Clone
8
Deployment
Hermes Agent edited this page 2026-10-11 22:55:17 +02:00

Деплой

Инфраструктура

Компонент Значение
Gitea admin/social-post-writer-bot, ветка dev (push → автодеплой)
Coolify проект Social Post Writer Bot
Coolify окружение development
Coolify приложение social-post-writer-bot-development (d32u5zcq2g4odmdpq9hw91yn)
Сервер приложения spb-easy-dale (31.129.103.242)
Бот @post_master_bot
Группа поддержки супергруппа с темами, chat.id = -1008000863273
Версия VERSION, сейчас 0.1.0+61

Сервер управления Coolify и сервер приложения — разные хосты. Проверять контейнер нужно на сервере приложения, а не на хосте Coolify.


Деплой-скрипт

bash /root/.hermes/scripts/gitea_deploy.sh dev

Скрипт делает POST /api/v1/deploy?uuid=<APP_UUID>&force=false. Токен берётся из /root/.hermes/.env (COOLIFY_TOKEN), API — http://10.19.0.2:8000/api/v1.

Coolify API не имеет endpoint /applications/{uuid}/deploy — деплой запускается именно через /deploy?uuid=....

Успешный ответ:

{"deployments":[{"message":"Application ... deployment queued.","deployment_uuid":"..."}]}

Проверка после деплоя

Не полли статус API: у приложения нет healthcheck, running:unknown ничего не доказывает — контейнер мог упасть с ImportError и всё ещё числиться running.

Проверяй лог контейнера на сервере приложения:

ssh root@31.129.103.242 \
  'docker ps -a --filter name=d32u5zcq2g4odmdpq9hw91yn --format "{{.Names}} {{.Status}}"'
# Coolify добавляет к UUID суффикс релиза — используй фактическое имя контейнера:
ssh root@31.129.103.242 'docker logs --tail 60 <CONTAINER_NAME>'

Успешный запуск:

INFO:__main__:Development deploy notice sent: version=0.1.0+61
INFO:aiogram.dispatcher:Start polling
INFO:aiogram.dispatcher:Run polling for bot @post_master_bot id=2201652808 - 'Мастер постинга'

Плохой запуск — ImportError / ModuleNotFoundError / Traceback в последних строках.

Если настроен вебхук Coolify → Hermes (POST https://hrms217.dynv6.net/webhooks/coolify), результат деплоя приходит сам — поллить не нужно.


Переменные окружения (Coolify)

Переменная Назначение
BOT_TOKEN токен Telegram-бота
APINEX_API_KEY ключ APInex
APINEX_STT_MODEL модель STT (дефолт nova-2)
APINEX_INTENT_CLASSIFIER_MODEL классификация намерений
APINEX_INJECTION_CLASSIFIER_MODEL проверка prompt injection
APINEX_POST_WRITER_MODEL генерация постов/идей
APINEX_IMAGE_TONE_MODEL vision (OCR скриншотов, ToV)
APINEX_RESPONSE_REPAIR_MODEL починка невалидного JSON (опционально)
BOT_DB_PATH путь к SQLite (/app/data/social_writer.sqlite3)
RAW_UPDATES_DB_PATH БД сырых апдейтов (по умолчанию /app/data/bot_updates.sqlite3)
BOT_LOG_PATH файл лога (по умолчанию /app/data/bot.log)
DEPLOY_ENV development — включает dev-поведение (уведомления о версии, диагностику, raw update log, dev-оплату)
DEV_CHAT_ID чат для уведомлений о новой версии
SUPPORT_GROUP_ID id группы операторов (супергруппа с темами); без неё поддержка выключена
SUPPORT_NOTE_PREFIX префикс внутренней заметки (default //)
SUPPORT_GREETINGS пул приветствий оператора, разделитель `
SUPPORT_OPERATOR_SIGNATURE подпись ответа оператора (default Оператор поддержки)
SUPPORT_TOPIC_EMOJI_ID custom emoji id на топике обращения (optional)

Правила:

  • DEPLOY_ENV включает dev-поведение только при точном значении development; production, пустое и неизвестное значение отключают его.
  • BOT_ENV отдельно выбирает Telegram Bot API и не используется для включения dev-поведения.
  • Секреты хранятся только в Coolify, в репозиторий не попадают.

Версионирование

  • Версия лежит в файле VERSION.
  • При каждом изменении кода версию нужно поднять (0.1.0+N).
  • При DEPLOY_ENV=development бот сравнивает сохранённую версию с текущей и, если они различаются, шлёт уведомление о версии в DEV_CHAT_ID.

Если версию не поднять, уведомление не отправится — notify_development_deploy делает return при совпадении.


Docker

FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY bot.py apinex_client.py user_store.py help_message.py payments.py keyboards.py raw_updates.py support.py activity_phrases.py VERSION ./
CMD ["python", "bot.py"]

При добавлении нового модуля его нужно добавить в COPY — иначе контейнер упадёт с ModuleNotFoundError при старте (так уже было с raw_updates.py).


Данные

Persistent volume d32u5zcq2g4odmdpq9hw91yn-social-post-writer-dev-data → монтируется в /app/data:

Файл Что
social_writer.sqlite3 рабочая БД (пользователи, ToV, посты, идеи, API-логи, подписки, платежи)
bot_updates.sqlite3 сырые входящие Telegram Update (только development, retention 30 дней)
social_writer.sqlite3 → support_topics привязка пользователя к топику поддержки
bot.log ротационный лог приложения (5 MiB × 3 архива)

WAL-режим, busy_timeout = 10000.

Поиск апдейта: SELECT payload FROM raw_updates WHERE update_id = ?.


Типичные проблемы

Симптом Причина Решение
ModuleNotFoundError в логах после деплоя новый модуль не добавлен в COPY Dockerfile добавить в COPY, поднять VERSION, redeploy
Нет уведомления о новой версии версия не изменена поднять VERSION
Деплой не запускается неверный COOLIFY_TOKEN или uuid проверить токен/uuid
no such table: ... БД создана до миграции или volume не смонтирован init_db() вызывается при старте — проверь монтирование volume
Автодеплой не срабатывает на push приложение не привязано к Git-проекту в Coolify Projects → привязать репо; проверить repository_project_id ≠ null и webhook в Gitea
TelegramNotFound / 404 на get_me мёртвый или не тот BOT_TOKEN обновить токен в Coolify (не через правки БД)