Files

3.7 KiB
Raw Permalink Blame History

tg2max-relay

Ретранслятор отчётов report-shot в мессенджер MAX от имени личного аккаунта MAX (без бизнес-бота). Работает в паре с ReportEvryDay и не изменяет его: просто читает тот же docker-volume с PDF-отчётами и хвост лога (для предупреждений о сбоях).

Как это работает

report-shot (тот же сервер)            tg2max-relay
  writes /app/output/*.pdf   ─volume─▶  видит новый otchet_YYYY-MM-DD.pdf
  writes report_shot.log                 шлёт файл+подпись в MAX (vkmax,
                                         личный аккаунт, wss ws-api.oneme.ru)
                                         строки ALERT_RE из лога → текстом
  • vkmax (unofficial user-client MAX, GitHub main) — send_message / send_file.
  • Сессия MAX (device_id + login_token) получается один раз на своём ПК и переносится в переменные Coolify. На сервере ничего интерактивного не нужно.

1. Активация MAX-сессии (один раз, на Windows-ПК)

cd C:\scripts\tg2max-relay
py -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
python -m app.login --phone +7999XXXXXXX
# введите код из приложения/SMS MAX → сохранится max_session.json
python -m app.login --chats   # посмотреть chatId (для MAX_TARGET_CHAT)
python -m app.login --test <chatId>  # проверить отправку

Для «Избранного» в качестве MAX_TARGET_CHAT используется собственный user id (скрипт подскажет его).

2. Deploy в Coolify (рядом с report-shot)

Создано как приложение в том же проекте Report (build pack dockercompose). Переменные в Variables:

Переменная Значение
MAX_DEVICE_ID из шага 1
MAX_LOGIN_TOKEN из шага 1
MAX_TARGET_CHAT chatId (Избранное: свой user id)
TZ Europe/Moscow

compose монтирует volume отчётов read-only bind-путью хоста (/var/lib/docker/volumes/<uuid-report-shot>_report-shot-output/_data → /watch). Если report-shot пересоздан с новым uuid — поправьте путь (или задайте REPORT_VOLUME_PATH переменной) и сделайте redeploy.

3. Поведение

  • При первом запуске текущее содержимое volume помечается как отправленное (история не дублируется), шлётся только «🟢 на связи».
  • Каждый новый otchet_*.pdf (файл дописался и молчит ≥ poll_interval) → send_file с подписью «данные за <вчера>».
  • Строки report_shot.log, попадающие под ALERT_RE (сбои, неполный отчёт) → текстом в тот же чат.
  • Захлебнулся WS/MAX — ретраи 2× и переподключение в следующем цикле; сбой цикла не роняет контейнер.

Без MAX_DEVICE_ID/MAX_LOGIN_TOKEN/MAX_TARGET_CHAT контейнер живёт, но сообщает в логе, что вход невозможен.

Переменные

См. .env.example. Всё опционально, кроме трёх MAX-ключей.