HUAN 讙 · 開發者

環境變數

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

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

共用

變數預設說明
NODE_ENVdevelopmentdevelopment、test 或 production
LOG_LEVELinfofatal 到 trace
DATABASE_URL—必填。 PostgreSQL 連線字串

物件儲存

變數預設說明
S3_ENDPOINT—必填。 Server 與 Worker 連得到的 RustFS 位址
S3_PUBLIC_ENDPOINT同 S3_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簽章網址有效時間
DEVICE_HEARTBEAT_SECONDS60下發給裝置的 heartbeat 間隔
DEVICE_FALLBACK_SYNC_SECONDS300下發給裝置的保底同步間隔
DEVICE_MAX_CONCURRENT_DOWNLOADS3裝置同時下載的檔案數
ADMIN_DIST_DIR—設定後由 Server 靜態提供 Admin

Worker

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

可觀測性

Server 與 Worker 都認得,全部選填。沒有設定 OTEL_EXPORTER_OTLP_ENDPOINT 時 SDK 完全不載入。說明見可觀測性。

變數預設說明
OTEL_EXPORTER_OTLP_ENDPOINT—OTLP/HTTP 收件端的根網址。設定了才啟用
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobuf
OTEL_RESOURCE_ATTRIBUTES—建議設 deployment.environment.name=production
OTEL_EXPORTER_OTLP_HEADERS—收件端需要驗證時使用
OTEL_SDK_DISABLEDfalse設為 true 暫時關閉
HUAN_VERSIONdev映像建置時帶入 commit SHA,成為 trace 上的服務版本

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_PASSWORD 與 S3_SECRET_ACCESS_KEY 要用高熵的隨機字串。
  • 原始碼裡沒有任何預設管理員密碼。 第一個管理員一定要用 CLI 建立。