Merge pull request 'fix(docker): use unique Compose service name for API upstream' (#20) from fix/docker-api-upstream-ambiguity into main
Some checks failed
CI / build-and-test (push) Has been cancelled

Reviewed-on: #20
This commit was merged in pull request #20.
This commit is contained in:
2026-04-12 15:43:25 +00:00
6 changed files with 15 additions and 14 deletions

View File

@@ -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 ./

View File

@@ -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 и бэкенда

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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: <NAME>`.
@@ -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-файле).