// backend\server.go package main import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" ) // --- main --- func main() { loadSettings() fixKeepRootFilesIntoModelSubdirs() postWorkQ.StartWorkers(1) startPostWorkStatusRefresher() go startGeneratedGarbageCollector() // ✅ NSFW-ONNX Detector initialisieren if err := initNSFWDetector(); err != nil { fmt.Println("❌ NSFW-ONNX Fehler:", err) os.Exit(1) } defer func() { _ = closeNSFWDetector() }() mux := http.NewServeMux() auth, err := NewAuthManager() if err != nil { fmt.Println("❌ auth init:", err) _ = closeNSFWDetector() os.Exit(1) } store := registerRoutes(mux, auth) go startChaturbateOnlinePoller(store) go startChaturbateAutoStartWorker(store) go startMyFreeCamsAutoStartWorker(store) go startDiskSpaceGuard() if _, err := ensureCoversDir(); err != nil { fmt.Println("⚠️ covers dir:", err) } fmt.Println("🌐 HTTP-API aktiv: http://localhost:9999") handler := withCORS(mux) srv := &http.Server{ Addr: ":9999", Handler: handler, } // Shutdown-Signale stopSig := make(chan os.Signal, 1) signal.Notify(stopSig, os.Interrupt, syscall.SIGTERM) go func() { <-stopSig fmt.Println("🛑 Beende Server...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() _ = srv.Shutdown(ctx) _ = closeNSFWDetector() }() if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { fmt.Println("❌ HTTP-Server Fehler:", err) _ = closeNSFWDetector() os.Exit(1) } _ = closeNSFWDetector() }