VPS с самостоятельным администрированием

Бэкап, восстановление и перенос Telegram-бота

Пример бота хранит историю, курсор обновлений и дневной счётчик в одной SQLite-базе. Копируйте их вместе. Экспорт одних сообщений — это архив переписки, но не полное состояние для продолжения работы с теми же ограничениями повторов и расходов.

Сделайте согласованный снимок

Из каталога развёртывания используйте команду backup. Она обращается к SQLite backup API, пока основной процесс продолжает работать. Файл назначения должен быть новым: не перезаписывайте предыдущую копию, пока нет другой проверенной.

mkdir -p backups
docker compose exec bot python bot.py backup /data/backup.sqlite
docker compose cp bot:/data/backup.sqlite backups/bot.sqlite
chmod 600 backups/bot.sqlite
docker compose exec bot python -c 'from pathlib import Path; Path("/data/backup.sqlite").unlink()'

Перед следующим запуском перенесите локальный backups/bot.sqlite в защищённое место с датой, чтобы случайно не заменить его. Передайте копию за пределы VPS через SSH/SFTP. В ней есть Telegram ID и тексты сообщений. .env храните отдельно и приватно: токены конфигурации не входят в базу. Вместе с копией запишите версию исходников и имя Compose-проекта.

Не считайте обычный cp работающей базы гарантированно согласованным снимком. Включённая команда использует механизм SQLite. Копия вне сервера обязательна для восстановления после потери VPS: второй файл в /data пропадёт вместе с первым.

Восстанавливайте при остановленном worker

Восстановление заменяет текущее состояние. Если может понадобиться откат, сначала сохраните существующую базу. В том же Compose-проекте:

docker compose stop bot
docker compose run --rm -T bot python bot.py restore < backups/bot.sqlite
docker compose start bot

Выполняйте команды по одной и проверяйте результат. При ошибке restore не запускайте бота до выяснения причины. Функция получает эксклюзивную блокировку, проверяет SQLite и ожидаемые таблицы, затем заменяет базу. Старые SQLite-журналы удаляются, чтобы они не откатили восстановленный снимок. Файл принадлежит пользователю бота и имеет закрытые права доступа.

Проверка структуры не доказывает, что копия самая новая или относится к нужному боту. Выбирайте её осознанно. Вместе со вчерашней базой возвращаются вчерашние курсор и счётчик: ожидающие сообщения могут обработаться снова, а сегодняшний лимит — допустить дополнительные попытки. Восстановление не возвращает уже подтверждённые сообщения Telegram или несохранённый ответ API.

Проверьте восстановление без второго рабочего бота

Распакуйте ту же версию исходников в отдельный тестовый каталог. Скопируйте .env.example в .env, оставив заглушки ключей. Задайте уникальное имя Compose-проекта, чтобы не затронуть рабочий volume. Для команд бэкапа и восстановления настоящие API-ключи не нужны:

docker compose -p telegram-restore-check build
docker compose -p telegram-restore-check run --rm -T bot \
  python bot.py restore < /absolute/path/to/backup.sqlite
docker compose -p telegram-restore-check run --rm bot \
  python bot.py backup /data/restored-check.sqlite

Не выполняйте up в этой проверке и не переносите в неё рабочий токен. Убедитесь в успешном завершении и сохраните тестовый volume до проверки результата. Это тест локального восстановления, а не доставки Telegram или ответа модели. Не публикуйте пользовательский бэкап как fixture.

При переносе у токена должен быть один владелец

Перед окончательным переносом остановите старого бота и сделайте финальный снимок командой docker compose run --rm bot python bot.py backup /data/final.sqlite. Скопируйте его из остановленного service-контейнера, если он сохранился, либо через отдельный контейнер с тем же volume. Перенесите снимок и защищённую конфигурацию на новый VPS, восстановите базу и запустите только новый worker. Старый всё это время должен оставаться остановленным.

Возможен перерыв в работе. Снимок базы не является протоколом бесшовной передачи, а старый бэкап — безопасным способом повторить запрос. На новом месте проверьте настоящий ответ, сохранение лимита и /reset. См. постоянное состояние и обновления.

Источник: Python SQLite backup API.

Тарифы из текущего каталога

Сейчас не удалось загрузить планы. Смотрите актуальные тарифы на странице цен.