Bootstraps Vellum as a single Go binary with one SQLite database. - core: env-driven config, slog logging, SQLite (WAL) with pooled pragmas, embedded migration runner keyed on PRAGMA user_version - migrations/0001_core.sql: identity, media, user state, infra. Media items are global; all per-user state (progress, favorites, grants) is a join. One polymorphic progress table covers every media kind. - httpapi: request-ID, structured request logging, panic recovery, JSON endpoints for /healthz and /api/v1/version - multi-arch Dockerfile (pure-Go SQLite, CGO_ENABLED=0) with an entrypoint that honours PUID/PGID like the rest of the self-hosted stack - tests for migration idempotency, FK enforcement, WAL, config, middleware Media does not exist yet. Nothing is exposed beyond health and version.
34 lines
734 B
Go
34 lines
734 B
Go
package core
|
|
|
|
import (
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// NewLogger builds a structured logger from the configured level and format.
|
|
// Unknown values fall back rather than failing: a bad log level must never
|
|
// stop the server from booting.
|
|
func NewLogger(level, format string) *slog.Logger {
|
|
var lvl slog.Level
|
|
switch strings.ToLower(level) {
|
|
case "debug":
|
|
lvl = slog.LevelDebug
|
|
case "warn", "warning":
|
|
lvl = slog.LevelWarn
|
|
case "error":
|
|
lvl = slog.LevelError
|
|
default:
|
|
lvl = slog.LevelInfo
|
|
}
|
|
|
|
opts := &slog.HandlerOptions{Level: lvl}
|
|
|
|
var h slog.Handler
|
|
if strings.EqualFold(format, "json") {
|
|
h = slog.NewJSONHandler(os.Stdout, opts)
|
|
} else {
|
|
h = slog.NewTextHandler(os.Stdout, opts)
|
|
}
|
|
return slog.New(h)
|
|
}
|