Skip to content

config.yml 详细解释与推荐配置

更新时间:2026-03-28

1. 配置加载规则

后端启动时按以下顺序取值:

  1. 使用系统默认值(代码内置默认)
  2. 读取 config.yml
  3. 读取环境变量覆盖(例如 server.portSERVER_PORT

2. 先看结论:数据库选型建议

  • 开发环境:优先 sqlite(部署简单、零依赖)
  • 生产环境:优先 postgres(并发、可靠性、可观测性更好)

如果你使用 sqlite 上生产,必须接受:

  • 写并发能力较弱
  • 单机/单盘强绑定
  • 横向扩容与高可用能力受限

3. 可直接复制的 Demo 配置

3.1 Demo A:本地开发(SQLite)

适用场景:单机开发、低并发测试。

yaml
server:
  host: 0.0.0.0
  port: 8080
  mode: debug

log:
  dir: ""
  filename: app.log
  max_size_mb: 100
  max_backups: 7
  max_age_days: 30
  compress: true

database:
  driver: sqlite
  dsn: ./db/dujiao.db?_busy_timeout=5000&_journal_mode=WAL&_synchronous=NORMAL
  pool:
    max_open_conns: 1
    max_idle_conns: 1
    conn_max_lifetime_seconds: 0
    conn_max_idle_time_seconds: 0

jwt:
  secret: "dev-admin-jwt-secret-change-me-please-32chars"
  expire_hours: 24

user_jwt:
  secret: "dev-user-jwt-secret-change-me-please-32chars"
  expire_hours: 24
  remember_me_expire_hours: 168

SQLite 重点提醒:

  • max_open_conns 建议固定为 1,否则高并发写入时容易出现 database is locked
  • _journal_mode=WAL 可提升读写并发体验(单机下常用)
  • 不建议把 SQLite 数据文件放在不稳定网络盘(可能导致锁异常)

3.2 Demo B:生产环境(PostgreSQL)

适用场景:正式业务、可预期并发流量。

yaml
server:
  host: 0.0.0.0
  port: 8080
  mode: release

log:
  dir: /var/log/dujiao-next
  filename: app.log
  max_size_mb: 100
  max_backups: 14
  max_age_days: 30
  compress: true

database:
  driver: postgres
  dsn: host=127.0.0.1 port=5432 user=dujiao password=CHANGE_ME dbname=dujiao sslmode=disable TimeZone=Asia/Shanghai
  pool:
    max_open_conns: 50
    max_idle_conns: 10
    conn_max_lifetime_seconds: 1800
    conn_max_idle_time_seconds: 600

jwt:
  secret: "replace-with-strong-random-admin-secret-64chars"
  expire_hours: 24

user_jwt:
  secret: "replace-with-strong-random-user-secret-64chars"
  expire_hours: 24
  remember_me_expire_hours: 168

PostgreSQL 重点提醒:

  • max_open_conns 不要超过 PostgreSQL 的 max_connections 预算
  • 建议预留连接给 DBA/监控/迁移任务,避免业务把连接池吃满
  • 建议设置 conn_max_lifetime_seconds,避免长期连接被中间网络设备回收后出现偶发错误
  • TimeZone 建议显式配置,避免订单时间与日志时间错位

3.3 Demo C:小流量生产(PostgreSQL 低资源)

适用场景:轻量业务、低配置云主机。

yaml
database:
  driver: postgres
  dsn: host=127.0.0.1 port=5432 user=dujiao password=CHANGE_ME dbname=dujiao sslmode=disable TimeZone=Asia/Shanghai
  pool:
    max_open_conns: 20
    max_idle_conns: 5
    conn_max_lifetime_seconds: 1200
    conn_max_idle_time_seconds: 300

4. 连接池参数如何调

以下建议适用于当前项目(API + 后台操作 + 支付回调)的一般场景。

  • max_open_conns
    • 含义:最大同时打开连接数
    • SQLite 推荐:1
    • PostgreSQL 推荐:20~100(按业务量和 DB 规格调整)
  • max_idle_conns
    • 含义:连接池内保留的空闲连接数
    • 建议:通常设为 max_open_conns20%~40%
  • conn_max_lifetime_seconds
    • 含义:单连接最大生存时间
    • 建议:900~36000 表示不限制
  • conn_max_idle_time_seconds
    • 含义:空闲连接最大空闲时间
    • 建议:300~12000 表示不限制

常见错误搭配:

  • max_idle_conns > max_open_conns(无意义且易误导)
  • PostgreSQL 把 max_open_conns 拉太高,导致 too many clients
  • SQLite 将 max_open_conns 设置为多连接,导致锁冲突增多

5. 分组字段说明

5.0 app

字段类型默认值说明推荐
secret_keystringchange-me-32-byte-secret-key!!AES-256 加密密钥,用于加密支付密钥、Bot Token 等敏感数据必须修改为随机 32 字节字符串

此密钥部署后不可随意更换,否则已加密数据将无法解密。

5.1 server

字段类型默认值说明推荐
hoststring0.0.0.0监听地址0.0.0.0
portstring8080服务端口8080
modestringdebug运行模式:debug/release生产用 release

5.2 log

字段类型默认值说明推荐
dirstring""日志目录;空字符串时使用运行目录下 logs生产建议显式指定
filenamestringapp.log日志文件名app.log
max_size_mbint100单文件最大 MB100
max_backupsint7保留文件数7~14
max_age_daysint30保留天数30
compressbooltrue是否压缩归档true

5.3 database

字段类型默认值说明推荐
driverstringsqlitesqlitepostgres生产建议 postgres
dsnstring./db/dujiao.db数据库连接串按环境配置
pool.max_open_connsint1最大打开连接数SQLite=1;Postgres=20~100
pool.max_idle_connsint1最大空闲连接数5~20 或 open 的 20%~40%
pool.conn_max_lifetime_secondsint0连接最大生命周期(秒,0=不限制)900~3600
pool.conn_max_idle_time_secondsint0空闲连接最大生命周期(秒,0=不限制)300~1200

5.4 jwt / user_jwt

字段类型默认值说明推荐
secretstringchange-me-in-production签名密钥至少 32 位随机字符串
expire_hoursint24Token 过期时间(小时)24
remember_me_expire_hoursint168user_jwt 使用,记住我过期时间168(7 天)

5.5 redis

字段类型默认值说明推荐
enabledbooltrue是否启用 Redis生产建议 true
hoststring127.0.0.1Redis 地址按环境设置
portint6379Redis 端口6379
passwordstring""Redis 密码生产必须设置
dbint0DB 索引0
prefixstringdj键前缀dj 或自定义

5.6 queue

字段类型默认值说明推荐
enabledbooltrue是否启用异步队列建议 true
hoststring127.0.0.1队列 Redis 地址可与 redis 共用不同 DB
portint6379队列 Redis 端口6379
passwordstring""Redis 密码生产必须设置
dbint1队列 DB 索引1
concurrencyint10Worker 并发数5~20
queuesmapdefault:10, critical:5队列名称与权重按需调整

提示:如果 queue.enabled=true 但 Redis 不可达,异步任务(如邮件)会失败或堆积。

补充:

  • 默认启动模式是 all(API + Worker)。
  • queue.enabled=false 时,请使用 -mode api 启动;否则 Worker 无法初始化。

5.7 upload

字段类型说明推荐
max_sizeint64上传大小上限(字节)10485760(10MB)
allowed_types[]string允许 MIME仅必要类型
allowed_extensions[]string允许后缀与 MIME 对齐
max_width / max_heightint图片尺寸上限4096

5.8 cors

字段类型说明推荐
allowed_origins[]string允许来源生产不要用 *
allowed_methods[]string允许方法保持最小集
allowed_headers[]string允许请求头按业务保留
allow_credentialsbool是否允许携带凭证与前端策略匹配
max_ageint预检缓存秒数600

补充:

  • 浏览器限制:当 allow_credentials=true 时,allowed_origins 不能包含 *

5.9 security

字段类型默认值说明推荐
login_rate_limit.window_secondsint300限流检测窗口(秒)300
login_rate_limit.max_attemptsint5窗口内最大失败次数5
login_rate_limit.block_secondsint900超限封禁时长(秒)900
password_policy.min_lengthint8密码最短长度8 或更高
password_policy.require_upperbooltrue是否要求大写字母true
password_policy.require_lowerbooltrue是否要求小写字母true
password_policy.require_numberbooltrue是否要求数字true
password_policy.require_specialboolfalse是否要求特殊字符按需开启

5.10 email

字段类型说明推荐
enabledbool是否启用邮件按需开启
host/portstring/intSMTP 地址按服务商配置
username/passwordstringSMTP 账号密码/授权码使用授权码
from/from_namestring发件地址与发件人名使用企业域名邮箱
use_tls/use_sslbool传输安全策略二选一,按服务商文档
verify_code.*mixed验证码有效期、频率、长度常用默认值

5.11 bootstrap

字段类型说明推荐
default_admin_usernamestring首次初始化管理员用户名建议显式设置为你自己的管理员账号
default_admin_passwordstring首次初始化管理员密码建议设置强密码

补充:

  • 仅当数据库 admins 表为空时,首次启动才会尝试创建默认管理员。
  • 优先级:DJ_DEFAULT_ADMIN_USERNAME / DJ_DEFAULT_ADMIN_PASSWORD(环境变量) > bootstrap.default_admin_username / bootstrap.default_admin_passwordconfig.yml) > 系统默认值。
  • 若运行在 release 模式且环境变量与 config.yml 都未提供管理员密码,系统会跳过默认管理员初始化。

5.12 order

字段类型默认值说明推荐
payment_expire_minutesint15待支付订单超时分钟数15~30

补充:

  • 实际生效值可能会被后台系统设置覆盖(见下方“运行时覆盖优先级”)。

5.13 telegram_auth(可选)

字段类型说明推荐
enabledbool是否启用 Telegram 登录按需开启
bot_usernamestringBot 用户名(不带 @例如 dujiao_login_bot
bot_tokenstringBot Token由 BotFather 生成
login_expire_secondsint登录有效期(秒)300
replay_ttl_secondsint重放保护时长(秒)300

5.14 captcha(可选)

config.yml.example 可能未完整展示该段,但系统已支持。

  • provider: none / image / turnstile
  • scenes:
    • login
    • register_send_code
    • reset_send_code
    • guest_create_order
    • gift_card_redeem
  • image: 图片验证码参数
  • turnstile: Cloudflare Turnstile 参数

示例:

yaml
captcha:
  provider: turnstile
  scenes:
    login: true
    register_send_code: true
    reset_send_code: true
    guest_create_order: true
    gift_card_redeem: true
  turnstile:
    site_key: "<your-site-key>"
    secret_key: "<your-secret-key>"
    verify_url: "https://challenges.cloudflare.com/turnstile/v0/siteverify"
    timeout_ms: 2000

5.15 运行时覆盖优先级(重要)

以下配置支持在后台“设置”中动态修改,且优先级高于 config.yml

  • SMTP(邮件)配置
  • 验证码配置
  • Telegram 登录配置
  • 订单支付超时分钟数(payment_expire_minutes

如果你修改了 config.yml 但页面行为没有变化,请优先检查后台对应设置项。

6. 环境变量映射示例

  • SERVER_MODE=release
  • DATABASE_DSN=host=127.0.0.1 ...
  • JWT_SECRET=...
  • USER_JWT_SECRET=...
  • DJ_DEFAULT_ADMIN_USERNAME=admin
  • DJ_DEFAULT_ADMIN_PASSWORD=<你的强密码>
  • REDIS_HOST=127.0.0.1
  • CAPTCHA_TURNSTILE_SITE_KEY=...
  • TELEGRAM_AUTH_ENABLED=true

规则:配置键中的 . 会被转换为 _

7. 常见故障与排查

  • database is locked
    • 常见于 SQLite 多并发写入
    • 检查 max_open_conns 是否为 1,并确认 DSN 已设置 _busy_timeout
  • pq: sorry, too many clients already
    • PostgreSQL 连接数耗尽
    • 下调 max_open_conns,或提升数据库 max_connections
  • 时间显示错乱(订单时间与日志时间不一致)
    • 检查 PostgreSQL DSN 的 TimeZone 与系统时区
  • Redis/队列可用但邮件未发送
    • 检查 queue.enabled、Redis 连通性、worker 是否启动
  • 订单长期停留在“待支付”,不自动过期
    • 检查是否以 -mode api 单独启动,或 queue.enabled/Redis 不可用导致超时任务未消费

8. 部署前检查清单

  • [ ] server.mode=release
  • [ ] jwt.secretuser_jwt.secret 已替换为高强度随机值
  • [ ] 数据库驱动与 DSN 配置符合环境(SQLite/PostgreSQL)
  • [ ] 连接池参数与数据库规格匹配
  • [ ] Redis/队列可用(如已启用)
  • [ ] 若使用默认启动模式 all,请确认 queue.enabled=true 且队列 Redis 可达
  • [ ] 若计划关闭队列,请确认使用 -mode api 启动,并知晓异步任务能力会受影响
  • [ ] CORS 已限制到真实业务域名
  • [ ] 邮件配置已做真实发信验证(如已启用)

Released under the MIT License.