Sổ tay vận hành đối tác qua ops CLI — KHÔNG cần thao tác SQL trực tiếp. Mọi thao tác có audit.
Nguồn sự thật:packages/platform-infrastructure/src/ops/cli.ts. Vòng đời:../platform/PARTNER-LIFECYCLE.md.
KHÔNG chứa secret. Raw API key chỉ hiển thị một lần lúc cấp/rotate — giao khách qua kênh an toàn.
cd packages/platform-infrastructure
# Cần DATABASE_URL trỏ tới Postgres tương ứng (staging/prod đã kiểm soát).
npm run ops -- <command> [flags]
# Thêm --json để lấy output máy-đọc.
Các lệnh nguy hiểm (revoke-key,revoke-partner,churn-customer,outbox-replay) bắt buộc--confirm;
thiếu → exit 2, không thực thi.
| Việc | Lệnh | |
|---|---|---|
Tạo Partner (→ pending) | create-partner --name <tên> [--contact c] [--owner o] | |
| Gắn Tenant cho Partner | create-tenant --partner <partnerId> --tenant <tenantId> [--name n] | |
| Nạp inventory mẫu (để test Availability) | seed-inventory --tenant <tenantId> | |
Kích hoạt (pending → active) | activate-partner --partner <partnerId> | |
Suspend (active → suspended, thuận nghịch) | suspend-partner --partner <partnerId> [--reason r] | |
Re-activate (suspended → active) | reactivate-partner --partner <partnerId> | |
| Revoke Partner (terminal, huỷ mọi key) | revoke-partner --partner <partnerId> [--reason r] --confirm | |
| Cấp API key | `issue-key --customer <partnerId> --env <sandbox\ | production> [--deliver]` |
Bàn giao key (pending_delivery → active) | deliver-key --key <keyId> | |
| Rotate API key | rotate-key --key <keyId> [--grace-days N] [--reason r] | |
| Revoke API key | revoke-key --key <keyId> --reason <r> --confirm | |
| Xem hồ sơ/keys của Partner | show-provisioning [--customer <partnerId>] | |
| Xem lịch sử audit của Partner | show-audit --partner <partnerId> |
partnerId == customerId.issue-keydùng cờ--customer(tương thích lịch sử) nhưng nhận chínhpartnerId.
npm run ops -- create-partner --name "Đối tác A" --owner ops@bng --json
# → { "partnerId": "…", "status": "pending" }
Partner ở pending — chưa dùng key được.
npm run ops -- create-tenant --partner <partnerId> --tenant t_partner_a --name "Tenant A"
npm run ops -- activate-partner --partner <partnerId> # → active
issue-keyyêu cầu Partner đã có Tenant (create-tenant).
npm run ops -- issue-key --customer <partnerId> --env sandbox --deliver --json
# In BANNER + raw key MỘT LẦN, rồi { keyId, prefix, environment, status:"active" }
--deliver: kích hoạt key ngay (sandbox/demo). Bỏ --deliver ⇒ key pending_delivery, bàn giao sau bằng deliver-key.npm run ops -- suspend-partner --partner <partnerId> --reason nonpayment
Hiệu lực tức thì: mọi request của partner → 401. Key KHÔNG bị huỷ (thuận nghịch).
npm run ops -- reactivate-partner --partner <partnerId>
Đúng key cũ hoạt động trở lại — không cần cấp lại.
npm run ops -- revoke-partner --partner <partnerId> --reason offboarding --confirm
Terminal: revoke mọi key. Không khôi phục (muốn dùng lại = tạo Partner mới).
npm run ops -- rotate-key --key <keyId> --json # cutover ngay: key cũ revoke
npm run ops -- rotate-key --key <keyId> --grace-days 7 --json # key cũ còn dùng 7 ngày rồi hết hạn
In raw key mới một lần. Key cũ:
revoked ngay (401 tức thì).rotating, vẫn auth tới hết grace-days rồi tự hết hạn.Ưu tiên: cắt hiệu lực trước, điều tra sau. Guardrail bất khả xâm phạm = không để key lộ tiếp tục dùng được.
revoke-key --key <keyId> --reason suspected-leak --confirm (401 tức thì), rồi rotate-key để cấp key mới cho đối tác (hoặc issue-key mới).
suspend-partner --partner <id> --reason suspected-leak(chặn toàn bộ key của partner tức thì, thuận nghịch — khôi phục nhanh sau khi xử lý).
rotate-key (giữ lineage) hoặc issue-key --deliver, giao qua kênh an toàn.show-provisioning --customer <id> (xem lastUsedAt, prefix, status — không có raw/hash), show-audit --partner <id> (lịch sử issue/rotate/revoke/suspend).
reactivate-partner (nếu đã suspend).revokedReason/audit. Không dán raw key vào ticket/log.Raw key không lưu ở đâu (DB chỉ giữ hash sha256). "Xem lại" key cũ là không thể — mất/lộ ⇒ rotate.
issue-key/rotate-key/mint-session-token, kèm banner "MỘT LẦN", không nằm trong dòng JSON summary.show-provisioning/show-audit không bao giờ lộ raw key hay keyHash.NODE_ENV=production: guard chặn key demo bng_demo_* (fail-fast).