package main import ( "context" "log/slog" "net/http" "os" "os/signal" "strings" "git.t-juice.club/torjus/alerttonotify/server" ) const Version = "v0.1.1" func main() { // Setup logging logger := slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelDebug, })) logger.Info("Starting alerttonotify", "version", Version) // Setup nats connection natsURL, ok := os.LookupEnv("NATS_URL") if !ok { logger.Error("NATS_URL not set") os.Exit(1) } nkey, ok := os.LookupEnv("NATS_NKEY") if !ok { path, ok := os.LookupEnv("NATS_NKEY_FILE") if !ok { logger.Error("NATS_NKEY and NATS_NKEY_FILE not set") os.Exit(1) } data, err := os.ReadFile(path) if err != nil { logger.Error("unable to read NATS_NKEY_FILE", "error", err) os.Exit(1) } nkey = strings.TrimSpace(string(data)) } ns, err := server.NewNotificationService(natsURL, nkey) if err != nil { logger.Error("Failed to create notification service", "error", err) os.Exit(1) } shutdownCtx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() // Setup http server srv := server.NewServer(ns, logger) srv.Addr = ":5001" addr, ok := os.LookupEnv("ALERTTONOTIFY_ADDR") if ok { srv.Addr = addr } // Listen for shutdown signal go func() { <-shutdownCtx.Done() srv.Close() srv.Shutdown(context.Background()) }() logger.Info("Starting http server", "addr", srv.Addr) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Error("Failed to start http server", "error", err) os.Exit(1) } logger.Info("Shutting down") }