Раздел 2
Архитектура (реальная)
Топология из 11 контейнеров за одним nginx, 4 базы PostgreSQL, dev-режим. Ниже — стек, карта портов и маршрутизации.
2.1 · Технологический стек (по факту кода)
| Слой | Технология |
|---|---|
| Backend (все 4 сервиса) | FastAPI, SQLAlchemy 2.x, Pydantic v2, Uvicorn |
| БД | PostgreSQL 16 в Docker (в коде дефолт — SQLite, только для локального запуска без Docker) |
| Frontend (все) | Vue 3 (<script setup> + TS), Vite, vue-router 4, axios |
| Граф Lineage | Vue Flow (@vue-flow/core) |
| Состояние фронта | простые reactive()/ref() стор-модули |
| UI | ручной CSS + inline SVG-иконки |
| Reverse proxy | nginx 1.27 (path-based routing) |
| Excel | openpyxl (backend), xlsx (frontend Form Filler) |
| Auth | самописный HS256 JWT; тестовые токены без паролей |
2.2 · Топология сервисов (docker-compose)
Единый хост, один docker-compose.yml. Каждый модуль = backend (FastAPI) + frontend (Vue/Vite), всё за одним nginx. Одна общая Postgres с 4 базами.
| Сервис (DNS-имя) | Что это | Внутр. порт | БД |
|---|---|---|---|
postgres | PostgreSQL 16-alpine (user/pw forms/forms) | 5432 (публ.) | — |
dg-backend | Data Governance API | 8000 | forms_dg |
dg-frontend | Основной Vue-портал (base=/demo/) | 5173 | — |
admin-frontend | Тот же фронт, режим админа (/demo_admin/) | 5177 | — |
dg-module-frontend | Тот же фронт, DG-only (/demo_dg/) | 5178 | — |
form-builder-backend | Конструктор форм API | 8100 | form_builder |
form-builder-frontend | Конструктор форм UI (/demo/form-builder/) | 5174 | — |
task-manager-backend | Сбор/согласование/DQ API | 8200 | task_manager |
task-manager-frontend | Регуляторный UI (/demo/submission/) | 5175 | — |
form-filler-backend | Кабинет организации API | 8300 | form_filler |
form-filler-frontend | Кабинет организации UI (/demo_org/) | 5176 | — |
nginx | Reverse proxy | 80 (публ.) | — |
Одна кодовая база — три инкарнации.
admin-frontend и dg-module-frontend — это тот же каталог frontend/, собранный с разными флагами VITE_*_MODULE и base-path.2.3 · Маршрутизация nginx
= / → статический landing.html
/demo/api/v1/ → dg-backend:8000 (→ /api/v1/)
/demo/form-builder-api/api/v1/ → form-builder-backend:8100 (→ /api/v1/)
/demo/submission-api/api/v1/ → task-manager-backend:8200 (→ /api/v1/)
/demo_org/api/v1/ → form-filler-backend:8300 (→ /api/v1/)
/demo/form-builder/ → form-builder-frontend:5174
/demo/submission/ → task-manager-frontend:5175
/demo_org/ → form-filler-frontend:5176
/demo_admin/ → admin-frontend:5177
/demo_dg/ → dg-module-frontend:5178
/demo/ → dg-frontend:5173 (catch-all, последним)
Сервисы общаются по DNS-именам сервисов внутри compose-сети (например http://dg-backend:8000/api/v1). Браузер ходит на same-origin /demo/..., а nginx проксирует. HMR/WebSocket проброшены.
2.4 · Базы данных
- Все 4 backend-а в Docker переключены на Postgres через
*_DATABASE_URL:forms_dg,form_builder,task_manager,form_filler. - Базы создаются скриптом
docker/postgres-init/01-create-databases.shпри первом старте. - В коде дефолт каждого сервиса — SQLite; используется только при локальном запуске без Docker.
- Схема создаётся через
Base.metadata.create_allпри старте; миграции данных и схем выполняются скриптами вscripts/.
2.5 · Dev vs Prod
Стенд собран в dev-режиме: Vite dev-серверы, тривиальные пароли Postgres, только HTTP, разрешительный CORS. Исключение — admin-frontend и dg-module-frontend: собираются (npm run build) и работают через vite preview с VITE_DISABLE_HMR=true.
Обновление кода. Backend-сервисы собираются в образ (исходники копируются при сборке) и запускаются без
--reload — изменения backend применяются пересборкой образа; Vite-фронтенды подхватывают правки на лету (HMR).