179 lines
11 KiB
Markdown
179 lines
11 KiB
Markdown
# Стек технологий и архитектура развёртывания
|
||
|
||
**Проект:** АС «Платформа ОПОРА РОССИИ»
|
||
**Статус:** согласовано (бэкапы отложены, выбор 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, макеты экранов.
|