package main import ( "context" "embed" "io/fs" "log" "net/http" "os" "git.dcntrlized.org/Dcntrlized/Maestro/handlers/actions" "git.dcntrlized.org/Dcntrlized/Maestro/handlers/containers" handlers "git.dcntrlized.org/Dcntrlized/Maestro/handlers/registry" libcontainers "git.dcntrlized.org/Dcntrlized/Maestro/lib/containers" "git.dcntrlized.org/Dcntrlized/Maestro/lib/docker" ) //go:embed all:frontend/dist var embeddedFrontend embed.FS func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() cache := libcontainers.NewContainerCache() if os.Getenv("DEV_MODE_STATIC_SERVICES") == "true" { // DEV MODE: Load from file, skip Docker client cache.LoadDevServices("services.json") } else { // PROD MODE: Use Docker dc, err := docker.NewDockerClient() if err != nil { log.Fatalf("Failed to init docker client: %v", err) } defer dc.Close() if err := libcontainers.EnsureDataRoot(); err != nil { log.Fatalf("Data root check failed: %v", err) } if err := cache.LoadInstalledContainers(); err != nil { log.Fatalf("Failed to load installed containers: %v", err) } cache.ReconcileContainers(ctx, dc) go cache.WatchContainers(ctx, dc) } wsHub := containers.NewWebSocketHub(cache) mux := http.NewServeMux() mux.HandleFunc("/api/containers", containers.NewListContainersHandler(cache)) mux.HandleFunc("/api/ws", wsHub.HandleWS) mux.HandleFunc("/api/containers/install", containers.InstallContainerHandler(cache)) mux.HandleFunc("/api/containers/uninstall", containers.UninstallContainerHandler(cache)) mux.HandleFunc("/api/containers/start", containers.StartContainerHandler(cache)) mux.HandleFunc("/api/containers/stop", containers.StopContainerHandler(cache)) mux.HandleFunc("/api/actions/{containerId}/{actionName}", actions.RunAction) mux.HandleFunc("/api/registry", handlers.GetRegistry) if os.Getenv("DEV_MODE") != "true" { frontendDir, err := fs.Sub(embeddedFrontend, "frontend/dist") if err != nil { log.Fatalf("Failed to parse embedded frontend subtree: %v", err) } mux.Handle("/", http.FileServer(http.FS(frontendDir))) } port := os.Getenv("PORT") if port == "" { port = "8080" } server := &http.Server{ Addr: ":" + port, // Use the variable here Handler: mux, } log.Printf("Server starting on port %s...", port) if err := server.ListenAndServe(); err != nil { log.Fatal(err) } }