2025-12-17 22:57:57 +01:00
package main
import (
"fmt"
"net/http"
"os"
2026-01-30 13:41:17 +01:00
"path/filepath"
2025-12-17 22:57:57 +01:00
"go.b0esche.cloud/backend/internal/audit"
"go.b0esche.cloud/backend/internal/auth"
"go.b0esche.cloud/backend/internal/config"
"go.b0esche.cloud/backend/internal/database"
httpsrv "go.b0esche.cloud/backend/internal/http"
"go.b0esche.cloud/backend/pkg/jwt"
)
2026-01-30 13:41:17 +01:00
// ensureAvatarCacheDir finds a writable, preferably persistent directory for avatar cache and updates cfg
func ensureAvatarCacheDir ( cfg * config . Config ) {
candidates := [ ] string {
cfg . AvatarCacheDir ,
"/var/lib/b0esche/avatars" ,
"./data/avatars" ,
filepath . Join ( os . TempDir ( ) , "b0esche_avatars" ) ,
}
for _ , d := range candidates {
if d == "" {
continue
}
if err := os . MkdirAll ( d , 0755 ) ; err == nil {
// Try writing a small test file to confirm write permission
testPath := filepath . Join ( d , ".write_test" )
if err := os . WriteFile ( testPath , [ ] byte ( "ok" ) , 0644 ) ; err == nil {
os . Remove ( testPath )
if d != cfg . AvatarCacheDir {
fmt . Printf ( "[WARN] Avatar cache dir %q not usable, using %q instead. Please set AVATAR_CACHE_DIR to a persistent, writable volume.\n" , cfg . AvatarCacheDir , d )
}
cfg . AvatarCacheDir = d
fmt . Printf ( "[INFO] Avatar cache directory set to %q\n" , d )
return
}
}
}
// If none usable, keep configured value and let runtime fallback handle it
fmt . Printf ( "[WARN] No writable persistent avatar cache directory found; falling back to tmp. Set AVATAR_CACHE_DIR to a persistent path.\n" )
}
2025-12-17 22:57:57 +01:00
func main ( ) {
cfg := config . Load ( )
2026-01-30 13:41:17 +01:00
// Ensure avatar cache directory is usable and persistent when possible
ensureAvatarCacheDir ( cfg )
2025-12-17 22:57:57 +01:00
dbConn , err := database . Connect ( cfg )
if err != nil {
fmt . Fprintf ( os . Stderr , "Database connection error: %v\n" , err )
os . Exit ( 1 )
}
db := database . New ( dbConn )
jwtManager := jwt . NewManager ( cfg . JWTSecret )
2026-01-08 13:07:07 +01:00
authService := auth . NewService ( db )
2025-12-17 22:57:57 +01:00
auditLogger := audit . NewLogger ( db )
srv := httpsrv . New ( cfg , db , jwtManager , authService , auditLogger )
fmt . Printf ( "Starting server on %s\n" , cfg . ServerAddr )
if err := srv . ListenAndServe ( ) ; err != nil && err != http . ErrServerClosed {
fmt . Fprintf ( os . Stderr , "Server error: %v\n" , err )
os . Exit ( 1 )
}
}