Решения владельца: сообщать и об успехе, и о сбое, каждое сообщение со сводкой; бот — тот же 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_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.
## Что сделано
Решения владельца: сообщать **и об успехе, и о сбое**, каждое сообщение со сводкой; бот — **тот же** 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
Каждый 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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что сделано
Решения владельца: сообщать и об успехе, и о сбое, каждое сообщение со сводкой; бот — тот же ForbidenStarsBot.
Отчёты. Каждый
runиverifyотправляет одно сообщение в чаты изBACKUP_TELEGRAM_CHAT_ID:EXITиз текста последнегоdie;verify.Если Telegram недоступен, бэкап не падает: в журнале остаётся только строка «не отправлено».
Бот.
fs-backup telegram botработает через long pollinggetUpdatesи стартует из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:Плюс блок в
.env.example.Модель безопасности
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 записан в журнал, поля не съехали;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