# 开发、生产环境与双部署方式设计规格 - 功能编号:GOV-006 - 规格版本:0.1 - 状态:approved_for_review - 日期:2026-08-13 ## 背景与目标 项目已经明确前后端和基础设施技术栈,但目前只有 `.gitignore` 排除 `.env`,没有正式的开发/生产配置契约、模板结构、加载优先级和部署边界。缺少这些规则会导致本地开发误用生产配置、生产回退到模拟数据、不同部署方式使用不同变量,以及密钥进入仓库或构建产物。 本功能建立统一的环境配置体系,并同时支持 Docker Compose 与 Ubuntu 源码生产部署。两种生产方式必须使用相同变量名、配置校验、进程边界和发布版本,不允许形成两套行为不同的应用。 ## 环境模型 项目只定义两个应用运行环境: - `development`:本地开发、热更新、确定性模拟数据和开发 Redis。 - `production`:线上运行,禁止热更新、调试端口、模拟数据和开发默认值回退。 测试运行使用测试工具自己的隔离配置,不把 `test` 作为可部署环境。应用启动必须显式获得环境值;生产环境缺少配置或出现非法组合时立即退出,不能静默使用开发默认值。 业务代码不得到处分支判断环境。环境差异在配置加载、依赖注入和基础设施 Adapter 边界收敛,纯业务计算保持一致。 ## 仓库模板结构 仓库提交完整但不含秘密的模板: ```text deploy/env/ ├── development/ │ ├── api.env.example │ ├── scheduler.env.example │ ├── worker.env.example │ └── web.env.example └── production/ ├── api.env.example ├── scheduler.env.example ├── worker.env.example └── web.env.example ``` 每个模板必须为每项变量写明用途、示例格式、是否必填、敏感性和启用条件。密码、Token 和 API Key 使用空值,不使用看似真实的占位凭据。 真实开发配置使用同目录或项目约定位置的 `*.env.local`,由 Git 忽略。真实生产配置永远不放在仓库、发布目录、镜像层或前端构建产物中。 ## 配置契约与校验 API、Scheduler、Worker 使用独立 Schema 校验各自配置,遵守最小知情范围: - API:HTTP 监听、Redis、当前快照、按需历史读取和 AI 调用配置。 - Scheduler:时区、交易日调度、Redis 分布式锁;RabbitMQ 未启用时使用服务内调度 Adapter。 - Worker:数据源、Redis、分析配置;未来启用时增加 MySQL、RabbitMQ 和 AI 变量。 - Web:只允许公开的 `VITE_*` 构建变量,例如 API 相对路径和应用标题。 功能开关控制条件必填:MySQL、RabbitMQ、正式数据源或 AI 未启用时,其连接变量可以为空;一旦开关启用,相关变量缺失、格式错误或不安全时必须拒绝启动。 前端构建环境变量会进入浏览器代码,任何数据库、Redis、RabbitMQ、数据源或 AI 凭据都不得使用 `VITE_*` 前缀。 ## 本地开发方式 本地开发默认使用 Docker Compose 只启动 Redis。Web、API、Scheduler 和 Worker 直接从源码运行,使用热更新和开发配置,便于调试。 第一阶段不启动 MySQL 和 RabbitMQ: - MySQL 只定义 Repository 接口并使用内存实现。 - RabbitMQ 只定义消息契约和发布接口,Scheduler 通过服务内 Adapter 调用任务。 - Redis 是第一阶段唯一实际启用的外部基础设施,用于当前快照、缓存、刷新锁和调度锁。 开发 Compose 文件不得加载生产配置,不得连接生产地址。开发服务名、网络和数据目录必须使用项目专用前缀,避免影响其他项目。 ## Docker Compose 生产部署 生产 Compose 支持运行 Web/Nginx、API、Scheduler、Worker,以及按部署选择连接内部或外部 Redis、MySQL 5.7 和 RabbitMQ。第一阶段未启用的组件不应为了形式完整而启动。 要求: - 镜像对应明确 Git 提交或版本标签,禁止使用浮动 `latest` 作为可回退版本。 - 使用外部指定的生产 env 文件加载同一配置契约,不把秘密写入 Compose YAML。 - 禁止源码挂载、热更新、调试端口和开发命令。 - 服务提供健康检查、日志边界、启动顺序和优雅停止。 - 数据目录使用明确宿主机路径或经确认的持久化方案,升级不得删除数据。 ## Ubuntu 源码生产部署 正式支持平台: - Ubuntu 22.04 LTS x86_64。 - Ubuntu 24.04 LTS x86_64。 服务器管理员预先提供并维护: - Node.js 22 LTS。 - pnpm 10。 - Nginx。 - MySQL 5.7、Redis、RabbitMQ 或对应外部服务。 项目只验证版本和连通性,不修改软件源,不安装或升级 Node.js、pnpm、Nginx、MySQL、Redis 或 RabbitMQ。版本不符合要求时部署立即终止并给出明确错误。 依赖安装必须使用 `pnpm install --frozen-lockfile`。Web 构建为静态文件后由 Nginx 托管;API、Scheduler 和 Worker 运行编译后的 JavaScript,禁止在生产运行 TypeScript、Vite 开发服务器、Nest watch 或源码热更新。 ## systemd 与生产配置位置 源码部署使用单个非登录系统用户 `a-share` 运行 API、Scheduler 和 Worker。第一阶段先降低部署复杂度,但仍把配置拆为独立文件,为以后按进程拆系统用户保留边界。 生产配置固定存放在发布目录之外: ```text /etc/a-share-analysis/ ├── api.env ├── scheduler.env ├── worker.env └── web.env ``` systemd 单元通过 `EnvironmentFile=/etc/a-share-analysis/<进程>.env` 在启动时注入变量。切换 `/opt/a-share-analysis/current` 指向的应用版本不会覆盖配置。 API、Scheduler 和 Worker 分别只引用自己的 env 文件。第一阶段文件所有者为 `root:a-share`,包含秘密的文件权限为 `0640`;Web 配置只含公开构建变量,可由部署构建步骤读取。未来接入高价值数据源和 AI 密钥时,评估拆分独立系统用户和更细的文件组权限。 ## 发布目录与进程边界 源码部署建议使用不可变版本目录: ```text /opt/a-share-analysis/ ├── releases/<版本或提交>/ └── current -> releases/<当前版本>/ ``` 更新时先在新目录安装、构建和校验,再原子切换 `current` 并重启服务。回退切回上一完整版本,不在旧目录上覆盖文件。 Nginx 托管当前版本 Web 静态产物并反向代理 API。API、Scheduler、Worker 为独立 systemd 服务;任一后台进程异常不得由 API 请求临时替代执行全市场采集任务。 ## MySQL 兼容约束 两种部署方式和两个环境都受 GOV-005 约束:MySQL 固定 5.7.x,字符集 `utf8mb4`,排序规则 `utf8mb4_general_ci`。项目启动或迁移必须验证该条件,不得在开发环境使用 8.x 再假设向下兼容。 第一阶段 MySQL 未启用,因此配置模板保留功能开关和条件变量,但默认不连接数据库。 ## 安全与防误用 - `.env`、`.env.*` 和 `*.env.local` 默认忽略,只允许提交 `*.env.example`。 - 模板、日志、错误和诊断输出不得包含真实秘密。 - 生产启动必须检查 `APP_ENV=production`,并拒绝模拟数据、开发 URL、调试模式和空的已启用服务凭据。 - 开发配置不得包含或连接生产主机;项目脚本禁止读取生产数据库进行开发验证。 - Docker Compose 与源码部署使用相同变量名称和 Schema,不用环境专属别名隐藏差异。 - Web 配置仅含公开值;所有付费 AI 和数据源密钥只存在服务端配置。 ## 运维文档范围 两种生产部署方式都必须提供: - 前置条件和版本检查。 - 初次部署、配置填充、构建和启动步骤。 - 健康检查、日志读取和进程状态检查。 - 使用确定版本的升级流程。 - 配置不变的应用回退流程。 - 数据服务备份职责声明和故障边界。 源码部署文档不提供基础设施安装脚本。Docker Compose 文档不能暗示其配置可以直接用于本地开发。 ## 实施范围 GOV-006 建立环境规范、变量模板、开发 Redis Compose、生产部署骨架、systemd/Nginx 示例及验证脚本的设计与追溯基础。由于 Web、Server、Scheduler 和 Worker 尚未实现,当前可先提供结构完整的模板和部署规范;具体应用启动命令在相应项目脚手架落地后通过后续功能验证,不得伪造已可运行状态。 ## 验收标准 - 仓库包含开发与生产环境下 API、Scheduler、Worker、Web 的八份无秘密模板。 - 本地开发仅通过 Compose 启动项目专用 Redis,应用从源码运行。 - 生产同时有 Docker Compose 和 Ubuntu 22.04/24.04 x86_64 源码部署规范。 - 源码部署明确管理员提供 Node.js 22 LTS、pnpm 10、Nginx 和基础设施,项目只验证不安装。 - 源码部署明确单个 `a-share` 用户、独立 EnvironmentFile 和发布目录边界。 - Docker Compose 与源码部署共用配置变量和校验规则。 - 生产环境无法回退到模拟数据、开发默认值、热更新或调试配置。 - MySQL 条件配置符合 GOV-005,第一阶段默认不启用 MySQL 和 RabbitMQ。 - 治理测试、模板静态检查、敏感信息检查、GitNexus 变更检测和双 Review 通过。 - 中文提交和对应版本标签精确推送到 Gitea。