From a4f8c37b842e5731259735fc21b236038d103ba8 Mon Sep 17 00:00:00 2001 From: "Vaka.pro" Date: Sun, 12 Apr 2026 18:39:04 +0300 Subject: [PATCH] fix(docker): use unique Compose service name for API upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename stack service from backend to runners-calendar-backend so DNS on shared external networks (e.g. postgres_default) cannot resolve to another project’s backend. Nginx proxy_pass targets the same hostname. Made-with: Cursor --- Dockerfile.frontend | 2 +- README.md | 8 ++++---- docker-compose.stack.yml | 11 ++++++----- docker/nginx.frontend.conf | 2 +- docs/backend-api-for-frontend.md | 2 +- docs/backend.md | 4 ++-- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Dockerfile.frontend b/Dockerfile.frontend index c614298..a0989aa 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -1,5 +1,5 @@ # Сборка из корня монорепо: docker build -f Dockerfile.frontend . -# SPA дергает API по префиксу /api (nginx проксирует на сервис backend:3000). +# SPA дергает API по префиксу /api (nginx проксирует на сервис runners-calendar-backend:3000). FROM node:20-alpine AS build WORKDIR /app COPY frontend/package.json frontend/package-lock.json ./ diff --git a/README.md b/README.md index ee51aac..73eda49 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ npm install npm run dev ``` -Фронт всегда отправляет запросы на относительный префикс `**/api**`. В dev это проксирует Vite на `http://localhost:3001`, в Docker/проде — nginx фронта проксирует на backend. У бэкенда `CORS_ORIGIN` должен совпадать с origin приложения (например `http://localhost:5173`). +Фронт всегда отправляет запросы на относительный префикс `**/api**`. В dev это проксирует Vite на `http://localhost:3001`, в Docker/проде — nginx фронта проксирует на `runners-calendar-backend:3000`. У бэкенда `CORS_ORIGIN` должен совпадать с origin приложения (например `http://localhost:5173`). ## Docker: backend + frontend рядом с Postgres @@ -36,11 +36,11 @@ npm run dev ```bash docker compose -f docker-compose.stack.yml up -d --build -docker compose -f docker-compose.stack.yml exec backend node dist/migrate.js -docker compose -f docker-compose.stack.yml exec backend node dist/seed.js +docker compose -f docker-compose.stack.yml exec runners-calendar-backend node dist/migrate.js +docker compose -f docker-compose.stack.yml exec runners-calendar-backend node dist/seed.js ``` -Фронт в браузере обращается к API по префиксу `**/api**` (nginx в образе фронта проксирует на backend). +Фронт в браузере обращается к API по префиксу `**/api**` (nginx в образе фронта проксирует на сервис `runners-calendar-backend` в той же сети). ## Документация API и бэкенда diff --git a/docker-compose.stack.yml b/docker-compose.stack.yml index 43d110c..9fbbf1f 100644 --- a/docker-compose.stack.yml +++ b/docker-compose.stack.yml @@ -10,13 +10,14 @@ # docker compose -f docker-compose.stack.yml up -d --build # # Миграции и seed (один раз после появления БД): -# docker compose -f docker-compose.stack.yml exec backend node dist/migrate.js -# docker compose -f docker-compose.stack.yml exec backend node dist/seed.js +# docker compose -f docker-compose.stack.yml exec runners-calendar-backend node dist/migrate.js +# docker compose -f docker-compose.stack.yml exec runners-calendar-backend node dist/seed.js # -# NPM: проброс на порт 3033. Браузер ходит на /api → nginx во фронте → backend:3000. +# NPM: проброс на порт 3033. Браузер ходит на /api → nginx во фронте → runners-calendar-backend:3000. +# Имя сервиса уникально в общей сети (не «backend»), чтобы не пересекаться с другими стеками. services: - backend: + runners-calendar-backend: build: context: . dockerfile: Dockerfile.backend @@ -40,7 +41,7 @@ services: dockerfile: Dockerfile.frontend container_name: runners-calendar-frontend depends_on: - - backend + - runners-calendar-backend ports: - "3033:80" restart: unless-stopped diff --git a/docker/nginx.frontend.conf b/docker/nginx.frontend.conf index aff7c21..5ba3e96 100644 --- a/docker/nginx.frontend.conf +++ b/docker/nginx.frontend.conf @@ -10,7 +10,7 @@ server { # Браузер ходит на тот же origin: /api/* → бэкенд с тем же префиксом /api location /api/ { - proxy_pass http://backend:3000; + proxy_pass http://runners-calendar-backend:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/docs/backend-api-for-frontend.md b/docs/backend-api-for-frontend.md index 92d7d96..b8813ea 100644 --- a/docs/backend-api-for-frontend.md +++ b/docs/backend-api-for-frontend.md @@ -5,7 +5,7 @@ SPA всегда отправляет запросы на относительный префикс `/api` текущего origin. - В dev (`npm run dev`): Vite proxy отправляет `/api/*` на `http://localhost:3001/api/*`. -- В Docker/проде: nginx фронта проксирует `/api/*` на backend в той же сети. +- В Docker/проде: nginx фронта проксирует `/api/*` на хост `runners-calendar-backend:3000` в той же сети (уникальное имя сервиса Compose, без коллизий с чужими стеками). ## 2. CORS diff --git a/docs/backend.md b/docs/backend.md index f0799f3..d9914fd 100644 --- a/docs/backend.md +++ b/docs/backend.md @@ -78,7 +78,7 @@ API слушает порт: **`PORT`** (если задан), иначе **`API | `API_PORT` | Порт API-сервера | `3001` | | `CORS_ORIGIN` | Разрешённый origin для CORS | `http://localhost:5173` | -Фронтенд всегда обращается к API по префиксу `/api` на текущем origin. В локальной разработке этот префикс проксирует Vite (`frontend/vite.config.ts`) на `http://localhost:3001`; в Docker-стеке — nginx фронта проксирует на backend. +Фронтенд всегда обращается к API по префиксу `/api` на текущем origin. В локальной разработке этот префикс проксирует Vite (`frontend/vite.config.ts`) на `http://localhost:3001`; в Docker-стеке — nginx фронта проксирует на `runners-calendar-backend:3000`. **Без mock:** при отсутствии любой из `DB_*` процесс падает при старте: `Missing required environment variable: `. @@ -118,4 +118,4 @@ backend/ Файл [`docker-compose.stack.yml`](../docker-compose.stack.yml) поднимает API и nginx со статикой SPA в **внешней** сети Docker (рядом с уже запущенным Postgres). Переменные — в **корневом** `.env` (шаблон [`.env.example`](../.env.example)): как минимум `DB_*`, `CORS_ORIGIN` (для выдачи фронта на порту 3033 задайте `http://localhost:3033`). Перед первым `up` файл `.env` должен существовать. -Порядок после старта контейнеров: `node dist/migrate.js` и `node dist/seed.js` внутри контейнера `backend` (см. комментарии в compose-файле). +Порядок после старта контейнеров: `node dist/migrate.js` и `node dist/seed.js` внутри сервиса `runners-calendar-backend` (см. комментарии в compose-файле).