diff --git a/.forgejo/workflows/deploy-tradein.yml b/.forgejo/workflows/deploy-tradein.yml index c0917abc..e27f3a2a 100644 --- a/.forgejo/workflows/deploy-tradein.yml +++ b/.forgejo/workflows/deploy-tradein.yml @@ -98,6 +98,7 @@ jobs: # basePath=/trade-in baked-in во время build (Next.js) build-args: | NEXT_PUBLIC_BASE_PATH=/trade-in + NEXT_PUBLIC_API_BASE_URL=/trade-in cache-from: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache cache-to: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache,mode=max tags: | diff --git a/tradein-mvp/docker-compose.prod.yml b/tradein-mvp/docker-compose.prod.yml index c3da88f5..05716b6e 100644 --- a/tradein-mvp/docker-compose.prod.yml +++ b/tradein-mvp/docker-compose.prod.yml @@ -54,9 +54,11 @@ services: container_name: tradein-frontend environment: NODE_ENV: production - # Frontend сам префиксит /trade-in (basePath), а fetch к API делает - # на /trade-in/api/v1/... (см. NEXT_PUBLIC_API_BASE_URL=/trade-in) - NEXT_PUBLIC_API_BASE_URL: "" + # Next.js standalone server.js читает HOSTNAME для bind-адреса. + # Docker по умолчанию ставит HOSTNAME= → сервер слушает + # только свой hostname-интерфейс и недоступен как tradein-frontend:3000. + # Принудительно 0.0.0.0 чтобы Caddy достучался. + HOSTNAME: "0.0.0.0" BACKEND_URL: "http://backend:8000" # internal SSR depends_on: [backend] restart: unless-stopped diff --git a/tradein-mvp/frontend/Dockerfile b/tradein-mvp/frontend/Dockerfile index 6ccdd28a..3ffad9c7 100644 --- a/tradein-mvp/frontend/Dockerfile +++ b/tradein-mvp/frontend/Dockerfile @@ -14,11 +14,15 @@ FROM node:20-alpine AS builder WORKDIR /app ENV NEXT_TELEMETRY_DISABLED=1 -# basePath baked-in во время build (Next.js не может изменить runtime). -# В CI workflow: --build-arg NEXT_PUBLIC_BASE_PATH=/trade-in (для prod); -# в локальном dev: пусто = no-op. +# basePath + API-prefix baked-in во время build (Next.js — build-time only). +# В CI workflow для prod: +# --build-arg NEXT_PUBLIC_BASE_PATH=/trade-in +# --build-arg NEXT_PUBLIC_API_BASE_URL=/trade-in +# В локальном dev: оба пусто = no-op (same-origin). ARG NEXT_PUBLIC_BASE_PATH="" ENV NEXT_PUBLIC_BASE_PATH=$NEXT_PUBLIC_BASE_PATH +ARG NEXT_PUBLIC_API_BASE_URL="" +ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL COPY --from=deps /app/node_modules ./node_modules COPY . . @@ -28,8 +32,12 @@ RUN npm run build # ---- runner ---- FROM node:20-alpine AS runner WORKDIR /app +# HOSTNAME=0.0.0.0 — Next.js standalone server.js биндится по этому env. +# Без него Docker ставит HOSTNAME= и сервер недоступен по +# имени сервиса из других контейнеров (Caddy → 502). ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ + HOSTNAME=0.0.0.0 \ PORT=3000 COPY --from=builder --chown=node:node /app/public ./public