Skip to content

Operations

1. Triển khai

Một image duy nhất, deploy tối đa hai role qua APP_ENV_APPLICATION_ROLES. Role api phục vụ REST + enqueue; role worker consume Kafka, render, encrypt, upload, và chạy quét recovery + WebSocket emitter.

Thuộc tínhGiá trị
Imageregistry/ledger:<tag>
Rolesapi, worker, hoặc cả hai (APP_ENV_APPLICATION_ROLES)
Container Port3000 (ngoài 31060)
ProbesGET /healthz (live), GET /readyz (ready)
Snowflake ID6 (APP_ENV_NODE_ID)
Migration modeRUN_MODE=migrate (migrate.ts) — bỏ qua components/services/controllers
ScalingScale replica worker và/hoặc APP_ENV_KAFKA_CONSUMER_COUNT cho throughput tạo

Traefik labels

yaml
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.ledger.rule=PathPrefix(`/v1/api/ledger`)"
  - "traefik.http.services.ledger.loadbalancer.server.port=3000"

Chỉ role api cần route ingress. Pod chỉ-worker không nhận traffic HTTP.

2. Observability

Tín hiệuNguồnXem ở đâu
Logsstdout (key-value có cấu trúc)kubectl logs <pod> / Loki
Pha pipelinedòng log FETCH_* / GENERATE_* / UPLOAD_DONE / COMPLETED / FAILED theo ledgerIdpod worker
HealthGET /healthz, GET /readyzPortal gateway
WS emitdòng [notifyJobStatus] (warn khi emitter chưa sẵn)pod worker

Trường log chính

TrườngNguồnGhi chú
ledgerIdmessage valueKhoá tương quan chính xuyên pipeline
merchantId / type / periodsổ đã nạpĐịnh danh job
attemptCountLedgerJobSố lần retry trọn đời
errorCodefailureReasonXem runbook

3. Bảo mật

Mối quan tâmGiảm thiểu
AuthNJWT (ES256, JWKS từ identity) — VerifierApplication
AuthZCasbin qua PolicyDefinition (cache Redis); mọi endpoint gọi assertMerchantAccess
Mã hoá fileAES-256-GCM at-rest trong S3 (APP_ENV_LEDGER_ENCRYPTION_KEY); file chỉ phục vụ qua download có xác thực
Gia cố downloadContent-Disposition + X-Content-Type-Options: nosniff; decrypt trong bộ nhớ, không URL S3 công khai
SecretsK8s Secret dạng env (APP_ENV_LEDGER_ENCRYPTION_KEY, Kafka SASL, S3 key)
Network policyCilium — chỉ cho gateway + Kafka + Redis + S3
Soft-deletedeletedAt — không hard-delete sổ

4. Runbook

4.1 Lớp cảnh báo

Cảnh báoKích hoạtKiểm traKhắc phụcLeo thang
ledgerJobRejectedSpiketỷ lệ LedgerJob.status=REJECTED tănglogs FAILED/errorCoderetry theo error code (bên dưới)backend on-call
ledgerStalledJobsnhiều job bị reset bởi quét recovery[RecoveryComponent] Found N stalled jobkiểm sức khoẻ worker / APP_ENV_JOB_TIMEOUT_MSbackend on-call
ledgerConsumerLaglag ledger.generate tănglogs consumer / lag Kafkascale worker / APP_ENV_KAFKA_CONSUMER_COUNTSRE on-call
ledgerWsNotReadylặp lại WS emitter not readykết nối Redis WS của workerkiểm APP_ENV_WEBSOCKET_REDIS_*SRE on-call

4.2 Mã lỗi (failureReason.errorCode)

CodeÝ nghĩaHành động
FETCH_DATA_ERRORLấy/parse dữ liệu nguồn thất bại (Zod)xem dữ liệu nguồn; retry thủ công
JOB_EXECUTION_FAILEDLỗi pipeline chung (render/upload)kiểm logs; retry
ENQUEUE_FAILEDKafka producer không publish đượckiểm broker/SASL; retry
JOB_IN_PROGRESSRetry/regenerate khi PENDING/PROCESSINGchờ hoàn tất
JOB_NOT_READYDownload trước khi COMPLETEDchờ/retry tạo

4.3 Thao tác thường gặp

Thao tácLệnh / Hành động
Tail logs workerkubectl logs -n <ns> -f deploy/ledger-worker
Retry thủ côngPOST /v1/api/ledger/ledgers/:id/retry
Regenerate DRAFTPOST /v1/api/ledger/ledgers/:id/regenerate
Ép phục hồi kẹtchờ quét (APP_ENV_SWEEP_INTERVAL_MS) hoặc restart worker (quét ban đầu lúc boot)
Chạy migrationjob RUN_MODE=migrate / bun run migrate:dev (dev)

Tái xử lý không bao giờ tự động — một message Kafka đã commit không được replay. Dùng retry/regenerate hoặc quét recovery.

5. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.