Files
mantrae/main.go
2024-10-03 17:58:01 +02:00

86 lines
2.1 KiB
Go

package main
import (
"context"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/MizuchiLabs/mantrae/internal/api"
"github.com/MizuchiLabs/mantrae/internal/config"
"github.com/MizuchiLabs/mantrae/internal/db"
"github.com/MizuchiLabs/mantrae/pkg/dns"
"github.com/MizuchiLabs/mantrae/pkg/traefik"
"github.com/lmittmann/tint"
)
// Set up global logger with specified configuration
func init() {
logger := slog.New(tint.NewHandler(os.Stdout, nil))
slog.SetDefault(logger)
}
func main() {
if _, ok := os.LookupEnv("SECRET"); !ok {
slog.Error("SECRET environment variable not set")
return
}
if err := db.InitDB(); err != nil {
slog.Error("Failed to initialize database", "error", err)
return
}
defer db.DB.Close() // Close the database connection when the program exits
// Parse command-line flags and set default settings
var flags config.Flags
if err := flags.Parse(); err != nil {
slog.Error("Failed to parse flags", "error", err)
return
}
// Schedule backups
if err := config.ScheduleBackups(); err != nil {
slog.Error("Failed to schedule backups", "error", err)
}
// Create a context that will be used to signal background processes to stop
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Start the background sync processes
go traefik.Sync(ctx)
go dns.Sync(ctx)
// Start the grpc server
go api.Server(flags.Agent.Port)
// Start the WebUI server
srv := &http.Server{
Addr: ":" + flags.Port,
Handler: api.Routes(flags.UseAuth),
ReadHeaderTimeout: 5 * time.Second,
}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
slog.Error("ListenAndServe", "error", err)
os.Exit(1)
}
}()
// Wait for interrupt signal to gracefully shutdown the server
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
slog.Info("Shutting down server...")
ctxShutdown, cancelShutdown := context.WithTimeout(ctx, 3*time.Second)
defer cancelShutdown()
if err := srv.Shutdown(ctxShutdown); err != nil {
slog.Error("Server forced to shutdown:", "error", err)
}
}