2025/08/15 10:35 Show HN: PgHook – Docker image that streams PostgreSQL row changes to webhooks

やっほー、ロボ子!今日はPostgreSQLの変更イベントをWebhookに配信するPgHookについて話すのじゃ!

博士、こんにちは。PgHookですか、面白そうですね!

そうじゃろ!しかもこれ、コンテナイメージがたったの23.17MBしかないらしいぞ。AOTコンパイルされた.NET 9とAlpineを使ってるからじゃと。

すごいですね!そんなに小さいのに、ちゃんと動くんですか?

動く動く!クイックスタートガイドもあるぞ。まずは`postgresql.conf`に`wal_level = logical`を追加して、論理レプリケーションを有効にする必要があるのじゃ。

`wal_level`の設定ですね。それから、`max_wal_senders`と`max_replication_slots`も必要に応じて増やす必要があると。

そう!デフォルトは両方とも10らしいから、足りなくなったら増やすのじゃ。設定を変えたらPostgreSQLの再起動も忘れずに!

監視したいテーブルに対するPublicationも必要ですね。例えば、`CREATE PUBLICATION mypub FOR TABLE table1, table2;`のように。

その通り!そして、PgHookを実行する時は、最低限必要な環境変数を設定するのじゃ。`PGH_POSTGRES_CONN`、`PGH_PUBLICATION_NAMES`、`PGH_WEBHOOK_URL`の3つじゃな。

PostgreSQLの接続文字列、Publication名、Webhookのエンドポイントですね。再起動時にレプリケーション位置を安定させるには、`PGH_USE_PERMANENT_SLOT`と`PGH_REPLICATION_SLOT`も設定すると。

さすがロボ子、よく分かってるのじゃ!WebhookペイロードはコンパクトなJSONオブジェクトで、バッチで配信されるらしいぞ。POSTあたり最大`PGH_BATCH_SIZE`アイテムじゃ。

`PGH_BATCH_SIZE`のデフォルトは100ですね。署名もオプションで設定できるんですね。`PGH_WEBHOOK_SECRET`を設定すると、HMAC-SHA256で署名されると。

そうそう!セキュリティもバッチリじゃ。他にも、タイムアウトとかキープアライブの設定も色々できるみたいじゃぞ。

`PGH_WEBHOOK_TIMEOUT_SEC`、`PGH_WEBHOOK_CONNECT_TIMEOUT_SEC`、`PGH_WEBHOOK_KEEPALIVE_DELAY_SEC`など、細かい設定が可能ですね。

失敗した場合の再試行も賢いのじゃ。400以上のエラーが返ってきたら、2秒、4秒、8秒後に3回再試行するらしいぞ。

それでも失敗したら、レプリケーションが停止して、データベース接続が閉じられるんですね。そして10秒後に再開すると。

そういうこと!ちなみにライセンスはMIT Licenseじゃ。

なるほど、PgHookはPostgreSQLの変更をリアルタイムにWebhookで受け取るための、とても便利なツールなんですね。

そういうことじゃ!これを使えば、データベースの変更に即座に反応するようなシステムが簡単に作れるぞ!

勉強になりました!

ところでロボ子、Webhookって知ってるか?

はい、知ってますよ!Web APIの一種で、イベントが発生した時にHTTPリクエストを送信する仕組みですよね。

正解!…って、知ってるのかーい!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。