Документация · Раздел 2 · Архитектура
v1.0 · июль 2026

Раздел 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
Граф LineageVue Flow (@vue-flow/core)
Состояние фронтапростые reactive()/ref() стор-модули
UIручной CSS + inline SVG-иконки
Reverse proxynginx 1.27 (path-based routing)
Excelopenpyxl (backend), xlsx (frontend Form Filler)
Authсамописный HS256 JWT; тестовые токены без паролей

2.2 · Топология сервисов (docker-compose)

Единый хост, один docker-compose.yml. Каждый модуль = backend (FastAPI) + frontend (Vue/Vite), всё за одним nginx. Одна общая Postgres с 4 базами.

Сервис (DNS-имя)Что этоВнутр. портБД
postgresPostgreSQL 16-alpine (user/pw forms/forms)5432 (публ.)
dg-backendData Governance API8000forms_dg
dg-frontendОсновной Vue-портал (base=/demo/)5173
admin-frontendТот же фронт, режим админа (/demo_admin/)5177
dg-module-frontendТот же фронт, DG-only (/demo_dg/)5178
form-builder-backendКонструктор форм API8100form_builder
form-builder-frontendКонструктор форм UI (/demo/form-builder/)5174
task-manager-backendСбор/согласование/DQ API8200task_manager
task-manager-frontendРегуляторный UI (/demo/submission/)5175
form-filler-backendКабинет организации API8300form_filler
form-filler-frontendКабинет организации UI (/demo_org/)5176
nginxReverse proxy80 (публ.)
Одна кодовая база — три инкарнации. 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).