Деплой
Инфраструктура
| Компонент | Значение |
|---|---|
| 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 (не через правки БД) |