package main import ( "context" "log" "net/http" "os/signal" "syscall" "time" "git.ryuvia.com/niklas/terdut-server/internal/api" "git.ryuvia.com/niklas/terdut-server/internal/config" "git.ryuvia.com/niklas/terdut-server/internal/db" ) var version = "dev" func main() { cfg := config.Load() database, err := db.Open(cfg.DBPath) if err != nil { log.Fatalf("open db: %v", err) } defer database.Close() if err := db.Migrate(database); err != nil { log.Fatalf("migrate: %v", err) } notify := api.NotifyConfig{ BaseURL: cfg.NtfyURL, Token: cfg.NtfyToken, FallbackTopic: cfg.NtfyFallbackTopic, PublicURL: cfg.PublicURL, RepeatEvery: cfg.NotifyRepeat, } deadman := api.ParseDeadmanConfig(cfg.DeadmanMatchers, cfg.DeadmanTimeout, cfg.DeadmanSeverity) router := api.NewRouter(database, notify, deadman) srv := &http.Server{ Addr: cfg.Addr, Handler: router, ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, } ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() go api.StartArchiver(ctx, database, cfg.ArchiveAfter, cfg.StaleAfter, deadman, notify) go api.StartNotifier(ctx, database, notify) go func() { log.Printf("terdut-server %s listening on %s", version, cfg.Addr) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %v", err) } }() <-ctx.Done() log.Println("shutting down") shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { log.Printf("shutdown: %v", err) } }