jumpserver部署失败主因是环境隔离、服务绑定和网络暴露配置错误:redis/mysql需绑定内网ip而非127.0.0.1,docker子网须避让宿主机网段,nginx反代必须正确指向容器内jms_core服务,且外网访问需同时开放云平台安全组与宿主机防火墙端口。

JUMPserver 在 Linux 上部署不是“一键就完事”,关键在环境隔离、服务绑定和网络暴露三个环节。用宝塔面板或纯命令行都能跑起来,但多数失败都卡在 Redis 和 MySQL 的 bind 配置、Docker 网络冲突、或公网访问时的端口映射错位上。
为什么 jumpserver-installer 启动后 Web 访问 502 或直接拒绝连接
本质是 Nginx 没能反向代理到容器内的 jms_core 服务,常见于以下情况:
-
config-example.txt中USE_EXTERNAL_MYSQL=1和USE_EXTERNAL_REDIS=1开启了,但DB_HOST或REDIS_HOST填的是127.0.0.1—— 容器内无法访问宿主机的 127.0.0.1,必须填服务器**内网 IP**(如192.168.10.100) - 宝塔面板里
Redis的 bind 默认是127.0.0.1,需手动改成内网 IP,并重启 Redis - MySQL 创建数据库时,访问权限选了“所有人”或“localhost”,应选“指定 IP”,并填同一内网 IP
-
DOCKER_SUBNET=192.168.250.0/24与宿主机所在网段重叠(比如你内网是192.168.250.x),会导致容器无法拉起,改个不冲突的子网即可,例如172.20.0.0/16
quick_start.sh 一键安装失败:curl 报错或 tar 解压中断
这是网络或权限问题,不是脚本本身有 bug:
- 执行前先确认系统已装
wget、curl、tar、iptables,缺一个就会 halt;可用which curl wget tar iptables快速验证 - 国内服务器直连 GitHub 很可能超时,官方推荐镜像源:
curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash更稳 - 不要用
sudo bash手动执行脚本,该脚本内部已做权限判断;若提示 “permission denied”,先chmod +x quick_start.sh再运行 - 解压失败常因磁盘空间不足(
/var/lib/docker默认路径),可提前用df -h查看,必要时通过DOCKER_DIR=/data/docker指定 Docker 根目录
如何让外网能访问到 JUMPserver Web 界面
不能只开防火墙 80 端口——因为 JUMPserver 容器默认监听的是内部 Docker 网络,宿主机的 80 端口没被真正映射出去:
- 确认
docker ps输出中jms_nginx容器的 PORTS 列是否含0.0.0.0:80->80/tcp;如果没有,说明docker-compose.yml里 nginx 的ports段没生效,检查配置文件中是否误删了该字段 - 云服务器(如腾讯云轻量)必须在控制台安全组里放行 TCP 80 端口,仅改服务器防火墙(
ufw或firewalld)不够 - 如果用宝塔面板,Nginx 本身也在监听 80 端口,会与
jms_nginx冲突;要么停掉宝塔 Nginx(bt stop 8),要么把jms_nginx改成监听 8080,再用宝塔反代过去 - 不想暴露 80 端口?可配 cpolar:启动后创建 http 类型隧道,本地地址填
127.0.0.1:80,它会分配一个带 HTTPS 的随机域名,适合临时调试
SECRET_KEY 和 BOOTSTRAP_TOKEN 为空还能启动吗
能启动,但极不推荐留空:
- 这两个值为空时,每次重启容器都会生成新密钥,导致所有已授权的 MFA 设备、已注册的 LDAP 绑定、甚至部分审计录像元数据失效
- 首次安装成功后,立刻从日志里提取真实值:
docker logs jms_core 2>&1 | grep SECRET_KEY,然后写回配置并重装(./jinstall.sh -d) -
BOOTSTRAP_TOKEN是初始化 API 认证用的,Web 界面添加用户、同步资产等操作依赖它;一旦丢失,只能进容器手动重置或重建整个实例 - 备份好
config.txt,比什么都重要——迁移或重装时它是唯一可信依据
MySQL 认的是 IP 不是 localhost,Redis 绑的是内网不是 127,Docker 网络认的是子网不是习惯,Nginx 反代认的是容器名不是域名——每个环节的“默认假设”都可能和实际拓扑对不上。











