指南
Kubernetes 部署
使用隨附的 Helm chart 進行高可用生產部署。
適用於需要高可用、多區域,或不願依賴單台主機的團隊。 我們在 deploy/helm/singlink/ 提供了一份完整的 Helm chart。
架構
Ingress (nginx / Cloudflare)
│
┌──────────┼──────────┐
│ │ │
web (×N) ws (×N) worker (×N)
│ │ │
└────┬─────┴────┬─────┘
│ │
Postgres Redis S3
(managed) (managed) (managed)安裝
helm install singlink ./deploy/helm/singlink \
--namespace singlink --create-namespace \
--set domain.app=chat.acme.com \
--set secret.authSecret="$(openssl rand -base64 32)" \
--set secret.postgresPassword="$(openssl rand -base64 24)" \
--set secret.redisPassword="$(openssl rand -base64 24)" \
--set s3.endpoint="https://s3.us-east-1.amazonaws.com" \
--set s3.bucket="acme-singlink" \
--set s3.accessKey="AKIA..." \
--set s3.secretKey="..."會建立哪些資源
- 3 個 Deployment:
web、ws、worker - 2 個 Service(web HTTP、ws 黏性工作階段)
- 1 個帶 WS 升級規則的 Ingress
- 可選的內嵌 postgres + redis StatefulSet
- 執行
prisma migrate deploy的安裝後 Job - 用於設定和憑證的 ConfigMap + Secret
生產環境檢查清單
- 停用內嵌資料庫,並指向託管的 RDS / ElastiCache:
--set embedded.postgres.enabled=false --set externalDatabaseUrl=... - 啟用自動擴縮容:
--set autoscaling.enabled=true --set autoscaling.maxReplicas=20 - TLS 在 ingress 層:安裝 cert-manager 並設定
ingress.tls.secretName="singlink-tls" - WS 的黏性工作階段已在 Service 層設定完成 (
sessionAffinity: ClientIP)—— 無需額外的 ingress 註解 - 密鑰管理:使用 Sealed Secrets 或 External Secrets, 而不是透過 CLI 傳遞取值
- S3:AWS S3、R2、GCS,或託管的 MinIO。該 chart不附帶 MinIO —— 在 K8s 中執行有狀態物件儲存並不好玩
擴縮容
# Manual scale
kubectl -n singlink scale deploy singlink-web --replicas=5
kubectl -n singlink scale deploy singlink-worker --replicas=10
# With autoscaling.enabled=true, HPAs do this automatically based on CPU.升級
helm upgrade singlink ./deploy/helm/singlink -n singlink \
--set image.tag=v0.2.0 \
--reuse-values
# Helm hook runs the migrate Job post-upgrade automatically.可觀測性
Next.js 的健康檢查位於 /api/healthz(已接入 readiness/liveness 探針)。要採集指標,可讓 Prometheus 指向你選用的標準 sidecar。 要做鏈路追蹤,請在 ConfigMap 中設定 OTEL_EXPORTER_OTLP_ENDPOINT。
企業版
要啟用 EE 功能,請傳入公鑰 + 客戶的授權檔:
helm upgrade singlink ./deploy/helm/singlink -n singlink \
--reuse-values \
--set secret.licensePublicKey="..." \
--set secret.licenseKey="..."完整的授權流程請參閱 CE vs EE。