From ae3221c4600fd7b444e88865f008d2e7c680a4b3 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Fri, 21 Aug 2026 15:01:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20app=20=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=B0=8D=E5=A4=96=E5=9F=A0=EF=BC=8C=E5=B0=8D=E5=A4=96?= =?UTF-8?q?=E5=8F=AA=E4=BF=9D=E7=95=99=20nginx=20=E7=9A=84=20HTTPS=20?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 摘要: 360-player 服務改為只 expose 不 ports,明文 HTTP 不再離開容器內網, 對外入口只剩 360-player-web 的 8443。 根本原因: 先前為了讓區網能用 IP 免憑證警告直連,保留了 app 的 ${PORT}:8360 對外映射。 但該埠在路由器上也有對外轉發,實際使用時是以網域連線 (http://jianmiau.tk:8360),等於在外網留了一條明文路徑。 影響: 外網走 8360 時,影片內容與 API 全程未加密,加上 TLS 的意義被抵消。 修法: - docker-compose.yml 拿掉 360-player 的 ports,只留 expose: 8360; nginx 仍可經容器內網以服務名連到它 - 保留註解說明如何加回來,並註明要綁死區網介面而非 0.0.0.0 - .env / .env.example 移除不再被 compose 參照的 PORT - README 的 SSL 段落改寫,說明代價是區網也要用網域連 驗證: docker compose config 展開後只有一個 published port(8443 → 8443), 360-player 服務底下僅剩 expose。 備註:路由器上 8360 的 port forwarding 需另外手動關閉,僅改 compose 不足以關掉外網入口。 Co-Authored-By: Claude Opus 5 (1M context) --- .env.example | 6 ++---- README.md | 8 +++++--- docker-compose.yml | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index 820ff80..52f8fa3 100644 --- a/.env.example +++ b/.env.example @@ -6,10 +6,8 @@ VIDEO_DIR=/volume1/photo/Badminton # 轉檔輸出與快取的存放位置(容器的 /cache;每部影片三種畫質約需原檔 70% 的空間) CACHE_DIR=/volume1/docker/360_player/cache -# HTTP 埠(區網用 IP 直連;憑證是網域名,用 IP 連 HTTPS 一定會跳警告) -PORT=8360 - -# HTTPS 埠(由 nginx 容器終結 TLS 後轉給 app) +# HTTPS 埠(由 nginx 容器終結 TLS 後轉給 app)。 +# app 容器不對外開埠,對外只有這一個入口。 HTTPS_PORT=8443 # 時區 diff --git a/README.md b/README.md index dd06a46..d6d2c67 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ npm start # 或 node server.js cp .env.example .env && vi .env # 3. 建置並啟動 docker compose up -d --build -# 4. 瀏覽器開 https://你的網域:8443(或區網 http://NAS-IP:8360) +# 4. 瀏覽器開 https://你的網域:8443 ``` Synology Container Manager:「專案」→「新增」→ 選這個資料夾,它會讀取 `docker-compose.yml`, @@ -88,8 +88,10 @@ privkey.pem 私鑰 兩點注意: -- 憑證是綁網域的,**用區網 IP 連 HTTPS 一定會跳警告**。所以 compose 同時保留了 - HTTP 的 `${PORT}:8360`:區網走 http、外網走 https。想只留 HTTPS 就把那段 `ports` 刪掉。 +- **對外只有 8443 一個入口**:app 容器只 `expose` 不 `ports`,明文那條不會離開容器內網。 + 代價是憑證綁網域,區網也得用網域連(`https://jianmiau.tk:8443`)而不是 IP —— 用 IP 連 + 會跳憑證警告。真的想要區網免警告的快速通道,把 app 的 `ports` 加回來並綁死區網介面 + (`"192.168.0.15:8360:8360"`),不要開成 `0.0.0.0`,否則等於在外網開了一條明文路徑。 - nginx 這邊關掉了 `proxy_buffering` 並把 `proxy_max_temp_file_size` 設為 0。 影片是靠 HTTP Range 串流的,開著緩衝會讓 nginx 先把整段回應寫成暫存檔再吐出去, 幾 GB 的來源會直接塞爆容器磁碟。`/api/events`(SSE)另外把 `proxy_read_timeout` diff --git a/docker-compose.yml b/docker-compose.yml index 4981541..7540d3b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,10 +6,10 @@ services: dockerfile: Dockerfile image: 360-player:latest restart: unless-stopped - ports: - # 區網用 IP 直連的 HTTP(憑證是網域名,IP 連一定會跳警告,所以留一條明文)。 - # 想只走 HTTPS 的話把這兩行刪掉,改用下面的 expose 就好。 - - "${PORT:-8360}:8360" + # 不對外開埠:只透過容器內網讓 nginx 連得到,外面一律走 HTTPS。 + # 若要在區網用 IP 直連明文(會省掉憑證警告),自行加回: + # ports: + # - "127.0.0.1:${PORT:-8360}:8360" # 或綁區網 IP expose: - "8360" volumes: