Files
git-pages/src/main.go
Catherine 07a736382c Automatically set GOMEMLIMIT at 90% of available memory.
Or at the ratio specified by `AUTOMEMLIMIT`.
2025-09-18 03:31:51 +00:00

116 lines
2.4 KiB
Go

package main
import (
"flag"
"log"
"log/slog"
"net"
"net/http"
"os"
"strings"
"github.com/KimMachineGun/automemlimit/memlimit"
)
var backend Backend
func serveHandler(name string, listen string, serve func(http.ResponseWriter, *http.Request)) {
protocol, address, ok := strings.Cut(listen, "/")
if !ok {
log.Fatalf("%s: %s: malformed endpoint", name, listen)
}
listener, err := net.Listen(protocol, address)
if err != nil {
log.Fatalf("%s: %s\n", name, err)
}
mux := http.NewServeMux()
mux.HandleFunc("/", serve)
if err := http.Serve(listener, mux); err != nil {
log.Fatalf("%s: %s\n", name, err)
}
}
func main() {
var err error
configPath := flag.String("config", "config.toml", "path to configuration file")
migrateV1Path := flag.String("migrate-v1", "", "path to v1 data directory to upload")
flag.Parse()
if err := ReadConfig(*configPath); err != nil {
log.Fatalln("config:", err)
}
UpdateConfigEnv() // environment takes priority
switch config.LogFormat {
case "short":
log.SetFlags(0)
default:
log.SetFlags(log.Ldate | log.Ltime | log.LUTC)
}
switch config.Backend.Type {
case "fs":
if backend, err = NewFSBackend(config.Backend.FS.Root); err != nil {
log.Fatalln("fs backend:", err)
}
case "s3":
if backend, err = NewS3Backend(
config.Backend.S3.Endpoint,
config.Backend.S3.Insecure,
config.Backend.S3.AccessKeyID,
config.Backend.S3.SecretAccessKey,
config.Backend.S3.Region,
config.Backend.S3.Bucket,
); err != nil {
log.Fatalln("s3 backend:", err)
}
default:
log.Fatalln("unknown backend:", config.Backend.Type)
}
if *migrateV1Path != "" {
root, err := os.OpenRoot(*migrateV1Path)
if err != nil {
log.Fatalln("migrate v1:", err)
}
err = MigrateFromV1(root)
if err != nil {
log.Fatalln("migrate v1:", err)
}
log.Println("migrate v1 ok")
}
// Avoid being OOM killed by not garbage collecting early enough.
memlimit.SetGoMemLimitWithOpts(
memlimit.WithLogger(slog.Default()),
memlimit.WithProvider(
memlimit.ApplyFallback(
memlimit.FromCgroup,
memlimit.FromSystem,
),
),
memlimit.WithRatio(0.9),
)
log.Println("ready")
go serveHandler("pages", config.Listen.Pages, ServePages)
if config.Listen.Caddy != "" {
go serveHandler("caddy", config.Listen.Caddy, ServeCaddy)
}
if config.Listen.Health != "" {
go serveHandler("health", config.Listen.Health, ServeHealth)
}
select {}
}