Усі статті
Події вставлення, оновлення та видалення рядків Postgres, що надходять із бази Supabase до захищеної локальної кінцевої точки вебхука.
Supabasedatabase webhooksPostgreslocal development

Як тестувати Supabase Database Webhooks на localhost

Для тестування Supabase Database Webhook на локальномуhost використовуйте host.docker.internal коли проект Supabase і ваш приймач працює на вашому машині, або використовувати публічний тунель HTTPS при розміщенні проекту Supabase повинен викликати локальний додаток. Визначні питання: локальна Postgres працює в Docker, де localhost означає контейнер бази даних, в той час як увімкнено Supabase для доступу до Інтернету.

Що Supabase Database Webhooks відправити

Database Webhooks реагує на Postgres INSERTй UPDATEй DELETE операції на обраному столі. Supabase описує їх як асинхронний обгортач навколо тригерів за допомогою асинхронного обгортання pg_net розширення. Операція, яка змінює ряд, не чекаючи вашого приймача, щоб закінчити свою логіку бізнесу, яка зменшує зчеплення, але також означає, що приймач повинен бути спостережливим і непрацездатним.

Завантажувальний навантаження JSON визначає операцію, схему та таблицю та містить дані рядка. Для вставок і оновлень, record містить новий ряд. Для оновлення та видалення, old_record забезпечує попередній ряд, де є. Побудувати обробники навколо документарного конверта, а не обробляти кожен запит як тільки об'єкт рядка.

Проект «Вісник»

Local Supabase до локального додатку: використовуйте центр Docker

Коли ви працюєте supabase start, Postgres всередині контейнера. 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 пропонує. Підтвердіть з контейнера, не просто від браузера.

ППСТЕРМ00022XPP до місцевого додатку: використання ППСТЕРМ00023XPP

Хмарна база даних не може вирішити назву вашого ноутбука Docker або адреса приватного петлю. Почати локальний додаток і запустити npx portpreview 3000, потім налаштувати:

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

Використовуйте виділений проект розробки або низький план. Хмарний webhook може містити дані реального рядка, тому розширюючи таблицю виробництва до URL-адреси тимчасового розвитку, як правило, погана стратегія тестування.

Створіть ресивер, який перевіряє загальний секрет

На відміну від постачальників, які визначають обов'язковий заголовок HMAC, Database Webhook є настройковим вихідним запитом HTTP. Захистіть кінцеву точку з секретним заголовком, ви контролюєте та налаштуйте той самий заголовок на сайті. 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 на невелику довірену Edge Function, яка перевіряє власний вхідний секрет, компілює обрану HMAC над канонічним зовнішнім тілом, і пересуває його на місцевий або виробничий споживач. Не продумати X-Supabase-Signature Витрата, якщо ваш власний форвардний шар створює і виправляє його.

Налаштуйте та спрацьовуйте фокус

  1. Виберіть таблицю розвитку і вирішіть, які операції мають значення.
  2. Створіть Database Webhook у ДСП Supabase під базою даних → Webhooks, вибравши схему, таблицю та операцій.
  3. Встановіть локальну URL-адресу Docker або URL-адресу публічного тунелю, описану вище.
  4. Додати Content-Type: application/json і випадковий X-Webhook-Secret значення, в якому доступна конфігурація заголовка Webhook.
  5. Почати приймач і вставити чітко позначений тестовий ряд.
  6. Оновіть одне поле, потім видаліть рядок, перевіривши всі вибрані конверти.
  7. Видалити або вимкнути тестовий вебок перед перемиканням проектів або закриттям тунелю.

Ім'я тестових рядів, таких як очищення. Не вогневої інтеграції таблиці на основі записів замовника, щоб побачити запит.

Перехід ППСТЕРМ00035XPP, UPDATE та DELETE безпечно

INSERT

Зареєструватися record як новий стан. Якщо ресивер створює відповідний об'єкт в іншому місці, зберігайте початковий ключ таблиці як ключ idempotency. Подія вставки може бути доставлена знову під час ручного відтворення або обробки на замовлення.

UPDATE

Порівняти record з old_record і діяти тільки на полях, що стосуються інтеграції. Цей веб-сайт використовує файли cookie, щоб використовувати файли cookie. Фільтрувати неопові зміни бізнес-процесів запобігає видаткам знизу.

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 комітує. Моніторинг вихідних результатів запиту та узгодження дизайну для будь-якого, що не можна втратити.

Для високоточних робочих процесів, таблиця зовнішньої коробки сильніше: списання зміни бізнесу та початкового рядка в одній операції бази даних, потім давайте працівнику поставку з явними лічильниками, відключенням та відключенням. Database Webhook може повідомити працівника, але періодична конденсація все ще повинна знайти невиліковні ряди скриньок.

Зробіть ресивер idempotent. Корисний ключ поєднує джерело schema, стіл, роботу, основний ключ і стабільну версію рядка, такі як updated_at; для суворих гарантій, додають негайний захід UUID у вихідному рядку. Уникайте хешування тільки поточного ряду, оскільки два дійсні переходи можуть виробляти подібні проекції.

Дзвоните до локальної Supabase Edge Function

Якщо пункт призначення Edge Function подається місцевим стеком Supabase, задокументований приклад:

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

Офіційна інформація Керівництво з розробки Edge Functions Зареєструватися supabase functions serve [function-name] для місцевого гарячого перевантаження. Edge Functions вимагає перевірки JWT за замовчуванням. Для функції webhook, яка не може надати користувачеві JWT, налаштуйте цю функцію навмисно, наприклад, з verify_jwt = false в supabase/config.toml, як задокументовано в Налаштування функції. Замініть автентифікацію JWT з вашим секретом або перевіркою підпису; відключення JWT самостійно робить функцію громадською.

Усунення несправностей Supabase webhook локальнихhost доставка

З'єднання відмовлено від локального стека

Зареєструватися localhost з host.docker.internalПеревірити додаток до інтерфейсу, що досягається від Docker і підтвердити порт. На Linux, налаштовуємо дозвіл хост-габажу або використовуйте хост IP. Послуга, пов'язана тільки з несподіваним інтерфейсом, може все-таки відхилити контейнерний трафік.

Проєкт, що знаходиться на маршруті

У рамках проекту необхідно вказати URL-адресу HTTPS, а не назву Docker. Підтвердіть тунель живою та її URL-адресою, що включає повний маршрут. Перевірити DNS/TLS шляхом розміщення на нього самостійно.

Маршрут повертається 401

Порівняйте настрочену назву заголовка і значення, див. для провідних або причепів білого простору, і перезавантажте додаток після зміни змінних середовища. Увійдіть, чи існує заголовок, ніколи не його значення. Якщо посередницькі смуги користувальницькі заголовки, використовуйте звичайний Authorization: Bearer ... ідентифікувати його явно.

Форма завантаження видається неправильно

Увійдіть тільки ключі верхнього рівня, роботу, схеми, таблиці в розробці. Пам'ятайте, що DELETE використовує дані попереднього рядка і UPDATE можуть включати обидва варіанти. Дійсно від поточних офіційних прикладів корисного навантаження, перш ніж змінити свій аналіз.

Оновлення бази даних досягається, але робота внизу відсутня

Що поведінкою можливо в асинхронному дизайні. Перевірка журналів запиту вебхука та pg_net діагностику, доступні в Вашому середовищі, потім додають птицю або примирення, а не розкочуючи назад вже здійснену бізнес-транзакцію.

Контроль безпеки

  • Використовуйте HTTPS для проведення тестів та обертати тимчасовий загальний секрет після
  • Відправте лише необхідні стовпці; не допускаючи чутливих таблиць або розвантажень широкого виробництва.
  • Дійсніть секретний заголовок перед тим, як зануритися або наполягати тіло.
  • Застосувати POST-тільки маршрутизації, обмеження розміру запиту, контроль швидкості та перевидані журнали.
  • Використовуйте окремі локальні, старі та виробничі конфігурації сайту.
  • Побудувати явні рети, ідемпотенції, моніторинг і відповідальність за важливі події.
  • Вимкніть тимчасові URL-адреси хмари при закритті тунелю.

Найпоширеніша локальна помилка - мережева адресата, не Postgres: локальні дзвінки host.docker.internal; хмарні дзвінки використовують публічний тунель. Після того, як трафік прибуває, лікуйте автентифікацію та доставку гарантує як окремі проблеми дизайну. Огляд захист тунелю локальнихhost і шаблони надійності вебхука перед підключенням чутливих даних.

Поширені запитання

Чому Supabase Database Webhook не досягає локального привиду?
Місцева Supabase Postgres працює в Docker, тому локальнийhost відноситься до контейнера. Використовуйте host.docker.internal або ваш хост IP. У проекті Supabase замість потреб громадськості HTTPS тунельний URL.
Чи потрібен тунель для локальної Supabase Database Webhooks?
Не коли використовується Supabase та ресивера, а також Docker. Вам потрібно тунель при розміщенні проекту Supabase необхідно викликати програму, яка працює на комп'ютері.
Чи підписано ППСТЕРМ00014XPP Database Webhooks?
Не приймає провайдера HMAC. Налаштуйте та встановіть загальний секретний заголовок. Якщо вам потрібен підпис для кузова, пересилайте через перевірену функцію, яка створює HMAC вашого одержувача.
Якими даними є Supabase Database Webhook?
Конверт JSON визначає INSERT, UPDATE, або DELETE плюс щіма і стіл. Він включає в себе новий запис для вставок і оновлень і попередніх рядків даних для оновлення або видалення, де доступні.