跳至主要内容
五折优惠 全部方案,限时优惠。起价 $2.48/mo
剩余 11 分钟
云架构与 IT

Telegram 机器人托管最佳 VPS:长轮询、Webhook、IPv4 与月费

C 作者 Chike 11 分钟阅读
通过 VPS 和持续连接托管 Telegram 机器人

机器人原本会回复每条消息,直到笔记本电脑合上盖子,用户便收不到回应了。每月花几美元租一台小型 VPS 就能解决这个问题。适合 Telegram 机器人的 VPS 取决于它获取更新的方式:由机器人向 Telegram 请求,或者由 Telegram 主动推送。

这个选择决定了所需端口、证书,以及是否需要公网 IPv4 连接。

简短版本

  • 一台 VPS 运行一个机器人时,使用长轮询即可,无需域名、证书或开放入站端口。
  • Webhook 需要在 443、80、88 或 8443 端口提供 HTTPS,并拥有公网 IPv4 地址。Telegram 不通过 IPv6 投递 Webhook。
  • 512 MB of RAM is a workable start for one bot with no local database.
  • 使用 systemd 保持机器人运行;如果已经使用容器部署,则使用 Docker 的重启策略。
  • 选择服务商时要考虑 IPv4 和内存余量,不能只看标价。

长轮询还是 Webhook:决定服务器需求的选择

Telegram 与 VPS 之间的长轮询和 Webhook 连接

Telegram 机器人通过两种方式之一接收更新。使用长轮询时,机器人调用 getUpdates,Telegram 会保持请求,直到有更新或超时,因此每条连接都由服务器发起。使用 Webhook 时,通过 setWebhook 注册一次 URL,Telegram 随后通过 HTTPS 将每条更新 POST 到该地址。

需求 长轮询(getUpdates) Webhook(setWebhook)
入站端口 不需要;只有出站请求 443、80、88 或 8443 端口上的 HTTPS
公网 IPv4 不需要 需要;Webhook 不支持 IPv6
域名与证书 不需要 需要证书;通常使用域名,但自签名证书可将 IP 用作 CN
进程 持续运行 持续响应 HTTPS 请求

Webhook 一栏依据 Telegram 的 Webhook 要求。

要确认机器人使用哪种方式,可查询 Bot API:

curl "https://api.telegram.org/bot<YOUR_TOKEN>/getWebhookInfo"

如果响应包含 "url":"",说明尚未配置 Webhook,机器人可以使用长轮询。grammY 的 bot.start() 默认使用长轮询;python-telegram-bot 使用 run_polling() 或 run_webhook()。

对于独占一台 VPS 的单个机器人,我会选择轮询,这也是 grammY 的默认建议。如果服务器已经运行反向代理(将 HTTPS 请求转发给机器人的 Web 服务器),多个机器人共用一个 HTTPS 端点,或使用无服务器平台,Webhook 更合适。这种情况下,Caddy 会自动获取和续订证书,无需 cron 任务。

短暂中断会延迟消息,但不会丢失消息。根据 Bot API 的更新规则,无论采用哪种方式,Telegram 都会保留更新,直到机器人接收,最长 24 小时;它还会在放弃前重试失败的 Webhook 请求。

如果 Webhook 直接独占端口,应将该端口的访问来源限制为 Telegram 公布的 IP 段。如果 443 端口由同时服务其他站点的反向代理共享,应只限制 Webhook 路径,或使用 Telegram 的密钥令牌,避免拦截其他所有 HTTPS 流量。Webhook 指南列出了两个来源地址段,并提醒它们可能变化。以 UFW 作为主机防火墙时:

sudo ufw allow 22/tcp    # keep SSH open before you enable the firewall

sudo ufw allow proto tcp from 149.154.160.0/20 to any port 443

sudo ufw allow proto tcp from 91.108.4.0/22 to any port 443

sudo ufw allow 80/tcp    # if your HTTPS setup uses HTTP validation or redirects HTTP to HTTPS

sudo ufw enable

如果 Webhook 监听 80、88 或 8443,请修改 443。这些规则保护直接运行在主机上的机器人。Docker 防火墙文档说明发布端口会绕过 UFW,因此以 -p 443:443 启动的 Webhook 容器仍对所有人开放。同时请在 setWebhook 中设置 secret_token。Telegram 会在每个请求的 X-Telegram-Bot-Api-Secret-Token 请求头中返回该值,处理程序应拒绝缺少该值的请求。

保持机器人运行:systemd 或 Docker

使用 systemd 或 Docker 持续运行 Telegram 机器人

要让 Telegram 机器人全天候运行,就必须在崩溃和服务器重启后重新启动它。在 VPS 上可由 systemd 完成;若机器人以镜像部署,也可以使用 Docker。

systemd 单元是一个简短的配置文件,告诉初始化系统如何启动和重启程序。创建 /etc/systemd/system/telegram-bot.service:

[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
User=bot
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/python bot.py
# Node: ExecStart=/usr/bin/node bot.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

将令牌以 BOT_TOKEN=... 的形式写入项目目录中的 .env 文件,并通过 os.environ["BOT_TOKEN"](Node 使用 process.env.BOT_TOKEN)读取,避免将其写入代码。然后将项目复制到指定位置并启动:

sudo mkdir -p /opt/bot

sudo cp -r ~/your-bot/. /opt/bot/        # your project, after git clone or scp from your machine; include .env and requirements.txt

sudo apt install -y python3-venv         # Debian/Ubuntu

sudo useradd --system --no-create-home bot

sudo chown -R bot:bot /opt/bot

sudo -u bot python3 -m venv /opt/bot/venv

sudo -u bot /opt/bot/venv/bin/pip install -r /opt/bot/requirements.txt

# Node: skip the venv and pip commands above, then run:

cd /opt/bot && sudo -u bot npm ci

sudo chmod 600 /opt/bot/.env

sudo systemctl daemon-reload

sudo systemctl enable --now telegram-bot

systemctl status telegram-bot    # look for: Active: active (running)

sudo journalctl -u telegram-bot -f    # follow the bot's logs

根据 systemd.service 手册,Restart=always 会在机器人正常退出或崩溃后重启它,而 on-failure 不会重启正常退出的进程。RestartSec=5 为重启尝试设置间隔,WantedBy=multi-user.target 配合 enable 可让机器人开机启动。如果它不断重启,运行 sudo journalctl -u telegram-bot -n 50 可查看错误堆栈。首先检查是否缺少 BOT_TOKEN。

Docker 中只需一个等效参数:

docker run -d --name telegram-bot --restart unless-stopped --env-file .env your-bot-image

docker logs -f telegram-bot

Compose 中对应的配置行是 restart: unless-stopped。Docker 重启策略文档说明,容器退出或守护进程重启后会重新启动,但用户主动停止后不会自动恢复。只要 Docker 本身开机启动,该策略也适用于服务器重启;Debian 和 Ubuntu 默认如此。其他系统请执行 sudo systemctl enable docker.service。

我的原则是:小型服务器上运行一个脚本就用 systemd,避免额外的守护进程占用内存。如果已经构建镜像或运行其他容器,就使用 Docker,并接受其守护进程会占用部分内存。

这两种工具都不会通知你机器人已经离线。部署在另一台服务器上的 Uptime Kuma 推送监控可以做到。机器人定时访问监控 URL,调用停止后,Uptime Kuma 会通过 Telegram 发出告警。

免费托管和家庭服务器的局限

Render 的免费 Web 服务在 15 分钟没有入站流量后会休眠,Render 免费套餐文档表示唤醒约需一分钟。轮询机器人没有入站流量,因此会被停止。Webhook 机器人会由 Telegram 的 POST 请求唤醒,但在长时间无活动后会经历冷启动。因此,免费托管是否适合 Telegram 机器人,取决于它使用哪种方式。

grammY 指南将无服务器平台列为适合 Webhook 的方案,而长轮询需要一台全天运行的机器。Fly.io 按用量收费,并且要求账户留存支付卡信息。

只要设备、电力和网络持续可用,Raspberry Pi 或旧电脑就可以运行轮询机器人。在家中使用 Webhook 还需要公网地址和端口转发。对于业余项目,这两种免费方案都可能足够。

VPS 以固定月费支持这两种方式。

适合 Telegram 机器人的五家 VPS 服务商对比

五家 Telegram 机器人托管 VPS 服务商比较

下表比较五款 Telegram 机器人托管入门付费套餐,采用截至 2026 年 10 月的广告月价,均为税前价。适用时已注明促销价格。

服务商 入门套餐配置 月费 公网 IPv4 账单
Cloudzy 1 vCPU(AMD EPYC),512 MB DDR5,20 GB NVMe,1 TB 流量 促销价 $2.48(原价 $4.95) 已包含,另含 IPv6 按小时或按月
DigitalOcean 1 vCPU,512 MiB,10 GiB SSD,500 GiB 流量 $4 起 已包含 按秒,以月价封顶
Vultr 1 vCPU,512 MB,10 GB SSD,512 GB 流量 仅 IPv6:$2.50 起;含 IPv4:$3.50 起 仅 $3.50 套餐包含 按小时或按月
Hetzner(德国/芬兰) 2 vCPU,4 GB,40 GB SSD,20 TB 流量 €5.49 起,不含增值税 另付 €0.50/月起,不含增值税(IPv6 免费) 按小时计费,不超过月价
Linode (Akamai) 1 vCPU,1 GB,25 GB 存储,1 TB 流量 $5 起 已包含 按小时或按月

Vultr 的纯 IPv6 套餐不含 IPv4,而 Hetzner 的价格也不含 IPv4 地址。没有 IPv4,两者都无法接收 Webhook。

由于 api.telegram.org 有 IPv6 地址,轮询机器人可以在纯 IPv6 环境运行。但它访问的其他所有服务也必须支持 IPv6,包括软件包仓库、Git 托管平台,以及调用的每个 API。选择前请逐一检查主机:

dig +short AAAA api.telegram.org

dig +short AAAA github.com

dig +short AAAA pypi.org    # repeat for every host your bot or its installs reach

结果为空表示该主机没有 IPv6 地址。

512 MB 足够运行 Telegram 机器人吗?

对于不使用本地数据库的单个机器人,我会从 512 MB 起步。python-telegram-bot 文档没有列出内存要求。实际需求取决于共用服务器的组件:操作系统、Docker 守护进程(若使用)以及本地数据库。请实际测量。

free -m                   # "available" is your headroom; the Swap row shows swap use

ps -o rss,cmd -p "$(systemctl show -p MainPID --value telegram-bot)"   # bot's resident memory, in KB

docker stats --no-stream  # per-container memory, if the bot runs in Docker

journalctl -k | grep -i "out of memory"   # kernel OOM kills

内存不足(OOM)终止是指内核为释放内存而结束进程。systemd 会重启机器人,因此那一条日志可能是唯一线索。出现 OOM 终止、持续使用交换空间,或准备添加本地数据库或第二个机器人时,应升级到 1 GB。

该选哪一个

运行一个机器人,我会选择包含公网 IPv4 的 512 MB 套餐。随后根据价格、资源余量和用户所在地选择服务商。

  • 目前最低月价:Cloudzy 在五折促销期间为 $2.48,包含 IPv4 和 IPv6。
  • 目前含 IPv4 的最低价格:Cloudzy 促销期间为 $2.48,包含独享 IPv4 和 IPv6。
  • 1 GB of headroom for Docker or a small database: Linode, from $5 a month.
  • 多个机器人或数据库,用户在欧洲:Hetzner,在此表中每欧元可获得最多资源(前提是该套餐有货;2026 年 10 月时显示为不可用)。使用 Webhook 需加上 IPv4 费用。
  • 512 MB 档位中更多磁盘和流量:Cloudzy。它在这些 512 MB 套餐中提供最多存储(20 GB NVMe,对比其他套餐的 10 GB)和流量(1 TB,对比约 500 GB),并包含 IPv4 和 IPv6。按当前促销价,Cloudzy 也比本比较中的其他入门套餐便宜。

按当前促销价,Cloudzy 不仅在本比较中月费最低,其存储和流量也高于其他 512 MB 套餐。Cloudzy 的 512 MB 套餐按小时计费,并提供 14 天退款保证,因此可以先运行几天再作决定。选择最靠近用户的位置,部署 Cloudzy Linux VPS,然后加入上面的 systemd 单元。

常见问题

能运行 Telegram 机器人的最便宜 VPS 是什么?

截至 2026 年 10 月,Cloudzy 的 512 MB 套餐在五家中最便宜,五折促销期间每月 $2.48,包含独享 IPv4 和 IPv6。原价为每月 $4.95。Vultr 的仅 IPv6 套餐起价略高,为 $2.50。

Telegram Webhook 为什么需要 HTTPS?

根据 Webhook 指南,无论使用哪个端口,Telegram 都要求 Webhook 使用 SSL/TLS。它拒绝明文 HTTP,接受 TLS 1.2 或更高版本。如果没有 TLS,每次 POST 都会以未加密形式传输用户消息。可以使用 Let's Encrypt 证书,也可以使用通过 setWebhook 上传的自签名证书。

Telegram 机器人能在 512 MB 内存上运行吗?

通常可以,前提是仅运行一个机器人且没有本地数据库。请监控内核日志中的内存不足终止记录;若出现此类记录或添加数据库,应升级到 1 GB。

如何让 Telegram 机器人在重启后继续运行?

使用 sudo systemctl enable --now telegram-bot 启用 systemd 服务,或以 --restart unless-stopped 运行容器,并启用 docker.service,确保 Docker 开机启动。

Telegram 会按 IP 地址限制机器人的请求速率吗?

Telegram 的机器人限额常见问题按机器人和聊天说明限制;不应将迁移服务器视为绕过限制的方式。超限后,API 返回 HTTP 429 及 retry_after 值。请等待该值指定的秒数后再重试。

Telegram 机器人该选择哪个服务器地区?

选择最靠近用户及机器人调用服务的位置,然后在每个候选位置运行 curl -o /dev/null -s -w '%{time_connect}\n' https://api.telegram.org 测量连接时间。

分享

讨论

评论

登录后参与讨论。

博客更多内容

继续阅读。

准备好部署了吗? 起价 $2.48/月。

独立云厂商,自 2008 年起。AMD EPYC、NVMe、40 Gbps。14 天退款保证。