惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
IT之家
IT之家
博客园 - Franky
Stack Overflow Blog
Stack Overflow Blog
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
H
Help Net Security
V
V2EX
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
博客园 - 叶小钗
J
Java Code Geeks
博客园 - 【当耐特】
月光博客
月光博客
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件

mephisto.cc

修复rime-ice无法弹出候选框的问题 开机滚动字体显示优化 个人网站安全防护 树莓派上部署Vaultwarden 使用goaccess实时分析Caddy日志 个人网站监控 Hugo全站AVIF记 Linux下尝试使用Godot开发小游戏 Arch linux dae 透明代理 Airflow接管galler-dl下载任务 如何使用gallery-dl批量下载图像 Arch核显下如何愉快玩Dota2和CS2 Arch/labwc 环境网络相关设置 Rime添加dota2词库 Arch 重装记录 Supertuxkart iOS版终于发布了 打造自己的流媒体音乐服务 剪切板管理工具clipcat推荐 MangoHud性能监控 微信小程序开发记 Rofi试用 解决Arch下VSCode无法输入中文的问题 独立窗口管理器下无法录屏问题处理 上海市二手房成交数据监控 OpenLDAP监控 Arch linux如何顺畅连接蓝牙设备 使用Git和Ansible管理配置文件 Arch Linux SSL VPN 客户端配置 简单获取celery任务实时结果 Arch linux下iNode客户端的安装和使用方法
利用github webhook和Fastapi自动更新网站
2022-06-06 · via mephisto.cc

我的的小破站放在国外机房的一个乞丐主机上面,代码托管在 github 私有仓库,push 代码的时候希望自动更新网站,github 有 action,可以自己编写相关逻辑在 github 的 runner 上面实现代码更新,最简单的是 ssh 到服务器上面,执行相关操作,但是这样要填写 Actions secrets,老实说有点不太放心,想自己编写个简单服务更新代码,毕竟自己全部掌控,真理在手,天下我有,减少依赖,供应链安全^_^

编写供 github webhook 使用的接口

  • 如下所示,利用 Fastapi 的 Background Tasks 功能,向/api/update/mephistocc 提交 post 请求的时候, 执行更新网站的脚本
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"}
  • 超级简单的更新脚本, pull main 仓库即可
 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!'%
  • 服务跑在 gunicorn 上面
 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,如下图所示

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

    github webhook result

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