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 (external: true). Имя тома
привязано к UUID приложения report-shot
(n51q832cjhizblqwbibgjxsc_report-shot-output). Если report-shot будет
пересоздан с новым uuid — поправьте имя тома здесь и 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-ключей.