Files
opora/docs/stack.md
T

11 KiB
Raw Blame History

Стек технологий и архитектура развёртывания

Проект: АС «Платформа ОПОРА РОССИИ» Статус: согласовано (бэкапы отложены, выбор LLM — в тестировании) Дата: 26.09.2026


1. Назначение документа

Документ фиксирует согласованный технологический стек и архитектуру развёртывания Системы на физическом сервере заказчика (on-premise, территория РФ). Служит основой для технического проекта и сметы.


2. Согласованный стек

Слой Технология Комментарий
Backend API Python 3.12 + FastAPI Async, автогенерация OpenAPI, единое API для бота и сайта
ORM / миграции SQLAlchemy 2 + Alembic Контроль схемы, миграции
БД PostgreSQL 16 Реляционная СУБД по ТЗ
Кэш / rate-limit Redis Лимиты, кэш, брокер для Celery
Очередь / фоновые задачи Celery + Redis Рассылки, автообновление срезов, ретраи
Планировщик Celery Beat Расписание рассылок и выгрузок
Бот aiogram 3 (Telegram) + адаптер MAX Bot API Единый бот-адаптер с двумя каналами (п. 4.1.13.2 ТЗ)
Frontend React + TypeScript + Vite Mobile-first SPA
UI Tailwind CSS + shadcn/ui Гибкость под брендбук «ОПОРА РОССИИ»
Файлы (артефакты) MinIO (S3-совместимое, локально) Файлы до 50 МБ, привязка к объектам
Контейнеризация Docker Engine + Docker Compose Один сервер; задел под Kubernetes при росте
Reverse proxy / TLS Nginx + Certbot (Let's Encrypt) HTTPS, статика фронтенда
Мониторинг Prometheus + Grafana + Loki Метрики, логи, алерты
Бэкапы Отложены (см. раздел 5) Принятый риск на текущем этапе
CI/CD GitLab CI Сборка образов, деплой на сервер
AI-ассистент «Зам» OpenRouter → deepseek/deepseek-chat Без GPU; модель выбрана по тестам (раздел 8). PiAPI — резерв (медиа)

3. Архитектура развёртывания (физический сервер)

                    Internet
                       │
                 ┌─────▼─────┐
                 │   Nginx   │  TLS (Let's Encrypt), статика, reverse proxy
                 └─────┬─────┘
          ┌────────────┼──────────────┐
          │            │              │
     ┌────▼────┐  ┌────▼────┐   ┌─────▼─────┐
     │  web    │  │   api   │   │  bot      │
     │ (React) │  │FastAPI  │   │ aiogram + │
     │ static  │  │         │   │ MAX adapt │
     └─────────┘  └────┬────┘   └─────┬─────┘
                       │              │
              ┌────────┼──────────────┤
              │        │              │
        ┌─────▼───┐ ┌──▼────┐  ┌──────▼──────┐
        │Postgres │ │ Redis │  │   MinIO     │
        └─────────┘ └───┬───┘  └─────────────┘
                        │
              ┌─────────┴──────────┐
              │  Celery worker +   │
              │  Celery beat       │
              └────────────────────┘

     Мониторинг: Prometheus + Grafana + Loki
     AI: внешний LLM API (OpenRouter / PiAPI) — только обезличенные данные

Состав контейнеров (Docker Compose)

Контейнер Назначение
nginx TLS-терминация, reverse proxy, раздача статики
web Сборка React (или статика через nginx)
api FastAPI (gunicorn + uvicorn workers)
bot aiogram + адаптер MAX
worker Celery worker
beat Celery beat
postgres PostgreSQL 16
redis Redis
minio S3-совместимое хранилище артефактов
prometheus / grafana / loki Мониторинг и логи

4. Параметры сервера

Параметр Значение
ОС Ubuntu Server (LTS)
CPU Intel Xeon
RAM 16 ГБ
GPU нет (AI — через внешний API)
Диск SSD, единый (отдельного диска под бэкапы нет)
Сеть статический IP
Домен opora.my-dpr.ru (тестовый)
TLS Let's Encrypt (Certbot, автообновление)

Примечание по реестру отечественного ПО: сервер на Ubuntu, поэтому полное соответствие реестру (ОС Astra Linux / RED OS) сейчас не достигается. При необходимости импортозамещения — отдельная миграция ОС и СУБД (Postgres Pro / Tantor). На текущем этапе используем стандартный PostgreSQL 16.


5. Надёжность и резервное копирование

Решение заказчика: бэкапы на текущем этапе отложены.

Принятый риск: при сбое диска или ошибке данные могут быть потеряны безвозвратно. Рекомендация на будущее (не блокирует старт):

  • минимальный pg_dump раз в сутки на внешнее хранилище (offsite, S3-совместимое в РФ) — дёшево и снимает основной риск;
  • бэкап артефактов (MinIO) через rclone;
  • хранение ≥ 30 дней (п. 4.1.9 ТЗ);
  • восстановление — не более 24 ч (п. 4.1.4 ТЗ).

Мониторинг доступности и алерты (Prometheus + Alertmanager) — в объёме.


6. Безопасность и 152-ФЗ

  • Все данные — на физическом сервере в РФ (локализация ПДн).
  • TLS на всех внешних соединениях (Let's Encrypt).
  • Одноразовые ссылки входа, привязка сессии к аккаунту мессенджера (п. 4.1.5 ТЗ).
  • Ролевая модель доступа (п. 4.1.8 ТЗ).
  • Журналирование действий пользователей и ассистента.
  • Секреты — через .env / Docker secrets (при необходимости — HashiCorp Vault).

AI-ассистент и внешние API (важно)

OpenRouter и PiAPI — зарубежные сервисы, данные уходят за пределы РФ. Требования:

  • Не передавать персональные данные (ФИО, контакты, аккаунты мессенджеров) во внешний LLM.
  • Передавать только обезличенный контекст: агрегаты по регионам, названия целей, тексты задач без ПДн.
  • Все действия ассистента фиксировать в журнале (кто, что, когда).
  • Ассистент действует в рамках прав владельца, с возможностью отключения/ограничения.
  • Требуется отдельная проработка: правовые основания обработки ПДн, согласия, сроки хранения, меры защиты по ПП-1119.

7. CI/CD

  • GitLab CI: линтеры → тесты → сборка Docker-образов → push в registry → деплой на сервер (SSH).
  • Окружения: dev (локально), staging (на сервере), prod.
  • Миграции БД — Alembic в пайплайне деплоя.

8. AI-ассистент: выбранная модель

Модель: deepseek/deepseek-chat (через OpenRouter).

Выбор сделан по результатам тестирования (стенд tools/test_models.py, отчёт — docs/llm-test-report.md).

Тест Статус Латентность Стоимость
Русский текст (еженедельный фокус целей) ✅ OK 9.65 с $0.00019
Function calling (create_task) ✅ OK 3.55 с $0.00034
Структурированный JSON ✅ OK 3.34 с $0.00008

Оценка стоимости: ~$0.0002–0.0003 за действие ассистента → ~$3/мес при 10 000 действий, ~$30/мес при 100 000.

Критерии, по которым оценивалась модель: русский язык и терминология, надёжность function calling, стоимость, латентность, размер контекста, стабильность JSON.

PiAPI — резервный вариант (генерация медиа), на текущем этапе не используется.


9. Открытые вопросы

  1. Бэкапы — когда включать (отложено).
  2. Реестр отечественного ПО — нужен ли в перспективе.
  3. PiAPI — назначение и момент подключения (резерв).

10. Следующие шаги

  1. Утвердить документ.
  2. Перейти к техническому проекту: структура БД, контракты API, макеты экранов.