利用github webhook和Fastapi自动更新网站
我的的小破站放在国外机房的一个乞丐主机上面,代码托管在github私有仓库,push代码的时候希望自动更新网站,github有action,可以自己编写相关逻辑在github的runner上面实现代码更新,最简单的是ssh到服务器上面,执行相关操作,但是这样要填写Actions secrets,老实说有点不太放心,想自己编写个简单服务更新代码,毕竟自己全部掌控,真理在手,天下我有,减少依赖,供应链安全^_^
编写供github webhook使用的接口
-
如下所示,利用Fastapi的Background Tasks功能,向/api/update/mephistocc提交post请求的时候, 执行更新网站的脚本
def update_site(script_name=""): subprocess.run(["/bin/bash", script_name]) @app.post("/api/update/mephistocc") async def update_mephisto_cc(background_tasks: BackgroundTasks): background_tasks.add_task(update_site, script_name="update_mephisto.cc.sh") return {"message": "update site in the background"}
-
超级简单的更新脚本, pull main仓库即可
(.venv) ➜ stock.mephisto.cc git:(main) cat update_mephisto.cc.sh #!/bin/sh echo '开始执行webhook钩子' HOME_DIR=/data/mephisto.cc #此目录为服务器页面展示目录 cd $HOME_DIR echo '清除git缓存' git clean -df echo '拉取远程代码' git pull origin main echo 'Job Done!'%
-
服务跑在gunicorn上面
root@tokyo:/data/mephisto.cc# systemctl status gunicorn ● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled) Active: active (running) since xxxxx CST; 15min ago Main PID: 2467813 (gunicorn) Status: "Gunicorn arbiter booted" Tasks: 5 (limit: 1036) Memory: 91.2M CGroup: /system.slice/gunicorn.service ├─2467813 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app ├─2467814 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app ├─2467815 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app ├─2467816 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app └─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的语法,个人觉得简单易用可控, 复杂的动态站点更新,可以自己定义格外的逻辑
最后修改于: Monday, August 28, 2023
版权申明:
- 本站内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。