Греки у Куна высадились в Мизии, уверенные, что это Троя. Корабли причалили, воины сошли на берег — с адресом промахнулись. У бота тоже бывает такая высадка: файлы уже на хостинге, сборка закончилась, а в телефоне по-прежнему тишина.

Для 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 они не нужны.

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

А ноутбук теперь можно убрать с кухни. Хлебная диспетчерская переехала.