Files
tingz/cmd/deployer/main.go
2025-10-14 22:35:11 +03:00

97 lines
2.2 KiB
Go

package main
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"git.yigid.dev/fyb/tingz/internal/config"
"git.yigid.dev/fyb/tingz/internal/db"
"git.yigid.dev/fyb/tingz/internal/deploy"
httpserver "git.yigid.dev/fyb/tingz/internal/http"
"git.yigid.dev/fyb/tingz/internal/logging"
"git.yigid.dev/fyb/tingz/internal/user"
)
func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func run() error {
cfg, err := config.LoadConfig()
if err != nil {
return fmt.Errorf("failed to load config: %w", err)
}
logger := logging.New(cfg.LogLevel)
logger.Info("deployer service starting",
"log_level", cfg.LogLevel)
dbConfig := &db.DBConfig{
JournalMode: cfg.DBJournalMode,
Synchronous: cfg.DBSynchronous,
BusyTimeout: cfg.DBBusyTimeout,
}
database, err := db.OpenDB(cfg.DBPath, dbConfig)
if err != nil {
return fmt.Errorf("failed to open database: %w", err)
}
defer database.Close()
if err := db.EnsureSchema(database); err != nil {
return fmt.Errorf("failed to ensure schema: %w", err)
}
userMgr := user.NewManager(database, cfg.DeployRoot, cfg.ReleaseRoot)
deployMgr := deploy.NewManager(cfg.DeployRoot, cfg.ReleaseRoot, cfg.ReleasesToKeep, logger)
router := httpserver.NewRouter(cfg, userMgr, deployMgr, logger)
server := &http.Server{
Addr: "0.0.0.0:8080",
Handler: router,
ReadTimeout: 15 * time.Second,
WriteTimeout: 15 * time.Second,
IdleTimeout: 60 * time.Second,
}
errChan := make(chan error, 1)
go func() {
logger.Info("server listening", "addr", server.Addr)
if cfg.TLSCert != "" && cfg.TLSKey != "" {
errChan <- server.ListenAndServeTLS(cfg.TLSCert, cfg.TLSKey)
} else {
errChan <- server.ListenAndServe()
}
}()
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
select {
case err := <-errChan:
return fmt.Errorf("server error: %w", err)
case sig := <-sigChan:
logger.Info("received shutdown signal", "signal", sig)
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
return fmt.Errorf("server shutdown failed: %w", err)
}
logger.Info("server stopped gracefully")
return nil
}