服务器上的 Telegram 机器人:启动与自启
如何在 VPS 上托管 Telegram 机器人:用独立用户隔离、systemd 服务、令牌存储、日志,以及处理网络中断。
更新于 2026年8月23日
机器人需要一个持续运行的进程——免费托管到此为止,VDS 从这里开始。机器人几乎不需要什么资源:即便是 VDS-1(1 核、2 GB)也能撑起一个拥有数千用户的机器人。
部署
单独的用户和目录——这样机器人就不会以 root 身份运行:
useradd -r -m -d /srv/bot -s /usr/sbin/nologin botuser
cd /srv/bot && sudo -u botuser git clone https://github.com/you/bot.git .
sudo -u botuser python3 -m venv venv
sudo -u botuser venv/bin/pip install -r requirements.txt
对于 Node.js:用 npm ci --omit=dev 代替 venv。
把令牌放在环境变量文件里,而不是代码里:
install -o botuser -g botuser -m 600 /dev/null /srv/bot/.env
echo 'BOT_TOKEN=123456:ABC...' > /srv/bot/.env
存放令牌的文件绝不能进入仓库:在第一次提交之前就把它加入 .gitignore。
服务
/etc/systemd/system/tgbot.service:
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/srv/bot
EnvironmentFile=/srv/bot/.env
ExecStart=/srv/bot/venv/bin/python -u bot.py
Restart=always
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tgbot
journalctl -u tgbot -f
Python 的 -u 参数会关闭输出缓冲——没有它,日志会在几分钟后才出现在 journal 中,甚至完全不出现。
长轮询还是 webhook
长轮询更简单:机器人自己向 Telegram 轮询,您不需要对外暴露任何东西。对大多数任务来说这就够了。
webhook 更快,也更省流量,但需要域名和证书:
location /bot/token {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
您需要 Let's Encrypt 和反向代理。Telegram 不太接受自签名证书——请使用正规证书。
绝不能同时运行两份机器人副本:Telegram 只会把更新投递给其中一个接收方,机器人就会时灵时不灵。修改之后请执行 restart,而不是再启动一次。
数据
SQLite 足以应付设置和统计——就是一个放在机器人旁边的文件。只有当机器人带有网页面板或多个进程时,才需要单独的数据库服务器。
常见错误
| 现象 | 原因 |
|---|---|
Conflict: terminated by other getUpdates | 同时运行着两份机器人副本 |
| 机器人过了一夜就没反应了 | 没有配置 Restart=always,进程在网络中断时崩溃了 |
Unauthorized | 令牌已被吊销,或复制时带了多余空格 |
| 没有日志 | 输出缓冲,或者写到了文件而不是 stdout |
| 手动运行正常,作为服务就崩溃 | systemd 中没有配置环境变量 |
出现在截图、公开仓库或他人聊天中的令牌都视为已泄露。请通过 BotFather 吊销它并修改
.env文件——不要指望没人会注意到。