Бесплатные хостинги и мониторинг
Разбираемся, где бесплатно поселить «Цыплёнка-помощника», почему «бесплатно» всегда с подвохом и как сделать так, чтобы бот сам поднимался после падения и кричал тебе в личку, если что-то сломалось.
Мониторинг — это система наблюдения за ботом, которая отвечает на один вопрос: «он сейчас живой и отвечает людям или молча лежит?» — и сообщает тебе об этом раньше, чем пожалуются друзья.
Зачем это вообще нужно
Представь: ты весь вечер собирал «Цыплёнка-помощника», он отвечает на /start, показывает кнопки, помнит твоих друзей в SQLite, ходит за погодой. Ты гордо кидаешь ссылку в чат игрового клана: «налетайте, бот-напоминалка про катки готов!». Все радуются, тыкают команды, и тут… ты закрываешь крышку ноутбука и идёшь спать.
Бот умирает. Потому что он жил на твоём ноутбуке, а ноутбук уснул вместе с тобой. Утром в чате — двадцать сообщений «бот не работает», «ало, ты сломал», и один обиженный мем про дохлого цыплёнка. Знакомая боль? Чтобы такого не было, бот должен жить не на твоём компьютере, а на хостинге — чужом компьютере, который никогда не спит и стоит где-то в дата-центре.
В прошлом уроке про VPS и Docker мы уже поднимали бота на настоящем сервере. Но VPS почти всегда стоит денег — пусть и небольших. А если тебе пятнадцать и карта родительская, платить $5 в месяц за пет-проект не вариант. Хорошая новость: есть способы держать бота бесплатно. Плохая: у каждого «бесплатно» есть звёздочка с мелким шрифтом. В этом уроке разберём, какие бесплатные варианты бывают, где они тебя подведут, и как настроить так, чтобы бот сам вставал после падения, а ты узнавал о проблемах первым.
Хостинг как съёмная комната
Думай о хостинге как о съёмном жилье для твоего бота. VPS из прошлого урока — это как снять отдельную квартиру: дорого, зато ты хозяин, ставишь что хочешь и никто не выгонит. Бесплатные хостинги — это как пожить у друга на диване или в хостеле: бесплатно или почти, но есть правила. Где-то тебя будят каждую ночь («докажи, что ты ещё тут»), где-то выселяют, если ты неделю не появлялся, а где-то дают только маленький угол и косо смотрят, если ты много ешь (читай — жрёшь процессор и память).
Бесплатные хостинги для ботов делятся на три больших типа, и важно понимать, чем они отличаются.
Платформы PaaS (Railway, Render, Fly.io)
PaaS расшифровывается как «платформа как сервис»: ты не настраиваешь сервер руками, а просто говоришь «вот мой код на GitHub, запусти его». Платформа сама ставит Python, разворачивает контейнер и держит бота живым. Это самый удобный для новичка вариант — почти как «загрузил и забыл».
Подвох: бесплатные тарифы дают ограниченное число часов работы в месяц или немного бесплатных кредитов, которые однажды кончаются. Render на бесплатном плане ещё и «усыпляет» сервисы, которые долго не получали запросов — для веб-сайта это терпимо, а для бота на polling может стать проблемой.
Бесплатные облака с триалом (Oracle Cloud Free Tier)
Некоторые большие облака дают по-настоящему бесплатный кусочек навсегда. Самый известный — Oracle Cloud Free Tier: там можно получить маленькую виртуальную машину, которая по сути тот же VPS, но за ноль рублей. Это, по факту, бесплатная «квартира».
Подвох: регистрация требует банковскую карту (для проверки, что ты не робот), интерфейс сложный, а бесплатные машинки иногда «разбирают» так быстро, что свободных не остаётся. Зато если повезло — это самый честный бесплатный вариант.
Домашний мини-сервер (старый ноут, Raspberry Pi)
Самый недооценённый способ: запустить бота на железке, которая у тебя уже есть. Старый ноутбук, который пылится в шкафу, или Raspberry Pi размером с пачку жвачки прекрасно тянут одного-двух ботов. Электричество — копейки, а ты полный хозяин.
Подвох: дома бывает нестабильный интернет и отключения света, а ещё нужно, чтобы устройство стояло включённым всегда. Но как тренировочный полигон — отлично.
| Вариант | Плюс | Главный подвох |
| PaaS (Railway/Render) | Проще всего: залил код — работает | Лимит часов/кредитов, сервис могут «усыпить» |
| Oracle Free Tier | Настоящий бесплатный VPS навсегда | Нужна карта, сложная регистрация, машинок мало |
| Домашняя железка | Бесплатно и полностью твоё | Зависит от твоего света и интернета |
Главная ловушка бесплатных хостингов: «засыпание»
Прежде чем настраивать что-либо, надо понять одну вещь, на которой спотыкаются почти все новички. Многие бесплатные платформы устроены под веб-сайты, а не под ботов. Сайт работает так: пришёл посетитель — сервер проснулся, отдал страницу, снова задремал. Это называется «сон при простое», и для сайта это норма.
Но наш бот на polling (помнишь — это когда бот сам постоянно спрашивает у Telegram «есть что новое?») должен работать непрерывно. Если платформа усыпит его за «бездействие», бот перестанет спрашивать Telegram и пропустит все сообщения. Друзья пишут — тишина.
Есть два чистых решения. Первое: выбрать платформу, которая держит фоновые процессы постоянно (Railway, Fly.io так умеют, если правильно настроить тип сервиса как «worker», а не «web»). Второе, более надёжное на проде, — перевести бота с polling на webhook: тогда Telegram сам стучится на твой адрес при новом сообщении, и боту не нужно крутиться в холостую. Webhook мы подробно разбирали отдельно; для бесплатного хостинга он часто удобнее именно потому, что дружит с «просыпанием по запросу».
Разбираем по шагам
Пример 1. Готовим бота к деплою: токен в переменной окружения
Любой нормальный хостинг просит тебя не зашивать токен прямо в код, а класть его в переменные окружения — отдельное хранилище секретов. Это и безопаснее (токен не утечёт в Git), и удобнее (на каждом хостинге задаёшь своё значение). Наш bot.py уже должен читать токен так:
import os
import asyncio
from aiogram import Bot, Dispatcher
TOKEN = os.getenv("BOT_TOKEN")
if not TOKEN:
raise RuntimeError("Не задана переменная окружения BOT_TOKEN")
bot = Bot(token=TOKEN)
dp = Dispatcher()
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())Результат: если переменная BOT_TOKEN задана на хостинге, «Цыплёнок-помощник» запустится; если нет — упадёт с понятной ошибкой «Не задана переменная окружения BOT_TOKEN», а не молча будет ломаться где-то в глубине Telegram.
Разберём по строчкам. os.getenv("BOT_TOKEN") достаёт значение из окружения — это та самая настройка, которую ты впишешь в панели хостинга в раздел Environment Variables. Проверка if not TOKEN ловит частую ошибку «забыл задать токен»: лучше честно упасть при старте, чем потом полчаса гадать, почему бот не отвечает. Дальше всё как раньше: создаём объект bot, объект dp и запускаем polling.
Чтобы хостинг знал, какие пакеты ставить, рядом обязательно должен лежать файл requirements.txt:
aiogram>=3.0
aiohttp
Результат: при деплое платформа прочитает этот файл и сама установит aiogram и aiohttp перед запуском бота — тебе не нужно ничего ставить руками.
Пример 2. Авто-перезапуск через systemd на VPS или домашней железке
Главная фишка надёжного хостинга — бот должен сам подниматься, если упал (например, словил ошибку или сервер перезагрузился). На Linux-машине (Oracle Free Tier, домашний мини-сервер) это делает systemd — встроенный «надзиратель» за программами. Ты описываешь сервис в файле, а systemd следит, чтобы он всегда был живой.
Создаём файл /etc/systemd/system/chickbot.service:
[Unit]
Description=Chick helper Telegram bot
After=network.target
[Service]
WorkingDirectory=/home/chick/bot
Environment=BOT_TOKEN=123456:ABC-замени-на-свой
ExecStart=/home/chick/bot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetРезультат: systemd будет запускать bot.py при старте сервера и перезапускать его через 5 секунд каждый раз, когда бот упадёт; «Цыплёнок» станет практически бессмертным.
Самые важные строки тут — Restart=always и RestartSec=5. Первая говорит: «что бы ни случилось, подними бота снова». Вторая: «но подожди 5 секунд, не дёргай мгновенно» — иначе при стабильной ошибке бот будет падать и стартовать тысячу раз в секунду. Строка Environment=BOT_TOKEN=... — это и есть та самая переменная окружения, только заданная на уровне systemd. Включаем сервис командами:
sudo systemctl daemon-reload
sudo systemctl enable chickbot
sudo systemctl start chickbot
sudo systemctl status chickbotРезультат: последняя команда покажет зелёное active (running), если бот жив, и красное failed с куском лога, если что-то не так — это твоя первая точка диагностики.
Пример 3. Простейший мониторинг: бот сам пишет тебе при старте
Самый дешёвый мониторинг — встроить его в самого бота. Пусть при каждом запуске «Цыплёнок» присылает тебе лично сообщение «я проснулся». Если ты видишь такое в неожиданное время — значит, бот падал и перезапускался, и пора смотреть логи.
import os
import logging
import asyncio
from aiogram import Bot, Dispatcher
logging.basicConfig(level=logging.INFO)
TOKEN = os.getenv("BOT_TOKEN")
ADMIN_ID = int(os.getenv("ADMIN_ID", "0"))
bot = Bot(token=TOKEN)
dp = Dispatcher()
async def on_startup():
if ADMIN_ID:
await bot.send_message(ADMIN_ID, "🐤 Цыплёнок-помощник проснулся и готов к работе")
async def main():
await on_startup()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())Результат: как только бот стартует, тебе в личку прилетает «🐤 Цыплёнок-помощник проснулся и готов к работе». Если такое сообщение приходит в три часа ночи без твоего участия — бот падал, и systemd его поднял; стоит разобраться, почему.
Где взять ADMIN_ID? Это твой числовой Telegram-идентификатор — его покажет любой бот вроде @userinfobot. Кладёшь его тоже в переменную окружения, чтобы не светить в коде. logging.basicConfig(level=logging.INFO) включает логи — записи о том, что бот делает; они нам пригодятся ниже.
Пример 4. Как читать логи, когда бот молчит
Когда бот «лёг», первый вопрос — почему?. Ответ почти всегда в логах. На systemd их смотрят так:
journalctl -u chickbot -n 50 --no-pagerРезультат: в терминале появятся последние 50 строк того, что писал бот, включая текст ошибки (traceback), из-за которой он упал — например, «Unauthorized» при неверном токене или «ConnectionError» при проблемах с сетью.
А чтобы понять, какие именно сообщения бот считает важными, полезно потренироваться на маленьком чистом примере — как обычно разбирают строку лога. Вот безопасный сниппет на стандартной библиотеке, его можно запустить прямо здесь:
log_lines = [
"INFO старт бота",
"ERROR не дозвонились до Telegram",
"INFO получено сообщение",
"ERROR упал хэндлер погоды",
]
errors = [line for line in log_lines if line.startswith("ERROR")]
print("Всего строк:", len(log_lines))
print("Ошибок:", len(errors))
for e in errors:
print(" ->", e)Вывод:
Всего строк: 4 Ошибок: 2 -> ERROR не дозвонились до Telegram -> ERROR упал хэндлер погоды
Тот же принцип лежит в основе «умного» мониторинга: программа читает логи, фильтрует строки со словом ERROR и шлёт тебе только их — чтобы не тонуть в обычных INFO-записях. На больших проектах для этого ставят отдельные сервисы (UptimeRobot пингует бота снаружи, Sentry собирает ошибки), но суть та же, что в этих четырёх строках.
Частые ошибки и подводные камни
- «Бот работал, пока был открыт ноутбук». Это не хостинг — это твой компьютер. Запуск
python bot.pyв терминале живёт ровно до тех пор, пока открыт терминал и не уснул ноут. Настоящий хостинг держит бота 24/7 без твоего участия. - Сервис «уснул» на бесплатном PaaS. Если выбрал платформу для веб-сайтов и запустил бота как «web»-сервис на polling, его усыпят за бездействие. Лечится выбором типа «worker»/«background» или переходом на webhook.
- Забыл
Restart=always. Без этой строки systemd запустит бота один раз, и после первой же ошибки тот останется лежать до утра. Авто-перезапуск — половина смысла всей затеи. - Токен прямо в коде, который лежит на GitHub. Классика. Telegram отслеживает утёкшие токены и может их отозвать, а злоумышленник за секунды угонит твоего бота. Только переменные окружения, всегда.
- Нет вообще никакого мониторинга. Бот может тихо падать неделями, а ты узнаешь об этом от друзей. Даже простое «бот пишет тебе при старте» из примера 3 уже спасает от слепоты.
- Лимит часов кончился в середине месяца. На бесплатных PaaS число часов ограничено: если бот крутится круглосуточно, лимит может выйти, скажем, к 20-му числу — и бот замолчит до следующего месяца. Следи за расходом кредитов в панели.
Мини-практика
Доведи «Цыплёнка» до состояния «сам себя сторожит». Сделай по шагам:
- Вынеси токен в переменную окружения
BOT_TOKENи добавьADMIN_IDсо своим Telegram-id (как в примерах 1 и 3). - Допиши
on_startup(), который шлёт тебе «проснулся». Дополнительно сделай функциюon_shutdown(), которая при штатной остановке шлёт «ушёл спать» — подсказка: aiogram умеет регистрировать её черезdp.shutdown.register(on_shutdown). - Если у тебя есть Linux-машина (Oracle Free Tier или старый ноут), напиши свой
chickbot.serviceсRestart=alwaysи проверь, что бот поднимается послеsudo systemctl restart chickbot. - Сломай бота нарочно: впиши неверный токен, перезапусти и найди ошибку через
journalctl -u chickbot -n 50. Научись читать traceback — это навык, который сэкономит тебе часы.
Когда тебе в личку прилетит «проснулся» после нарочного падения — поздравляю, у тебя получился самовосстанавливающийся бот с базовым мониторингом.
Итоги и что дальше
Сегодня ты разобрался, где бота можно держать бесплатно (PaaS вроде Railway, бесплатный VPS от Oracle, домашняя железка) и почему у каждого варианта своя «звёздочка»: лимит часов, засыпание при бездействии, зависимость от домашнего света. Ты узнал главную ловушку — бесплатные платформы любят усыплять сервисы, и лекарство от этого либо «worker»-режим, либо webhook. И самое важное: ты научился делать бота живучим через Restart=always в systemd и видящим — через сообщение себе при старте и чтение логов командой journalctl.
«Цыплёнок-помощник» теперь не просто работает — он переживает падения и сообщает о себе. В следующих уроках раздела мы сделаем мониторинг по-взрослому: подключим внешний пинг-сервис, который дёргает бота снаружи и пишет тебе, если тот замолчал, и настроим сбор ошибок, чтобы видеть не только что бот упал, но и точную строку кода, на которой это случилось. Так твой бот окончательно превратится из домашней игрушки в надёжный сервис.