すべての記事
Supabaseデータベースから安全なローカルWebhookエンドポイントへ流れるPostgres行の挿入・更新・削除イベント。
Supabasedatabase webhooksPostgreslocal development

Supabase Database Webhooksをlocalhostでテストする

の ローカルホストでSupabase Database Webhookをテストするために、使用して下さい host.docker.internal の特長 Supabase およびあなたの受信機があなたの機械で動くとき、またはホストされた Supabase のプロジェクトがあなたのローカル アプリを呼ばなければならないときパブリック HTTPS トンネルを使用して下さい。 の特長 区別事項:ローカルPostgresはDockerで、どこに動かします localhost の特長 つまり、ホストされているSupabaseは、インターネットアクセス可能なURLを必要とします。

の特長 Supabase Database Webhooksは送ります

の特長 Database WebhooksはPostgresに反応します INSERTの特長 , UPDATEの特長 と DELETE の特長 選択したテーブルの操作。 Supabaseは、トリガーの周りの非同期ラッパーとしてそれらを説明する pg_net の特長 拡張子。 行を変更するトランザクションは、レシーバーがビジネスロジックを終わらせるのを待ちません。これは、結合を削減するだけでなく、レシーバーが観察可能で故障に注意しなければならないことを意味します。

の特長 JSONのペイロードは操作、スキーマおよびテーブルを識別し、列のデータを含んでいます。 インサートとアップデートのため、 record の特長 新しい行を含む。 更新と削除のため、 old_record の特長 利用できる前の行を提供します。 文書化された封筒の周りのハンドラをビルドするのではなく、すべてのリクエストを行のオブジェクトとして扱います。

の特長 ローカルスタック対ホストプロジェクト

の特長 ローカルSupabaseをローカルアプリに:Dockerのホストを使用して下さい

の特長 実行時に supabase startの特長 、Postgresは容器の中にあります。 webhook URL など http://localhost:3000/api/supabase-db-hook の特長 そのコンテナに戻り、通常は失敗します。 Supabaseの公式 の特長 Database Webhooksの文書 の特長 ターゲットに言う host.docker.internalの特長 : : :

http://host.docker.internal:3000/api/supabase-db-hook

の特長 公共トンネルを必要としません。 そのホスト名が利用できなくなったLinuxエンジンでは、Dockerセットアップや、Supabaseドキュメントが提案するマシンのLANアドレスでサポートされているホストゲートウェイマッピングを使用します。 ホストブラウザからではなく、コンテナから確認します。

の特長 ローカルアプリにSupabaseをホストしました:HTTPSを使用して下さい

の特長 クラウドデータベースは、ラップトップのDockerホスト名またはプライベートループバックアドレスを解決できません。 ローカルアプリを起動し、実行 npx portpreview 3000の特長 それから構成します:

https://your-subdomain.portpreview.dev/api/supabase-db-hook

の 専用の開発プロジェクトまたは低リスクテーブルを使用します。 クラウドWebhookは実際の行データを含むことができるので、一時的な開発URLにプロダクションテーブルを公開することは、通常、テスト戦略が悪いです。

の 共有シークレットを検証するレシーバーを作成する

の特長 必須HMACヘッダーを定義するプロバイダとは異なり、Database Webhookは構成可能なアウトバウンドHTTPです。 エンドポイントをシークレットヘッダで保護し、Webhook 上で同じヘッダーを構成します。 TLSはトランジットでそれを保護します; 定数時間の比較はあなたの適用を通して秘密修正のタイミングを漏らすことを避けます。

// app/api/supabase-db-hook/route.ts
import crypto from 'node:crypto';

function safeEqual(a: string, b: string) {
  const left = Buffer.from(a);
  const right = Buffer.from(b);
  return left.length === right.length &&
    crypto.timingSafeEqual(left, right);
}

export async function POST(request: Request) {
  const supplied = request.headers.get('x-webhook-secret') ?? '';
  const expected = process.env.SUPABASE_DB_WEBHOOK_SECRET ?? '';

  if (!expected || !safeEqual(supplied, expected)) {
    return new Response('unauthorized', { status: 401 });
  }

  const payload = await request.json();
  if (!['INSERT', 'UPDATE', 'DELETE'].includes(payload.type)) {
    return new Response('unsupported event', { status: 400 });
  }

  await recordDelivery(payload);
  return new Response('accepted', { status: 200 });
}

の特長 共有ヘッダーは秘密の知識を証明するが、その秘密を体に結びつける暗号化されていない。 体レベルのタンパーの証拠が必要な場合は、Database Webhookを独自のインバウンドシークレットを検証し、選択されたHMACを正当化し、局所または生産の消費者に転送します。 発明しないでください X-Supabase-Signature の特長 あなた自身の転送層が作成し、それを確認しない限り仮定して下さい。

の特長 集中した webhook の設定とトリガー

  1. の特長 開発テーブルを選択し、どの操作が重要であるかを決めます。
  2. の特長 データベース → Webhooks の下にある Supabase ダッシュボードで Database Webhook を作成し、スキーマ、テーブル、および操作を選択します。
  3. の特長 上記のローカルDocker URLまたはパブリックトンネルURLを設定します。
  4. の特長 追加する Content-Type: application/json の ランダム X-Webhook-Secret の特長 webhook ヘッダーの構成が利用できる値。
  5. の特長 受信機を始動し、明確に分類されたテスト 列を差し込みます。
  6. の特長 1つのフィールドを更新し、列を削除し、選択したすべてのエンベロップを確認します。
  7. の特長 プロジェクトを切り替えるか、トンネルを閉じる前にテストのwebhookを削除または無効にします。

の特長 名前テスト行ので、クリーンアップは決定的です。 リクエストが到着することを確認するだけで、生産顧客レコードでテーブル全体の統合を発射しないでください。

の特長 INSERT、UPDATEおよびDELETEを安全に解釈して下さい

の特長 INSERTの特長

の特長 使用条件 record の特長 新しく投入された状態として。 受信機が他の場所で対応するオブジェクトを作成する場合は、ソーステーブルの主キーを idempotency キーとして格納します。 手動リプレイまたはカスタムリトライ処理中に、インサートイベントを再び配信できます。

の UPDATEの特長

の特長 比較する record の特長 お問い合わせ old_record の インテグレーションに関連するフィールドのみを操作します。 一般的な更新 Webhook は、タイムスタンプや無関係なメタデータのために火を発する可能性があります。 ノップビジネスの変更をフィルタリングすると、高価なダウンストリーム呼び出しを防ぎます。

の DELETEの特長

の 削除された行は、現在のレコードではなく、以前のデータによって表されます。 削除されたハンドラは、オプションのフィールドを欠落させ、下流アクションが削除、アーカイブ、または取消されるかどうかを決定します。 監査の要件を保存します。

switch (payload.type) {
  case 'INSERT':
    await mirror.upsert(payload.record.id, payload.record);
    break;
  case 'UPDATE':
    if (payload.old_record.status !== payload.record.status) {
      await syncStatus(payload.record.id, payload.record.status);
    }
    break;
  case 'DELETE':
    await mirror.archive(payload.old_record.id);
    break;
}

の特長 配達信頼性は適用心配です

の特長 Database Webhooksは非同期ネットワークの要求であるため、原発する行の変更を伴う分散トランザクションとしてレシートを扱いません。 Postgresのコミットの後であなたの遠隔側面は利用できなくなるかもしれません。 アウトバウンドリクエストを監視し、紛失できないものに対して再調整を設計します。

の特長 価値の高いワークフローでは、アウトボックステーブルがより強くなります。1つのデータベーストランザクションでビジネス変更とアウトボックス行を書き、ワーカーが明示的なリトライカウンター、バックオフ、デッドレター処理で配信できるようにします。 Database Webhookは、作業員に通知することができますが、定期的な調整は、未処理のアウトボックス行を見つける必要があります。

の特長 受信機のidempotentを作って下さい。 便利なキーは、ソーススキーマ、テーブル、操作、主キー、およびこのような安定した行バージョンを組み合わせます。 updated_atの特長 ;厳密な保証のために、外箱の列で不変なでき事UUIDを加えて下さい。 2つの有効な移行が同様の予測を生成する可能性があるため、現在の行だけをハッシュすることを避けてください。

の特長 ローカルSupabase Edge Functionを呼ぶこと

の特長 宛先がローカルSupabaseスタックによって提供されるEdge Functionである場合、文書化された例は次のとおりです。

http://host.docker.internal:54321/functions/v1/my-function-name

の特長 公式サイト の特長 Edge Functions開発ガイド の 使用方法 supabase functions serve [function-name] の特長 ローカルホットリロードのため。 Edge FunctionsはデフォルトでJWTの確認を要求します。 ユーザーJWTを供給できないwebhook関数では、例えば、その関数を非審正的に設定します。 verify_jwt = false の特長 お問い合わせ supabase/config.tomlの特長 、文書化されるように の特長 機能構成の特長 . あなたの秘密のヘッダーか署名の点検とJWTの証明を取り替えて下さい; JWTを単独で分解することは機能公共をします。

の特長 トラブルシューティングSupabaseのwebhookローカルホスト配達

の特長 ローカルスタックから拒否された接続

の特長 リプレース localhost の特長 お問い合わせ host.docker.internalの特長 、app が Docker から到達可能なインターフェイスに結合し、港を確認して下さい。 Linux では、ホストゲートウェイの解像度を設定したり、ホスト IP を使用する。 予期しないインターフェイスに限らず、コンテナのトラフィックを拒否するサービス。

の特長 ホストされたプロジェクトは決してルートに到達しません

の特長 ホストされているプロジェクトは、Dockerホスト名ではなく、パブリックHTTPSトンネルURLを必要とします。 トンネルが稼働していることを確認します。URLには完全なルートが含まれています。 DNS/TLS を自身に投稿することでチェックします。

の特長 ルートは401を返します

の特長 設定されたヘッダ名と値を比較し、先頭またはホワイトスペースを追跡し、環境変数を変更した後にアプリを再起動します。 ヘッダが存在するかどうかをログに記録し、その値が存在しない。 インターメディアがカスタムヘッダをストライプする場合、従来のヘッダを使用する Authorization: Bearer ... の ヘッダは明示的に検証します。

の特長 ペイロード形状が間違っている

の特長 開発中のトップレベルのキー、操作、スキーマ、テーブルのみをログに記録します。 DELETEは以前の行データとUPDATEは両方のバージョンを含むことができることを忘れないでください。 パーサを変更する前に、現在の公式ペイロード例に対して検証します。

の特長 データベースの更新は成功しますが、下流作業は欠落しています

の特長 非同期設計では、その動作が可能です。 Webhookリクエストログを調べる pg_net の特長 あなたの環境で利用可能な診断は、すでにコミットされたビジネストランザクションをロールバックするのではなく、再試行または調整を追加します。

の特長 セキュリティチェックリスト

  • の特長 HTTPSをホスト・ツー・ローカルのテストに使用し、その後に一時的な共有シークレットを回転させます。
  • の特長 必要な列だけを送って下さい;敏感なテーブルか広い生産のペイロードを露出することを避けて下さい。
  • の特長 ボディをパースするか、または主張する前に秘密のヘッダーを検証します。
  • の特長 POST専用ルーティング、要求サイズの制限、速度制御、および赤字ログを適用します。
  • の特長 別のローカル、ステージング、および生産のwebhook構成を使用して下さい。
  • の特長 重要なイベントの明示的なレトリー、潜在能力、監視、および調整を構築します。
  • の特長 トンネルを閉じると、一時的なクラウドのWebhook URLを無効にします。

の特長 最も一般的なローカルバグは、Postgresではなく、ネットワークアドレスです: ローカルコンテナ呼び出しの使用 host.docker.internalの ;雲は公共のトンネルを使用します。 トラフィックが到着したら、認証と配送保証を別々のデザインの問題として扱います。 レビュー の特長 localhostトンネルのセキュリティ の特長 そして、 の特長 webhookの信頼性パターン の 機密データを接続する前に。

よくある質問

の なぜSupabase Database Webhookがlocalhostに到達しないのですか?
の特長 ローカルSupabase PostgresはDockerで動きます、従ってlocalhostは容器を示します。 host.docker.internalかあなたのホストIPを使用して下さい。 ホストされているSupabaseプロジェクトは、パブリックHTTPSトンネルURLを必要とします。
の特長 ローカルSupabase Database Webhooksのためのトンネルを必要としますか。
の特長 Supabaseとレシーバーがローカルにいるときではなく、Dockerホストルーティングを使用します。 ホストされているSupabaseプロジェクトがコンピュータ上で実行されているアプリケーションを呼び出す必要があるときにトンネルが必要です。
の特長 Supabase Database Webhooksは自動的に署名されますか。
の特長 プロバイダーHMACヘッダーを想定しないでください。 共有された秘密ヘッダーの設定と検証。 ボディ・バウンドのシグネチャが必要な場合は、あなたの受信機が確認するHMACを作成する信頼できる機能によって先に進む。
の特長 Supabase Database Webhookはどんなデータを送りますか。
の特長 JSONの封筒は回路図およびテーブルが付いているINSERT、UPDATE、またはDELETEを識別します。 インサートとアップデート用の新しいレコードと、利用可能な更新または削除用の以前の行データが含まれます。