Files
eko/cmd/server/main.go

98 lines
1.9 KiB
Go

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
err := rotator.Rotate()
if err != nil {
slog.Error("log file rotation failed", "error", err)
} else {
slog.Info("log file rotated")
}
}
}()
}