跳到主要内容

部署架构与资源清单

重要声明:本文档基于 docs/archon/docs/ 目录下的需求文档编写,不引用 reflekt-health-prd 仓库的任何目录结构作为实现依据。实际代码仓库的部署配置由对应开发团队自行定义,参考本文件提供的架构设计、资源规格与环境规范。

文档依据technical_architecture.mdsoftware_endpoints.mdbusiness_architecture.mdthird_party_integrations.mdconstraints_and_dependencies.mdnon_functional_requirements.mdproject_brief.mddata_model_design.md

最后更新:2026-04-22


1. 部署架构总览

1.1 整体架构图

1.2 部署区域与账号规划

环境区域用途集群数据库
开发环境us-east-1本地 / 个人开发Docker Compose 单机PostgreSQL 本地
预发布环境us-east-1功能测试、集成测试EKS dev 集群RDS dev(单AZ)
生产环境us-east-1正式运营EKS prod 集群RDS prod(Multi-AZ)

2. AWS 基础设施组件

2.1 AWS 组件选型

组件AWS 服务规格说明用途
容器编排Amazon EKS1.29+,托管控制面5个微服务(D1-D5)容器部署
负载均衡AWS ALBApplication Load BalancerREST API 入口,路径路由至各服务
数据库Amazon RDS PostgreSQL14+,Multi-AZ核心业务数据存储,AES-256 加密字段
缓存Amazon ElastiCache Redis7.2+会话缓存、设备心跳、分布式锁
消息队列Amazon MQRabbitMQ,MQTT Broker雷达设备 MQTT 接入
对象存储Amazon S3标准存储类语音留言、TTS 音频、雷达存档、告警截图
镜像仓库Amazon ECR私有镜像仓库5个微服务 Docker 镜像存储
监控日志Amazon CloudWatch日志组 + 指标全链路可观测,TraceID 串联
链路追踪AWS X-Ray分布式追踪API 请求全链路追踪
CDNAmazon CloudFront全球 CDNAdmin Web 静态资源分发

2.2 VPC 网络规划

网段用途说明
10.0.0.0/16VPC 主 CIDR
10.0.1.0/24EKS Node Group(公有子网)运行容器 Pod
10.0.2.0/24RDS + ElastiCache(私有子网)数据库和缓存,安全组严格控制
10.0.3.0/24Amazon MQ(私有子网)MQTT Broker

3. 服务部署架构

3.1 五个微服务职责

服务K8s Deployment副本数调用协议核心依赖
D1 设备接入服务reflekt-health-device-access2~4MQTT / HTTP / WebSocketAmazon MQ / PostgreSQL / Redis / S3 / AI服务
D2 家属端服务reflekt-health-family-api2~4REST APIPostgreSQL / Redis / S3 / AI服务
D3 运营管理服务reflekt-health-admin-api1~2REST APIPostgreSQL / Redis
D4 AI大脑服务reflekt-health-ai-brain2~4内部调用(gRPC/HTTP)PostgreSQL / Redis / S3 / OpenAI / 通知服务
D5 通知告警服务reflekt-health-notification2~3内部调用(gRPC/HTTP)PostgreSQL / Redis / Twilio / APNs / FCM

3.2 服务间调用拓扑


4. 容器资源配置

4.1 各服务资源配置

服务CPU 请求/限制内存请求/限制副本数启动探针就绪探针
D1 设备接入250m / 500m512Mi / 1Gi2~4/health/ready
D2 家属端250m / 500m512Mi / 1Gi2~4/health/ready
D3 运营管理100m / 250m256Mi / 512Mi1~2/health/ready
D4 AI大脑500m / 1000m1Gi / 2Gi2~4/health
D5 通知告警100m / 250m256Mi / 512Mi2~3/health
PostgreSQL RDS500m / 1000m1Gi / 2Gi—(托管)pg_isready
Redis ElastiCache100m / 250m256Mi / 512Mi—(托管)PING

容量依据:基于 MVP 试点 8~10 个家庭(约 50 名用户),DAU 约 30,峰值 QPS 约 10(设计按 100 TPS 预留扩展余量)。

4.2 健康检查配置

# Kubernetes HPA(Horizontal Pod Autoscaler)示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: reflekt-health-device-access-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: reflekt-health-device-access
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80

4.3 容器启动顺序


5. 客户端分发架构

5.1 三端分发方式

技术栈分发平台构建命令输出格式
Family AppUniApp + Vue3 + TSiOS App Store / Google Playpnpm build:app-ios / pnpm build:app-android.ipa / .apk / .aab
Luma 智能音箱原生 Android(Java + Kotlin)固件刷入(ota)./gradlew assembleRelease.img 固件包
Admin 管理后台Vue3 + TS + ElementPlusCDN 静态托管pnpm build:admindist/admin/

5.2 Family App 推送架构

红色告警静默穿透:APNs / FCM 推送设置 content-available: 1 + priority: high,强制绕过 iOS/Android 系统静音。


6. CI/CD 流水线

6.1 流水线阶段

6.2 镜像构建与推送

# 1. 登录 ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com

# 2. 为每个微服务构建镜像并推送
for SERVICE in device-access family-api admin-api ai-brain notification; do
docker build -t reflekt-health-${SERVICE}:${IMAGE_TAG} .
docker tag reflekt-health-${SERVICE}:${IMAGE_TAG} \
${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/reflekt-health-${SERVICE}:${IMAGE_TAG}
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/reflekt-health-${SERVICE}:${IMAGE_TAG}
done

# 3. EKS 滚动更新
kubectl set image deployment/reflekt-health-device-access \
reflekt-health-device-access=${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/reflekt-health-device-access:${IMAGE_TAG}

kubectl rollout status deployment/reflekt-health-device-access

6.3 前端构建与部署

# Family App
cd reflekt-health-app
pnpm install
pnpm build:app-ios # 输出 .ipa
pnpm build:app-android # 输出 .apk / .aab

# Admin(管理后台)
cd reflekt-health-admin
pnpm install
pnpm build:admin # 输出 dist/admin/
# 部署至 S3 + CloudFront CDN
aws s3 sync dist/admin/ s3://reflekt-health-admin/
aws cloudfront create-invalidation --distribution-id ${DIST_ID} --path "/*"

7. 环境变量清单

7.1 必需环境变量(生产环境)

变量名必填示例值敏感所属服务
SPRING_PROFILES_ACTIVEprod所有服务
DATABASE_URLpostgresql://...D1/D2/D3/D4/D5
REDIS_HOSTreflekt-redis.xxxxx.ng.0001.usne1.cache.amazonaws.comD1/D2/D4/D5
REDIS_PASSWORD********D1/D2/D4/D5
AMAZON_MQ_ENDPOINTb-xxxx.mq.us-east-1.amazonaws.com:5672D1
AMAZON_MQ_USERNAMEadminD1
AMAZON_MQ_PASSWORD********D1
TWILIO_ACCOUNT_SIDACxxxxxxxxD5
TWILIO_AUTH_TOKEN********D5
TWILIO_PHONE_NUMBER+1234567890D5
OPENAI_API_KEYsk-********D4
AWS_S3_BUCKETreflekt-health-assetsD1/D2/D4
AWS_REGIONus-east-1D1/D2/D4
AWS_ACCESS_KEY_IDAKIA********D1/D2/D4
AWS_SECRET_ACCESS_KEY********D1/D2/D4
APNS_KEY_IDXXXXXXXXXXD5
APNS_TEAM_IDYYYYYYYYYYD5
APNS_KEY_PATH/secrets/apns.p8D5
FCM_SERVER_KEY********D5
EWATRIS_API_ENDPOINThttps://api.ewatris.comD1
S3_ENDPOINThttps://s3.us-east-1.amazonaws.comD1/D2/D4

7.2 环境隔离标识

环境Spring Profile数据库第三方沙箱
开发(dev)dev本地 PostgreSQLTwilio 沙箱 / OpenAI 测试配额
预发布(staging)stagingRDS dev(单AZ)同生产第三方
生产(prod)prodRDS prod(Multi-AZ)正式第三方服务

8. Docker Compose 开发环境

# docker-compose.yml(本地开发用)
version: '3.8'
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: reflekt_dev_pass
POSTGRES_DB: reflekt_health
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5

# Amazon MQ 模拟(ActiveMQ Artemis,支持 MQTT)
activemq:
image: rmohr/activemq:5.18-alpine
ports:
- "1883:1883" # MQTT
- "8161:8161" # Web Console
- "61616:61616" # OpenWire
environment:
ACTIVEMQ_ADMIN_LOGIN: admin
ACTIVEMQ_ADMIN_PASSWORD: admin
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8161 || exit 1"]
interval: 30s
timeout: 10s
retries: 3

# 后端 API 服务(本地开发热重载)
api:
build:
context: ../reflekt-health-api
dockerfile: Dockerfile.dev
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: dev
DATABASE_URL: jdbc:postgresql://postgres:5432/reflekt_health
REDIS_HOST: redis
AMAZON_MQ_ENDPOINT: tcp://activemq:1883
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
activemq:
condition: service_healthy
volumes:
- ../reflekt-health-api:/app
- maven_cache:/root/.m2

# Family App 开发预览(Vite Dev Server)
fap-dev:
build:
context: ../reflekt-health-app
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
environment:
VITE_API_BASE_URL: http://localhost:8080
volumes:
- ../reflekt-health-app:/app
- /app/node_modules

# Admin 开发预览
admin-dev:
build:
context: ../reflekt-health-admin
dockerfile: Dockerfile.dev
ports:
- "4000:4000"
environment:
VITE_API_BASE_URL: http://localhost:8080
volumes:
- ../reflekt-health-admin:/app
- /app/node_modules

volumes:
postgres_data:
redis_data:
maven_cache:

9. 灾难恢复与高可用

9.1 故障恢复参数

指标目标值保障措施
系统可用性 SLA99.9%EKS 多副本 + ALB 健康检查
故障恢复时间 RTO< 30 分钟Multi-AZ RDS + ElastiCache 自动故障切换
数据恢复点 RPO< 5 分钟RDS 自动备份(5分钟Wal日志)+ ElastiCache 持久化
设备心跳可用性≥ 99.5%Redis 心跳缓存 + 设备本地离线缓存
红色预警端到端延迟< 5 分钟全链路延迟监控,SLA 告警

9.2 多可用区部署

AWS US East(N. Virginia)
├── us-east-1a(可用区A)
│ ├── EKS Node Group(运行 D1/D2/D3 副本)
│ └── RDS 副本节点
├── us-east-1b(可用区B)
│ ├── EKS Node Group(运行 D1/D2/D4/D5 副本)
│ └── RDS 主节点
└── us-east-1c(可用区C)
├── EKS Node Group(运行 D1/D4 副本)
└── RDS 副本节点

9.3 数据库备份策略

备份类型频率保留说明
自动快照每日7 天RDS 自动备份
手动快照按需自定义重大变更前手动触发
Wal 日志连续5 分钟支撑 Point-in-Time 恢复
跨区域复制每日30 天S3 跨区域复制至 us-west-2

10. 运维与监控

10.1 监控指标体系

类别指标告警阈值告警动作
API 性能P95 响应时间> 500msSlack / Email
API 性能错误率 5xx> 1%PagerDuty
红色预警端到端延迟> 5 分钟PagerDuty(高优先级)
设备心跳上报成功率< 99.5%Slack
AI 服务OpenAI API 配额> 80% 使用率Slack
第三方Twilio SMS 配额> 80% 使用率Slack
基础设施RDS CPU> 70%CloudWatch Alarm
基础设施ElastiCache CPU> 70%CloudWatch Alarm

10.2 日志规范

  • 格式:结构化 JSON,含 traceIdspanIdservicelevelmessage
  • 采集:Fluentd / CloudWatch Logs Agent 采集至 CloudWatch
  • 保留:7 天在线,归档至 S3 Glacier 保留 12 个月(HIPAA 合规)
  • TraceID:全链路串联,从 API 请求 → D1 → D4 → D5 → 第三方

10.3 告警升级规则

告警级别触发条件通知方式升级策略
P0 紧急红色预警链路中断 / 数据库不可用PagerDuty + 电话立即通知 on-call
P1 高API 错误率 > 5% / 告警延迟 > 3 分钟PagerDuty15 分钟无响应升级
P2 中第三方服务降级(Twilio/OpenAI)Slack工作时间处理
P3 低资源使用率 > 80%Slack下一个工作日处理

11. 一键部署脚本(DevOps 参考实现)

#!/bin/bash
# deploy.sh — Reflekt Health 一键部署脚本(生产环境)
set -e

ENV=${1:-prod}
IMAGE_TAG=${2:-$(git rev-parse --short HEAD)}
AWS_REGION=${AWS_REGION:-us-east-1}
ECR_PREFIX="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"

echo "==> 部署环境: ${ENV}"
echo "==> 镜像版本: ${IMAGE_TAG}"

# 步骤1:构建并推送所有微服务镜像
for SERVICE in device-access family-api admin-api ai-brain notification; do
echo "==> 构建镜像: reflekt-health-${SERVICE}"
docker build -t reflekt-health-${SERVICE}:${IMAGE_TAG} \
-f Dockerfile.${SERVICE} .
docker tag reflekt-health-${SERVICE}:${IMAGE_TAG} \
${ECR_PREFIX}/reflekt-health-${SERVICE}:${IMAGE_TAG}
docker push ${ECR_PREFIX}/reflekt-health-${SERVICE}:${IMAGE_TAG}
done

# 步骤2:更新 EKS Deployment 镜像版本
echo "==> 更新 EKS 部署..."
for SERVICE in device-access family-api admin-api ai-brain notification; do
kubectl set image deployment/reflekt-health-${SERVICE} \
reflekt-health-${SERVICE}=${ECR_PREFIX}/reflekt-health-${SERVICE}:${IMAGE_TAG}
kubectl rollout status deployment/reflekt-health-${SERVICE} \
--timeout=300s
done

# 步骤3:验证部署
echo "==> 验证服务健康..."
curl -sf https://api.reflekt.health/health || exit 1

echo "==> 部署完成"

本文档由 Reflekt Health 产品团队维护,最后更新于 2026-04-22。