Files
opora/docs/stack.md
T

11 KiB

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

Проект: АС «Платформа ОПОРА РОССИИ» Статус: согласовано (бэкапы отложены, выбор 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-ассистент «Зам» Внешний LLM API: OpenRouter / PiAPI Без GPU; выбор модели — в тестировании (см. раздел 8)

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-ассистент: тестирование моделей

Выбор LLM — в тестировании. Критерии оценки:

Критерий Что проверяем
Русский язык Качество текста, терминология («точка 0», «прирост», «красная зона»)
Function calling Надёжность вызова инструментов (заполнить карточку, создать задачу, загрузить артефакт)
Стоимость Цена за 1M токенов, оценка месячного бюджета
Скорость Латентность ответа
Контекст Размер окна (сводки по 89 регионам)
Стабильность Повторяемость структурированного вывода (JSON)

Кандидаты (через OpenRouter): GPT-4o / GPT-4o-mini, Claude (Sonnet/Haiku), Gemini Flash, Qwen, DeepSeek, Mistral. PiAPI — уточнить назначение (генерация изображений/медиа для артефактов или LLM).


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

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

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

  1. Провести тестирование LLM-моделей (раздел 8).
  2. Утвердить документ.
  3. Перейти к техническому проекту: структура БД, контракты API, макеты экранов.