Бесплатные хостинги и мониторинг

Разбираемся, где бесплатно поселить «Цыплёнка-помощника», почему «бесплатно» всегда с подвохом и как сделать так, чтобы бот сам поднимался после падения и кричал тебе в личку, если что-то сломалось.
Мониторинг — это система наблюдения за ботом, которая отвечает на один вопрос: «он сейчас живой и отвечает людям или молча лежит?» — и сообщает тебе об этом раньше, чем пожалуются друзья.

Зачем это вообще нужно

Представь: ты весь вечер собирал «Цыплёнка-помощника», он отвечает на /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-му числу — и бот замолчит до следующего месяца. Следи за расходом кредитов в панели.

Мини-практика

Доведи «Цыплёнка» до состояния «сам себя сторожит». Сделай по шагам:

  1. Вынеси токен в переменную окружения BOT_TOKEN и добавь ADMIN_ID со своим Telegram-id (как в примерах 1 и 3).
  2. Допиши on_startup(), который шлёт тебе «проснулся». Дополнительно сделай функцию on_shutdown(), которая при штатной остановке шлёт «ушёл спать» — подсказка: aiogram умеет регистрировать её через dp.shutdown.register(on_shutdown).
  3. Если у тебя есть Linux-машина (Oracle Free Tier или старый ноут), напиши свой chickbot.service с Restart=always и проверь, что бот поднимается после sudo systemctl restart chickbot.
  4. Сломай бота нарочно: впиши неверный токен, перезапусти и найди ошибку через journalctl -u chickbot -n 50. Научись читать traceback — это навык, который сэкономит тебе часы.

Когда тебе в личку прилетит «проснулся» после нарочного падения — поздравляю, у тебя получился самовосстанавливающийся бот с базовым мониторингом.

Итоги и что дальше

Сегодня ты разобрался, где бота можно держать бесплатно (PaaS вроде Railway, бесплатный VPS от Oracle, домашняя железка) и почему у каждого варианта своя «звёздочка»: лимит часов, засыпание при бездействии, зависимость от домашнего света. Ты узнал главную ловушку — бесплатные платформы любят усыплять сервисы, и лекарство от этого либо «worker»-режим, либо webhook. И самое важное: ты научился делать бота живучим через Restart=always в systemd и видящим — через сообщение себе при старте и чтение логов командой journalctl.

«Цыплёнок-помощник» теперь не просто работает — он переживает падения и сообщает о себе. В следующих уроках раздела мы сделаем мониторинг по-взрослому: подключим внешний пинг-сервис, который дёргает бота снаружи и пишет тебе, если тот замолчал, и настроим сбор ошибок, чтобы видеть не только что бот упал, но и точную строку кода, на которой это случилось. Так твой бот окончательно превратится из домашней игрушки в надёжный сервис.

Проверьте себя
1. Почему бот, запущенный командой python bot.py на твоём ноутбуке, перестаёт отвечать ночью?
ATelegram блокирует ботов в ночное время
BПроцесс живёт только пока открыт терминал и не уснул компьютер
Caiogram автоматически выключается через 8 часов
DЗаканчивается бесплатный лимит сообщений
2. В чём главный подводный камень бесплатных PaaS вроде Render для бота на polling?
AОни требуют знать ассемблер
BОни усыпляют сервисы при бездействии, и бот перестаёт опрашивать Telegram
CОни работают только с Java
DОни удаляют код через час
3. За что отвечает строка Restart=always в systemd-файле бота?
AПерезапускает компьютер каждый час
BЗаставляет systemd снова поднимать бота каждый раз, когда он упал
CОбновляет версию aiogram
DВключает логирование
4. Где правильно хранить токен бота при деплое на хостинг?
AПрямо в коде bot.py, который лежит на GitHub
BВ переменной окружения, отдельно от кода
CВ названии файла
DВ комментарии к коммиту
5. Какой командой посмотреть последние строки логов бота, запущенного через systemd?
Apython logs.py
Bjournalctl -u chickbot -n 50 --no-pager
Cgit log
Dsystemctl logs all
6. Зачем бот при старте отправляет сообщение тебе в личку?
AЧтобы поздороваться со всеми пользователями
BЭто простейший мониторинг: неожиданное «проснулся» означает, что бот падал и перезапустился
CЧтобы ускорить работу polling
DЭто обязательное требование Telegram