如何让树莓派上的Node.js服务器自动获取GitHub代码变更?
解决方案建议
一、先完成树莓派代码与GitHub仓库的同步
如果还没把树莓派上的代码推到GitHub,先执行以下步骤:
- 进入树莓派的项目目录,初始化Git仓库:
git init - 添加所有项目文件到仓库:
git add . - 提交初始版本:
git commit -m "initial commit" - 关联你在GitHub创建的空远程仓库:
git remote add origin 你的GitHub仓库地址 - 推送到GitHub:
git push -u origin main
二、在线VS Code编辑代码(用GitHub Codespaces)
直接在GitHub仓库内启动在线VS Code:
- 打开你的GitHub仓库页面,点击顶部的「Code」按钮,切换到「Codespaces」标签,创建新的Codespace即可在线编辑代码。编辑完成后,提交并推送到
main分支即可。
三、树莓派拉取代码并重启服务(核心解决你的问题)
方法1:手动执行(新手友好,快速上手)
每次在线编辑推送代码后,通过SSH连接到树莓派,执行以下命令:
- 进入项目目录:
cd 你的项目绝对路径 - 拉取最新代码:
git pull origin main - 重启Node.js服务:
- 如果之前用
nodemon app.js启动,先终止旧进程:pkill -f nodemon - 后台重启nodemon:
nodemon app.js &
- 如果之前用
方法2:自动拉取+重启(进阶,无需手动操作)
通过webhook监听GitHub推送事件,自动触发更新和重启:
- 树莓派上安装webhook工具:
sudo apt install webhook - 创建钩子配置文件
hooks.json(放在项目目录或任意路径),内容如下:
[ { "id": "update-banana-site", "execute-command": "/home/pi/update-site.sh", "command-working-directory": "/home/pi/你的项目目录", "trigger-rule": { "and": [ { "match": { "type": "payload-hash-sha1", "secret": "自定义密钥(比如abc123xyz,越复杂越好)", "parameter": { "source": "header", "name": "X-Hub-Signature" } } }, { "match": { "type": "value", "value": "refs/heads/main", "parameter": { "source": "payload", "name": "ref" } } } ] } } ]
- 创建执行脚本
update-site.sh,赋予执行权限:chmod +x update-site.sh
脚本内容:
#!/bin/bash # 拉取最新代码 git pull origin main # 重启服务(如果用systemd管理,替换成下面的命令) # sudo systemctl restart banana.service pkill -f nodemon nodemon app.js &
- 后台启动webhook服务:
webhook -hooks hooks.json -port 9000 & - 配置GitHub仓库的webhook:
- 进入GitHub仓库的「Settings」→「Webhooks」,点击「Add webhook」
- Payload URL填写:
http://你的树莓派公网IP:9000/hooks/update-banana-site(局域网内的树莓派需要在路由器做端口映射,把9000端口映射到树莓派的内网IP) - Content type选择
application/json - Secret填写你在
hooks.json里设置的自定义密钥 - 勾选「Just the push event」,点击「Add webhook」保存
之后每次在线编辑推送代码,GitHub会自动通知树莓派拉取代码并重启服务。
四、更稳定的服务管理建议
用systemd管理Node.js服务,避免进程意外终止,且树莓派重启后自动启动:
- 创建systemd服务文件:
sudo nano /etc/systemd/system/banana.service - 写入以下内容:
[Unit] Description=Banana Website Service After=network.target [Service] User=pi WorkingDirectory=/home/pi/你的项目目录 ExecStart=/usr/bin/nodemon app.js Restart=always [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reloadsudo systemctl enable banana.servicesudo systemctl start banana.service - 后续重启服务只需执行:
sudo systemctl restart banana.service
内容的提问来源于stack exchange,提问作者KozynTheTaquito
相关产品推荐
相关产品推荐

