Setting PORT in .env.local moved the port the server listens on *inside* the container (env_file injects it), while the mapping and the healthcheck stayed on 3000 — so the container came up unreachable. The published port is now HOST_PORT, and PORT is pinned to 3000 via `environment` (which takes precedence over env_file) so a leftover PORT in .env.local can no longer desync the app from the mapping. Documented both, including for the plain-docker path.
2.1 KiB
Running with Docker
The repo ships a multi-stage Dockerfile (Next.js standalone output,
runs as a non-root user) and a docker-compose.yml with a single
app service. Supabase is external — point the app at your hosted
(or self-hosted) Supabase project via env vars; no database container
is included.
Quick start
-
Copy the env template and fill it in:
cp .env.local.example .env.local -
Build and start (the
--env-fileflag is required — Compose only reads.envby default for${VAR}substitution, and this project keeps its config in.env.local):docker compose --env-file .env.local up --build -d -
The app is served on http://localhost:3000 (publish it elsewhere with
HOST_PORT=8080in.env.local).
Use
HOST_PORT, notPORT, to move the published port.PORTis what the server listens on inside the container, andenv_filewould inject it there — leaving the app on a port the mapping and the healthcheck don't target. Compose pins it to 3000 for that reason.
Build-time vs runtime variables
NEXT_PUBLIC_*variables are inlined into the client bundle at build time. They are passed as Docker build args bydocker-compose.yml. If you change any of them, rebuild:docker compose --env-file .env.local up --build -d.- Everything else (
SUPABASE_SERVICE_ROLE_KEY,ENCRYPTION_KEY,META_APP_SECRET, …) is read at runtime from.env.localviaenv_fileand is never baked into the image — safe to change with just a container restart.
Plain Docker (no Compose)
docker build \
--build-arg NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co \
--build-arg NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key \
-t wacrm .
docker run -d --env-file .env.local -e PORT=3000 -p 3000:3000 wacrm
Notes
- Database migrations under
supabase/are not run by the container — apply them with the Supabase CLI as described in the README. - If you use automation Wait steps, remember to point your cron pinger
at
GET /api/automations/cronon this deployment (seedocs/automations-and-cron.md).