HUAN 讙 · 開發者

疑難排解

面向架設與開發的問題。使用者端的問題見使用教學的疑難排解

安裝與啟動

pnpm dev 說找不到 @huan/protocol

apps/* 依賴共用套件的建置產物。先執行:

pnpm build:packages

pnpm devpnpm testpnpm typecheck 都會自動先做這一步,直接執行 pnpm --filter @huan/server dev 則不會。

pnpm devEADDRINUSE: port 4000

pnpm docker:up 會啟動 server 容器,它同樣佔用 4000 埠。兩者只能擇一:

docker compose -f docker/compose.yaml stop server worker
pnpm dev

只需要資料庫與物件儲存時,啟動這兩個服務就好:

docker compose -f docker/compose.yaml up -d postgres rustfs

pnpm install 被擋下來

repository 只接受 pnpm。npm installyarn 會被 preinstall 腳本拒絕。

corepack enable pnpm

Server 啟動時報環境變數錯誤

@huan/config 會在啟動時驗證所有環境變數,並明確指出哪一個有問題。對照 .env.example 補齊,特別是 DATABASE_URLS3_ENDPOINTS3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEY

資料庫

pnpm db:migrate 連不上

確認容器已經起來且通過健康檢查:

docker compose -f docker/compose.yaml ps

.envDATABASE_URL 的密碼必須和 POSTGRES_PASSWORD 一致。改過密碼之後舊的 volume 仍然保留著舊密碼,需要重建:

docker compose -f docker/compose.yaml down -v
pnpm docker:up
pnpm db:migrate

PostgreSQL 容器啟動後立刻重啟

日誌裡會看到:

Error: in 18+, these Docker images are configured to store database data in a
       format which is compatible with "pg_ctlcluster" ...
       there appears to be PostgreSQL data in:
         /var/lib/postgresql/data (unused mount/volume)

PostgreSQL 18 起,官方映像把資料放進帶主版本號的子目錄,掛載點必須是 /var/lib/postgresql,不是它底下的 datacompose.yaml 已經是正確的設定;如果你從舊版升級,volume 裡還是舊的目錄結構,需要用 pg_upgrade 或倒出重灌。

轉檔

工作卡在 pending

檢查 Worker 是不是在跑:

docker compose -f docker/compose.yaml logs -f worker

本機開發時 Worker 需要系統上有 FFmpeg。ffmpeg -version 應該要有輸出。

想看轉檔失敗的完整原因

後台顯示的是給使用者看的訊息,完整的 FFmpeg 輸出只留在 Worker 的日誌裡:

docker compose -f docker/compose.yaml logs worker | grep <assetId>

這是刻意的:完整指令與檔案系統路徑對一般使用者沒有幫助,而且會洩漏伺服器的內部結構。

瀏覽器直傳物件儲存失敗

Server 簽出來的網址是給瀏覽器用的。如果 Server 在 Docker 內部而瀏覽器在外面,S3_ENDPOINT(內部位址)與 S3_PUBLIC_ENDPOINT(外部位址)必須分開設定:

S3_ENDPOINT=http://rustfs:9000
S3_PUBLIC_ENDPOINT=https://storage.example.com

測試

pnpm test:e2e 找不到資料

端對端測試會自己執行種子(globalSetup),並由 Playwright 的 webServer 帶起 Server 與 Admin,所以通常只要 pnpm docker:up 之後直接跑就好。

要改測 Docker 直接提供的 Admin:

HUAN_E2E_NO_WEB_SERVER=true HUAN_E2E_BASE_URL=http://localhost:4000 pnpm test:e2e

端對端測試出現 429

/auth/* 有速率限制,這是產品該有的行為。測試已經改成整份只登入兩次並共用 cookie;如果你新增的測試每個都自己登入,就會撞到這個限制。請改用 storageState

Server 與 Worker 的測試互相干擾

兩者共用同一個資料庫,而 Server 的整合測試會清空資料表。pnpm test 已經設成逐一執行 workspace(--workspace-concurrency=1),不要改成平行。

部署

登入之後馬上被登出

正式環境的 session cookie 帶有 Secure,只會在 HTTPS 下送出。如果反向代理還沒有接上 TLS,暫時設定:

SESSION_COOKIE_SECURE=false

正式上線前務必改回來。

後台載得起來但 API 全部失敗

CORS_ORIGINS 必須包含瀏覽器實際使用的來源。由 Server 直接靜態提供 Admin 時兩者同源,不會有這個問題。

裝置連得上 REST 但 WebSocket 一直重連

反向代理沒有轉發 upgrade 請求。見 Docker 部署的 nginx 範例。

少了它系統會退化成每 5 分鐘輪詢一次——功能還在,只是更新變慢。

/health/ready 回 503

readiness 檢查的是 PostgreSQL。看 Server 日誌確認連線錯誤的原因。

RustFS 刻意不列入 readiness——物件儲存暫時不可用時,後台與裝置的目標狀態仍然可以運作,裝置也能繼續播放本機內容。

文件部署失敗:Get Pages site failed: Not Found

repository 還沒在 Settings → Pages 把 Source 設成 GitHub Actions。這是一次性的手動步驟,詳見 GitHub Pages