axiom/main.go
2025-06-30 23:51:37 -06:00

94 lines
1.8 KiB
Go

package main
import (
"log"
"io/fs"
"net/http"
"os"
"os/signal"
"syscall"
"embed"
"git.tavo.one/tavo/axiom/database"
"git.tavo.one/tavo/axiom/handlers"
"git.tavo.one/tavo/axiom/storage"
"git.tavo.one/tavo/axiom/config"
"git.tavo.one/tavo/axiom/views"
)
//go:embed min/static/*
var publicFS embed.FS
//go:embed min/views/*
var viewFS embed.FS
func init() {
needed := []string{
"PRODUCTION",
"PORT",
"APP_DATA_DIR",
"DB_CONNDVR",
"DB_CONNSTR",
}
for _, v := range needed {
if os.Getenv(v) == "" {
log.Fatalf("missing environment varialbe: %s", v)
}
}
}
func main() {
err := views.Init(viewFS, config.ViewMap, config.FuncMap)
if err != nil {
log.Fatalf("failed to initialize templates: %v", err)
}
db, err := database.Init(os.Getenv("DB_CONNDVR"), os.Getenv("DB_CONNSTR"))
if err != nil {
log.Fatalf("failed to initialize database: %v", err)
}
defer db.Close()
s3, err := storage.New(os.Getenv("APP_DATA_DIR"), 4<<20)
if err != nil {
log.Fatalf("failed to initialize storage: %v", err)
}
handlerConfig := handlers.Config{
Production: os.Getenv("PRODUCTION") == "1",
Views: nil,
DB: db,
S3: s3,
}
handler := handlers.New(handlerConfig)
router := routes(handler)
staticFiles, err := fs.Sub(publicFS, "min/static")
if err != nil {
log.Fatalf("failed to create static files filesystem: %v", err)
}
router.Handle(
"GET /s/",
http.StripPrefix("/s/", http.FileServer(http.FS(staticFiles))),
)
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
port := os.Getenv("PORT")
go func() {
log.Printf("starting on :%s...", port)
if err := http.ListenAndServe(":"+port, router); err != nil {
log.Fatalf("fatal: failed to start on port %s: %v", port, err)
}
}()
<-stop
log.Printf("shutting down...")
}