docs: sync wiki with 0.1.0+48 (Deployment)
1 parent
fdf3ec619f
commit
11c7c41dfb
1 file changed
+138
+138
@@ -0,0 +1,138 @@
|
||||
# Деплой
|
||||
|
||||
## Инфраструктура
|
||||
|
||||
| Компонент | Значение |
|
||||
|---|---|
|
||||
| **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](https://t.me/post_master_bot) |
|
||||
| **Версия** | `VERSION`, сейчас `0.1.0+48` |
|
||||
|
||||
> Сервер управления Coolify и сервер приложения — **разные хосты**. Проверять контейнер нужно на сервере приложения, а не на хосте Coolify.
|
||||
|
||||
---
|
||||
|
||||
## Деплой-скрипт
|
||||
|
||||
```bash
|
||||
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=...`.
|
||||
|
||||
Успешный ответ:
|
||||
```json
|
||||
{"deployments":[{"message":"Application ... deployment queued.","deployment_uuid":"..."}]}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Проверка после деплоя
|
||||
|
||||
**Не полли статус API**: у приложения нет healthcheck, `running:unknown` ничего не доказывает — контейнер мог упасть с `ImportError` и всё ещё числиться `running`.
|
||||
|
||||
Проверяй лог контейнера на сервере приложения:
|
||||
|
||||
```bash
|
||||
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+48
|
||||
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` | чат для уведомлений о новой версии |
|
||||
|
||||
**Правила:**
|
||||
- `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
|
||||
|
||||
```dockerfile
|
||||
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 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 дней) |
|
||||
| `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 (не через правки БД) |
|
||||
Reference in new issue
Block a user