部署文档 (Deployment Guide)
目录结构
deploy/
├── compose/ # Docker Compose 配置(开发环境)
│ ├── docker-compose.dev.yml # 基础设施(MySQL + Redis)
│ └── docker-compose.full.yml # 完整服务(含应用)
├── helm/ # Helm Charts(生产环境)
│ └── ljwx-health/
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
├── environments/ # 环境差异化配置
│ ├── dev-eu.yaml # 欧洲开发环境
│ └── dev-mac.yaml # Mac Studio 开发环境
└── README.md # 本文件
部署演进路线图
阶段 1: Docker Compose(当前阶段)✅
适用场景: 本地开发、快速验证
优势:
- 一键启动基础设施(MySQL + Redis)
- 无需 K8s 环境
- 适合单机开发调试
限制:
- 无自动扩缩容
- 无服务发现
- 无滚动更新
使用方式:
# 启动基础设施
./scripts/dev_up.sh
# 执行数据库迁移
./scripts/db_migrate.sh
# 本地启动应用
cd ljwx-boot && ./run-local.sh
cd ljwx-bigscreen/bigscreen && python run.py
阶段 2: Helm + K3s(规划中)⏳
适用场景: 多环境部署(开发/测试/预发布)
优势:
- 标准化配置管理
- 环境差异化(values-dev.yaml, values-prod.yaml)
- 支持滚动更新
- 资源限制与健康检查
目标环境:
- 欧洲节点 K3s 集群
- Mac Studio K3s 集群
使用方式(待实现):
# 部署到开发环境
helm upgrade --install ljwx-health ./deploy/helm/ljwx-health \
-f deploy/environments/dev-eu.yaml \
-n ljwx-health-dev --create-namespace
# 查看状态
kubectl get pods -n ljwx-health-dev
阶段 3: Argo CD + GitOps(最终目标)🎯
适用场景: 生产环境持续交付
优势:
- Git 作为单一事实源
- 自动同步部署
- 声明式配置
- 审计与回滚
架构:
Git Repo (main branch)
└── deploy/helm/ljwx-health/
↓
Argo CD Application
↓
K3s Cluster (EU / Mac Studio)
↓
ljwx-boot + ljwx-bigscreen + MySQL + Redis
使用方式(待实现):
# argocd-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: ljwx-health
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/ljwx-health.git
targetRevision: main
path: deploy/helm/ljwx-health
helm:
valueFiles:
- ../../environments/dev-eu.yaml
destination:
server: https://kubernetes.default.svc
namespace: ljwx-health-dev
syncPolicy:
automated:
prune: true
selfHeal: true
环境变量约定
通用环境变量
| 变量名 | 说明 | 示例值 | 来源 |
|---|---|---|---|
ENV |
环境标识 | dev, staging, production |
ConfigMap |
SERVICE_NAME |
服务名称 | ljwx-boot, ljwx-bigscreen |
ConfigMap |
LOG_LEVEL |
日志级别 | INFO, DEBUG |
ConfigMap |
数据库环境变量
| 变量名 | 说明 | 示例值 | 来源 |
|---|---|---|---|
DB_HOST |
数据库地址 | mysql.infra.svc.cluster.local |
ConfigMap |
DB_PORT |
数据库端口 | 3306 |
ConfigMap |
DB_NAME |
数据库名称 | ljwx_health |
ConfigMap |
DB_USER |
数据库用户 | ljwx_app |
Secret |
DB_PASSWORD |
数据库密码 | <encrypted> |
Secret |
Redis 环境变量
| 变量名 | 说明 | 示例值 | 来源 |
|---|---|---|---|
REDIS_HOST |
Redis 地址 | redis.infra.svc.cluster.local |
ConfigMap |
REDIS_PORT |
Redis 端口 | 6379 |
ConfigMap |
REDIS_PASSWORD |
Redis 密码 | <encrypted> |
Secret |
REDIS_DB |
Redis 数据库索引 | 1 |
ConfigMap |
可观测性环境变量
| 变量名 | 说明 | 示例值 | 来源 |
|---|---|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT |
Tempo 地址 | http://tempo.infra.svc:4317 |
ConfigMap |
OTEL_SERVICE_NAME |
服务名称 | ljwx-boot |
ConfigMap |
OTEL_TRACES_SAMPLER |
采样策略 | parentbased_traceidratio |
ConfigMap |
OTEL_TRACES_SAMPLER_ARG |
采样率 | 0.1 (10%) |
ConfigMap |
数据库迁移策略
当前方案(Compose)
执行方式: 通过 scripts/db_migrate.sh 手动触发
#!/bin/bash
# scripts/db_migrate.sh
cd ljwx-boot
mvn flyway:migrate \
-Dflyway.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME} \
-Dflyway.user=${DB_USER} \
-Dflyway.password=${DB_PASSWORD}
未来方案(Helm + Argo CD)
执行方式: K8s Job + Argo CD PreSync Hook
# deploy/helm/ljwx-health/templates/migration-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
spec:
template:
spec:
containers:
- name: flyway
image: flyway/flyway:latest
command: ['flyway', 'migrate']
env:
- name: FLYWAY_URL
value: jdbc:mysql://$(DB_HOST):$(DB_PORT)/$(DB_NAME)
- name: FLYWAY_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: FLYWAY_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
volumeMounts:
- name: migrations
mountPath: /flyway/sql
volumes:
- name: migrations
configMap:
name: db-migrations
restartPolicy: Never
优势:
- 应用部署前自动执行迁移
- 迁移失败自动阻止应用更新
- 完整的执行日志与审计
基础设施复用策略
当前状态(独立部署)
ljwx-health-dev namespace
├── ljwx-boot (Pod)
├── ljwx-bigscreen (Pod)
├── mysql (StatefulSet) ← 独立部署
└── redis (StatefulSet) ← 独立部署
未来状态(infra 复用)
infra namespace
├── postgres (StatefulSet) ← 统一数据库
└── redis (StatefulSet) ← 统一缓存
ljwx-health-dev namespace
├── ljwx-boot (Pod) ────→ postgres.infra.svc (独立 DB + 用户)
└── ljwx-bigscreen (Pod) ─→ redis.infra.svc (独立前缀/库)
迁移步骤:
- 在 infra namespace 创建 Postgres 数据库
- 创建独立用户
ljwx_app与 Schemaljwx_health - 执行数据迁移(MySQL → Postgres)
- 更新 ljwx-health 应用配置指向 infra Postgres
- 验证后下线独立 MySQL
健康检查配置
Spring Boot
# K8s Deployment
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 9998
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 9998
initialDelaySeconds: 10
periodSeconds: 5
FastAPI
livenessProbe:
httpGet:
path: /health
port: 5225
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 5225
initialDelaySeconds: 5
periodSeconds: 5
资源配置建议
ljwx-boot (Spring Boot)
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 2Gi
ljwx-bigscreen (FastAPI)
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
网络与访问
开发环境(Compose)
| 服务 | 地址 | 说明 |
|---|---|---|
| ljwx-boot | http://localhost:9998 | Spring Boot API |
| ljwx-bigscreen | http://localhost:5225 | FastAPI 大屏 |
| MySQL | localhost:3306 | 数据库 |
| Redis | localhost:6379 | 缓存 |
K8s 环境(Helm)
| 服务 | 内部地址 | 外部访问(Ingress) |
|---|---|---|
| ljwx-boot | ljwx-boot.ljwx-health-dev.svc:9998 | https://api.ljwx-health.example.com |
| ljwx-bigscreen | ljwx-bigscreen.ljwx-health-dev.svc:5225 | https://bigscreen.ljwx-health.example.com |
验收标准
PR-4(Compose 阶段)
./scripts/dev_up.sh可一键启动 MySQL + Redis./scripts/db_migrate.sh可执行 Flyway 迁移- 新人可在 10 分钟内完成环境搭建
PR-6(Helm 阶段)
- Helm Chart 模板语法正确(
helm lint通过) - values.yaml 结构清晰,支持环境差异化
- migration-job.yaml PreSync Hook 配置正确
未来(Argo CD 阶段)
- Argo CD Application 可自动同步
- Git commit 自动触发部署
- 回滚操作 < 1 分钟
更新时间: 2025-12-18 当前阶段: Compose 开发环境 下一步: Helm Chart 结构搭建(PR-6)