HUAN 讙 · 開發者

環境變數

所有環境變數在啟動時由 @huan/config 以 zod 驗證。缺少或格式錯誤時 Server 與 Worker 會拒絕啟動,並明確指出是哪一個變數有問題——不會帶著錯誤的設定跑起來,然後在某個奇怪的地方失敗。

完整範例見 repository 根目錄的 .env.example

共用

變數預設說明
NODE_ENVdevelopmentdevelopmenttestproduction
LOG_LEVELinfofataltrace
DATABASE_URL必填。 PostgreSQL 連線字串

物件儲存

變數預設說明
S3_ENDPOINT必填。 Server 與 Worker 連得到的 RustFS 位址
S3_PUBLIC_ENDPOINTS3_ENDPOINT瀏覽器與裝置連得到的位址
S3_REGIONus-east-1S3 簽章需要,RustFS 不在意實際值
S3_BUCKEThuan儲存桶名稱
S3_ACCESS_KEY_ID必填。
S3_SECRET_ACCESS_KEY必填。
S3_FORCE_PATH_STYLEtrueRustFS 需要 path-style 位址

Server

變數預設說明
HOST0.0.0.0監聽位址
PORT4000監聽埠
PUBLIC_URLhttp://localhost:4000對外網址,用於組出配對連結
CORS_ORIGINShttp://localhost:5173逗號分隔的允許來源
SESSION_COOKIE_NAMEhuan_session
SESSION_TTL_HOURS336(14 天)
SESSION_COOKIE_SECUREproduction 為 true沒有 TLS 的環境才設為 false
TOTP_ISSUERHUAN顯示在驗證器 App 裡的名稱
LOGIN_RATE_LIMIT_MAX10時間窗內允許的失敗次數
LOGIN_RATE_LIMIT_WINDOW_SECONDS300
SIGNED_URL_TTL_SECONDS900簽章網址有效時間
DISTRIBUTION_RETENTION_HOURS24全部 ACK 之後播放產物的保留期
DEVICE_HEARTBEAT_SECONDS60下發給裝置的 heartbeat 間隔
DEVICE_FALLBACK_SYNC_SECONDS300下發給裝置的保底同步間隔
DEVICE_MAX_CONCURRENT_DOWNLOADS3裝置同時下載的檔案數
ADMIN_DIST_DIR設定後由 Server 靜態提供 Admin

DISTRIBUTION_RETENTION_HOURS 值得想一下

這個值決定「所有裝置都下載完成之後,播放產物還要在 RustFS 上留多久」。

效果
24(預設)一天內新增裝置還來得及取得素材
168一週
720一個月。實務上幾乎不會遇到需要重新上傳的情況

調長只是多花儲存空間;調短則會更快遇到「需要重新上傳」的狀態。詳見 ADR-0003

Worker

變數預設說明
WORKER_CONCURRENCY2同時處理的工作數
WORKER_POLL_INTERVAL_MS2000取件輪詢間隔
WORKER_JOB_MAX_ATTEMPTS3最大重試次數
FFMPEG_PATHffmpeg
FFPROBE_PATHffprobe
WORKER_TMP_DIR系統暫存目錄轉檔暫存位置
WORKER_HEALTH_PORT4001存活檢查端點的埠

Admin(建置期)

變數說明
VITE_API_BASE_URL開發時的 API 位址。同源部署時不需要設定。

文件(建置期)

變數說明
DOCS_SITE_ORIGIN站台來源,預設 https://docs.huan.linyao.tw

只影響 llms.txt 與各頁 Markdown 裡的絕對連結。GitHub Actions 會從 Pages 設定自動帶入,本機不需要設定。

秘密管理

  • 不要 commit .env .gitignore 已經排除它。
  • 不要把密碼寫進 compose.yaml。用 .env 或部署平台提供的秘密管理機制。
  • 正式環境的 POSTGRES_PASSWORDS3_SECRET_ACCESS_KEY 要用高熵的隨機字串。
  • 原始碼裡沒有任何預設管理員密碼。 第一個管理員一定要用 CLI 建立。