跳转到内容

环境管理规范

dev / test / staging / prod 环境约定


[Requirement] 所有项目必须至少划分以下 4 个环境,各环境用途、数据来源、部署频率严格区分,禁止混用。

环境别名用途数据来源部署频率可访问性
dev开发环境开发者本地联调、特性开发本地 Mock / 共享开发库任意,随代码提交仅研发团队
test测试环境QA 功能测试、集成测试、回归测试测试库(含脱敏生产数据快照)每日构建 / 提测时研发 + QA
staging预发布环境 / UAT发布前验收、性能验证、灰度演练生产数据全量快照(脱敏)每次发布前研发 + QA + 产品
prod生产环境对外提供服务真实生产数据按发布计划运维 + 授权人员

[Standard] staging 环境必须与 prod 环境同构——相同的实例规格、节点数量、中间件版本、网络拓扑,仅数据量有差异。

dev (本地) test (共享) staging (预发布) prod (生产)
┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ 本地服务 │ │ CI 部署 │ │ 蓝绿/灰度池 │ │ 全量集群 │
│ 本地 DB │ │ 测试 DB │ │ 预发布 DB │ │ 生产 DB │
│ 本地 Redis│ │ 测试 Redis│ │ 预发布 Redis │ │ 生产 Redis │
└──────────┘ └──────────┘ └──────────────┘ └──────────────┘
│ │ │ │
└──────── 网络隔离 ──┴─── 网络隔离 ──────┴──── 网络隔离 ────────┘

[Requirement] 每个服务运行时必须能通过环境变量或配置项明确感知自身所处环境,环境标识只能取以下值之一:dev / test / staging / prod。

# 统一环境变量
APP_ENV=prod
APP_ENVIRONMENT=prod

[Caution] 禁止使用 production、live、prd 等别名,必须统一为 prod,避免脚本和监控规则匹配失败。


[Requirement] 各环境之间必须实现网络层隔离,禁止跨环境直接访问基础设施(数据库、缓存、MQ 等)。

隔离方式说明
VPC / 安全组不同环境使用独立 VPC 或独立安全组,默认拒绝跨环境流量
独立子网各环境使用独立的 IP 网段,避免 IP 冲突和路由串扰
防火墙规则仅允许特定端口(如 80/443)从公网进入 prod,其余环境禁止公网访问

[Requirement] 数据库、缓存、消息队列、对象存储等中间件必须按环境独立部署,禁止共用。

资源隔离要求示例
数据库每个环境独立实例,独立账号密码user-db-dev、user-db-test、user-db-staging、user-db-prod
缓存每个环境独立 Redis 实例禁止 dev 和 test 共用一个 Redis
消息队列每个环境独立 MQ 集群或独立 namespacekafka-dev、kafka-prod
对象存储每个环境独立 Bucket 或独立账号assets-dev、assets-prod

[Standard] 所有云资源、域名、K8s namespace 必须带环境前缀,一眼可辨。

# 域名
api-dev.example.com
api-test.example.com
api-staging.example.com
api.example.com # prod 不带环境前缀
# K8s Namespace
dev-user-service
test-user-service
staging-user-service
prod-user-service
# 数据库
user_db_dev
user_db_test
user_db_staging
user_db_prod
  • ❌ dev 环境直连 prod 数据库进行调试。
  • ❌ test 和 staging 共用同一个 Redis,导致缓存串数据。
  • ❌ prod 环境的数据库账号在 dev 环境也能使用。
  • ❌ 环境标识使用 prd、production 等不统一别名。

[Requirement] 配置必须按环境分离,禁止把多环境配置硬编码在代码中。详细规则见 配置管理规范。

[Standard] 配置文件按 application-<env>.yml 或 .env.<env> 命名,通过环境变量 APP_ENV 激活对应配置。

project/
├── config/
│ ├── application.yml # 共享默认配置
│ ├── application-dev.yml
│ ├── application-test.yml
│ ├── application-staging.yml
│ └── application-prod.yml # 仅含占位符,密钥从环境变量注入

[Standard] 以下配置项必须按环境区分,禁止跨环境复用:

配置项devteststagingprod
日志级别DEBUGINFOINFOWARN
数据库连接池大小510与 prod 一致与 prod 一致
超时时间(秒)3030与 prod 一致与 prod 一致
功能开关默认值全开按测试用例与 prod 一致按发布计划
缓存 TTL短(60s)中(300s)与 prod 一致与 prod 一致
外部 API 调用Mock / SandboxSandbox生产沙箱生产

[Requirement] 所有环境的密钥、密码、Token 禁止写入代码仓库,必须通过环境变量、K8s Secret 或密钥管理服务(KMS / Vault)注入。

[Caution] prod 环境的密钥必须与其他环境完全隔离,禁止复用。


[Requirement] 数据只能从 prod 向低级环境单向流动,禁止反向同步。

prod ──(脱敏快照)──→ staging ──(脱敏快照)──→ test
│
└──(脱敏快照)──→ dev(按需)

[Requirement] 从 prod 同步到非 prod 环境的数据,必须经过脱敏处理,禁止明文生产数据流入 dev/test。

字段类型脱敏规则
手机号保留前 3 后 4:138****5678
身份证保留前 4 后 2:1101***********12
姓名保留姓,名用 *:张*
邮箱保留首字符和域名:z***@example.com
地址保留省市区,屏蔽门牌号
银行卡保留后 4 位:************1234

[Standard] 各环境数据量参考:

环境数据量说明
dev最小子集(百级)仅覆盖核心场景,便于本地调试
test中等(万级)覆盖功能测试、边界测试
staging全量脱敏快照与 prod 同构,验证真实数据下的行为
prod全量真实数据生产数据

[Standard] test 环境数据每日构建时重置为基线数据集,避免脏数据影响回归测试。

[Suggestion] staging 环境每周从 prod 同步一次脱敏快照,保持数据新鲜度。


[Requirement] 各环境访问权限必须严格管控,遵循最小权限原则。

角色devteststagingprod
研发工程师读写读写只读禁止
QA 工程师读读写只读禁止
产品经理禁止只读只读只读(经授权)
运维工程师读写读写读写读写
管理员读写读写读写读写

[Requirement] prod 环境禁止研发直接登录服务器操作,所有变更必须通过 CI/CD 流水线或运维工单执行。

[Requirement] prod 环境数据库禁止研发直连,如需查询数据须通过只读账号 + 运维审批。

[Standard] prod 环境的 SSH / 数据库访问必须通过堡垒机,所有操作全程录像审计。

[Caution] 在工具、脚本中切换环境时,必须二次确认目标环境,避免误操作 prod。

# 部署脚本示例:切换环境时必须显式指定并二次确认
deploy() {
  local env=$1
  if [ "$env" = "prod" ]; then
    echo "⚠️  即将部署到 PROD 环境,请输入 'yes' 确认:"
    read -r confirm
    [ "$confirm" != "yes" ] && { echo "已取消"; exit 1; }
  fi
  # ... 执行部署
}
  • ❌ 研发持有 prod 数据库的写权限。
  • ❌ 在 prod 环境直接执行 kubectl exec 手动改配置。
  • ❌ 所有环境共用同一个 Redis 密码。
  • ❌ 部署脚本中硬编码 prod 地址,导致误部署。