name: wacrm services: app: build: context: . # NEXT_PUBLIC_* vars are inlined at build time — forward them # from .env.local as build args. Changing any of them requires # a rebuild (docker compose up --build). args: NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL} NEXT_PUBLIC_SUPABASE_ANON_KEY: ${NEXT_PUBLIC_SUPABASE_ANON_KEY} NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-} NEXT_PUBLIC_APP_LOCALE: ${NEXT_PUBLIC_APP_LOCALE:-en} # Runtime (server-only) secrets come from .env.local; they are # never baked into the image. env_file: - .env.local # The server always listens on 3000 inside the container. Pinned # here because `environment` wins over `env_file`, so a stray PORT # in .env.local can't desync the app from the mapping and the # healthcheck below. environment: PORT: 3000 # Host side only — HOST_PORT=8080 publishes the app on :8080. ports: - '${HOST_PORT:-3000}:3000' restart: unless-stopped healthcheck: test: [ 'CMD', 'node', '-e', "fetch('http://localhost:3000').then((r)=>process.exit(r.ok||r.status<500?0:1)).catch(()=>process.exit(1))", ] interval: 30s timeout: 5s retries: 3 start_period: 15s