diff --git a/.gitignore b/.gitignore index b4219db..ec3512e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules/ dist/ frontend/dist/ +backend/embed/dist/ *.exe *.test diff --git a/Makefile b/Makefile index 731a159..3120209 100644 --- a/Makefile +++ b/Makefile @@ -15,15 +15,23 @@ backend: frontend: cd frontend && npm run build -build: backend frontend +.PHONY: copyfrontend +copyfrontend: + rm -rf backend/embed/dist + mkdir -p backend/embed/dist + cp -r frontend/dist/. backend/embed/dist/ + +build: frontend copyfrontend backend run: cd backend && DEV_DEPLOY_DIR=$(DEV_DEPLOY_DIR) SERVERFILE_DIR=$(SERVERFILE_DIR) MODS_DIR=$(MODS_DIR) CFG_DIR=$(CFG_DIR) PROFILES_DIR=$(PROFILES_DIR) DATA_DIR=$(DATA_DIR) GIN_MODE=debug go run ./cmd/server/ dev: + mkdir -p backend/embed/dist + test -f backend/embed/dist/dev.txt || touch backend/embed/dist/dev.txt cd backend && DEV_DEPLOY_DIR=$(DEV_DEPLOY_DIR) SERVERFILE_DIR=$(SERVERFILE_DIR) MODS_DIR=$(MODS_DIR) CFG_DIR=$(CFG_DIR) PROFILES_DIR=$(PROFILES_DIR) DATA_DIR=$(DATA_DIR) GIN_MODE=debug go run ./cmd/server/ & cd frontend && npm run dev clean: rm -f backend/arma3-web-server - rm -rf frontend/dist + rm -rf frontend/dist backend/embed/dist diff --git a/backend/cmd/server/main.go b/backend/cmd/server/main.go index 29539fd..e07dc33 100644 --- a/backend/cmd/server/main.go +++ b/backend/cmd/server/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "io/fs" "log" "net/http" "os" @@ -10,6 +11,7 @@ import ( "syscall" "time" + "arma3-web-server/embed" "arma3-web-server/internal/api" "arma3-web-server/internal/services" @@ -24,7 +26,6 @@ func main() { cfgDir := mustAbs(getEnv("CFG_DIR", filepath.Join(devDeploy, "serverfiles", "cfg"))) profilesDir := mustAbs(getEnv("PROFILES_DIR", filepath.Join(devDeploy, "serverfiles", "profiles"))) listen := getEnv("LISTEN", ":8080") - frontendDir := mustAbs(getEnv("FRONTEND_DIR", filepath.Join("..", "frontend", "dist"))) log.Printf("data dir: %s", dataDir) log.Printf("serverfile dir: %s", serverfileDir) @@ -55,16 +56,19 @@ func main() { r := gin.Default() - if fi, err := os.Stat(frontendDir); err == nil && fi.IsDir() { - r.Static("/assets", filepath.Join(frontendDir, "assets")) - r.StaticFile("/favicon.ico", filepath.Join(frontendDir, "favicon.ico")) - r.NoRoute(func(c *gin.Context) { - c.File(filepath.Join(frontendDir, "index.html")) - }) - log.Printf("serving frontend from %s", frontendDir) + subFS, subErr := fs.Sub(embed.Frontend, "dist") + if subErr == nil { + if _, err := subFS.Open("index.html"); err == nil { + r.StaticFS("/assets", http.FS(subFS)) + r.StaticFileFS("/favicon.ico", "favicon.ico", http.FS(subFS)) + r.NoRoute(func(c *gin.Context) { + c.FileFromFS("index.html", http.FS(subFS)) + }) + log.Print("serving embedded frontend") + } } - handler := api.New(settings, configMgr, modlistMgr, process, steamcmd, scheduler, streamer, dataDir, serverfileDir, modsDir, cfgDir, profilesDir, frontendDir) + handler := api.New(settings, configMgr, modlistMgr, process, steamcmd, scheduler, streamer, dataDir, serverfileDir, modsDir, cfgDir, profilesDir) handler.SetupRoutes(r) // Startup auto-tasks diff --git a/backend/embed/embed.go b/backend/embed/embed.go new file mode 100644 index 0000000..dfb93ba --- /dev/null +++ b/backend/embed/embed.go @@ -0,0 +1,6 @@ +package embed + +import "embed" + +//go:embed dist +var Frontend embed.FS diff --git a/backend/internal/api/health.go b/backend/internal/api/health.go index f0070ed..5f70ce8 100644 --- a/backend/internal/api/health.go +++ b/backend/internal/api/health.go @@ -50,8 +50,7 @@ type SteamCMDHealth struct { } type FrontendHealth struct { - Served bool `json:"served"` - Path string `json:"path"` + Served bool `json:"served"` } func (h *Handler) Health(c *gin.Context) { @@ -60,7 +59,6 @@ func (h *Handler) Health(c *gin.Context) { paths := h.checkPaths() disk := h.checkDisk() - frontendServed, _ := h.checkFrontend() resp := HealthResponse{ Server: ServerHealth{ @@ -78,8 +76,7 @@ func (h *Handler) Health(c *gin.Context) { Running: h.steamcmd.IsRunning(), }, Frontend: FrontendHealth{ - Served: frontendServed, - Path: h.frontendDir, + Served: true, }, } @@ -129,14 +126,6 @@ func (h *Handler) checkDisk() []DiskHealth { return result } -func (h *Handler) checkFrontend() (bool, string) { - if h.frontendDir == "" { - return false, "" - } - fi, err := os.Stat(h.frontendDir) - return err == nil && fi.IsDir(), h.frontendDir -} - func checkServerBinary(serverfileDir string) bool { _, found := findServerBinary(serverfileDir) return found diff --git a/backend/internal/api/router.go b/backend/internal/api/router.go index ad21d4a..86a8de3 100644 --- a/backend/internal/api/router.go +++ b/backend/internal/api/router.go @@ -19,7 +19,6 @@ type Handler struct { modsDir string cfgDir string profilesDir string - frontendDir string } func New( @@ -30,7 +29,7 @@ func New( steamcmd *services.SteamCmdManager, scheduler *services.Scheduler, streamer *services.LogStreamer, - dataDir, serverfileDir, modsDir, cfgDir, profilesDir, frontendDir string, + dataDir, serverfileDir, modsDir, cfgDir, profilesDir string, ) *Handler { return &Handler{ settings: settings, @@ -45,7 +44,6 @@ func New( modsDir: modsDir, cfgDir: cfgDir, profilesDir: profilesDir, - frontendDir: frontendDir, } } diff --git a/frontend/src/pages/Status.tsx b/frontend/src/pages/Status.tsx index b6c9206..76b3364 100644 --- a/frontend/src/pages/Status.tsx +++ b/frontend/src/pages/Status.tsx @@ -78,7 +78,6 @@ export default function Status() {
- : '-'} />
diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 31d5f60..f63e05c 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -77,7 +77,6 @@ export interface ServerHealth { } frontend: { served: boolean - path: string } }