Files
Maestro/src/main.go
T

82 lines
2.4 KiB
Go

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)
}
}