摘要: 拿掉 360-player-web(nginx)服務與 docker/nginx/,改在 server.js 用 node:https 直接提供 HTTPS,部署從兩個容器變成一個。 根本原因: 先前為了 TLS 而多開一個 nginx 容器。分開的主因是「憑證續期時能 reload 而不重啟 app」——重啟會殺掉正在跑的 ffmpeg 轉檔,一部 4K 360 影片動輒數小時。 但 Node 的 https.Server 本來就有 setSecureContext(),可以熱換憑證不重啟行程, 這個理由不成立,多一個容器只是多一層維護成本。 影響: - 需維護額外的 nginx 映像檔與 entrypoint.sh - 影片經反向代理多一跳,且必須小心處理 proxy_buffering 與 SSE 逾時, 設錯會讓 Range 串流被寫進暫存檔、或讓轉檔進度停止更新 修法: - server.js 新增 TLS:讀取 SSL_CERT_DIR 的憑證,以 fs.watch 監看該資料夾, 檔案變動時 debounce 1 秒後呼叫 setSecureContext() 熱套用 - 中介憑證串進 cert 而非 ca:Node 只送出 cert 的內容,ca 是驗證對方用的 信任庫、不會送給瀏覽器,放錯會導致憑證鏈不完整 - 串接前正規化 PEM(去 CRLF、補結尾換行),沿用原 nginx entrypoint 的處理 - config.json 新增 httpsPort(預設 0 = 停用)與 certDir,本機開發不需憑證; 憑證讀不到時退回只提供 HTTP 並印警告,不讓服務起不來 - docker-compose.yml 併回單一服務,憑證改掛 /certs;Dockerfile 補上 HTTPS_PORT、SSL_CERT_DIR,EXPOSE 改為 8443 - 刪除 docker/nginx/ 驗證(實機執行,非僅靜態檢查): - 以 SSL_CERT_DIR=/volume1/docker/certs 啟動,log 顯示 「HTTPS:jianmiau.tk — 14 天後到期」,https 的 /api/config 回 200 - openssl s_client 確認送出完整三層憑證鏈 (jianmiau.tk → Let's Encrypt YR2 → ISRG Root YR) - HTTPS 上的 Range 請求正常:檔頭與中段各取一段皆回 206 且長度正確 - 熱換測試:換上 CN=hotswap-test.local 的自簽憑證後,log 出現 「憑證已重新載入」,s_client 讀到新 CN,且行程 PID 與啟動時間不變 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
32 lines
1.4 KiB
YAML
32 lines
1.4 KiB
YAML
services:
|
||
360-player:
|
||
container_name: 360-player
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
image: 360-player:latest
|
||
restart: unless-stopped
|
||
ports:
|
||
# 對外只有 HTTPS;容器內的 8360(HTTP)不對外開,只給 HEALTHCHECK 用。
|
||
- "${HTTPS_PORT:-8443}:8443"
|
||
volumes:
|
||
# 影片資料夾(NAS 上的實際路徑)→ 容器內 /videos,唯讀
|
||
- "${VIDEO_DIR:-/volume1/photo/Badminton}:/videos:ro"
|
||
# 轉檔輸出 + probe 快取 → 容器內 /cache(需要可寫)
|
||
- "${CACHE_DIR:-./cache}:/cache"
|
||
# SSL 憑證(與 badminton-scoreboard 共用同一份)→ 容器內 /certs,唯讀。
|
||
# 左邊是 NAS 上的路徑,右邊是容器內固定的 /certs。
|
||
- "${SSL_CERT_DIR:-/volume1/docker/certs}:/certs:ro"
|
||
environment:
|
||
TZ: ${TZ:-Asia/Taipei}
|
||
# CPU 轉檔時 libx264 的 preset;NAS CPU 弱可改 superfast / ultrafast(檔案會稍大)
|
||
X264_PRESET: ${X264_PRESET:-veryfast}
|
||
# 憑證檔名(DSM 匯出的是 RSA-cert.pem 之類的,可個別覆寫)
|
||
SSL_CERT_FILE_NAME: ${SSL_CERT_FILE_NAME:-cert.pem}
|
||
SSL_CHAIN_FILE_NAME: ${SSL_CHAIN_FILE_NAME:-chain.pem}
|
||
SSL_KEY_FILE_NAME: ${SSL_KEY_FILE_NAME:-privkey.pem}
|
||
# 本機為 Intel J4025(UHD 600),已啟用 VAAPI 硬體轉檔;
|
||
# 換到沒有 /dev/dri 的機器時要把下面兩行註解掉,否則容器起不來。
|
||
devices:
|
||
- /dev/dri:/dev/dri
|