CI / check (push) Successful in 36s
CI / tests-imaging-browsers (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m59s
CI / tests-unit (push) Successful in 2m4s
CI / tests-quality (push) Successful in 42s
CI / tests-ui (push) Successful in 4m39s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 3m20s
On a CI-managed host scripts/ci-deploy.sh owns port 3002 through the blue/green slots, so a compose replica of the cms service could only ever crash-loop on EADDRINUSE — it never serves traffic, because nginx points at a slot container. Gate the service behind the `cms` profile so a bare `docker compose up -d` starts only byparr. Naming the service explicitly (`docker compose up -d cms`, which is what the installer and updater already do) still enables the profile automatically, so the compose-only install path keeps working. Keep the one port that is actually served (3002) and make the 2 GB ceiling hard by capping swap at 2g as well. Drop the green compose service (3003): the green slot only ever exists as a docker run container created by CI, so compose no longer defines it and the two paths cannot drift apart. The loopback override contract stays covered: proxy-config.test.mjs now renders the configuration with --profile cms, and a new build-contract test pins the profile and the memory limits so neither can be dropped by accident.
81 lines
3.4 KiB
YAML
81 lines
3.4 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Next.js CMS — single slot on port 3002
|
|
#
|
|
# ── Eigenaar van poort 3002 ─────────────────────────────────────────────────
|
|
# Deze repo kent twee deploy-paden die allebei op poort 3002 willen:
|
|
# * `scripts/ci-deploy.sh` (blue/green, docker run) — de eigenaar op een
|
|
# CI-host. Elke push naar main bouwt daar een nieuwe image, draait de
|
|
# migrations en zet nginx pas om na health + e2e + imaging.
|
|
# * deze compose-`cms`-service — bedoeld voor een LOSSE host zonder CI.
|
|
#
|
|
# Ze kunnen niet naast elkaar draaien: wie op 3002 zit, blokkeert de ander met
|
|
# `EADDRINUSE`. Daarom staat `cms` achter een profile. Een bloot
|
|
# `docker compose up -d` start dus alleen byparr en kan nooit de live CI-release
|
|
# van de site drukken. De service start alleen als je hem expliciet noemt
|
|
# (`docker compose up -d cms`, `docker compose build cms`, ...): Compose schakelt
|
|
# het profile van een expliciet genoemde service vanzelf in. Op een CI-host wil
|
|
# je dat dus juist NOOIT doen.
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
x-cms: &cms
|
|
image: epicnext-cms:${CMS_RELEASE:-local}
|
|
# No `network: host` on the build. BuildKit (v0.26, Docker 29) refuses to grant
|
|
# host networking unless every caller passes --allow=network.host, and
|
|
# `docker compose build` has no such flag — so asking for it here turned every
|
|
# rebuild into an immediate "additional privileges requested" failure, which
|
|
# left the previous release serving traffic. The build only needs outbound
|
|
# internet (apk, pnpm, next/font/google), which the default bridge provides.
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
args:
|
|
NEXT_DEPLOYMENT_ID: ${CMS_RELEASE:-unknown}
|
|
# Runtime host networking IS required: nginx reaches the CMS over 127.0.0.1
|
|
# on the single port that is actually served (3002).
|
|
network_mode: host
|
|
stop_grace_period: 15s
|
|
restart: unless-stopped
|
|
env_file:
|
|
- .env
|
|
volumes:
|
|
- ./public/nitro-assets:/app/public/nitro-assets
|
|
- ./public/swf:/app/public/swf
|
|
- ./storage:/app/storage
|
|
- /var/www/Gamedata:/var/www/Gamedata
|
|
|
|
# ── Resource limits ──
|
|
mem_limit: 2g
|
|
memswap_limit: 2g
|
|
cpus: 2.0
|
|
pids_limit: 512
|
|
|
|
healthcheck:
|
|
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:'+(process.env.PORT||'3002')+'/api/health').then(r=>{process.exit(r.ok?0:1)}).catch(()=>process.exit(1))"]
|
|
interval: 15s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 40s
|
|
|
|
services:
|
|
cms:
|
|
<<: *cms
|
|
# Alleen starten als je deze host bewust compose-only beheert.
|
|
profiles: ["cms"]
|
|
container_name: epicnext-cms
|
|
environment:
|
|
- HOSTNAME=0.0.0.0
|
|
- PORT=3002
|
|
|
|
byparr:
|
|
image: ghcr.io/thephaseless/byparr:latest
|
|
container_name: byparr
|
|
network_mode: host
|
|
restart: unless-stopped
|
|
environment:
|
|
- LOG_LEVEL=INFO
|
|
pids_limit: 256
|
|
healthcheck:
|
|
test: ["CMD", "curl", "http://localhost:8191/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s |