Nginx Proxy Manager (NPM) 架設、內部轉址與維護
1. 資料庫選型:SQLite vs. MariaDB
NPM 在底層儲存 Proxy Hosts、Redirection 與使用者帳號資訊。
-
SQLite(強烈建議): 新版 NPM 預設內建 SQLite。若無多台負載平衡或叢集需求,直接使用 SQLite 可以完全擺脫外部關聯式資料庫的依賴,節省記憶體並大幅降低維護複雜度。
-
MariaDB / MySQL: 若環境已有集中式 DB(例如 LibreNMS、WordPress 共用池)或對高可用有強烈需求,可透過環境變數切換。
2. Docker Compose 建置(SQLite 輕量化)
建議建立一個獨立且全域的 Docker 網路(如 npm-network),方便其他後端容器直接加入該網路並透過容器名稱(Container Name)進行通訊,完全不需要對 Host 做實體 Port Mapping。
步驟 1:建立前置目錄與專用網路
# 建立共用網路(若尚未建立)
docker network create npm-network
# 建立持久化目錄
mkdir -p /opt/npm/data
mkdir -p /opt/npm/letsencrypt
步驟 2:docker-compose.yml 配置
在 /opt/npm/docker-compose.yml 中定義:
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80" # HTTP 轉發與 ACME 挑戰
- "81:81" # Web 管理儀表板
- "443:443" # HTTPS 轉發
volumes:
- /opt/npm/data:/data
- /opt/npm/letsencrypt:/etc/letsencrypt
networks:
- npm-network
networks:
npm-network:
external: true
啟動服務:
docker compose up -d
3. 初始設定與登入
-
瀏覽器訪問:
http://<Host_IP>:81 -
預設帳號密碼:
-
Email:
admin@example.com -
Password:
changeme
-
-
首次登入後,系統會強制要求修改管理員名稱、Email 與密碼,請妥善保存新密碼。
4. 核心架構精華:內網純容器名轉址 (Zero-Port Mapping)
除了對外暴露服務外,NPM 在內網環境(配合內部 DNS 如 AdGuard Home、Pi-hole 或 Unbound)最優雅的用法就是直接以「Container Name」作為轉發目標。
核心運作邏輯
-
同一個 Docker Network:Docker 內部內建 Embedded DNS Server (
127.0.0.11),只要兩個容器掛載在同一個自定義 bridge 網路(如npm-network),就能直接用容器名稱解析出對方的內部 IP。 -
後端容器不需要映射 Port:後端容器(例如 Emby、Jellyfin、Vaultwarden)完全不需要在
ports:暴露給 Host,僅需在容器內監聽內部 Port。這不僅避免主機 Port 衝突,還大幅縮小內網攻擊面。