You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

远程服务器持续运行的Telegram Bot脚本:如何检测GitHub新版本并更新?

自动检测GitHub脚本更新并远程更新Telegram Bot的方案

我来给你几个实用的方案,都是我自己和身边开发者常用的,能完美解决你每次手动登服务器更新的麻烦:

方案一:定时拉取+自动重启(简单易上手)

这个方案适合不想折腾复杂配置的场景,核心是让服务器定期检查GitHub仓库的更新,有变化就自动拉取并重启Bot。

  1. 先把仓库克隆到服务器
    登录服务器后,用Git把你的Bot仓库拉下来:

    git clone git@github.com:your-username/your-bot-repo.git
    

    如果是私有仓库,记得配置SSH密钥(生成密钥后添加到GitHub的SSH Keys里),这样拉取时不用输密码。

  2. 写一个更新脚本
    在仓库目录下创建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

  3. 用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代码时主动通知服务器。

  1. 在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
  2. 在服务器上部署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管理起来,确保它一直运行。

  3. 配合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工具可以全自动检测镜像更新并重启容器,几乎不用手动干预。

  1. 把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
    
  2. 用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

  3. 部署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

火山引擎 最新活动