Linux VPS Docker部署S-UI完整总结(含操作步骤、弯路复盘、最终解决方案)
一、整体背景
本次目标:在Linux VPS上通过Docker部署alireza7/s-ui镜像,实现外部浏览器可访问S-UI面板,用于后续相关配置管理。
核心环境:Linux VPS(root权限)、Docker已预装、现有网站占用80端口。
二、完整操作步骤(可直接复现,一步一命令)
步骤1:前期环境准备(创建工作目录)
mkdir -p ~/s-ui && cd ~/s-ui
# 2. 创建数据卷目录(用于持久化S-UI配置/数据库)
mkdir -p s-ui-db && chmod 777 s-ui-db
步骤2:首次部署S-UI容器(初始端口2095)
docker run -d \
–name s-ui \
–restart unless-stopped \
-p 2095:2095 \
-p 2096:2096 \
-v $(pwd)/s-ui-db:/app/db \
alireza7/s-ui
步骤3:配置本地防火墙(先iptables,后安装ufw)
3.1 初始iptables放行端口
iptables -A INPUT -p tcp –dport 2095 -j ACCEPT
iptables -A INPUT -p tcp –dport 2096 -j ACCEPT
# 创建iptables规则保存目录,保存规则
mkdir -p /etc/iptables
iptables-save > /etc/iptables/rules.v4
3.2 后续安装ufw防火墙(兜底防护,更易用)
apt update && apt install -y ufw
# 2. 启用ufw,默认规则(拒绝入站,允许出站)
ufw enable
ufw default deny incoming
ufw default allow outgoing
# 3. 放行核心端口(SSH 22必放,避免断连;后续端口同步放行)
ufw allow 22/tcp
ufw allow 2095/tcp
ufw allow 2096/tcp
ufw allow 8888/tcp
ufw allow 8090/tcp
ufw allow 80/tcp(现有网站,无需删除)
# 4. 重载ufw,查看规则状态
ufw reload
ufw status numbered
步骤4:更换映射端口(规避隐性屏蔽,尝试8888→8090)
docker rm -f s-ui
# 2. 重建容器,映射VPS 8888端口→容器2095端口
docker run -d \
–name s-ui \
–restart unless-stopped \
-p 8888:2095 \
-p 2096:2096 \
-v $(pwd)/s-ui-db:/app/db \
alireza7/s-ui
# 3. (后续更换8090端口,重复上述步骤,仅修改映射端口)
docker rm -f s-ui
docker run -d \
–name s-ui \
–restart unless-stopped \
-p 8090:2095 \
-p 2096:2096 \
-v $(pwd)/s-ui-db:/app/db \
alireza7/s-ui
步骤5:配置服务商安全组(关键外部通路)
- 登录VPS服务商控制台,找到对应VPS的「安全组/防火墙」配置;
- 新增「入站规则」,依次放行端口:2095、8888、8090、2096(协议均为TCP,授权对象
0.0.0.0/0,规则启用); - 保存规则,等待1-3分钟生效(无需重启VPS/容器)。
步骤6:验证容器端口映射(确认映射正常)
docker port s-ui
# 2. 查看所有运行中容器端口映射(全局验证)
docker ps –format “table {{.Names}}\t{{.Ports}}”
# 3. 查看本地端口监听状态(确认docker-proxy进程正常)
ss -tulpn | grep -E “8090|8888|2095”
步骤7:排查访问路径(最终找到有效路径)
curl -v http://127.0.0.1:8090
# 2. 进入容器内部,查找可能的访问路径(虽未找到静态文件,但验证服务类型)
docker exec -it s-ui /bin/sh
find / -name “*login*” -o -name “*index*” -o -name “*html*”
exit(退出容器)
步骤8:最终成功访问(外部浏览器验证)
- 浏览器开启「无痕模式」(Chrome/Edge:
Ctrl+Shift+N); - 输入完整访问地址:
http://213.210.5.42:8090/app/; - 按
Ctrl+F5强制刷新2-3次,优先使用手机流量访问(避开路由器拦截); - 成功进入S-UI面板,完成部署目标。
步骤9:(可选)环境清理(若需重新部署)
docker rm -f s-ui
# 2. 彻底删除S-UI工作目录(含配置/数据卷)
rm -rf ~/s-ui
# 3. (可选)删除ufw对应端口规则(先查编号,再删除)
ufw status numbered
ufw delete 对应规则编号
三、核心弯路复盘(踩坑点+原因分析+解决方案)
弯路1:初期仅配置本地iptables,忽略服务商安全组(外部请求无法到达VPS)
表现:容器运行正常、本地端口监听正常,外部浏览器访问超时/无法连接,在线端口扫描显示端口关闭;
原因:服务商安全组是「外部网络第一道防火墙」,优先级高于VPS本地防火墙,未放行对应端口时,外部请求根本无法到达VPS;
解决方案:本地防火墙(iptables/ufw)放行端口后,必须同步在服务商控制台配置安全组入站规则,放行相同端口(TCP协议)。
弯路2:执着于根路径/访问,未意识到S-UI有指定面板路径(返回404误以为服务故障)
表现:本地curl http://127.0.0.1:8090返回404 Not Found,尝试/login//admin路径仍无效,误以为容器服务异常;
原因:S-UI面板并非部署在根路径/,而是有专属访问路径/app/,且S-UI为前后端分离服务,根路径无有效静态页面;
解决方案:通过论坛求助/官方文档,获取有效访问路径/app/,补充到IP+端口后完成访问。
弯路3:初期使用2095端口,遭遇隐性网络屏蔽(更换端口后链路通畅)
表现:2095端口配置全正常(本地监听、防火墙、安全组),但外部始终无法访问,curl返回无响应;
原因:部分运营商/路由器会隐性屏蔽2095这类非常规端口,导致请求被拦截;
解决方案:更换更通用的端口(8888、8090),重建容器映射,同步更新防火墙/安全组规则,规避端口屏蔽。
弯路4:误解「本地curl无输出/404」的含义,过度排查容器服务(忽略链路通畅核心)
表现:本地curl根路径无输出/返回404,误以为容器内S-UI服务未启动,反复重启/重建容器,浪费大量时间;
原因:① S-UI是后端API服务+专属前端路径,根路径无有效响应;② 404 Not Found是标准HTTP响应,说明本地链路(VPS→Docker→容器服务)已完全通畅,仅路径不正确;
解决方案:curl -v返回完整HTTP响应(即使404),即可确认本地链路正常,无需再排查容器服务,聚焦「访问路径」和「外部网络限制」即可。
弯路5:未开启浏览器无痕模式/使用WiFi访问,遭遇本地缓存/路由器拦截(误以为配置无效)
表现:配置全部正确,访问http://213.210.5.42:8090/app/仍无法打开,显示「无法访问」;
原因:① 浏览器缓存旧请求结果,未发起新请求;② 家庭/公司路由器会拦截8090这类非默认端口(80/443),导致请求无法传出;
解决方案:① 开启浏览器无痕模式,避免缓存/插件干扰;② 优先使用手机流量访问,避开路由器拦截,快速验证配置有效性。
四、最终结论与经验总结
核心总结与复用经验
- 部署核心三要素:容器服务正常(运行+端口映射)、本地防火墙放行、服务商安全组放行,三者缺一不可,外部通路才能打通;
- 访问关键两要点:正确的「IP+端口+访问路径」、规避本地网络限制(无痕模式+手机流量),解决路径问题和本地拦截问题,即可成功访问;
- 排障优先级:先验证本地链路(
docker port+curl -v)→ 再排查外部通路(安全组+端口屏蔽)→ 最后聚焦访问细节(路径+本地网络),避免本末倒置,浪费排障时间; - 经验复用:后续部署同类Docker服务时,可直接复用本次步骤(目录创建→容器部署→双防火墙配置→路径验证),有效规避同类踩坑。
本次部署从踩坑到成功,核心在于逐步排查「通路」和「细节」,明确每一步的验证标准,最终通过更换端口、找到有效路径、规避本地限制,实现了S-UI面板的外部成功访问。