package main import ( "embed" "flag" "io/fs" "log" "net/http" "os" "emailforwarder/backend" ) //go:embed frontend-js/dist/* var frontend embed.FS func main() { runOnce := flag.String("run", "", "einen Umzugs-Job einmalig ausfuehren (Konto-Name oder 'all'), ohne Web-UI") watch := flag.Bool("watch", false, "Delta-Sync in Schleife bis Stop (Cutover-Fenster)") flag.Parse() if err := backend.LoadConfig("config.json"); err != nil { log.Fatalf("config: %v", err) } if err := backend.ConnectDB(); err != nil { log.Fatalf("database: %v", err) } if err := backend.InitAuth(); err != nil { log.Fatalf("auth: %v", err) } // CLI-Modus: ohne Web laufen lassen (Cronjob / Cutover). if *runOnce != "" { must(backend.RunMigration(*runOnce, *watch)) return } dist, err := fs.Sub(frontend, "frontend-js/dist") if err != nil { log.Fatal(err) } mux := http.NewServeMux() mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(dist)))) backend.RegisterRoutes(mux) addr := backend.Cfg.Bind + ":" + backend.Cfg.Port log.Printf("Email-Forwarder listening on %s", addr) log.Fatal(http.ListenAndServe(addr, backend.AuthMiddleware(mux))) } func must(err error) { if err != nil { log.Print(err) os.Exit(1) } }