main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Command deliverd consumes deliveries.<channel>.<company_id> subjects
  2. // and pushes the alert to the appropriate third-party sink
  3. // (FCM, Telegram, SMS, email, Slack, Teams, webhook).
  4. //
  5. // M0: per-channel worker binary that connects to NATS, /health, /metrics.
  6. // Real delivery lands in M1+ per channel.
  7. package main
  8. import (
  9. "context"
  10. "os"
  11. "os/signal"
  12. "syscall"
  13. "git3.techno-world.net/lrosales/broad-announce/internal/broker"
  14. "git3.techno-world.net/lrosales/broad-announce/internal/config"
  15. "git3.techno-world.net/lrosales/broad-announce/internal/httpserver"
  16. "git3.techno-world.net/lrosales/broad-announce/internal/observability"
  17. )
  18. func main() {
  19. cfg, err := config.LoadCommon("deliverd")
  20. if err != nil {
  21. os.Stderr.WriteString("config: " + err.Error() + "\n")
  22. os.Exit(1)
  23. }
  24. logger := observability.Init(cfg.Env, cfg.LogLevel, "deliverd")
  25. logger.Info("starting", "env", cfg.Env, "addr", cfg.HTTPAddr)
  26. ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
  27. defer stop()
  28. br, err := broker.Connect(ctx, cfg.NATSURL)
  29. if err != nil {
  30. logger.Error("nats connect", "err", err)
  31. os.Exit(1)
  32. }
  33. defer br.Close()
  34. logger.Info("nats connected")
  35. reg, _ := observability.NewRegistry("deliverd")
  36. srv := httpserver.New(httpserver.Config{
  37. Addr: cfg.HTTPAddr,
  38. ServiceName: "deliverd",
  39. ShutdownGrace: cfg.ShutdownGrace,
  40. }, logger, observability.MetricsHandler(reg))
  41. errCh := make(chan error, 1)
  42. go func() { errCh <- srv.Start() }()
  43. select {
  44. case <-ctx.Done():
  45. logger.Info("shutdown signal received")
  46. case err := <-errCh:
  47. if err != nil {
  48. logger.Error("http server", "err", err)
  49. os.Exit(1)
  50. }
  51. }
  52. if err := srv.Shutdown(ctx); err != nil {
  53. logger.Warn("graceful shutdown", "err", err)
  54. }
  55. logger.Info("bye")
  56. }