Развертывание
Документ описывает продакшен-запуск после разделения проекта на backend, frontend и worker.
Перед стартом заполните минимальный .env по configuration.md. Полный справочник переменных лежит в configuration/env-vars.md; после первого входа большинство продуктовых настроек удобнее менять через Web App админку.
Быстрый старт
Заголовок раздела «Быстрый старт»Обычный docker compose up -d --build поднимает:
postgresиredisс проверками здоровья;migrateкак одноразовый сервис на backend-образе;backendтолько после успешных миграций;workerтолько после успешных миграций;frontendкак отдельный nginx-образ без Python runtime.
Основной путь миграций — отдельный сервис migrate. backend и worker также выполняют
безопасную проверку схемы на старте под PostgreSQL advisory lock, поэтому прямой запуск сервиса
без compose тоже применит недостающие миграции и не создаст гонку на схеме БД.
Готовые папки запуска
Заголовок раздела «Готовые папки запуска»Для production удобнее использовать не корневой compose, а отдельные примеры из
Deploy examples. В каждой папке лежат свой docker-compose.yml,
.env.example и нужный конфиг рядом, а подробные инструкции хранятся в docs/:
| Папка | Назначение | Запуск |
|---|---|---|
| Caddy | Caddy с автоматическим HTTPS. | cp .env.example .env, заполнить .env, docker compose up -d. |
| Nginx | Nginx в Docker-сети приложения, TLS-сертификаты кладутся в ssl/. | cp .env.example .env, заполнить .env, положить сертификаты, docker compose up -d. |
| Pangolin/Newt | Pangolin/Newt без входящих портов на сервере приложения. | cp .env.example .env, заполнить Newt credentials, создать ресурсы в Pangolin, docker compose up -d. |
| No proxy | Прямая публикация портов backend/frontend. | cp .env.example .env, заполнить публичные URL и порты, docker compose up -d. |
Пример для Caddy:
Корневой docker-compose.yml оставлен для локальной сборки из исходников. Примеры в
deploy/examples используют готовые GHCR-образы и не требуют указывать -f.
Миграции
Заголовок раздела «Миграции»При обычном старте миграции применяются автоматически:
Для ручного повторного запуска:
Проверить логи миграций:
backend и worker зависят от migrate через service_completed_successfully; если миграции
падают, приложение не стартует поверх неподготовленной БД. При прямом запуске backend или
worker без compose тот же init_db применяет недостающие миграции перед стартом логики сервиса.
Сервисы
Заголовок раздела «Сервисы»backend: aiohttp API, Telegram webhook, платежные webhooks, panel webhooks, проверка здоровья/healthz.worker: TariffTrafficWorker, задачи синхронизации с панелью, обработка рассылок, потребители очереди webhooks.frontend: статические Svelte-ассеты через nginx.postgres: PostgreSQL 17.redis: Redis 7 для FSM, кеша, rate-limit, очередей и locks.
В production-примерах внешний доступ добавляют caddy, nginx, newt или прямые ports в
соответствующем варианте из Deploy examples.
Логи и проверка
Заголовок раздела «Логи и проверка»Эндпоинты проверки здоровья:
В обычном compose backend публикуется на 127.0.0.1:${WEB_SERVER_PORT:-8080}, frontend на
127.0.0.1:${FRONTEND_PORT:-8082}. В новых production-примерах проверяйте bind-переменные
конкретной папки: HTTP_BIND, HTTPS_BIND, WEB_SERVER_BIND или FRONTEND_BIND.
Обновление
Заголовок раздела «Обновление»Локальная сборка из репозитория:
Если нужно пересобрать только образы приложения:
Образы GHCR
Заголовок раздела «Образы GHCR»Образы приложения называются единообразно:
Сборка образов с конкретным тегом:
Публикация после docker login ghcr.io:
Для PowerShell есть варианты scripts/docker-build-images.ps1 и
scripts/docker-push-images.ps1. Если публикуете образы в другой registry, namespace или с другим
префиксом имени, переопределите IMAGE_NAMESPACE, IMAGE_REGISTRY или IMAGE_PREFIX.
Для Docker Hub аккаунта 3252a8 есть отдельный скрипт, который сразу собирает и публикует все три
образа:
PowerShell-вариант:
По умолчанию он публикует:
Если PowerShell блокирует локальные скрипты ошибкой PSSecurityException / Execution Policy,
запустите те же скрипты с обходом политики только для текущего процесса:
Этот bypass действует только для запущенного процесса powershell и не меняет системную политику.
Масштабирование
Заголовок раздела «Масштабирование»В текущих Compose-файлах заданы явные container_name, поэтому docker compose --scale для
backend, frontend и worker не используется: Docker не может создать несколько контейнеров с
одним именем. Если понадобится горизонтальное масштабирование, уберите container_name у
масштабируемых сервисов или перенесите конфигурацию в orchestrator.
Состояние FSM, rate-limit и краткоживущие кеши вынесены в Redis, а tariff tick защищен Redis distributed lock; код подготовлен к нескольким репликам, но текущие Compose-файлы ориентированы на фиксированные имена контейнеров.
Данные и volumes
Заголовок раздела «Данные и volumes»Продакшен compose использует именованные volumes:
postgres-data;redis-data;shop-data; В Caddy-варианте также используютсяcaddy-dataиcaddy-config.
shop-data монтируется целиком в /app/data; внутри него лежат тарифы, темы, логотипы и прочие
файловые данные приложения.
Если вместо именованного volume включаете bind mount ./data:/app/data, на сервере заранее дайте права
пользователю контейнера 10001:
Проверка прав:
Резервная копия PostgreSQL
Заголовок раздела «Резервная копия PostgreSQL»Восстановление в чистую БД:
Обратный прокси
Заголовок раздела «Обратный прокси»Готовые reverse-proxy примеры лежат в:
- Caddy - автоматический HTTPS;
- Nginx - сертификаты кладутся рядом в
ssl/; - Newt/Pangolin - без входящих портов на сервере приложения.
Во всех вариантах схема одинаковая:
- webhook/backend-домен целиком идет в
backend:8080; - Mini App/frontend-домен целиком идет в
frontend:80; - API/auth/theme routes Mini App дальше проксируются frontend nginx в
backend:8081.
Минимальная логика Caddy:
Минимальная логика Nginx такая же: webhooks.example.com проксируется в backend:8080,
app.example.com - в frontend:80. В deploy/examples/nginx/nginx.conf.template уже есть
заголовки X-Forwarded-*, редирект HTTP -> HTTPS и пути сертификатов.
Для Newt используйте Pangolin / Newt. В compose уже есть сервис
newt, а в .env.example - поля PANGOLIN_ENDPOINT, NEWT_ID и NEWT_SECRET.
В Pangolin создайте два HTTP-ресурса для этого Newt site:
backend:8081 является внутренним WebApp API/auth-сервером для frontend nginx; обычно его не нужно
указывать в Newt напрямую.
Переменный env-файл
Заголовок раздела «Переменный env-файл»По умолчанию compose читает .env. Для smoke-тестов или отдельного окружения можно подставить
другой файл: