GitHub WebhookとFastAPIを使ってウェブサイトを自動更新する

私の小規模なウェブサイトは、海外のデータセンターにある安価なサーバーでホストされています。コードはGitHubのプライベートリポジトリでホストされています。コードをプッシュすると、サイトが自動的に更新されるようにしたいと考えています。GitHubにはアクションが用意されているので、GitHubランナーでコードを更新する独自のロジックを記述できます。最も簡単な方法は、サーバーにSSH接続して必要な操作を実行することですが、アクションのシークレットを入力する必要があり、少し不安です。シンプルなサービス更新コードを自分で記述したいと思っています。結局のところ、私はすべてのコントロール権を持ち、真実は私の手の中にあり、世界は私のものであり、依存関係を減らして安全なサプライチェーンを維持できるからです。 ^_^

GitHub Webhook 用のインターフェースの作成

  • 以下に示すように、Fastapi のバックグラウンドタスク機能を使用して、/api/update/mephistocc に POST リクエストが送信されたときにサイトを更新するスクリプトを実行します。
1def update_site(script_name=""):
2subprocess.run(["/bin/bash", script_name])
3
4@app.post("/api/update/mephistocc")
5async def update_mephisto_cc(background_tasks: BackgroundTasks):
6background_tasks.add_task(update_site, script_name="update_mephisto.cc.sh")
7return {"message": "バックグラウンドでサイトを更新します"}
  • 非常にシンプルな更新スクリプト。メインリポジトリをプルするだけです。
 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 '完了!'%
  • サービスは gunicorn 上で実行されています
 1root@tokyo:/data/mephisto.cc# systemctl status gunicorn
 2● gunicorn.service - gunicorn デーモン
 3ロード済み: ロード済み (/etc/systemd/system/gunicorn.service; 有効; ベンダープリセット: 有効)
 4アクティブ: xxxxx CST 以降アクティブ (実行中); 15分前
 5メインPID: 2467813 (gunicorn)
 6ステータス: 「Gunicornアービター起動」
 7タスク数: 5 (上限: 1036)
 8メモリ: 91.2MB
 9CGroup: /system.slice/gunicorn.service
10├─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
11├─2467815 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
12├─2467816 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
13└─2467817 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
  • GitHubリポジトリのペイロードURLを以下のように設定します。

github webhook

  • push webhookによってトリガーされ、バックエンドで結果を確認します。以下の画像に示すように、トリガーは成功し、コードで定義された結果が返されています。

github webhook result

もちろん、ウェブサイトを更新する方法は無数にあります。SCP、SSH、FTP、Rsyncなどを直接使用することもできます。外部サーバーへのログインが遅く、常にログインしたくないので、これを使用しています。これで十分かつ柔軟性があります。GitHubのWebhookのみに依存します。GitHubがダウンしても、GitLabなどのプラットフォームにもWebhookがあります。アクション構文を学ぶ必要はありません。シンプルで使いやすく、制御しやすいと思います。複雑な動的サイト更新には、独自のカスタムロジックを定義できます。

最終更新日: Saturday, October 25, 2025

翻訳: