配置项¶
所有配置都来自环境变量。用 Compose 时写在仓库根目录的 .env(由 docker compose 自动读取),裸跑二进制时就是进程环境变量。默认值以代码为准:backend/internal/config/config.go。
最省事的开始
cp .env.example .env 已经能跑起本地演示。要上服务器,先看生产部署的清单,再回来调这里的值。
数据库¶
| 变量 | 默认 | 说明 |
|---|---|---|
DATABASE_URL |
postgres://postgres:postgres@localhost:5432/reqmango?sslmode=disable |
完整 DSN。设置后优先级高于下面的 DB_* 组合 |
DB_USER |
reqmango |
Compose 数据库用户名 |
DB_PASSWORD |
reqmango |
Compose 数据库密码。公网实例必须改 |
DB_NAME |
reqmango |
数据库名 |
DB_PORT |
5432 |
宿主机映射端口 |
Compose 会用 DB_* 拼出容器内的 DATABASE_URL(主机名为 db),所以不必手写 DSN;裸部署则需要自己给 DATABASE_URL。
安全与认证¶
| 变量 | 默认 | 说明 |
|---|---|---|
SECRET_KEY |
未设置 | JWT 签名密钥。未设置(或仍是 change-me-in-production)时,进程启动会生成一个随机密钥并打印警告:重启即失效,必然要显式设置 |
ACCESS_TOKEN_EXPIRE_MINUTES |
10080(7 天) |
访问令牌有效期 |
ADMIN_EMAIL |
admin@reqmango.com |
空库首次启动时创建超级管理员的邮箱 |
ADMIN_PASSWORD |
空 | 留空则生成 24 位随机密码,只在日志里打印一次 |
SEED_DEMO |
false |
是否写入演示数据与演示账号(demo@example.com / demo1234) |
SEED_E2E |
false |
是否写入 E2E 测试夹具账号(仅供 CI) |
SEED_DEMO 和 SEED_E2E 的账号密码写在公开仓库里,默认关闭是有意为之。.env.example 里打开 SEED_DEMO=true 只是为了让 docker compose up 第一次就能登录。
引导管理员只在“库里还没有超级管理员”时运行,且不会把已注册用户提升为管理员。详见生产部署。
服务与日志¶
| 变量 | 默认 | 说明 |
|---|---|---|
PORT |
8000 |
后端监听端口(容器内固定 8000,一般不用改) |
API_PORT |
8000 |
宿主机映射给后端的端口 |
WEB_PORT |
80 |
宿主机映射给前端的端口 |
DEBUG |
true |
Gin 调试模式;也会影响默认 SQL 日志级别 |
DB_LOG_LEVEL |
跟随 DEBUG |
silent / error / warn / info。info 会把每条 SQL 连同参数打出来,生产环境别用 |
SLOW_REQUEST_MS |
1000 |
超过该耗时的请求以 [SLOW] 前缀记录路由模板;0 关闭。/health、/readyz 不记 |
日志里不会出现完整 DSN:启动时只打印前 30 个字符。
限流¶
| 变量 | 默认 | 说明 |
|---|---|---|
RATE_LIMIT_REQUESTS |
500 |
每个客户端 IP 在窗口内允许的请求数;0 关闭限流 |
RATE_LIMIT_WINDOW_SEC |
60 |
窗口长度(秒) |
限流键是客户端 IP(c.ClientIP())。Gin 默认信任所有代理转发头,所以:
反向代理之后能正确按真实 IP 计,但后端端口绝不能直接暴露在公网,否则任何人伪造 X-Forwarded-For 就能绕过限流。生产部署请把 8000 绑到回环地址。
超限时返回 429,响应头带 X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset。
AI(可选)¶
不填 AI_API_KEY 时,AI 相关按钮会隐藏或给出提示,其余功能不受影响。
| 变量 | 默认 | 说明 |
|---|---|---|
AI_API_KEY |
空 | 兼容 OpenAI 的服务密钥;也会读 DEEPSEEK_API_KEY |
AI_PROVIDER |
deepseek |
提供方标识 |
AI_MODEL |
deepseek-chat |
模型名 |
AI_BASE_URL |
https://api.deepseek.com/v1 |
OpenAI 兼容端点,指向自建网关也可以 |
API Key 只留在后端;浏览器不会拿到它。
镜像与发布(仅 Compose)¶
| 变量 | 默认 | 说明 |
|---|---|---|
REQMANGO_TAG |
latest |
镜像标签。生产环境钉版本号,不要漂在 latest |
REQMANGO_BACKEND_IMAGE |
ghcr.io/vinthuy/reqmango-backend:<tag> |
覆盖后端镜像地址(内网仓库、离线环境) |
REQMANGO_FRONTEND_IMAGE |
ghcr.io/vinthuy/reqmango-frontend:<tag> |
覆盖前端镜像地址 |
REQMANGO_COMMIT / REQMANGO_BUILD_DATE 只在从源码构建时作为镜像元数据使用,会体现在 GET /version 里。
一份够用的生产 .env¶
SEED_DEMO=false
SEED_E2E=false
SECRET_KEY=<openssl rand -hex 32 的输出>
ADMIN_EMAIL=you@example.com
ADMIN_PASSWORD=<强密码,或者留空去日志里取一次性随机密码>
DB_USER=reqmango
DB_PASSWORD=<不是 reqmango>
DB_NAME=reqmango
DEBUG=false
DB_LOG_LEVEL=warn
REQMANGO_TAG=0.1.0
改完后 docker compose up -d,用 curl -s localhost/version 确认跑的是哪个构建。