This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Развёртывание
Развёртывание, CI/CD, мониторинг и резервное копирование СТАНКИН Анти-Спам.
Docker
Docker-образ
Образ собирается локально из Dockerfile:
stankin-antispam:latest
Dockerfile использует многостадийную сборку:
- frontend-builder — сборка фронтенда (Node.js 22, TypeScript, SCSS, Tailwind)
- deps-builder — установка Python-зависимостей через uv (Python 3.14)
- schema-builder — временный Postgres, применение миграций и
pg_dump --schema-onlyвschema.sql - erd-builder — сборка статического ERD-вьювера Liam (
@liam-hq/cli) изschema.sqlвerd_dist - pkg-builder — системные пакеты из Chainguard dev-образа (для ONNX Runtime и pg_dump)
- runtime — минимальный образ на базе Chainguard Python
Runtime-образ не содержит shell, что уменьшает поверхность атаки.
Диаграмма БД (ERD)
Панель раздаёт интерактивную диаграмму схемы базы данных по адресу /erd (вьювер Liam ERD, собирается на стадии erd-builder). Страница доступна только авторизованным пользователям панели, как и /docs. Без Docker-сборки каталог panel/erd_dist отсутствует и /erd отдаёт 404.
Docker Compose
Конфигурация docker-compose.yml:
services:
app:
build: .
image: stankin-antispam:latest
container_name: stankin-antispam
user: root
env_file: .env
environment:
ORT_DISABLE_TELEMETRY: "1"
TZ: "Europe/Moscow"
network_mode: host
volumes:
- ./models:/app/models
- ./logs:/app/logs
- ./data:/app/data
restart: unless-stopped
Используется network_mode: host: контейнер работает в сети хоста, поэтому публикация портов не требуется — веб-панель доступна на порту PANEL_PORT (по умолчанию 12523) напрямую. Переменная ORT_DISABLE_TELEMETRY отключает телеметрию onnxruntime, которая вызывает падение по SIGSEGV на Python 3.14.
Монтируемые директории:
models/— ML-модели (BERT, ONNX)logs/— файлы логовdata/— данные приложения
Развёртывание на сервере
- Установите Docker и Docker Compose на сервер
- Склонируйте репозиторий или создайте директорию с
docker-compose.ymlи.env - Заполните
.env(минимум:BOT_TOKEN,DATABASE_URL,SECRET_KEY,NOTIFICATION_CHAT_ID) - Убедитесь, что PostgreSQL доступен с сервера
- Запустите:
docker compose up -d
- Проверьте логи:
docker compose logs -f
Обновление
docker compose build
docker compose up -d
Образ пересобирается локально из Dockerfile.
Сборка образа
Docker-образ собирается вручную на сервере из Dockerfile при обновлении:
docker compose build
docker compose up -d
Многостадийная сборка кеширует слои фронтенда и Python-зависимостей, поэтому повторная сборка занимает заметно меньше времени, чем первая.
CI
CI настроен через Forgejo Actions в .forgejo/workflows/ci.yml. Workflow запускается при пуше в master и вручную (workflow_dispatch).
Джобы:
test— установка Python 3.14 через uv, прогон unit- и интеграционных тестов pytest с отчётом покрытия. Реальная БД и сеть не требуются: тесты используют фейковый пул соединений.build-and-push— сборка Docker-образа и публикация в реестрscm.overklassniy.space/nyashki/stankin-antispam:latest. Запускается после успешных тестов.repo-stats— генерация отчёта о статистике кода через scc, результат загружается как артефакт прогона.wiki— синхронизация каталога.docsв вики-репозиторийSTANKIN_AntiSpam.wiki.git. Выполняется только если в пуше изменились файлы.docs(или при ручном запуске). Файлы раскладываются по страницам с числовым префиксом,README.mdстановится главной страницейHome.md; синхронизация полностью пересоздаёт вики.
Для работы джоб использует секрет FGJ_TOKEN (права на реестр контейнеров и запись в вики).
Мониторинг
Sentry
Интеграция с Sentry настраивается через переменные окружения:
SENTRY_DSN— обязательный для включения мониторингаSENTRY_TRACES_SAMPLE_RATE— процент трейс-сессийSENTRY_ENABLE_LOGS— отправка логов как structured logsSENTRY_LOGS_LEVEL— уровень логов для structured logsSENTRY_BREADCRUMBS_LEVEL— уровень breadcrumbsSENTRY_EVENT_LEVEL— уровень events
Sentry перехватывает:
- Неперехваченные исключения в обработчиках бота
- Ошибки в FastAPI-приложении
- Контекстные breadcrumbs для диагностики
Версия приложения (APP_VERSION) передаётся в Sentry как release.
Логирование
Логи записываются в файлы в директории logs/ и выводятся в stdout. Уровень логирования зависит от режима:
- Обычный режим —
INFO - Тестовый режим (
TESTING=true) —DEBUG
Резервное копирование
Автоматические бэкапы
Настраиваются через веб-панель или API:
BACKUP_ENABLED— включение автоматических бэкаповBACKUP_START_TIME— время начала (формат HH:MM)BACKUP_INTERVAL_HOURS— интервал в часах
Процесс:
- Создание дампа БД через
pg_dump - Вычисление SHA-256 хеша файла
- Отправка файла в Telegram-чат управления в тред
NOTIFICATION_CHAT_BACKUP_THREAD
Ручной бэкап
Через API:
curl -X POST http://localhost:12523/api/v1/backup \
-H "Cookie: session=..."
Через веб-панель — кнопка создания резервной копии в разделе настроек.
Требуется наличие pg_dump в окружении. В Docker-образе postgresql-client предустановлен.