Греки у Куна высадились в Мизии, уверенные, что это Троя. Корабли причалили, воины сошли на берег — с адресом промахнулись. У бота тоже бывает такая высадка: файлы уже на хостинге, сборка закончилась, а в телефоне по-прежнему тишина.
Для Telegram-бота на Python с polling нужен постоянно работающий процесс. В этом руководстве поселим его в Render Background Worker: хостинг установит библиотеки и запустит python bot.py, после чего программа сама будет забирать сообщения из Telegram. Исходные условия — свой рабочий Python-проект и уже доступный платный worker. В конце проверим ответ с выключенным ноутбуком, затем ещё раз — после перезапуска.
Допустим, вы собираете помощника для домашних списков. Пока он умеет только повторять текст. Пишете «Хлеб» — прилетает «Хлеб». Польза скромная, зато собственное произведение отвечает! Но всякий раз ради этого «Хлеба» на кухне обязан дежурить включённый ноутбук. Вечером хочется убрать его со стола, а у вас там уже круглосуточная хлебная диспетчерская. Отселим её на сервер.
Какой хостинг для Telegram-бота на Python подходит для polling
У бота есть имя в Telegram, токен и программа. Имя помогает найти диалог, токен даёт программе доступ к Bot API. Сам Python-файл должен где-то выполняться. Чат с красивой аватаркой может годами стоять на месте, пока за кулисами не работает вообще никто. Выключили единственную программу — аватарка осталась за старшую. Полномочий отвечать у неё нет.
При polling программа сама запрашивает новые события. В справке Render о фоновых процессах такой сервис описан как непрерывно работающий worker без входящего сетевого трафика. Он подходит для нашего исходящего обращения к Telegram. Свой домен и HTTP-страницу для этого пути заводить не требуется.
Веб-сервис рассчитан на другой способ работы: приложение принимает обращения на сетевом порту. Если выбрать его для обычного run_polling(), хостинг может искать порт, которого ваша программа вообще не открывает. Он ждёт посетителей у парадного входа, а ваш бот в это время сам ходит за почтой. Отсюда ошибка про порт — даже когда Python-файл совершенно исправен.
В бесплатных сервисах Render worker нет. Для размещения без оплаты есть отдельный разбор бесплатного хостинга для бота, с другим способом получения сообщений.
Соберите то, что уже работает на ноутбуке
Нужен собственный бот и доступ к его токену, репозиторий с кодом и тестовый личный диалог. Для переноса возьмите нейтральную строку «Проверка: хлеб». Семейный список с адресом доставки и кодом домофона пусть пока останется дома: сначала нам достаточно узнать, кто вообще отвечает на другом конце.
Если слова «окружение» и «репозиторий» пока мало помогают, откройте бесплатный чат DeepSeek. Вставьте запрос, затем покажите имена файлов и эту инструкцию. Для такого сопровождения подойдут и ChatGPT или Claude, если уже ими пользуетесь.
Помоги перенести работающего Telegram-бота на Python с ноутбука
на уже доступный платный Render Background Worker. Новую оплату
пока не планирую. Сначала спроси мою систему, как запускаю бота
и где лежат файлы; помоги выяснить версии и способ хранения данных.
Веди по одному действию: что открыть, куда вставить строку,
что должно появиться и как проверить. Жди моего результата.
Сохрани логику и зависимости; сначала проверь подготовку файлов,
потом настройки worker. Токен и пароли останутся у меня,
в примерах используй BOT_TOKEN. Ошибку пришлю без секретов
и личных данных: объясни причину и дай одну проверку.
Спорные настройки сверяй с официальной документацией Render
и моей версии библиотеки. Перед сменой webhook объясни последствия.
Если не уверен, скажи; без поиска попроси нужный фрагмент справки.
Первый результат — понять, какой файл запускается и какие зависимости ему нужны. Команды проверки версий ниже вводят в терминале проекта. Поля Build Command и Start Command позже заполняют уже в кабинете Render: это два разных места. Если своего терминала ещё не нашли, начните разговор с этого вопроса.
Для опорного примера берём официальный echobot библиотеки python-telegram-bot. На дату проверки stable — 22.8. Бот отвечает на /start, а обычное текстовое сообщение повторяет. В своём работающем проекте сохраните логику и зависимости.
В окружении рабочего проекта выполните python --version и python -m pip show python-telegram-bot. Версии пригодятся для хостинга. Если у вас Python вызывается как python3, локально используйте это имя.
Представьте переезд в двух файлах. В bot.py лежит сама программа, а в requirements.txt — список того, что нужно установить в пустой серверной среде. Для опорного echobot второй файл содержит:
python-telegram-bot==22.8
У собственного проекта сохраните остальные необходимые библиотеки. Если ваш работающий бот использует другую версию PTB, сначала разберите совместимость; установка 22.8 сама по себе старый код современным не сделает.
Токен вынесите из Python-файла в переменную окружения. В официальном примере добавьте импорт и замените строку сборки приложения:
import os
application = Application.builder().token(os.environ["BOT_TOKEN"]).build()
Импорт поставьте рядом с другими импортами, строку application замените внутри main(), сохранив её отступ. Остальная логика echobot остаётся прежней. В исходнике будет только имя BOT_TOKEN; секретное значение вводится в настройки среды.
При запуске локально задайте BOT_TOKEN средствами своей среды разработки и убедитесь, что бот ещё отвечает. При отсутствии переменной обращение через квадратные скобки даст KeyError: это полезная подсказка, какой настройки не хватает. Название нужно перенести точно. Между BOT_TOKEN в коде и TELEGRAM_TOKEN в настройках связи не возникнет, сколько бы вы ни перезапускали процесс.
В репозитории остаются код и зависимости. .env, токен и личные данные туда не добавляйте. Если токен попал в открытый репозиторий, замените его через BotFather. Telegram советует хранить токен как пароль; удаление строки не убирает её из истории репозитория.
Передайте worker две команды и токен
Откройте настройки уже доступного Background Worker. Подключите репозиторий и ветку, где лежит подготовленный проект. Если код вложен в отдельную папку, укажите её как Root Directory. Следующие имена файлов и команды считаются относительно этой папки.
| Поле | Что указать | Зачем это нужно |
|---|---|---|
| Тип сервиса | Background Worker | Наш бот получает события исходящими запросами |
| Language / Runtime | Python | Хостинг готовит среду для Python-кода |
| Build Command | pip install -r requirements.txt |
Установить зависимости до запуска |
| Start Command | python bot.py |
Запустить файл, который остаётся работать |
| Environment | BOT_TOKEN и его секретное значение |
Дать коду доступ к своему боту |
| Число экземпляров | Один | Сохранить единственного постоянного получателя polling |
Для файла main.py укажите python main.py. Регистр важен: Bot.py и bot.py — разные имена. При ошибке «файл не найден» проверьте имя и корневую папку.
Последовательность Build Command → Start Command описана в документации о развёртывании Render. Build устанавливает библиотеки, Start запускает программу. Службы разные: грузчики могут донести диспетчерскую до пятого этажа, поставить посреди комнаты и с чистой совестью уехать. Отвечать на звонки они не нанимались. После сборки найдите в журнале запуск приложения и проверьте ответ в чате.
Версию Python закрепите по локальному проекту: файлом .python-version в корне либо переменной PYTHON_VERSION. У переменной приоритет выше; для неё нужен полный номер из трёх чисел, как в выводе python --version. Эти правила описаны в справке о версии Python. Проверьте, что старое значение переменной не перекрывает ваш файл.
Токен добавляется в Environment как Key BOT_TOKEN и Value с самим токеном. По справке о секретах Render, Save only сохраняет настройку до следующего deploy. Сейчас выберите этот вариант; запуск выполним после остановки старой копии. Сам токен в журналы не печатайте. В официальном echobot уже приглушены подробные сообщения httpx; сохраните эту настройку, чтобы адреса запросов не оседали в обычном журнале.
Оставьте одного получателя сообщений
Перед запуском на хостинге остановите локального бота через Ctrl+C в его терминале. Закрытие редактора с отдельно работающим терминалом процесс не всегда останавливает. Проверьте также прежний хостинг, если он был: там тот же токен больше никто опрашивать не должен.
У Telegram два взаимоисключающих способа получать события: polling через getUpdates и webhook. При webhook Telegram отправляет событие на заданный адрес. В нашем пути программа сама забирает события. Если прежде был конструктор с webhook, остановите старую интеграцию и уберите его маршрут. Следующая команда меняет доставку именно вашего бота; выполняйте её, когда решили переходить на polling.
В терминале с Bash и установленным curl введите токен скрыто. Он передаётся curl через стандартный ввод и не попадает в текст сохранённой команды:
read -rsp 'Токен своего бота: ' BOT_TOKEN
printf '\n'
printf 'url = "https://api.telegram.org/bot%s/deleteWebhook"\nrequest = "POST"\ndata = "drop_pending_updates=false"\n' "$BOT_TOKEN" |
curl --disable --config - --silent --show-error --max-time 20
unset BOT_TOKEN
Успех метода deleteWebhook возвращает ok: true и result: true. Параметр drop_pending_updates=false не очищает ожидающие события. Затем через getWebhookInfo проверьте пустое поле url: команды чтения есть в инструкции для бота, который не отвечает.
Если в журнале появляется Conflict с текстом о другом запросе getUpdates, ищите вторую копию с тем же токеном. На ноутбуке один Python, на хостинге другой — два питона тянут зубами один бумажный самолётик. Вы хотели помочь боту переехать, а поселили второго такого же, причём ключи от почты выдали обоим. На постоянной основе оставьте один экземпляр; настройки масштабирования Render позволяют проверить их число.
При самом развёртывании есть тонкость: Render может кратко держать старый и новый экземпляры одновременно. Поэтому конфликт только во время смены версии отличается от конфликта, который продолжается после её завершения. Сначала дождитесь окончания перехода, затем проверьте новую строку в чате. Устойчивый Conflict требует искать лишнюю копию, даже если вы уже выключили ноутбук. Когда прежний получатель остановлен и настройки готовы, в Deploys выберите Manual Deploy → Deploy latest commit. Дождитесь запуска подготовленной версии.
Хостинг для Telegram-бота на Python проверяют свежим сообщением: успешная сборка ещё оставляет открытым вопрос, отвечает ли запущенная программа.
Проверьте ответ, перезапуск и память
Дождитесь запуска приложения и откройте его Logs. Если установка зависимостей завершилась, но приложение сразу остановилось с ошибкой, читайте последнюю ошибку запуска. ModuleNotFoundError отсылает к зависимостям и выбранному окружению; KeyError: BOT_TOKEN — к имени и применению переменной. Выберите одну причину, исправьте и повторите запуск.
В личном чате со своим ботом отправьте /start, затем «Проверка: хлеб». Echobot должен вернуть этот текст. Для собственного сценария возьмите известную команду с заранее понятным ответом.
Теперь выключите ноутбук, на котором раньше запускали бота. С телефона отправьте новую строку «Проверка: молоко». Новое слово здесь полезнее десятка зелёных галочек: вы видите свежую работу после выключения компьютера. Старое «Хлеб» из истории чата такой проверки не заменит.
После этого в Render откройте Deploys → Manual Deploy → Restart service. Дождитесь завершения перезапуска и отправьте третью строку: «Проверка после перезапуска». Ожидается тот же механизм ответа. Команда и особенности restart описаны в документации Render: используется текущая развёрнутая версия и её конфигурация. Сохранённые, но ещё не применённые новые переменные такой restart не подхватит.
А теперь представьте следующий вечер. Бот бодро здоровается, но из списка покупок пропало всё, что вы записали утром. Вы уже дома с одним хлебом. Молоко, яйца и вся утренняя решительность исчезли вместе со старым процессом. Echobot просто возвращает текст, поэтому хранение ему пока не требуется. Но если ваш собственный проект складывает покупки в обычный список Python, перезапуск этот список очистит.
Локальный файл сам по себе проблему тоже не решает: файловая система Render по умолчанию временная, изменения теряются при restart и deploy. Для постоянных записей нужен предусмотренный проектом внешний источник данных либо persistent disk — постоянный диск. Он сохраняет файлы только внутри подключённой папки. Важно проверить, что программа действительно пишет туда; файл рядом с bot.py от одного факта покупки диска бессмертным не станет.
Проверьте память отдельно: добавьте одну нейтральную запись, перезапустите проект и попросите вернуть её. Сохранился ответ «Привет» — хорошо, но нужна именно добавленная запись. Когда бот научится отмечать покупки, повторите проверку и для отметки «Куплено». Так вы узнаете о забывчивости дома, пока ещё можно обойтись без второй поездки за молоком.
Через некоторое время и на следующий день повторите одну известную команду. При ошибке сопоставьте её время с новой попыткой и прочитайте журнал.
Попросите ИИ найти следующий шаг
Если всё ломается на установке библиотеки, дайте помощнику этот фрагмент журнала, название зависимости и версии. Если процесс работает, а бот молчит, привяжите ошибку к новой попытке: «В 14:10 отправил проверочную строку, вот что появилось в Logs». Полученную правку проверьте свежим сообщением. Так разговор возвращается к работающей программе. Перед отправкой журнала просмотрите даже адреса запросов: в них тоже бывает токен.
Частые вопросы
Нужен ли домен для Python-бота с polling?
Для описанного пути домен не нужен: worker сам обращается к Bot API. Публичный HTTPS-адрес нужен при другом способе доставки, webhook.
Можно ли просто загрузить bot.py в файловый хостинг?
Хранение файла не запускает программу. Нужна среда, которая выполняет Python и поддерживает работающий процесс с вашей командой запуска.
Почему текст возвращается, а фотография — нет?
В echobot настроен обработчик текстовых сообщений. Фото требует своего обработчика и логики ответа. Перенос на хостинг этого поведения не добавляет.
Хостинг сделает бота умнее?
Он даёт программе место для выполнения. Ответы определяет ваш код. Подключение модели, её ключ и оплата API — отдельная часть проекта; для первого переноса echobot они не нужны.
Когда бот ответит с выключенным ноутбуком и повторит ответ после перезапуска, у вашего маленького проекта появится отдельное место жительства. Следующая приятная ступень — чтобы он помнил покупки и позволял отмечать выполненное. Для неё откройте практику о ботах и опишите свой сценарий: что присылаете, что хотите получить и что должно сохраниться до завтра.
А ноутбук теперь можно убрать с кухни. Хлебная диспетчерская переехала.