# Install - 需求:.NET SDK 8.x, PostgreSQL - 設定:複製 `.env.example` → `.env` - Migration: - 預設由 API 啟動時自動執行(`Db__AutoMigrate=true`) - 需要關閉時請設定 `Db__AutoMigrate=false` - 手動執行可用 `dotnet run --project src/SendEngine.Installer -- migrate` - Webhook Auth 初始化(不使用 SQL 檔,改用 Installer): - 若僅需先建立 tenant 基本資料: - `dotnet run --project src/SendEngine.Installer -- ensure-tenant --tenant-id [--tenant-name ]` - 使用 Installer 建立 webhook client(`id` 自動隨機產生): - `dotnet run --project src/SendEngine.Installer -- add-webhook-client --tenant-id [--tenant-name ] --client-id --name --scopes ` - 例如:`dotnet run --project src/SendEngine.Installer -- add-webhook-client --tenant-id 11111111-1111-1111-1111-111111111111 --tenant-name "Tenant A" --client-id member-center-webhook --name "Member Center Webhook" --scopes newsletter:events.write` - 若 tenant 不存在,Installer 會先自動建立 `tenants` 基本資料,避免 webhook 出現 `tenant_not_found` - 建立成功後,Member Center webhook header `X-Client-Id` 請帶回傳的 `id` - 若要自動同步到 Member Center `POST /integrations/send-engine/webhook-clients/upsert`(保留原手動流程): - `dotnet run --project src/SendEngine.Installer -- add-webhook-client --tenant-id --client-id --name --scopes --upsert-member-center --mc-base-url --mc-client-id --mc-client-secret --mc-scope newsletter:events.write.global` - 可選參數: - `--mc-token-path`(預設 `/oauth/token`) - `--mc-upsert-path`(預設 `/integrations/send-engine/webhook-clients/upsert`) - `--mc-token-url` / `--mc-upsert-url`(使用完整 URL 時可覆蓋 path 組合) - Webhook 驗證規則為 tenant 綁定:`auth_clients.tenant_id` 必須等於 payload `tenant_id` - 不支援 `X-Client-Id` fallback - 預設拒絕 `tenant_id = NULL` 的通用 client(`Webhook__AllowNullTenantClient=false`) - Member Center 回寫授權(建議): - `MemberCenter__BaseUrl`(建議) - `MemberCenter__DisableSubscriptionPath`(預設 `/subscriptions/disable`) - `MemberCenter__TokenPath`(預設 `/oauth/token`) - `MemberCenter__ClientId` - `MemberCenter__ClientSecret` - `MemberCenter__Scope=newsletter:events.write` - `MemberCenter__DisableSubscriptionUrl` 與 `MemberCenter__TokenUrl` 可用完整 URL 覆蓋(fallback) - `MemberCenter__ApiToken` 僅作暫時 fallback(非首選) - 本機測試輔助(臨時): - `TestFriendly__Enabled=true` 時: - webhook 收到未知 tenant 會自動建立 tenant - `/webhooks/ses` 不做任何 DB 存取(僅用於測試流程打通) - 正式環境建議維持 `false`