配置指南
1. 环境变量注入
应用支持用环境变量覆盖关键配置项。这在 Docker/Kubernetes 环境下尤为重要——
敏感信息不应硬编码在 config.json 中。
支持的环境变量
| 变量名 | 说明 | 覆盖的配置路径 | 示例 |
|---|---|---|---|
FULLA_DB_HOST | 数据库主机名 | db_clients[0].host | postgres |
FULLA_DB_NAME | 数据库名 | db_clients[0].dbname | fulla_db |
FULLA_DB_PASSWORD | 数据库密码 | db_clients[0].passwd | secret |
FULLA_REDIS_HOST | Redis 主机名 | redis_clients[0].host | redis |
FULLA_REDIS_PASSWORD | Redis 密码 | redis_clients[0].passwd | secret |
FULLA_VUE_CLIENT_SECRET | Vue 客户端密钥 | plugins[OAuth2Plugin].config.clients.vue-client.secret | ... |
生产部署的完整环境变量清单(30+ 项)见生产部署的变量表;本表只列注入机制的六个核心项。
工作机制
- 加载钩子:启动时
main.cc的loadConfiguration()先调用common::config::ConfigManager::load(),再调用ConfigManager::validate()。 - 解析:把基础
config.json读入Json::Value对象。 - 注入:检查上述环境变量是否存在;存在则就地更新
Json::Value中对应节点。 - 加载:Drogon 通过
drogon::app().loadConfigJson(config)直接加载修改后的配置对象,磁盘上不产生临时文件。
验证
专用测试 EnvInjectionVerify(EnvConfigTest.cc)保证该逻辑正确。
2. Docker 部署
仓库内置 docker-compose.yml 编排全栈(详解见 Docker 部署)。
服务栈
- fulla-frontend:Vue SPA + Nginx(构建自
deploy/docker/Dockerfile的frontend-runtime)。 - fulla-admin:管理后台前端(构建自
frontends/admin/Dockerfile)。 - fulla-backend:Drogon 后端(构建自
deploy/docker/Dockerfile的backend-runtime)。 - fulla-postgres:PostgreSQL 17(后端启动时经
FULLA_AUTO_MIGRATE=true应用apps/server/migrations/下的 schema)。 - fulla-redis:带密码保护的 Redis 7。
- fulla-prometheus:指标采集。
快速开始
# 构建并启动(在仓库根目录执行)
docker compose -f deploy/docker/docker-compose.yml up -d --build
# 查看日志
docker compose -f deploy/docker/docker-compose.yml logs -f fulla-backend
# 停止
docker compose -f deploy/docker/docker-compose.yml down
Docker 下的配置处理
docker-compose.yml 将 apps/server/config/config.json 只读挂载进容器;
environment 段注入环境变量(见 §1),运行时经 ConfigManager::load() +
环境注入覆盖文件默认值。
3. 存储后端选择
OAuth2 插件的 config.storage_type 决定持久化后端:
storage_type | 状态 | 说明 |
|---|---|---|
postgres | 支持(唯一生产后端) | 完整令牌持久化、refresh token 轮换与重用检测。 |
redis | 已弃用 | 历史上从未持久化 refresh token(saveRefreshToken/getRefreshToken 为空操作),轮换与重用检测静默失效。该模式仍可启动(兼容考虑,启动时打 ERROR 日志),但 refresh_token 授权会以 unsupported_grant_type 被拒绝。新部署不要使用。 |
memory | 仅测试 | 面向单元/集成测 试,不用于生产。 |
目标架构:Postgres 作为存储层,前置一个在线 Redis L2 缓存(键空间
fulla:cache:*,经 config.json 的 cache 块配置 enabled /
ttl_seconds / invalidation_double_delete_delay_ms;失效采用延迟双删,
见 DelayedDoubleDelete)。不存在独立 Redis 存储模式。
4. Issuer 配置
config.metadata.issuer(custom config)是服务器 issuer URL 的唯一事实源。
OAuth2Plugin 启动时读取一次,一致地用于:
- 签发 access token 时打上的
iss声明(authorization_code / refresh_token / client_credentials / device_code 授权); - 内省响应的
iss(存储行未携带时以配置值回填); - 发现文档(
/.well-known/openid-configuration、/.well-known/oauth-authorization-server)。
约束:
- 末尾斜杠会被自动规范化掉,不要依赖它。
- 未设置时默认
http://localhost:5555,此时打LOG_WARN。 - 生产部署必须配置
https://issuer;非回环主机上使用明文 http issuer 会有启动告警。 - 内省
iss与发现文档issuer保证逐字节一致(OIDC Discovery §3 要求)。