mirror of
https://github.com/MizuchiLabs/mantrae.git
synced 2026-01-06 06:19:57 -06:00
86 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|