Skip to content
VDS · 应用与机器人

服务器上的 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 文件——不要指望没人会注意到。