3.4 KiB
3.4 KiB
kind, name, category, scope, source_files
| kind | name | category | scope | source_files | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| configuration_system | 环境变量与配置加载体系 | configuration_system |
|
|
系统概览
本仓库采用「进程级 .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 |
MySQL,Sequelize 直连,dialectOptions.charset='utf8mb4',开发模式打印 SQL |
| 应用 | APP_NAME, APP_ENV, PORT |
`APP_ENV=development |
| 认证 | 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同时驱动本地与容器。
开发者规则
- 新增配置项先在
.env.example中添加注释与默认值,再在对应config/*.js中读取。 - 敏感信息(密码、密钥)一律走环境变量,禁止硬编码或写入代码。
- 使用
APP_ENV做环境分支逻辑,不要直接检查主机名或路径。 - Docker 部署时通过 compose 的
environment覆盖必要变量,保持.env最小化。 - 若某配置有默认值且允许空值,务必在读取处提供 fallback,避免启动期崩溃。