指南
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。