Skip to content

config.yml 詳細解釋與推薦配置 ​

更新時間:2026-03-28

1. 配置加載規則 ​

後端啟動時按以下順序取值:

  1. 使用系統默認值(代碼內置默認)
  2. 讀取 config.yml
  3. 讀取環境變量覆蓋(例如 server.port ⇢ SERVER_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_conns 的 20%~40%
  • conn_max_lifetime_seconds
    • 含義:單連接最大生存時間
    • 建議:900~3600;0 表示不限制
  • conn_max_idle_time_seconds
    • 含義:空閒連接最大空閒時間
    • 建議:300~1200;0 表示不限制

常見錯誤搭配:

  • 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 ​

字段類型預設值說明推薦
driverstringsqlitesqlite 或 postgres生產建議 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_hoursint168僅 user_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_password(config.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.secret 與 user_jwt.secret 已替換為高強度隨機值
  • [ ] 數據庫驅動與 DSN 配置符合環境(SQLite/PostgreSQL)
  • [ ] 連接池參數與數據庫規格匹配
  • [ ] Redis/隊列可用(如已啟用)
  • [ ] 若使用默認啟動模式 all,請確認 queue.enabled=true 且隊列 Redis 可達
  • [ ] 若計劃關閉隊列,請確認使用 -mode api 啟動,並知曉異步任務能力會受影響
  • [ ] CORS 已限制到真實業務域名
  • [ ] 郵件配置已做真實發信驗證(如已啟用)

Released under the MIT License.