mirror of
https://github.com/Kyren223/eko.git
synced 2026-03-11 02:15:37 +00:00
98 lines
1.9 KiB
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")
|
|
}
|
|
}
|
|
}()
|
|
}
|