我的的小破站放在国外机房的一个乞丐主机上面,代码托管在 github 私有仓库,push 代码的时候希望自动更新网站,github 有 action,可以自己编写相关逻辑在 github 的 runner 上面实现代码更新,最简单的是 ssh 到服务器上面,执行相关操作,但是这样要填写 Actions secrets,老实说有点不太放心,想自己编写个简单服务更新代码,毕竟自己全部掌控,真理在手,天下我有,减少依赖,供应链安全^_^
1def update_site(script_name=""):
2 subprocess.run(["/bin/bash", script_name])
3
4
5@app.post("/api/update/mephistocc")
6async def update_mephisto_cc(background_tasks: BackgroundTasks):
7 background_tasks.add_task(update_site, script_name="update_mephisto.cc.sh")
8 return {"message": "update site in the background"}
1(.venv) ➜ stock.mephisto.cc git:(main) cat update_mephisto.cc.sh
2#!/bin/sh
3echo '开始执行webhook钩子'
4
5HOME_DIR=/data/mephisto.cc #此目录为服务器页面展示目录
6cd $HOME_DIR
7
8echo '清除git缓存'
9git clean -df
10
11echo '拉取远程代码'
12git pull origin main
13
14echo 'Job Done!'%
1root@tokyo:/data/mephisto.cc# systemctl status gunicorn
2● gunicorn.service - gunicorn daemon
3 Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
4 Active: active (running) since xxxxx CST; 15min ago
5Main PID: 2467813 (gunicorn)
6 Status: "Gunicorn arbiter booted"
7 Tasks: 5 (limit: 1036)
8 Memory: 91.2M
9 CGroup: /system.slice/gunicorn.service
10 ├─2467813 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
11 ├─2467814 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
12 ├─2467815 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
13 ├─2467816 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
14 └─2467817 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
在 github 仓库的配置 Payload URL,如下图所示

push 触发下 webhook,再去后台查看结果,看下图触发成功,返回了代码定义的结果

当然, 网站的更新方式千千万,你直接远古 scp ssh ftp rsync 更新都可以,我是因为登录外国服务器卡,也不想老是登录,这样够用也够灵活,同时只依赖 github 的 webhook,github 挂了,gitlab 类的也有 webhook,不用去学 action 的语法,个人觉得简单易用可控, 复杂的动态站点更新,可以自己定义格外的逻辑
我的的小破站放在国外机房的一个乞丐主机上面,代码托管在 github 私有仓库,push 代码的时候希望自动更新网站,github 有 action,可以自己编写相关逻辑在 github 的 runner 上面实现代码更新,最简单的是 ssh 到服务器上面,执行相关操作,但是这样要填写 Actions secrets,老实说有点不太放心,想自己编写个简单服务更新代码,毕竟自己全部掌控,真理在手,天下我有,减少依赖,供应链安全^_^
1def update_site(script_name=""):
2 subprocess.run(["/bin/bash", script_name])
3
4
5@app.post("/api/update/mephistocc")
6async def update_mephisto_cc(background_tasks: BackgroundTasks):
7 background_tasks.add_task(update_site, script_name="update_mephisto.cc.sh")
8 return {"message": "update site in the background"}
1(.venv) ➜ stock.mephisto.cc git:(main) cat update_mephisto.cc.sh
2#!/bin/sh
3echo '开始执行webhook钩子'
4
5HOME_DIR=/data/mephisto.cc #此目录为服务器页面展示目录
6cd $HOME_DIR
7
8echo '清除git缓存'
9git clean -df
10
11echo '拉取远程代码'
12git pull origin main
13
14echo 'Job Done!'%
1root@tokyo:/data/mephisto.cc# systemctl status gunicorn
2● gunicorn.service - gunicorn daemon
3 Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
4 Active: active (running) since xxxxx CST; 15min ago
5Main PID: 2467813 (gunicorn)
6 Status: "Gunicorn arbiter booted"
7 Tasks: 5 (limit: 1036)
8 Memory: 91.2M
9 CGroup: /system.slice/gunicorn.service
10 ├─2467813 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
11 ├─2467814 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
12 ├─2467815 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
13 ├─2467816 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
14 └─2467817 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
在 github 仓库的配置 Payload URL,如下图所示

push 触发下 webhook,再去后台查看结果,看下图触发成功,返回了代码定义的结果

当然, 网站的更新方式千千万,你直接远古 scp ssh ftp rsync 更新都可以,我是因为登录外国服务器卡,也不想老是登录,这样够用也够灵活,同时只依赖 github 的 webhook,github 挂了,gitlab 类的也有 webhook,不用去学 action 的语法,个人觉得简单易用可控, 复杂的动态站点更新,可以自己定义格外的逻辑