- Created migration file for rebaseline of the database schema. - Added tables: auth_clients, tenants, auth_client_keys, webhook_nonces, events_inbox, lists, campaigns, subscriptions, send_jobs, delivery_summary, and send_batches. - Defined relationships and constraints between tables. - Updated DbContext and model snapshot to reflect new entities and their configurations. - Removed deprecated ListMember entity and its references. - Introduced Dockerfile for building and running the SendEngine application. - Enhanced installer program to support tenant creation and webhook client management with Member Center integration.
40 lines
2.9 KiB
Markdown
40 lines
2.9 KiB
Markdown
# 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_uuid> [--tenant-name <name>]`
|
||
- 使用 Installer 建立 webhook client(`id` 自動隨機產生):
|
||
- `dotnet run --project src/SendEngine.Installer -- add-webhook-client --tenant-id <tenant_uuid> [--tenant-name <name>] --client-id <client_id> --name <display_name> --scopes <scope1,scope2>`
|
||
- 例如:`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 <tenant_uuid> --client-id <client_id> --name <display_name> --scopes <scope1,scope2> --upsert-member-center --mc-base-url <member_center_base_url> --mc-client-id <oauth_client_id> --mc-client-secret <oauth_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`
|