82 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|