Railway

Deploy Telegram Bot Starter — Python + telebot

Production-ready Python Telegram bot: commands, keyboards, long polling

Deploy Telegram Bot Starter — Python + telebot

Telegram Bot Python

aeither/telegram-bot-python

Just deployed

Deploy and Host a Python Telegram Bot on Railway

This template deploys a production-ready Telegram bot written in Python with the pyTelegramBotAPI (telebot) library. It ships with a real command router, inline and reply keyboards, error handling, and graceful shutdown — not just an echo loop — so you have a foundation to build on rather than a snippet to rewrite.

Add your bot token, deploy, and the bot is live in under two minutes.


What This Template Deploys

ServicePurpose
Telegram BotA long-running Python process connected to the Telegram Bot API via long polling

A single always-on service. No webhook, no public domain, and no database required to get started — long polling means Telegram pushes updates to the bot without any inbound networking to configure.


About Hosting a Python Telegram Bot

A Telegram bot is a long-lived process: it opens a connection to Telegram, waits for messages, and replies. That sounds trivial until you host it. On a laptop it stops the moment you close the lid. On a bare VPS you are writing systemd units, handling restarts, and babysitting a process that dies silently at 3am.

Railway keeps the process alive. The service restarts automatically on failure, redeploys on every push, and streams logs so you can see exactly what your bot received and how it replied. Because this template uses long polling, there is nothing to expose publicly — no webhook URL, no TLS, no domain.

Dependencies are managed with uv, so cold builds are fast and the lockfile keeps production identical to local.

Typical cost: ~$5/month on Railway's Hobby plan for a single always-on bot, flat regardless of how many users it serves.


What's In the Box

This is a starter you can ship on, not a bare /start handler:

  • Command router/start, /help, and example commands wired through a clean dispatch pattern you extend by adding one function
  • Reply and inline keyboards — a persistent menu that appears after /start plus an inline-button example with callback handling
  • Message handlers — text echo, unknown-command fallback, and a template for content-type filtering
  • Environment-based config — the bot token and settings come from environment variables, never the codebase
  • Graceful shutdown — the polling loop exits cleanly on restart instead of leaving a half-open connection
  • Structured logging — every update and reply is logged, so Railway's log view is actually useful

Deploy in Under 5 Minutes

  1. Message @BotFather on Telegram, send /newbot, and copy the token it gives you
  2. Click Deploy on Railway and wait for the build (~1–2 minutes)
  3. Set TELEGRAM_BOT_TOKEN to the token from BotFather
  4. Open Telegram, start a chat with your bot, and send /start
  5. The menu appears and the bot responds immediately

No webhook setup, no domain, no SSL.


Common Use Cases

  • Personal automation — a private bot that runs commands, posts reminders, or pings you when something happens
  • Community and support bots — greet new members, answer FAQs with canned commands, and route requests
  • Notification delivery — call the bot from your own scripts or cron jobs to push alerts to a chat or channel
  • Rapid prototyping — a clean base to test a bot idea without wiring the boilerplate first
  • Learning Telegram bot development — readable, commented code showing the patterns telebot actually uses in production

Configuration

VariableRequiredDescription
TELEGRAM_BOT_TOKENRequiredBot token from BotFather — the bot will not start without it
BOT_ADMIN_IDOptionalYour numeric Telegram user ID, for admin-only commands
LOG_LEVELOptionalINFO in production, DEBUG while developing
WELCOME_MESSAGEOptionalOverride the text sent on /start without editing code
PARSE_MODEOptionalHTML or MarkdownV2 for formatted replies (default HTML)

Keep your token secret. Anyone with the bot token has full control of the bot. Set it as a Railway variable — never commit it. If it leaks, revoke and reissue it through BotFather immediately.


Dependencies for Python Telegram Bot Hosting

  • Railway account — Hobby plan (~$5/month) runs a single always-on bot
  • A Telegram account and a bot token from BotFather
  • Optional: a Railway Postgres service if you later need to persist user state or history

Deployment Dependencies

Implementation Details

The bot runs as a single Python service built with uv. TELEGRAM_BOT_TOKEN is read from the environment at startup, and the process connects to Telegram over long polling — Telegram delivers updates to the bot, so no inbound port, webhook, or domain is needed.

Commands are registered through a dispatch layer rather than a flat wall of handlers, so adding behaviour is a matter of writing one function and registering it. The polling loop is wrapped with exception handling and a clean shutdown path, which prevents the duplicate-update problems that occur when a bot is redeployed while an old instance is still polling.

The template runs statelessly by default. If you need to remember users, conversations, or settings across restarts, add a Railway Postgres service and a reference variable — the code is structured to make that a small change rather than a rewrite.


Frequently Asked Questions

Do I need a webhook or a public domain? No. This template uses long polling, so Telegram pushes updates to the bot. There is nothing to expose publicly and no SSL to configure. Webhooks are an option later if you need lower latency at high volume.

Where do I get a bot token? From @BotFather on Telegram. Send /newbot, follow the prompts, and copy the token into TELEGRAM_BOT_TOKEN.

Does the bot remember conversations after a redeploy? Not by default — it runs statelessly. Add a Railway Postgres service if you need to persist user state, and store what you need against each user's Telegram ID.

Can two people run the same bot at once? No. Telegram allows only one long-polling connection per token. If you deploy the same token twice, updates conflict. Run one instance per bot, and let Railway restart it rather than running a second copy.

How do I add my own commands? Write a handler function and register it with the dispatcher. The included /help and menu examples show the pattern; extending the bot does not require touching the polling loop.

Is telebot the right library? telebot (pyTelegramBotAPI) is a mature, synchronous library that is quick to read and quick to ship with — well suited to command bots and automation. For heavily concurrent or async-first bots, python-telegram-bot or aiogram are worth a look; this template is deliberately the straightforward, synchronous option.

Can I turn this into an AI chatbot? Yes. Add your model provider's SDK and an API key as a Railway variable, then call it from a message handler. The config and handler structure are already in place for it.


Why Deploy a Python Telegram Bot on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying this Telegram bot on Railway you get an always-on process with automatic restarts, push-to-deploy, and live logs — no systemd, no webhook plumbing, no server to maintain. Add a token and your bot is live, with a clean codebase ready for whatever you build next.


Template Content

Telegram Bot Python

aeither/telegram-bot-python

More templates in this category

View Template
Telegram JavaScript Bot
A template for Telegram bot in JavaScript using grammY

Agampreet Singh
295
View Template
Cobalt Tools [Updated Jul ’26]
Cobalt Tools [Jul ’26] (Media Downloader, Converter & Automation) Self Host

shinyduo
245
View Template
Telegram Gateway
Multi-bot Telegram webhook gateway with real-time WebSocket event streaming

INAPP
4