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.