Уведомление о бэкапах в тг боте (#83) #97

Merged
NotBigGhost merged 1 commits from issue-83-backup-telegram into dev 2026-09-30 13:02:06 +03:00
Collaborator

Что сделано

Решения владельца: сообщать и об успехе, и о сбое, каждое сообщение со сводкой; бот — тот же ForbidenStarsBot.

Отчёты. Каждый run и verify отправляет одно сообщение в чаты из BACKUP_TELEGRAM_CHAT_ID:

  • «✅ Бэкап» — игроки и партии в БД; по каждому репозиторию снимок, число снимков и размер;
  • «❌ Бэкап не удался» — причина и упавшие репозитории. Сюда же попадают ранние отказы: нет пароля, занят lock, битая БД. Причину берёт обработчик EXIT из текста последнего die;
  • «🔍 Проверка данных: OK» или «❌» — после verify.

Если Telegram недоступен, бэкап не падает: в журнале остаётся только строка «не отправлено».

Бот. fs-backup telegram bot работает через long polling getUpdates и стартует из entrypoint.sh в фоне; если упадёт, перезапускается через минуту.

  • Команды: /backups (по репозиторию число снимков, размер и 10 последних снимков, 📌 у именованных), /status, /help.
  • Отвечает только чатам из белого списка. Чужой chat id пишет в журнал, ответа не даёт.
  • Для настройки: telegram chats показывает id писавших боту, telegram test проверяет связь.

Конфигурация.

  • BACKUP_TELEGRAM_CHAT_ID — пусто значит Telegram выключен.
  • BACKUP_TELEGRAM_BOT_TOKEN — в compose по умолчанию подставляется TELEGRAM_BOT_TOKEN приложения.
  • BACKUP_TELEGRAM_API — только для тестов.
  • В образ добавлен curl.

Документация. deploy/backup/README.md:

  • раздел 10, «Отчёты в Telegram»: что приходит, команды, настройка;
  • справочник команд и переменных;
  • неполадки.

Плюс блок в .env.example.

Модель безопасности

  • Бот публичный: он же используется для входа. На команды он отвечает только белому списку чатов, остальным — тишина.
  • В сообщениях только метаданные: время, id снимков, число игроков и партий, размеры. Ни данных, ни паролей.
  • Токен бота теперь есть и в контейнере backup — единственное исключение из правила «секреты приложения туда не передаются», решение владельца. Можно задать отдельный BACKUP_TELEGRAM_BOT_TOKEN.

Коммиты

  • 5b89dc9 Бэкапы: отчёты и команды в Telegram-боте

Проверки

Образ backup собран локально, Telegram заменён фейковым Bot API (Python-сервер записывает sendMessage и отдаёт заготовленные getUpdates):

  • run — пришло «✅» со сводкой: БД: игроков 11, партий 24, local: снимок c6979930 · снимков 1 · 27.1 KB;
  • run без BACKUP_PASSWORD — «❌ … BACKUP_PASSWORD не задан»; run с битой БД — «❌ … не удалось снять копию БД»;
  • verify — «🔍 Проверка данных: OK … игроков 11, партий 24»;
  • telegram bot: ответил владельцу на /backups и /status@ForbidenStarsBot; чужой чат без username остался без ответа, его id записан в журнал, поля не съехали;
  • Telegram на закрытом порту: run завершился с кодом 0, в журнале «не отправлено»;
  • штатный entrypoint: бот запущен в фоне рядом с supercronic; без BACKUP_TELEGRAM_* — строка «Telegram не настроен», поведение прежнее;
  • telegram chats вывел id писавших; без токена — понятный отказ;
  • docker compose config — ок; вложенная подстановка ${BACKUP_TELEGRAM_BOT_TOKEN:-${TELEGRAM_BOT_TOKEN:-}} даёт токен приложения, свой токен его переопределяет.

Отклонения от плана

Добавлена команда telegram chats: без неё узнать свой chat id при первой настройке было нельзя — бот стартует, только когда chat id уже задан.

Что остаётся владельцу

  • После мёржа: scripts/build-push.ps1, на Pi — docker compose up -d backup.
  • Написать боту /start → docker compose exec backup fs-backup telegram chats → вписать id в BACKUP_TELEGRAM_CHAT_ID → docker compose up -d backup → fs-backup telegram test.

Closes #83

🤖 Generated with Claude Code

https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd

## Что сделано Решения владельца: сообщать **и об успехе, и о сбое**, каждое сообщение со сводкой; бот — **тот же** ForbidenStarsBot. **Отчёты.** Каждый `run` и `verify` отправляет одно сообщение в чаты из `BACKUP_TELEGRAM_CHAT_ID`: - **«✅ Бэкап»** — игроки и партии в БД; по каждому репозиторию снимок, число снимков и размер; - **«❌ Бэкап не удался»** — причина и упавшие репозитории. Сюда же попадают ранние отказы: нет пароля, занят lock, битая БД. Причину берёт обработчик `EXIT` из текста последнего `die`; - **«🔍 Проверка данных: OK»** или **«❌»** — после `verify`. Если Telegram недоступен, бэкап не падает: в журнале остаётся только строка «не отправлено». **Бот.** `fs-backup telegram bot` работает через long polling `getUpdates` и стартует из `entrypoint.sh` в фоне; если упадёт, перезапускается через минуту. - Команды: `/backups` (по репозиторию число снимков, размер и 10 последних снимков, 📌 у именованных), `/status`, `/help`. - Отвечает **только** чатам из белого списка. Чужой `chat id` пишет в журнал, ответа не даёт. - Для настройки: `telegram chats` показывает id писавших боту, `telegram test` проверяет связь. **Конфигурация.** - `BACKUP_TELEGRAM_CHAT_ID` — пусто значит Telegram выключен. - `BACKUP_TELEGRAM_BOT_TOKEN` — в compose по умолчанию подставляется `TELEGRAM_BOT_TOKEN` приложения. - `BACKUP_TELEGRAM_API` — только для тестов. - В образ добавлен `curl`. **Документация.** `deploy/backup/README.md`: - раздел 10, «Отчёты в Telegram»: что приходит, команды, настройка; - справочник команд и переменных; - неполадки. Плюс блок в `.env.example`. ## Модель безопасности - Бот публичный: он же используется для входа. На команды он отвечает только белому списку чатов, остальным — тишина. - В сообщениях только метаданные: время, id снимков, число игроков и партий, размеры. Ни данных, ни паролей. - Токен бота теперь есть и в контейнере `backup` — единственное исключение из правила «секреты приложения туда не передаются», решение владельца. Можно задать отдельный `BACKUP_TELEGRAM_BOT_TOKEN`. ## Коммиты - `5b89dc9` Бэкапы: отчёты и команды в Telegram-боте ## Проверки Образ `backup` собран локально, Telegram заменён фейковым Bot API (Python-сервер записывает `sendMessage` и отдаёт заготовленные `getUpdates`): - `run` — пришло «✅» со сводкой: `БД: игроков 11, партий 24`, `local: снимок c6979930 · снимков 1 · 27.1 KB`; - `run` без `BACKUP_PASSWORD` — «❌ … BACKUP_PASSWORD не задан»; `run` с битой БД — «❌ … не удалось снять копию БД»; - `verify` — «🔍 Проверка данных: OK … игроков 11, партий 24»; - `telegram bot`: ответил владельцу на `/backups` и `/status@ForbidenStarsBot`; чужой чат без `username` остался без ответа, его id записан в журнал, поля не съехали; - Telegram на закрытом порту: `run` завершился с кодом 0, в журнале «не отправлено»; - штатный `entrypoint`: бот запущен в фоне рядом с supercronic; без `BACKUP_TELEGRAM_*` — строка «Telegram не настроен», поведение прежнее; - `telegram chats` вывел id писавших; без токена — понятный отказ; - `docker compose config` — ок; вложенная подстановка `${BACKUP_TELEGRAM_BOT_TOKEN:-${TELEGRAM_BOT_TOKEN:-}}` даёт токен приложения, свой токен его переопределяет. ## Отклонения от плана Добавлена команда `telegram chats`: без неё узнать свой chat id при первой настройке было нельзя — бот стартует, только когда chat id уже задан. ## Что остаётся владельцу - [ ] После мёржа: `scripts/build-push.ps1`, на Pi — `docker compose up -d backup`. - [ ] Написать боту `/start` → `docker compose exec backup fs-backup telegram chats` → вписать id в `BACKUP_TELEGRAM_CHAT_ID` → `docker compose up -d backup` → `fs-backup telegram test`. Closes #83 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Agent added 1 commit 2026-09-19 02:39:11 +03:00
Каждый run и verify шлёт в чаты BACKUP_TELEGRAM_CHAT_ID одно сообщение: успех
со сводкой (игроки/партии, по репозиторию снимок, число снимков, размер) или
сбой с причиной — в том числе ранний отказ (нет пароля, занят lock, битая БД):
обработчик EXIT берёт текст последнего die. Недоступный Telegram бэкап не ломает.

Бот-слушатель (fs-backup telegram bot, long polling, стартует из entrypoint в
фоне) отвечает на /backups (хранящиеся снимки), /status и /help только чатам из
белого списка; чужие chat id пишет в журнал. telegram chats — узнать свой id,
telegram test — проверить связь. Токен по умолчанию — TELEGRAM_BOT_TOKEN
приложения (тот же бот), BACKUP_TELEGRAM_BOT_TOKEN переопределяет. В образ
добавлен curl. Настройка — deploy/backup/README.md, раздел 10. #83

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost merged commit 2f0b22ccd4 into dev 2026-09-30 13:02:06 +03:00
NotBigGhost deleted branch issue-83-backup-telegram 2026-09-30 13:02:06 +03:00
Sign in to join this conversation.