package main import ( "context" "flag" "log" "log/slog" "os" "os/signal" "path/filepath" "syscall" "time" "github.com/kyren223/eko/internal/server" "github.com/kyren223/eko/internal/server/api" "github.com/kyren223/eko/internal/server/ctxkeys" "github.com/kyren223/eko/pkg/assert" "gopkg.in/natefinch/lumberjack.v2" ) const port = 7223 var prod = true func main() { prodFlag := flag.Bool("prod", true, "true for production mode, false for dev mode") flag.Parse() prod = !(*prodFlag) setupLogging() slog.Info("starting eko-server...") api.ConnectToDatabase() assert.AddFlush(api.DB()) defer api.DB().Close() ctx, cancel := context.WithCancel(context.Background()) defer cancel() signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) go func() { signal := <-signalChan slog.Info("received signal", "signal", signal) cancel() }() server := server.NewServer(ctx, port) server.Run() // blocks } func setupLogging() { logDir := os.Getenv("EKO_SERVER_LOG_DIR") if logDir == "" { logDir = "logs" } err := os.MkdirAll(logDir, 0750) if err != nil { log.Fatalln(err) } rotator := &lumberjack.Logger{ Filename: filepath.Join(logDir, "server.log"), MaxSize: 100, // megabytes MaxAge: 28, // days } level := slog.LevelDebug if prod { level = slog.LevelInfo } baseHandler := slog.NewJSONHandler(rotator, &slog.HandlerOptions{ AddSource: true, Level: level, }) handler := ctxkeys.WrapLogHandler(baseHandler) logger := slog.New(handler) slog.SetDefault(logger) slog.SetLogLoggerLevel(level) // TODO: remove me after fully migrating to slog go func() { for { now := time.Now() next := now.Truncate(24 * time.Hour).Add(24 * time.Hour) time.Sleep(time.Until(next)) // sleep until next midnight rotator.Rotate() } }() }