跳转至

配置(环境变量)

所有配置都通过环境变量完成。权威示例见 backend/.env.example

切勿提交密钥

backend/.env、根目录的 .envbackend.env 全部已 加入 gitignore。新增变量时,请在各 README 中记录该变量 — 但绝不要记录它的值。

核心

变量 示例 用途
PORT 8080 API 监听端口
ENVIRONMENT production 开启严格的生产守卫
DEBUG false 详细日志
ALLOWED_ORIGINS https://open.gerege.mn CORS 白名单(逗号分隔;禁止 *
TRUSTED_PROXIES 反向代理地址

数据库与 Redis

变量 用途
DB_POSTGRE_DSN / DB_POSTGRE_URL 连接字符串
DB_MAX_OPEN_CONNSDB_MAX_IDLE_CONNSDB_CONN_MAX_LIFE_MINS 连接池调优
REDIS_HOSTREDIS_PASSREDIS_EXPIRED Redis 连接与 TTL

生产环境的 DSN 必须使用 sslmode=verify-full

生产守卫强制要求这一点。Docker Compose 技术栈之所以刻意以 ENVIRONMENT=development 运行,是因为其内部数据库没有启用 TLS。

API 不得以超级用户身份连接数据库

只有当应用以最小权限角色连接时,RLS 才会真正生效。在生产环境中, 超级用户或带 BYPASSRLS 的角色会导致启动失败。

JWT 与会话

变量 用途
JWT_SECRET ≥32 个字符。 修改它会使所有会话失效
JWT_EXPIREDJWT_REFRESH_EXPIRED access / refresh 的有效期
JWT_ISSUER 通常为应用域名。修改它会使所有已签发令牌失效

eID(依赖方 RP)

变量 用途
EID_BASE_URL eID Mongolia /v3 基址(或 SSO 签署中继)
EID_RP_UUIDEID_RP_SECRET RP 凭据
SIGN_RELAY_TOKEN 签名中继的共享令牌(留空则停用)

Gerege SSO(RP 侧 — 本应用作为客户端)

变量 示例 用途
SSO_ISSUER https://sso.gerege.mn 未设置时默认为此值
SSO_CLIENT_ID / SSO_CLIENT_SECRET 留空则 SSO 流程不会启用
SSO_REDIRECT_URI https://open.gerege.mn/sso/callback 必须在 SSO 客户端上完全一致地注册
SSO_SCOPE openid profile email nationalid nationalid 会附带公民登记号
SSO_NATIVE_CLIENT_ID 移动端(PKCE,公开客户端)流程使用的客户端
SSO_EID_PROXY_BASE_URL 设置后,eID PKI 相关接口将经由 SSO 代理

未注册的客户端会返回 invalid_client

如果提供方的客户端库中不存在 SSO_CLIENT_ID,authorize 步骤会返回 {"error":"invalid_client"}。重定向 URI 也必须完全一致。

OIDC 提供方侧(本应用作为提供方)

变量 用途
OAUTH_ISSUER 例如 https://open.gerege.mn只有设置该变量时提供方才会启用
SSO_STATE_KEY 登录/授权临时 state 的 HMAC 密钥(≥32 字节
SSO_FIRSTPARTY_CLIENTS 跳过授权确认页的第一方客户端
SSO_ADMIN_API_KEYSSSO_ADMIN_SUBS 管理 API 访问权限

登录界面(AUTH_MODE

平台是自行认证用户,还是跳转到上游 SSO,并非代码差异 —— 由这一个变量 决定:

取值 在首页与 /login
provider 登录卡片(eID 登记号/二维码 · Google)显示在这里
client 跳转到上游 SSO(SSO_ISSUER
AUTH_MODE=client      # 本模板的参考部署 —— SSO 的依赖方
AUTH_MODE=provider    # 诸如 sso.dgov.mn / sso.gerege.mn 的身份服务

留空时会根据是否配置了 SSO_CLIENT_ID 自动推导 —— 因此现有部署无需改动。

拼写错误不会被静默兜底

取值无法识别时,后端会拒绝启动。否则平台会以与预期不同的登录界面悄然 启动。

OAUTH_ISSUER 是不同的维度

OAUTH_ISSUER 回答「本平台是否为其他应用签发令牌」;AUTH_MODE 回答 「本平台的用户在哪里登录」。两者可以同时启用 —— 形成链式结构。

前端从公开接口 GET /api/v1/site/auth 读取自身模式(无需认证、不含机密), 因此前端不存在重复的环境变量。

界面语言

平台内置了蒙古语 + 联合国六种官方语言(阿拉伯语 · 汉语 · 英语 · 法语 · 俄语 · 西班牙语)的完整翻译。七种语言开箱即用 —— 数据库为空也无需任何翻译 步骤。

阿拉伯语会自动设置 <html dir="rtl">

变量 说明
无需配置;这些语言以 is_builtin 形式写入 languages

如需更多语言,超级管理员可在语言页面添加,并用 Gemini 填充翻译 —— 它们以 数据库 overlay 的形式保存。

第三方与存储

变量 用途
GEMINI_API_KEY AI 流水线。缺少它时 /ai/* 会返回真实的 500
GOOGLE_CLIENT_ID / SECRET Google 绑定(留空时按钮隐藏)
VERIFY_API_BASEVERIFY_API_KEYVERIFY_CHANNEL 公民 / 组织信息核验
XYP_API_BASEXYP_CLIENT_IDXYP_CLIENT_SECRET 国家登记系统查询
GSPACE_* 应用自有的 SFTP 存储(按用户配额)
INTEGRATION_ENC_KEY ≥16 字节。 用于加密 OAuth 令牌和超级管理员 MFA

INTEGRATION_ENC_KEY 是必填项

各部署必须配置该密钥,且一经设置就绝不能更改 — 轮换它会破坏此前加密的所有数据。

可观测性

变量 用途
OTEL_EXPORTEROTEL_SAMPLE_RATIO OpenTelemetry 链路追踪
OBSERVABILITY_TOKEN 生产环境中把关 /metrics/swagger 的 bearer 令牌

前端

变量 用途
BACKEND_URL BFF 调用的内部地址(例如 http://api:8080

在共享网络中名称 api 可能冲突

当多套技术栈共用同一个 Docker 网络时,http://api:8080 可能解析到另一个容器, 从而使每个 /api/v1/* 调用都变成 404。此时请把 BACKEND_URL 固定为 您自己 api 容器的完整名称。