Bind the production web server to a chosen port
react-router-serve only honours a port it is given: with PORT unset it calls getAvailablePort(3000) and takes the first free port from 3000 upwards (@react-router/serve cli.js). Nothing in the manual path set PORT, so a busy 3000 silently moved the site to 3001, 3002 and so on, and a reverse proxy configured against one upstream stopped matching. Docker never showed this because apps/web/Dockerfile and docker-compose.yml both set PORT=3000. The web start script now always passes a port - PORT if exported, else WEB_PORT from .env, else 3000 - so the manual path is as deterministic as the containerised one and .env's WEB_PORT finally reaches the process that binds. HOST is deliberately left undefaulted: react-router-serve reads it directly, unset means every interface (what the container needs) and 127.0.0.1 restricts the socket to a proxy on the same host. Verified against the existing build: PORT=8123 listens on *:8123, and WEB_PORT=8124 HOST=127.0.0.1 listens on 127.0.0.1:8124 and serves /en with a 200 while the CMS is down. .env.example documents both variables, and the deployment section of README.md gains a systemd unit, since nothing sources .env there, and a warning that WEB_PORT is the published host port under Docker but the listen port in manual mode. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,7 +68,18 @@ ENCRYPTION_KEY=
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# React Router server (production build / Docker). `pnpm dev:web` uses 5173.
|
||||
# Manual mode: `pnpm --filter web start` binds this port exactly - export it
|
||||
# first (set -a; . ./.env; set +a) or pass it inline (PORT=8080 pnpm ...).
|
||||
# Without it the server would pick the first free port from 3000 upwards,
|
||||
# which a reverse proxy cannot be pointed at.
|
||||
WEB_PORT=3000
|
||||
|
||||
# Manual mode only - interface the React Router server binds to. Unset means
|
||||
# every interface. Set it to 127.0.0.1 when a reverse proxy on the same host
|
||||
# is the only thing that should reach it. Leave it unset under Docker, where
|
||||
# the container's own network namespace already isolates it.
|
||||
# HOST=127.0.0.1
|
||||
|
||||
# Strapi API + admin panel.
|
||||
CMS_PORT=1337
|
||||
|
||||
|
||||
Reference in New Issue
Block a user