环境管理规范
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 集群或独立 namespace | kafka-dev、kafka-prod |
| 对象存储 | 每个环境独立 Bucket 或独立账号 | assets-dev、assets-prod |
[Standard] 所有云资源、域名、K8s namespace 必须带环境前缀,一眼可辨。
# 域名api-dev.example.comapi-test.example.comapi-staging.example.comapi.example.com # prod 不带环境前缀
# K8s Namespacedev-user-servicetest-user-servicestaging-user-serviceprod-user-service
# 数据库user_db_devuser_db_testuser_db_staginguser_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] 以下配置项必须按环境区分,禁止跨环境复用:
| 配置项 | dev | test | staging | prod |
|---|---|---|---|---|
| 日志级别 | DEBUG | INFO | INFO | WARN |
| 数据库连接池大小 | 5 | 10 | 与 prod 一致 | 与 prod 一致 |
| 超时时间(秒) | 30 | 30 | 与 prod 一致 | 与 prod 一致 |
| 功能开关默认值 | 全开 | 按测试用例 | 与 prod 一致 | 按发布计划 |
| 缓存 TTL | 短(60s) | 中(300s) | 与 prod 一致 | 与 prod 一致 |
| 外部 API 调用 | Mock / Sandbox | Sandbox | 生产沙箱 | 生产 |
[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] 各环境访问权限必须严格管控,遵循最小权限原则。
| 角色 | dev | test | staging | prod |
|---|---|---|---|---|
| 研发工程师 | 读写 | 读写 | 只读 | 禁止 |
| 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 地址,导致误部署。