diff --git a/.env.docker.production.example b/.env.docker.production.example index 7c39185..df4413c 100644 --- a/.env.docker.production.example +++ b/.env.docker.production.example @@ -37,6 +37,9 @@ REDIS_URL=redis://redis:6379 API_PORT=4000 # SSR server-side calls go via the internal Docker network API_INTERNAL_URL=http://api:4000/api/v1 +# Next.js rewrites between the marketplace and internal apps also use Docker-network URLs +DASHBOARD_INTERNAL_URL=http://dashboard:3001 +ADMIN_INTERNAL_URL=http://admin:3002 # Public-facing API URL visible to browsers — MUST be your real domain, not localhost API_URL=https://api.rentaldrivego.ma # Baked into Next.js bundles at build time — MUST be set before running `npm run build` diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 246c953..0004465 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -157,7 +157,14 @@ build_image: done # NEXT_PUBLIC_* vars are inlined into Next.js bundles at build time — must be passed as ARGs - | + export API_INTERNAL_URL="${API_INTERNAL_URL:-http://api:4000/api/v1}" + export DASHBOARD_INTERNAL_URL="${DASHBOARD_INTERNAL_URL:-http://dashboard:3001}" + export ADMIN_INTERNAL_URL="${ADMIN_INTERNAL_URL:-http://admin:3002}" + docker build \ + --build-arg API_INTERNAL_URL=$API_INTERNAL_URL \ + --build-arg DASHBOARD_INTERNAL_URL=$DASHBOARD_INTERNAL_URL \ + --build-arg ADMIN_INTERNAL_URL=$ADMIN_INTERNAL_URL \ --build-arg NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \ --build-arg NEXT_PUBLIC_MARKETPLACE_URL=$NEXT_PUBLIC_MARKETPLACE_URL \ --build-arg NEXT_PUBLIC_DASHBOARD_URL=$NEXT_PUBLIC_DASHBOARD_URL \ diff --git a/Dockerfile.production b/Dockerfile.production index ee6ed6b..e41f833 100644 --- a/Dockerfile.production +++ b/Dockerfile.production @@ -8,12 +8,21 @@ COPY package.json package-lock.json turbo.json tsconfig.base.json ./ COPY apps ./apps COPY packages ./packages +# These URLs are read by Next.js config during `next build`, so the production +# image must bake Docker-network service URLs instead of localhost defaults. +ARG API_INTERNAL_URL=http://api:4000/api/v1 +ARG DASHBOARD_INTERNAL_URL=http://dashboard:3001 +ARG ADMIN_INTERNAL_URL=http://admin:3002 + # NEXT_PUBLIC_* vars must be present at build time — they are inlined into JS bundles ARG NEXT_PUBLIC_API_URL ARG NEXT_PUBLIC_MARKETPLACE_URL ARG NEXT_PUBLIC_DASHBOARD_URL ARG NEXT_PUBLIC_ADMIN_URL -ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \ +ENV API_INTERNAL_URL=$API_INTERNAL_URL \ + DASHBOARD_INTERNAL_URL=$DASHBOARD_INTERNAL_URL \ + ADMIN_INTERNAL_URL=$ADMIN_INTERNAL_URL \ + NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \ NEXT_PUBLIC_MARKETPLACE_URL=$NEXT_PUBLIC_MARKETPLACE_URL \ NEXT_PUBLIC_DASHBOARD_URL=$NEXT_PUBLIC_DASHBOARD_URL \ NEXT_PUBLIC_ADMIN_URL=$NEXT_PUBLIC_ADMIN_URL diff --git a/docker-compose.production.yml b/docker-compose.production.yml index 9b9a03b..f7db651 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -32,6 +32,9 @@ services: context: . dockerfile: Dockerfile.production args: + API_INTERNAL_URL: ${API_INTERNAL_URL:-http://api:4000/api/v1} + DASHBOARD_INTERNAL_URL: ${DASHBOARD_INTERNAL_URL:-http://dashboard:3001} + ADMIN_INTERNAL_URL: ${ADMIN_INTERNAL_URL:-http://admin:3002} NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} NEXT_PUBLIC_MARKETPLACE_URL: ${NEXT_PUBLIC_MARKETPLACE_URL} NEXT_PUBLIC_DASHBOARD_URL: ${NEXT_PUBLIC_DASHBOARD_URL} @@ -57,6 +60,14 @@ services: build: context: . dockerfile: Dockerfile.production + args: + API_INTERNAL_URL: ${API_INTERNAL_URL:-http://api:4000/api/v1} + DASHBOARD_INTERNAL_URL: ${DASHBOARD_INTERNAL_URL:-http://dashboard:3001} + ADMIN_INTERNAL_URL: ${ADMIN_INTERNAL_URL:-http://admin:3002} + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} + NEXT_PUBLIC_MARKETPLACE_URL: ${NEXT_PUBLIC_MARKETPLACE_URL} + NEXT_PUBLIC_DASHBOARD_URL: ${NEXT_PUBLIC_DASHBOARD_URL} + NEXT_PUBLIC_ADMIN_URL: ${NEXT_PUBLIC_ADMIN_URL} healthcheck: test: ["CMD-SHELL", "node -e \"require('http').get('http://localhost:4000/health', (r) => process.exit(r.statusCode < 400 ? 0 : 1)).on('error', () => process.exit(1))\""] interval: 15s @@ -98,6 +109,9 @@ services: context: . dockerfile: Dockerfile.production args: + API_INTERNAL_URL: ${API_INTERNAL_URL:-http://api:4000/api/v1} + DASHBOARD_INTERNAL_URL: ${DASHBOARD_INTERNAL_URL:-http://dashboard:3001} + ADMIN_INTERNAL_URL: ${ADMIN_INTERNAL_URL:-http://admin:3002} NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} NEXT_PUBLIC_MARKETPLACE_URL: ${NEXT_PUBLIC_MARKETPLACE_URL} NEXT_PUBLIC_DASHBOARD_URL: ${NEXT_PUBLIC_DASHBOARD_URL} @@ -134,6 +148,9 @@ services: context: . dockerfile: Dockerfile.production args: + API_INTERNAL_URL: ${API_INTERNAL_URL:-http://api:4000/api/v1} + DASHBOARD_INTERNAL_URL: ${DASHBOARD_INTERNAL_URL:-http://dashboard:3001} + ADMIN_INTERNAL_URL: ${ADMIN_INTERNAL_URL:-http://admin:3002} NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} NEXT_PUBLIC_MARKETPLACE_URL: ${NEXT_PUBLIC_MARKETPLACE_URL} NEXT_PUBLIC_DASHBOARD_URL: ${NEXT_PUBLIC_DASHBOARD_URL} @@ -170,6 +187,9 @@ services: context: . dockerfile: Dockerfile.production args: + API_INTERNAL_URL: ${API_INTERNAL_URL:-http://api:4000/api/v1} + DASHBOARD_INTERNAL_URL: ${DASHBOARD_INTERNAL_URL:-http://dashboard:3001} + ADMIN_INTERNAL_URL: ${ADMIN_INTERNAL_URL:-http://admin:3002} NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} NEXT_PUBLIC_MARKETPLACE_URL: ${NEXT_PUBLIC_MARKETPLACE_URL} NEXT_PUBLIC_DASHBOARD_URL: ${NEXT_PUBLIC_DASHBOARD_URL}