Как перенести Telegram-бота с VPS и перестать администрировать сервер

Перенос Telegram-бота с VPS на платформу — работа на один вечер: скачать папку проекта и базу, залить код, добавить токен секретом, положить базу в постоянное хранилище и остановить старый процесс, чтобы токен остался в единственном экземпляре. После этого сервером занимается платформа: systemd, обновления и свободное место на диске перестают быть вашей заботой. Ниже — порядок шагов, чтобы при переезде ничего не потерялось; примеры даны для Dockbox.

Что сложить в «чемодан» перед переездом

Сначала инвентаризация. Переносится не только код:

Код проекта. Вся папка с ботом целиком, а не один main.py: рядом могут лежать модули, шаблоны, статические файлы.

Файл зависимостей. requirements.txt для Python или package.json для Node.js. Без него список библиотек придётся восстанавливать по памяти.

Данные, которые создал сам бот. Файл SQLite, загруженные пользователями картинки, кэши. Они не в репозитории и лежат рядом с ботом на диске — про них забывают чаще всего.

Настройки. Токен, ключи внешних сервисов, строка подключения к базе, id администратора. Всё это должно уехать отдельно от кода.

Шаг 1. Заберите код и данные с сервера

Скачайте проект по SSH:

scp -r user@server:/home/bot/mybot ./mybot

Проверьте, что файл зависимостей на месте, и посмотрите, что бот дописал сам:

ls -la /home/bot/mybot
du -sh /home/bot/mybot/*.db /home/bot/mybot/uploads

Если бот пишет в PostgreSQL или MySQL, снимите дамп базы — файл на диске тут не поможет:

pg_dump -U bot botdb > botdb.sql

Шаг 2. Вынесите токен и ключи из кода

Загляните в .env, файл systemd-юнита или конфиг — туда, откуда бот читает настройки. Плохой вариант, который часто приходит из готовых примеров:

TOKEN = "7123456789:***"
bot = Bot(token=TOKEN)

Хороший — значение берётся из переменной окружения:

import os
TOKEN = os.environ["BOT_TOKEN"]
bot = Bot(token=TOKEN)

Токен в коде = токен утёк. Код вы показываете, отдаёте и коммитите в Git, а вместе с ним уезжает доступ к вашему боту. Если что-то осталось захардкоженным — это единственное, что стоит поправить перед переездом.

Шаг 3. Загрузите бота в Dockbox

Подключите Git-репозиторий (можно приватный) или залейте архив — Dockbox определит язык по файлам проекта, соберёт образ и запустит его в Docker-контейнере. Ни Python, ни Node.js устанавливать не нужно, Dockerfile писать не нужно, автозапуск настраивать не нужно. Значения из старого .env добавьте в секреты проекта: имена переменных видны, значения зашифрованы и не попадают ни в архив, ни в репозиторий.

Шаг 4. Перенесите базу данных и файлы

У каждого проекта есть постоянное хранилище: то, что в нём лежит, переживает публикацию новой версии кода. Положите туда файл SQLite и папки с загрузками — пользователи, их настройки и история останутся на месте. Если бот работал с PostgreSQL, поднимите базу отдельным сервисом проекта и восстановите дамп:

psql -U bot -d botdb -f botdb.sql

Что будет, если этого не сделать. Файлы вне постоянного хранилища при следующем деплое создаются заново, а вместе с ними пропадают все данные, которые бот накопил на старом сервере.

Шаг 5. Остановите старого бота до запуска нового

Самый важный шаг. У одного токена может быть только один работающий экземпляр: если старый бот на VPS продолжит опрашивать Telegram, апдейты будут уходить то одной копии, то другой, и бот начнёт отвечать через сообщение. Сначала гасим процесс на сервере, потом запускаем на платформе:

sudo systemctl stop mybot
sudo systemctl disable mybot

Сервер пока не удаляйте — пусть постоит денёк-другой как страховка.

Шаг 6. Проверьте бота и выключите сервер

Прогоните обычные сценарии: /start, основные кнопки, сохранение записи в базу, ответ после перезапуска. Логи видны в панели в реальном времени, ошибка в них написана прямым текстом. Когда всё работает — отменяйте аренду VPS.

Тарифы и постоянная работа

Здесь принципиальная разница с собственным сервером: администрировать нечего, и контейнеры работают постоянно — без лимита по часам, без «засыпания» и без тарифа, который выключает бота. Упал процесс — платформа перезапускает контейнер сама.

Starter — 990 ₽/мес. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект, автодеплой и SSL. Первый месяц бесплатный — как раз чтобы переехать и спокойно всё проверить.

Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов, preview-окружения и свой домен.

Team — 4 990 ₽/мес. Проектов без ограничения и SLA.

Один вечер работы — и SSH перестаёт быть частью вашей жизни. Залейте бота в Dockbox из Git, сравните поведение со старой копией и гасите сервер. Вернуться назад тоже можно: код остаётся вашим, специфичных для платформы настроек у бота нет, а файлы из постоянного хранилища скачиваются из панели.

Частые вопросы

Сколько времени занимает переезд?

Обычно вечер: скачать код и данные, загрузить проект, задать токен и настройки, перенести базу и протестировать сценарии. Проверка занимает больше времени, чем сам деплой.

Что делать с базой данных бота?

Файл SQLite и папки с загрузками кладутся в постоянное хранилище проекта — оно сохраняется при публикации новой версии кода, а сами файлы можно просмотреть и скачать из панели. Если бот работал с PostgreSQL или MySQL, база поднимается отдельным сервисом проекта, а данные восстанавливаются из дампа.

Бот отвечает через сообщение после переезда — почему?

Почти всегда потому, что старый бот на VPS всё ещё запущен. У одного токена может быть только один живой экземпляр: Telegram отдаёт апдейты то одной копии, то другой. Остановите процесс на сервере.

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

Нет. Тот же проект переезжает целиком: платформа определяет язык и зависимости по вашим файлам. Единственное, что стоит поправить, — вынести токен и ключи из кода в переменные окружения, если они ещё там.

Можно ли вернуться на свой сервер?

Да. Код остаётся вашим, бот не требует специфичных для платформы настроек, а файлы из постоянного хранилища скачиваются из панели. Обратный переезд ничем не отличается от обычной установки на сервер.