Хостинг для бота: почему PaaS стирает SQLite и усыпляет Long-polling

Хостинг для ботов Хостинги

Главная ошибка при выборе хостинга для Telegram-, Discord- или VK-бота — запуск на бесплатном PaaS-сервисе (Render, Railway, Fly.io) без понимания жизненного цикла контейнеров.

Выбор площадки зависит от двух факторов: архитектуры получения сообщений и способа хранения состояния.

Ловушка «засыпания» при работе по Long-polling

При схеме Long-polling бот непрерывно запрашивает обновления у сервера мессенджера через исходящие HTTPS-запросы. Входящие HTTP-запросы на сам хостинг при этом отсутствуют.

Ловушка засыпания

Модель сбоя на PaaS: Бесплатные тарифы PaaS-хостингов отслеживают только входящий HTTP-трафик. Не получая внешних запросов в течение 15 минут, платформа переводит контейнер в спящий режим. Скрипт замораживается, Long-polling прерывается, и бот перестает отвечать на сообщения пользователей.

Решение: Для работы по Long-polling необходим выделенный VPS/VDS, где процессы функционируют 24/7 без привязки к HTTP-трафику. Альтернатива — перевод сервиса на схему вебхуков, при которой сервер мессенджера сам присылает POST-запросы.

Эфемерная файловая система: смерть локальных баз данных

Многие начинающие разработчики хранят данные пользователей и сессий в локальных файлах: bot.db (SQLite), JSON или Pickle.

БД

Модель сбоя на PaaS: Docker-контейнеры на PaaS-платформах изолированы и эфемерны. При автоматическом перезапуске, сбое или обновлении кода файловая система контейнера сбрасывается к исходному образу. Все созданные ботом локальные файлы уничтожаются.

Решение:

  • При развертывании на PaaS подключайте монтируемый постоянный том (Persistent Volume) или используйте внешнюю базу данных (PostgreSQL, Redis).

  • Если бот использует SQLite, разворачивайте его на VPS, где файловая система постоянна по умолчанию.

Специфика Вебхуков на VPS: почему Telegram игнорирует бота

При переходе на VPS и схему вебхуков разработчики часто сталкиваются с тем, что бот перестает получать сообщения при полностью рабочем коде.

Вебхуки

Telegram API имеет жесткое ограничение безопасности: сервер мессенджера отправляет POST-запросы только на адреса с валидным HTTPS-сертификатом. Если запустить Webhook-сервер на голом IP или по обычному HTTP, Telegram отбросит подключение. На VPS необходимо настроить reverse-proxy (например, Nginx) и выпустить бесплатный SSL-сертификат через Certbot, либо явно передать публичный ключ самоподписанного сертификата при регистрации вебхука через API.

Минимальный харднинг процесса на VPS: автозапуск через systemd

При выборе VPS запуск бота командами python bot.py или node index.js внутри SSH-сессии приведет к падению процесса сразу после закрытия терминала. Для автоматического перезапуска используйте системный демон systemd.

Критический узел сбоя (Переменные окружения): Демон systemd запускает процесс в полностью изолированной среде. Если токен хранится в файле .env (стандартная практика), запуск приведет к ошибке KeyError: 'BOT_TOKEN'. Демону нужно явно указать путь к этому файлу.

Создайте файл службы: sudo nano /etc/systemd/system/mybot.service

Вставьте конфигурацию, добавив директиву EnvironmentFile:

[Unit]
Description=Telegram Bot Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/var/www/mybot
EnvironmentFile=/var/www/mybot/.env
ExecStart=/var/www/mybot/venv/bin/python main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Активируйте и запустите службу:

sudo systemctl daemon-reload
sudo systemctl enable mybot
sudo systemctl start mybot

Когда VPS НЕ нужен

Не арендуйте VPS, если ваш бот спроектирован на Serverless-архитектуре (например, Yandex Cloud Functions или AWS Lambda) и работает исключительно по вебхукам без фоновых задач. В этом случае вы платите только за миллисекунды исполнения кода при получении запроса, что значительно дешевле и избавляет от необходимости администрировать Linux-сервер.

Оцените статью
autoparse.tech
Добавить комментарий