package main import ( "context" "errors" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/gin-gonic/gin" "github.com/vaultdrop/backend/config" "github.com/vaultdrop/backend/db" "github.com/vaultdrop/backend/handlers" "github.com/vaultdrop/backend/ocr" "github.com/vaultdrop/backend/pkg/auth" "github.com/vaultdrop/backend/repository" "github.com/vaultdrop/backend/service" ) var version = "dev" func newRouter() *gin.Engine { r := gin.Default() handlers.RegisterRoutes(r) return r } func main() { if len(os.Args) > 1 && os.Args[1] == "--version" { fmt.Printf("vaultdrop-server %s\n", version) os.Exit(0) } cfg, err := config.LoadApplicationConfig() if err != nil { log.Fatalln(err) } conn, err := db.Open(cfg.DatabaseURL) if err != nil { log.Fatalf("connexion postgres: %v", err) } if err := db.MigrateDatabase(cfg.DatabaseURL); err != nil { log.Fatalf("migrations postgres: %v", err) } authManager, err := auth.NewManager(cfg.AuthSecret) if err != nil { log.Fatalln(err) } handlers.Auth = authManager repo := repository.NewRepository(conn) // Premier admin (users vide) — refus de démarrer si identifiants absents. if err := service.EnsureAdmin(repo, cfg.AdminUsername, cfg.AdminPassword); err != nil { log.Fatalln(err) } handlers.Store = service.NewResources( repo, cfg.UploadDir, cfg.MaxFileSizeMB*1024*1024, ) handlers.Ocr = service.NewOcr(repo, cfg.UploadDir, cfg.OcrLang, ocr.NewTesseract()) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() // Worker OCR borné (OCR_WORKERS) : file `ocr_jobs`, hors request handlers. go handlers.Ocr.Run(ctx, cfg.OcrWorkers) log.Printf("ocr worker démarré (%d workers)", cfg.OcrWorkers) srv := &http.Server{ Addr: fmt.Sprintf(":%d", cfg.Port), Handler: newRouter(), } go func() { if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Fatalf("server: %v", err) } }() <-ctx.Done() stop() shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { log.Printf("shutdown: %v", err) } log.Println("arrêt propre") }