Files
2026-07-10 11:25:45 +08:00

47 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
kind: configuration_system
name: 环境变量与配置加载体系
category: configuration_system
scope:
- '**'
source_files:
- backend/src/app.js
- backend/src/config/loadEnv.js
- backend/src/config/env.js
- backend/src/config/database.js
- backend/src/config/redis.js
- .env.example
- docker-compose.yml
---
## 系统概览
本仓库采用「进程级 .env 文件 + 环境变量」的轻量配置方案,由后端在启动时统一加载,未引入第三方配置中心或 YAML/JSON 配置文件。所有运行时参数通过 `process.env` 注入,开发环境与生产环境通过 `APP_ENV` 区分。
## 核心机制
- **统一入口加载**`backend/src/app.js` 首行 `require('./config/loadEnv')`,确保应用启动前完成 `.env` 解析。
- **dotenv 加载策略**`loadEnv.js` 固定从仓库根目录读取 `.env``path.resolve(__dirname, '../../../.env')`),仅在文件存在时调用 `dotenv.config()`Docker 部署时通过 `docker-compose.yml``env_file` 注入,容器内无 `.env` 也不会覆盖已存在的环境变量。
- **环境判断工具**`config/env.js` 暴露 `APP_ENV``isDevelopment``isProduction`,供各模块按环境切换行为(如数据库日志开关)。
## 配置项分类与约定
| 类别 | 关键变量 | 默认值 / 说明 |
|---|---|---|
| 数据库 | `DATABASE_HOST`, `DATABASE_PORT`, `DATABASE_NAME`, `DATABASE_USER`, `DATABASE_PASSWORD` | MySQLSequelize 直连,`dialectOptions.charset='utf8mb4'`,开发模式打印 SQL |
| 应用 | `APP_NAME`, `APP_ENV`, `PORT` | `APP_ENV=development|production`;本地默认 8083Docker 内 8000 |
| 认证 | `JWT_SECRET`, `DASHBOARD_ADMIN_USERNAME`, `DASHBOARD_ADMIN_PASSWORD` | 首次启动自动创建超级管理员 |
| S3 存储 | `AWS_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_S3_OTA_BUCKET`, `AWS_S3_MEASUREMENT_BUCKET` | 正式环境可通过 IAM 角色免 AK/SK 访问 |
| OTA 地址 | `OTA_X8_PUBLIC_BASE`, `OTA_X9_URL_BASE`, `OTA_UPLOAD_DIR` | X8/X9 升级包基 URL;上传目录仅生产环境需显式配置 |
| Redis 缓存 | `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`, `REDIS_EQ_DB` | ioredis 单例,连接失败记录错误日志 |
| 外部服务 | `MEILISEARCH_*`, `CURVE_API_BASE_URL` | 搜索与曲线 API 基础地址 |
## 架构与约定
- **单一来源**`.env.example` 是配置清单,实际 `.env` 不应提交到版本库(已在 `.gitignore` 中忽略)。
- **分层组织**`backend/src/config/` 下每个子模块只负责自身依赖的配置读取(database、redis、logger),不互相耦合。
- **环境变量优先**:所有配置均从 `process.env` 读取,并带合理默认值,保证本地可零配置运行。
- **Docker 集成**`docker-compose.yml` 通过 `env_file: [.env]``environment:` 覆盖端口与环境变量,实现同一份 `.env` 同时驱动本地与容器。
## 开发者规则
1. 新增配置项先在 `.env.example` 中添加注释与默认值,再在对应 `config/*.js` 中读取。
2. 敏感信息(密码、密钥)一律走环境变量,禁止硬编码或写入代码。
3. 使用 `APP_ENV` 做环境分支逻辑,不要直接检查主机名或路径。
4. Docker 部署时通过 compose 的 `environment` 覆盖必要变量,保持 `.env` 最小化。
5. 若某配置有默认值且允许空值,务必在读取处提供 fallback,避免启动期崩溃。