package qccd import ( "context" "fmt" "os" "os/signal" "syscall" "github.com/niko/qcc/internal/config" "github.com/niko/qcc/internal/server" "github.com/spf13/cobra" "go.uber.org/zap" ) var serverCmd = &cobra.Command{ Use: "server", Short: "Start QuiC Call server", Run: runServer, } func runServer(cmd *cobra.Command, args []string) { logger, _ := zap.NewProduction() defer logger.Sync() cfg := config.Load() srv, err := server.New(cfg, logger) if err != nil { logger.Fatal("Failed to create server", zap.Error(err)) } ctx, cancel := context.WithCancel(context.Background()) defer cancel() sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigCh logger.Info("Received signal, shutting down", zap.String("signal", sig.String())) cancel() }() logger.Info("Starting server", zap.String("listen", cfg.Server.Listen), zap.Strings("domains", cfg.ACME.Domains), ) if err := srv.Start(ctx); err != nil { logger.Fatal("Server error", zap.Error(err)) } fmt.Println("Server stopped gracefully") }