远程服务器持续运行的Telegram Bot脚本:如何检测GitHub新版本并更新?
我来给你几个实用的方案,都是我自己和身边开发者常用的,能完美解决你每次手动登服务器更新的麻烦:
方案一:定时拉取+自动重启(简单易上手)
这个方案适合不想折腾复杂配置的场景,核心是让服务器定期检查GitHub仓库的更新,有变化就自动拉取并重启Bot。
先把仓库克隆到服务器
登录服务器后,用Git把你的Bot仓库拉下来:git clone git@github.com:your-username/your-bot-repo.git如果是私有仓库,记得配置SSH密钥(生成密钥后添加到GitHub的SSH Keys里),这样拉取时不用输密码。
写一个更新脚本
在仓库目录下创建update_bot.sh,内容如下(根据你的Bot语言调整):#!/bin/bash cd /path/to/your-bot-repo # 拉取最新代码 git fetch origin main LOCAL_HASH=$(git rev-parse HEAD) REMOTE_HASH=$(git rev-parse origin/main) # 对比本地和远程的commit哈希 if [ "$LOCAL_HASH" != "$REMOTE_HASH" ]; then echo "发现新版本,开始更新..." git pull origin main # 重启Bot(如果用systemd管理的话,直接重启服务) sudo systemctl restart telegram-bot echo "Bot已更新并重启完成" else echo "当前已是最新版本,无需更新" fi给脚本加执行权限:
chmod +x update_bot.sh用crontab定时执行
编辑定时任务:crontab -e添加一行,比如每小时检查一次:
0 * * * * /path/to/update_bot.sh >> /var/log/bot_update.log 2>&1这样更新日志会存在
/var/log/bot_update.log里,方便排查问题。
方案二:GitHub Webhook触发实时更新(更及时)
如果想要有新版本推送就立刻更新,用Webhook是最佳选择,GitHub会在你push代码时主动通知服务器。
在GitHub上配置Webhook
打开你的仓库 → Settings → Webhooks → Add webhook:- Payload URL:填服务器上的一个接口地址(比如
http://your-server-ip:8000/update-bot) - Content type:选
application/json - Secret:设一个随机的密钥(比如
your-secret-key),用来验证请求合法性 - Which events would you like to trigger this webhook? 选
Just the push event
- Payload URL:填服务器上的一个接口地址(比如
在服务器上部署Webhook接收服务
用Python写个简单的Flask服务(需要先装Flask:pip install flask),比如webhook_server.py:from flask import Flask, request, abort import hmac import hashlib import subprocess app = Flask(__name__) SECRET = "your-secret-key" # 和GitHub上的Secret一致 def verify_signature(payload_body, signature_header): hash_object = hmac.new(SECRET.encode(), msg=payload_body, digestmod=hashlib.sha256) expected_signature = "sha256=" + hash_object.hexdigest() return hmac.compare_digest(expected_signature, signature_header) @app.route('/update-bot', methods=['POST']) def update_bot(): signature_header = request.headers.get('X-Hub-Signature-256') if not verify_signature(request.data, signature_header): abort(403) # 执行更新脚本 subprocess.run(['/path/to/update_bot.sh'], check=True) return "Bot更新完成", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8000)把这个服务用systemd管理起来,确保它一直运行。
配合systemd管理Bot
强烈建议用systemd托管你的Bot,这样重启更可靠,还能自动恢复崩溃的进程。创建/etc/systemd/system/telegram-bot.service:[Unit] Description=Telegram Bot Service After=network.target [Service] User=your-username WorkingDirectory=/path/to/your-bot-repo ExecStart=/usr/bin/python3 bot.py # 替换成你的Bot启动命令 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable telegram-bot sudo systemctl start telegram-bot
方案三:Docker容器化+Watchtower自动更新(最省心)
如果你的Bot已经容器化了,用Watchtower工具可以全自动检测镜像更新并重启容器,几乎不用手动干预。
把Bot打包成Docker镜像
写一个Dockerfile,比如:FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "bot.py"]构建镜像并推送到Docker Hub或GitHub容器注册表:
docker build -t your-username/telegram-bot:latest . docker push your-username/telegram-bot:latest用docker-compose部署Bot
创建docker-compose.yml:version: '3' services: telegram-bot: image: your-username/telegram-bot:latest restart: always environment: - TELEGRAM_TOKEN=your-token启动容器:
docker-compose up -d部署Watchtower自动更新镜像
运行Watchtower容器,它会定期检查镜像更新:docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower \ --interval 3600 # 每小时检查一次如果你想实时触发更新,也可以给Watchtower配置Webhook,和GitHub联动。
一些额外的注意事项
- 不管用哪种方案,都要确保服务器有足够的权限执行Git拉取和服务重启操作。
- 私有仓库的话,Git的SSH密钥或者容器镜像的拉取权限要配置好。
- 记得备份重要的配置文件(比如Bot的token、数据库文件),避免更新时被覆盖。
内容的提问来源于stack exchange,提问作者bqback




