利用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上面
[email protected]:/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的語法,個人覺得簡單易用可控, 複雜的動態站點更新,可以自己定義格外的邏輯