一台服务器部署多个服务:Dockge + Nginx Proxy Manager + 3X-UI 端口复用与 HTTPS 教程
一台服务器部署多个服务
用 Dockge 管理 Compose 栈,让 Nginx Proxy Manager 统一接管 80/443,再把 MyIP、IT-Tools 与 3X-UI 通过不同域名暴露出去。核心目标只有一个:一台 VPS,不抢端口,也能同时跑多个服务。
前半部分按你提供的 HTML 原文重构,包括准备工作、Dockge、NPM、MyIP、IT-Tools 与 3X-UI 安装命令;原文标题虽然提到“3X-UI 反向代理和 SSL 证书调用”,但正文只写到了 3X-UI 安装,所以后半部分的反向代理/TLS 流程根据当前项目官方文档补齐,并单独标注为“官方文档补充”。
先理解端口复用的思路
多服务部署最容易踩的坑,就是每个 Web 项目都想占用 80 或 443。正确做法是只让一个入口服务占住公网 HTTP/HTTPS 端口,其余项目全部使用自己的内部端口,然后根据域名转发。
app.example.comip.example.comtools.example.companel.example.com80 / 443:公网入口81:NPM 管理后台18966:MyIP8088:IT-Tools2053:3X-UI 示例端口准备工作
原教程要求准备一台 VPS、远程 SSH 工具和 Cloudflare 域名解析,并强调“每一个项目解析一个域名”。原文写的是 Debian 10+ / Ubuntu 22.04+;如果现在重新搭建,建议直接使用 Debian 11/12 或 Ubuntu 22.04/24.04。
服务器
建议至少 2 vCPU / 2 GB RAM,系统使用较新的 Debian / Ubuntu。
域名
准备多个子域名,例如 npm、ip、tools、panel,全部解析到同一台 VPS。
Docker
本文后续的 Dockge、NPM、MyIP、IT-Tools 都基于 Docker。还没安装可以先看站内 Docker 安装教程。
SSH
FinalShell、Termius、Windows Terminal + OpenSSH 都可以,不影响后续步骤。
部署 Dockge 面板
原教程使用的是一个第三方 Dockge 一键脚本:
sudo apt install git -y && \
git clone https://github.com/slobys/dockge.git && \
cd dockge && \
chmod +x dockge.sh && \
./dockge.sh如果你更希望跟随 Dockge 当前官方仓库,官方标准安装方式如下,默认栈目录是 /opt/stacks,Web 端口为 5001:
mkdir -p /opt/stacks /opt/dockge
cd /opt/dockge
curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml \
--output compose.yaml
docker compose up -dhttp://服务器IP:5001 打开 Dockge。后续新建 NPM、MyIP、IT-Tools 都可以直接在 Dockge 里创建 Stack。在 Dockge 中部署 Nginx Proxy Manager
这是整套架构最关键的入口服务。原教程给出的 Compose 与 NPM 当前官方 Quick Setup 基本一致:
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt| 端口 | 用途 |
|---|---|
80 | HTTP 公网入口 |
81 | NPM 管理后台 |
443 | HTTPS 公网入口 |
在 Dockge 中如果把这个 Stack 命名为 npm,并且栈目录沿用默认 /opt/stacks,那么宿主机证书数据通常位于 /opt/stacks/npm/letsencrypt。原教程特别记录了证书目录:
/opt/stacks/npm/letsencrypt/archivearchive 是证书历史文件所在位置,实际证书文件名会随续期变化。对于 3X-UI,优先建议让 NPM 负责 HTTPS,3X-UI 本身走内部 HTTP,这样最省心。部署 MyIP IP 查询工具
原教程把 MyIP 映射到宿主机 18966:
services:
myip:
image: jason5ng32/myip:latest
container_name: myip
restart: always
ports:
- "18966:18966"
environment:
ALLOWED_DOMAINS: "ip.example.com"
# GOOGLE_MAP_API_KEY: "你的GoogleMapKey"ALLOWED_DOMAINS,否则非 localhost 请求可能返回 403;完整地理位置/ASN 功能还需要配置 MaxMind GeoLite2 凭据。部署 IT-Tools 工具箱
原教程将 IT-Tools 的容器 80 映射到宿主机 8088:
services:
it-tools:
image: corentinth/it-tools:latest
container_name: it-tools
restart: unless-stopped
ports:
- "8088:80"这和 IT-Tools 官方自托管方式一致,只是官方示例通常使用宿主机 8080;端口左侧可以按你的服务器实际情况自由调整。
在 NPM 中为多个服务添加反向代理
进入 NPM 后依次创建 Proxy Host。原教程特别提醒:Forward Port 必须填写对应项目的映射端口。
| 域名示例 | 目标服务 | Forward Port |
|---|---|---|
ip.example.com | MyIP | 18966 |
tools.example.com | IT-Tools | 8088 |
panel.example.com | 3X-UI | 以面板实际端口为准 |
NPM 的基本配置流程:
- Domain Names 填对应子域名。
- Scheme 如果后端本身没有 TLS,一般选
http。 - Forward Hostname / IP 填后端可以被 NPM 容器访问到的地址。
- Forward Port 填项目实际端口。
- SSL 页面申请 Let's Encrypt 证书,并开启 Force SSL。
127.0.0.1。可以给 NPM 增加 Linux 的 host-gateway 映射,然后使用 host.docker.internal。services:
app:
image: 'jc21/nginx-proxy-manager:latest'
extra_hosts:
- "host.docker.internal:host-gateway"部署 3X-UI 面板
原 HTML 正文在这一段只提供了官方安装脚本,没有继续写面板反向代理与证书设置:
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)安装完成后先运行:
x-ui通过菜单查看当前面板端口、Web Base Path 等设置。当前 3X-UI 官方文档中的默认 webPort 是 2053,但实际安装后应以你的当前设置为准。
官方文档补充:用 NPM 反向代理 3X-UI
3X-UI 当前官方文档明确支持把面板放到 Nginx / Caddy 等反向代理后面,并让代理层负责 HTTPS。面板使用 WebSocket 做实时更新,所以代理需要正确处理 WebSocket Upgrade。
在 NPM 新建 Proxy Host,例如:
| 配置项 | 示例 |
|---|---|
| Domain Names | panel.example.com |
| Scheme | http |
| Forward Hostname / IP | host.docker.internal |
| Forward Port | 2053(示例,以实际为准) |
| Websockets Support | 开启 |
SSL 页面选择 Request a new SSL Certificate,申请成功后开启 Force SSL。这样公网访问链路就是:
浏览器 HTTPS :443
|
v
Nginx Proxy Manager
|
| HTTP(服务器内部)
v
3X-UI :2053官方文档补充:让 3X-UI 自己使用 SSL 证书
如果你不想让 NPM 终结 TLS,也可以让 3X-UI 直接读取证书。当前官方文档提供的方式是进入 x-ui 菜单,选择 SSL 相关功能申请证书。域名证书会保存到:
/root/cert/<你的域名>/fullchain.pem
/root/cert/<你的域名>/privkey.pem然后在 Panel Settings 里把:
| 3X-UI 设置 | 对应文件 |
|---|---|
webCertFile | fullchain.pem |
webKeyFile | privkey.pem |
两个路径都设置后,3X-UI 面板自身就会提供 HTTPS。
/opt/stacks/npm/letsencrypt/archive。如果你确实打算复用 NPM 证书,需要自己确认具体 fullchain 和 privkey 文件以及权限;相比之下,直接让 NPM 负责 TLS 或使用 3X-UI 自己的证书管理更稳定。上线前的端口与安全检查
| 端口 | 建议 |
|---|---|
| 80 / 443 | 作为 NPM 公网入口,需要开放 |
| 81 | NPM 后台,不建议对全网开放 |
| 5001 | Dockge 后台,不建议对全网开放 |
| 18966 / 8088 | 已经有 NPM 域名后,不应作为主要公网入口 |
| 3X-UI 面板端口 | 建议仅由 NPM/受信任网络访问 |
- 每个服务使用独立域名,DNS 都指向同一台服务器。
- NPM 是唯一主要的公网 Web 入口。
- NPM、Dockge、3X-UI 管理后台使用强密码和非默认访问路径。
- 3X-UI 的 WebSocket 代理工作正常。
- HTTPS 证书已经生效,并确认自动续期方案。
- Compose 数据目录已经做持久化和备份。
资料来源与版本说明
本文前半部分根据你提供的“一机多用”HTML 教程重构;3X-UI 反向代理、TLS、Dockge 当前官方安装方式、MyIP 当前域名配置要求等内容根据项目现行官方文档补充。这样既保留原教程的实际部署路线,也避免把已经变化的项目细节继续当成固定配置。
Dockge:github.com/louislam/dockge
Nginx Proxy Manager:github.com/NginxProxyManager/nginx-proxy-manager
MyIP:github.com/jason5ng32/MyIP
IT-Tools:github.com/CorentinTh/it-tools