81917acc3e
Two long-standing dev-environment ergonomics had not survived the move from the bespoke local-dev stack to the CI-driven dev-deploy: 1. `BACKEND_DEV_SANDBOX_EMAIL` defaulted to an empty string in the dev-deploy compose, so the auto-provisioned "Dev Sandbox" game never appeared on `https://www.galaxy.lan`. Bake `dev@galaxy.lan` as the default — matches `.env.example` and lets a developer who logs in with that email find a ready-to-play game in the lobby. 2. The lobby's synthetic-report loader was gated on `import.meta.env.DEV`, which is true only for `vite dev` (the tools/local-dev path). The long-lived dev environment builds with `vite build` (production mode), so the section was always stripped from its bundle. Gate it on an explicit `VITE_GALAXY_DEV_AFFORDANCES` flag instead and set it both in `.env.development` (preserves `pnpm dev` behaviour) and in the `dev-deploy.yaml` build step. The `prod-build.yaml` build path leaves the flag unset, so production stays clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
107 lines
4.2 KiB
Makefile
107 lines
4.2 KiB
Makefile
.PHONY: help up down rebuild logs status clean-data health psql build-engine seed-ui
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
REPO_ROOT := $(realpath $(CURDIR)/../..)
|
|
ENGINE_IMAGE := galaxy-engine:dev
|
|
ENGINE_LABEL := org.opencontainers.image.title=galaxy-game-engine
|
|
# Game-state root lives under the invoking user's home by default so
|
|
# `make up` works without sudo. Override `GALAXY_DEV_GAME_STATE_DIR`
|
|
# in the environment or `.env` to relocate (e.g. /var/lib/galaxy-dev/
|
|
# game-state in a production-shaped host). The value flows through to
|
|
# both the compose bind-mount and the backend's
|
|
# `BACKEND_GAME_STATE_ROOT`.
|
|
export GALAXY_DEV_GAME_STATE_DIR ?= $(HOME)/.galaxy-dev/game-state
|
|
|
|
COMPOSE := docker compose
|
|
|
|
help:
|
|
@echo "Long-lived Galaxy dev environment (https://*.galaxy.lan):"
|
|
@echo " make up Build images, ensure engine image, bring stack up"
|
|
@echo " make rebuild Force rebuild of backend / gateway images and bring up"
|
|
@echo " make build-engine Build $(ENGINE_IMAGE) from game/Dockerfile (no-op if present)"
|
|
@echo " make seed-ui Build ui/frontend and load into galaxy-dev-ui-dist volume"
|
|
@echo " make down Stop containers, keep named volumes"
|
|
@echo " make logs Tail all logs"
|
|
@echo " make status docker compose ps"
|
|
@echo " make health Probe the stack through the host Caddy"
|
|
@echo " make psql Open a psql shell as galaxy@galaxy_backend"
|
|
@echo " make clean-data Stop everything and wipe named volumes + game-state"
|
|
@echo ""
|
|
@echo "Requires:"
|
|
@echo " - external Docker network '$${GALAXY_EDGE_NETWORK:-edge}'"
|
|
@echo " (docker network create edge)"
|
|
@echo " - host Caddy proxying *.galaxy.lan into that network"
|
|
@echo " - game-state dir: $(GALAXY_DEV_GAME_STATE_DIR) (auto-created)"
|
|
|
|
up: build-engine
|
|
mkdir -p "$(GALAXY_DEV_GAME_STATE_DIR)"
|
|
$(COMPOSE) up -d --wait
|
|
|
|
rebuild: build-engine
|
|
$(COMPOSE) build --no-cache galaxy-backend galaxy-api
|
|
mkdir -p "$(GALAXY_DEV_GAME_STATE_DIR)"
|
|
$(COMPOSE) up -d --wait
|
|
|
|
build-engine:
|
|
@if docker image inspect $(ENGINE_IMAGE) >/dev/null 2>&1; then \
|
|
echo "$(ENGINE_IMAGE) already built; skipping (use 'docker rmi $(ENGINE_IMAGE)' to force a rebuild)."; \
|
|
else \
|
|
echo "building $(ENGINE_IMAGE)…"; \
|
|
docker build -t $(ENGINE_IMAGE) -f $(REPO_ROOT)/game/Dockerfile $(REPO_ROOT); \
|
|
fi
|
|
|
|
# Build the UI frontend and load the resulting build/ directory into
|
|
# the named volume Caddy serves from. Used by the dev-deploy workflow
|
|
# and by anyone bringing the stack up by hand.
|
|
seed-ui:
|
|
@if [ ! -d $(REPO_ROOT)/ui/frontend/node_modules ]; then \
|
|
echo "installing UI dependencies…"; \
|
|
(cd $(REPO_ROOT)/ui && pnpm install --frozen-lockfile); \
|
|
fi
|
|
@echo "building UI (vite build)…"
|
|
(cd $(REPO_ROOT)/ui/frontend && \
|
|
VITE_GATEWAY_BASE_URL=https://api.galaxy.lan \
|
|
VITE_GALAXY_DEV_AFFORDANCES=true \
|
|
VITE_GATEWAY_RESPONSE_PUBLIC_KEY=$$(cat $(REPO_ROOT)/ui/frontend/.env.development \
|
|
| sed -n 's/^VITE_GATEWAY_RESPONSE_PUBLIC_KEY=//p') \
|
|
pnpm build)
|
|
@echo "loading build/ into galaxy-dev-ui-dist volume…"
|
|
docker volume create galaxy-dev-ui-dist >/dev/null
|
|
docker run --rm \
|
|
-v galaxy-dev-ui-dist:/dst \
|
|
-v $(REPO_ROOT)/ui/frontend/build:/src:ro \
|
|
alpine sh -c 'rm -rf /dst/* /dst/.??* 2>/dev/null; cp -a /src/. /dst/'
|
|
|
|
down:
|
|
$(COMPOSE) down
|
|
|
|
logs:
|
|
$(COMPOSE) logs -f --tail=100
|
|
|
|
status:
|
|
$(COMPOSE) ps
|
|
|
|
health:
|
|
@echo "Frontend (https://www.galaxy.lan):"
|
|
@curl -sS -o /dev/null -w " HTTP %{http_code}\n" https://www.galaxy.lan/ || echo " unreachable"
|
|
@echo "API healthz (https://api.galaxy.lan/healthz):"
|
|
@curl -sS -o /dev/null -w " HTTP %{http_code}\n" https://api.galaxy.lan/healthz || echo " unreachable"
|
|
|
|
psql:
|
|
$(COMPOSE) exec galaxy-postgres psql -U galaxy -d galaxy_backend
|
|
|
|
clean-data:
|
|
@echo "Stopping containers and engines, then wiping volumes + game-state…"
|
|
@ids=$$(docker ps -aq --filter label=$(ENGINE_LABEL)); \
|
|
if [ -n "$$ids" ]; then \
|
|
echo "stopping engine containers…"; \
|
|
docker rm -f $$ids >/dev/null; \
|
|
fi
|
|
$(COMPOSE) down -v
|
|
@if [ -d "$(GALAXY_DEV_GAME_STATE_DIR)" ]; then \
|
|
echo "wiping $(GALAXY_DEV_GAME_STATE_DIR)…"; \
|
|
docker run --rm -v "$(GALAXY_DEV_GAME_STATE_DIR):/state" alpine sh -c 'rm -rf /state/*' 2>/dev/null \
|
|
|| rm -rf "$(GALAXY_DEV_GAME_STATE_DIR)"/* 2>/dev/null || true; \
|
|
fi
|