
JumpServer v4.10.16-ce 华为云 ECS 实战部署全记录从零开始在华为云 ECS (Ubuntu 24.04) 上部署 JumpServer 开源堡垒机包含完整的踩坑记录、真实服务器执行输出、配置详解。目录1. 前言2. 环境准备3. 架构设计4. 部署实战5. 踩坑记录6. Bug 修复ERR_INVALID_REDIRECT7. 验证测试8. 总结1. 前言JumpServer是广受欢迎的开源堡垒机 (Bastion Host / PAM - Privileged Access Management)用来统一管理和审计所有对服务器的访问。为什么需要堡垒机┌─────────────────────────────────────────────────────────────┐ │ 没有堡垒机 │ │ │ │ 工程师 A ──直接 SSH──► 生产服务器 (无审计无控制) │ │ 工程师 B ──直接 SSH──► 生产服务器 (账号共享无法追溯) │ │ 外包人员 ──直接 SSH──► 生产服务器 (权限无法细粒度控制) │ └─────────────────────────────────────────────────────────────┘ ⬇ 引入 JumpServer 后 ┌─────────────────────────────────────────────────────────────┐ │ 有堡垒机 │ │ │ │ 所有工程师 ──► JumpServer ──► 资产服务器 │ │ │ │ │ ├── 统一认证 (Unified Auth) │ │ ├── 权限细粒度控制 (Fine-grained ACL) │ │ ├── 操作录屏审计 (Session Recording) │ │ └── 命令过滤 (Command Filter) │ └─────────────────────────────────────────────────────────────┘JumpServer vs 同类产品对比特性JumpServerTeleportApache Guacamole开源协议GPL v3商业闭源Apache 2.0Web Terminal✅ 支持✅ 支持✅ 支持资产管理✅ 丰富✅ 中等❌ 需自行开发操作录屏✅ 完整✅ 完整⚠️ 需插件中文文档✅ 完善⚠️ 一般❌ 较少部署复杂度中等 (Docker)简单较高社区活跃度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐2. 环境准备2.1 服务器信息本次部署使用华为云 (Huawei Cloud) 中国香港区域 ECS 服务器┌─────────────────────────────────────────────────────────────┐ │ ecs-f763 集群 │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ jms2-01 │ │ jms2-02 │ │ │ │ 27.106.107.121 │ │ 119.12.172.218 │ │ │ │ 资产节点 │ │ 资产节点 │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ jms2-03 (JumpServer 堡垒机) │ │ │ │ 49.0.242.25 │ │ │ │ 2vCPU / 4GiB / Ubuntu 24.04 │ │ │ │ 部署节点 (Deployment Node) │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────┐ │ │ │ jms2-04 │ │ │ │ 190.92.231.238 │ │ │ │ 资产节点 │ │ │ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘主机名公网 IP私网 IP规格角色jms2-01 (ecs-f763-0001)27.106.107.121192.168.0.102c6.large.2资产节点 (Asset Node)jms2-02 (ecs-f763-0002)119.12.172.218192.168.0.239c6.large.2资产节点jms2-03 (ecs-f763-0003)49.0.242.25192.168.0.88c6.large.2JumpServer 堡垒机jms2-04 (ecs-f763-0004)190.92.231.238192.168.0.34c6.large.2资产节点2.2 软件版本组件版本说明JumpServerv4.10.16-ceCommunity EditionDocker29.5.3容器运行时Docker Composev5.1.4容器编排PostgreSQL16.10-bookworm元数据数据库Redis7.4.6-bookworm缓存与会话Ubuntu24.04 LTS操作系统3. 架构设计3.1 JumpServer 整体架构┌──────────────────────────────────────────────────────────────────┐ │ Internet │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ Nginx (web) │ ← jumpserver/web │ │ │ :80 / :443 │ 端口 80/443 │ │ └────────┬─────────┘ │ │ │ proxy_pass │ │ ┌──────────────┼──────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Core │ │ KoKo │ │ Lion │ │ │ │ :8080 │ │ :2222 │ │ :4822 │ │ │ │ (REST API) │ │ (SSH/Telnet│ │ (RDP/VNC) │ │ │ │ │ │ Proxy) │ │ Web VNC │ │ │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ ┌──────┴──────────────────────────────────────┐ │ │ │ Core 内部依赖 │ │ │ │ ┌──────────────┐ ┌──────────────────┐ │ │ │ │ │ PostgreSQL │ │ Redis │ │ │ │ │ │ :5432 │ │ :6379 │ │ │ │ │ │ (Metadata) │ │ (Cache/Session) │ │ │ │ │ └──────────────┘ └──────────────────┘ │ │ │ └──────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘3.2 容器网络拓扑┌─────────────────────────────────────────────────────────────┐ │ Docker Network: jumpserver (192.168.250.0/24) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ core │ │ web │ │ koko │ │ lion │ │ │ │ 250.101 │ │ 250.102 │ │ 250.103 │ │ 250.104 │ │ │ └────┬─────┘ └────┬─────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ ┌────┴─────┐ ┌────┴─────┐ │ │ │ postgres │ │ redis │ │ │ │ 250.105 │ │ 250.106 │ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘说明:DOCKER_SUBNET192.168.250.0/24在.env中配置避免与宿主机网络冲突。4. 部署实战4.1 步骤一安装 Docker 和 Docker Compose踩坑提示: 华为云香港区域访问 Docker 官方源不稳定需使用阿里云镜像加速。# 1. 安装 Docker (使用阿里云镜像)curl-fsSLhttps://get.docker.com|sh-s----mirrorAliyun# 2. 配置 Docker 镜像加速mkdir-p/etc/dockercat/etc/docker/daemon.jsonEOF { registry-mirrors: [https://mirrors.aliyun.com] } EOFsystemctl daemon-reload systemctl restartdockersystemctlenabledocker# 3. 安装 Docker Compose (阿里云镜像)curl-Lhttps://mirrors.aliyun.com/docker-toolbox/linux/compose/releases/download/v2.24.5/docker-compose-$(uname-s)-$(uname-m)\-o/usr/local/bin/docker-composechmodx /usr/local/bin/docker-compose真实服务器输出:rootjms2-03:~# docker --version Docker version 29.5.3, build v29.5.3 rootjms2-03:~# docker compose version Docker Compose version v5.1.4 rootjms2-03:~# docker info | grep -A2 Registry Mirrors Registry Mirrors: https://mirrors.aliyun.com/4.2 步骤二创建 Swap 交换空间JumpServer 最低要求 4GB 内存若服务器只有 4GB必须启用 Swap 防止 OOM (Out of Memory)。# 创建 4GB Swap 文件fallocate-l4G /swapfilechmod600/swapfilemkswap/swapfileswapon/swapfile# 写入 fstab 开机自动挂载echo/swapfile none swap sw 0 0/etc/fstab# 验证free-h真实服务器输出:rootjms2-03:~# free -h total used free shared buff/cache available Mem: 3.8Gi 1.2Gi 285Mi 0.0Ki 2.3Gi 2.4Gi Swap: 4.0Gi 0B 4.0Gi4.3 步骤三拉取 JumpServer 镜像⚠️关键踩坑: JumpServer v4.x 的 Docker 镜像不在 Docker Hubjumpserver/core只有 v2.x 标签v4.x 镜像托管在registry.cn-beijing.aliyuncs.com/jumpservice。# ❌ 错误做法 (Docker Hub 上 v4.x 不存在)dockerpull jumpserver/core:v4.10.16-ce# 会报 manifest unknown 错误# ✅ 正确做法 (从阿里云镜像仓库拉取)REGISTRYregistry.cn-beijing.aliyuncs.com/jumpservicedockerpull${REGISTRY}/core:v4.10.16-cedockerpull${REGISTRY}/koko:v4.10.16-cedockerpull${REGISTRY}/lion:v4.10.16-cedockerpull${REGISTRY}/chen:v4.10.16-cedockerpull${REGISTRY}/web:v4.10.16-ce# 重新打标签为 jumpserver/ 前缀 (与 docker-compose.yml 匹配)dockertag${REGISTRY}/core:v4.10.16-ce jumpserver/core:v4.10.16-cedockertag${REGISTRY}/koko:v4.10.16-ce jumpserver/koko:v4.10.16-cedockertag${REGISTRY}/lion:v4.10.16-ce jumpserver/lion:v4.10.16-cedockertag${REGISTRY}/chen:v4.10.16-ce jumpserver/chen:v4.10.16-cedockertag${REGISTRY}/web:v4.10.16-ce jumpserver/web:v4.10.16-ce# 拉取数据库和缓存镜像dockerpull postgres:16.10-bookwormdockerpull redis:7.4.6-bookworm真实服务器输出(镜像拉取结果):REPOSITORY:TAG SIZE CREATED AT jumpserver/koko:v4.10.16-ce 836MB 2026-03-04 19:49:16 registry.cn-beijing.aliyuncs.com/jumpservice/koko:v4.10.16-ce 836MB jumpserver/lion:v4.10.16-ce 551MB jumpserver/chen:v4.10.16-ce 861MB jumpserver/core:v4.10.16-ce 1.46GB jumpserver/web:v4.10.16-ce 387MB postgres:16.10-bookworm 621MB redis:7.4.6-bookworm 175MB4.4 步骤四创建 JumpServer 配置配置详解: JumpServer 使用.env文件驱动docker compose核心配置来自config.txt模板。# 创建数据持久化目录mkdir-p/data/jumpservermkdir-p/opt/jumpserver/configcd/opt/jumpserver# 生成关键密钥 (重要迁移时必须保持一致)SECRET_KEY$(cat/dev/urandom|tr-dcA-Za-z0-9|head-c50)BOOTSTRAP_TOKEN$(cat/dev/urandom|tr-dcA-Za-z0-9|head-c24)# 创建 .env 配置文件cat/opt/jumpserver/.envEOF # # 镜像配置 (Image Configuration) # # 镜像拉取策略: Always每次都拉取最新, IfNotPresent本地没有才拉取 IMAGE_PULL_POLICYIfNotPresent # # 安装配置 (Installation Configuration) # # 数据持久化目录 (Database persistence directory) VOLUME_DIR/data/jumpserver # 加密密钥 (重要迁移时必须保持一致) # Encryption key (CRITICAL! Keep consistent when migrating) SECRET_KEYzg8CgJWbDWG66cE09ZV8fanllUR577LS9vJhcDbHRQ7rI0P3OY # 组件注册 Token (组件间通信认证) # Component bootstrap token (for inter-component auth) BOOTSTRAP_TOKENvRuuOmXxdP54UplX # 日志级别: INFO, WARN, ERROR LOG_LEVELERROR # Docker 子网 (避免与宿主机网络冲突) # Docker subnet (avoid conflict with host network) DOCKER_SUBNET192.168.250.0/24 # # 数据库配置 (Database Configuration) # DB_ENGINEpostgresql DB_HOSTpostgresql # docker-compose 服务名 (service name) DB_PORT5432 DB_USERpostgres DB_PASSWORDhiRKuPR4HQ6V1QvgRn5V # 必须不含单双引号 DB_NAMEjumpserver # # Redis 配置 (Redis Configuration) # REDIS_HOSTredis # docker-compose 服务名 REDIS_PORT6379 REDIS_PASSWORDJSpb5fwCzSDWc6k3GmQZ # 必须不含单双引号 EOF配置参数详解参数默认值说明SECRET_KEY随机生成加密敏感数据 (密码、API Token)迁移时必须保持一致BOOTSTRAP_TOKEN随机生成KoKo/Lion/Chen 组件注册到 Core 的认证 TokenVOLUME_DIR/data/jumpserver挂载卷目录存储录像、任务日志、数据库备份DOCKER_SUBNET192.168.250.0/24JumpServer 内部容器网络避免与现有网络冲突DB_PASSWORD-不能包含单引号或双引号否则 PostgreSQL 启动失败REDIS_PASSWORD-不能包含单引号或双引号否则 Redis 启动失败LOG_LEVELERROR生产环境建议 ERROR排查问题时临时改为 INFO4.5 步骤五启动 JumpServer# 创建 docker-compose.yml (手动编写因为 jmsctl.sh install 会卡住)# 实际部署时使用 JumpServer 自带的 compose 文件cd/opt/jumpserver# 启动所有服务 (首次启动会自动初始化数据库约 2-3 分钟)dockercompose\--env-file .env\-fcompose/network.yml\-fcompose/redis.yml\-fcompose/postgres.yml\-fcompose/core.yml\-fcompose/koko.yml\-fcompose/lion.yml\-fcompose/chen.yml\-fcompose/web.yml\up-d# 查看启动状态dockercompose-fcompose/core.ymlps真实服务器输出(所有容器状态):NAMES IMAGE STATUS PORTS jms_postgresql postgres:16.10-bookworm Up 10 minutes (healthy) 5432/tcp jms_redis redis:7.4.6-bookworm Up 10 minutes (healthy) 6379/tcp jms_web jumpserver/web:v4.10.16-ce Up 10 minutes (healthy) 0.0.0.0:80-80/tcp, 0.0.0.0:443-443/tcp jms_lion jumpserver/lion:v4.10.16-ce Up 10 minutes (healthy) 4822/tcp, 8081/tcp jms_core jumpserver/core:v4.10.16-ce Up 10 minutes (healthy) 8080/tcp jms_chen jumpserver/chen:v4.10.16-ce Up 10 minutes (healthy) 8082/tcp jms_koko jumpserver/koko:v4.10.16-ce Up 9 minutes (healthy) 0.0.0.0:2222-2222/tcp✅ 所有容器状态均为(healthy)表示启动成功5. 踩坑记录5.1 坑一Docker Hub 上没有 JumpServer v4.x 镜像现象:dockerpull jumpserver/core:v4.10.16-ce# Error: manifest unknown: manifest unknown原因: JumpServer v4.x 开始官方镜像不再推送到 Docker Hub只保留 v2.x 历史版本。解决方案: 从阿里云镜像仓库拉取:dockerpull registry.cn-beijing.aliyuncs.com/jumpservice/core:v4.10.16-cedockertag registry.cn-beijing.aliyuncs.com/jumpservice/core:v4.10.16-ce jumpserver/core:v4.10.16-ce5.2 坑二DOCKER_IMAGE_MIRROR 配置误解现象: 在.env中配置了DOCKER_IMAGE_MIRROR1但 JumpServer 镜像依然拉取失败。原因:DOCKER_IMAGE_MIRROR只影响Docker/Compose 二进制文件下载不影响 JumpServer 镜像拉取。镜像拉取使用的是REGISTRY变量在compose/core.yml等文件中定义。解决方案: 手动拉取镜像后打标签或修compose/*.yml文件中的镜像地址。5.3 坑三jmsctl.sh install 卡住现象: 执行jmsctl.sh install后脚本卡在检测 Docker 版本步骤无输出。原因:jmsctl.sh会检测网络环境并尝试拉取镜像在华为云香港区域网络不稳定时会超时卡死。解决方案: 手动创建.env文件跳过jmsctl.sh直接执行docker compose up -d。5.4 坑四SSH heredoc 远程执行异常现象: 通过 SSH 远程执行cat file EOF ... EOF时变量被展开或格式错乱。原因: SSH 远程执行时Shell 会对 heredoc 内容进行变量展开。解决方案: 使用cat file EOF单引号包裹 EOF禁止变量展开或使用echo逐行写入。6. Bug 修复ERR_INVALID_REDIRECT6.1 问题描述部署完成后浏览器访问http://49.0.242.25/显示This site cannot be reached ERR_INVALID_REDIRECT6.2 根因分析查看jms_web容器内的 Nginx 配置文件/etc/nginx/conf.d/https_server.confserver { listen 80; # server_name demo.example.com; ← 被注释了 location / { return 307 https://$server_name$request_uri; ← 问题所在 } }问题链:server_name 被注释 ↓ $server_name 变量为空 (evaluates to empty string) ↓ return 307 https://$server_name$request_uri; ↓ 实际重定向到: https:/// ← 空主机名 ↓ 浏览器报错: ERR_INVALID_REDIRECT6.3 修复方案将 80 端口的location /从307 重定向改为直接反向代理到后端。修复后的配置:server { listen 80; location /.well-known/ { proxy_pass http://http_server; } location / { # ✅ 直接代理到后端不再重定向 proxy_pass http://http_server; # 以下是标准 WebSocket 代理配置 proxy_buffering off; proxy_request_buffering off; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header X-Forwarded-For $remote_addr; # 超时配置 (单位: 秒) proxy_ignore_client_abort on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 6000; } }6.4 修复步骤 (真实命令)# 1. 在宿主机上写入修复后的配置 (绕过 SSH heredoc 问题)cat/tmp/jms_https_fix.confCONFEOF # 完整配置内容 (见上方) ... CONFEOF# 2. 复制到容器dockercp/tmp/jms_https_fix.conf jms_web:/etc/nginx/conf.d/https_server.conf# 3. 测试配置dockerexecjms_web nginx-t# 4. 重载 Nginx (不中断现有连接)dockerexecjms_web nginx-sreload修复后验证:curl-sIhttp://localhost:80/# HTTP/1.1 200 OK ← 修复成功curl-shttp://localhost:80/api/health/# {status:true,db_status:true,db_time:0.0026,redis_status:true}7. 验证测试7.1 Web 界面访问访问地址: ADDRESS_REMOVED 默认账号: admin / admin⚠️安全提醒: 首次登录后请立即修改默认密码7.2 API 健康检查curlhttp://49.0.242.25/api/health/预期输出:{status:true,db_status:true,db_time:0.002639293670654297,redis_status:true,redis_time:0.0002593994140625,time:1780831762}字段说明status整体健康状态db_statusPostgreSQL 连接状态db_time数据库查询耗时 (秒)redis_statusRedis 连接状态redis_timeRedis PING 耗时 (秒)7.3 端口检测# Web 界面telnet49.0.242.2580# SSH 资产连接 (通过 JumpServer KoKo 组件)ssh-p2222admin49.0.242.258. 总结8.1 部署要点回顾┌─────────────────────────────────────────────────────────────────────┐ │ JumpServer 部署 Checklist │ │ │ │ ✅ Docker Compose 安装 (配置阿里云镜像加速) │ │ ✅ Swap 空间创建 (内存 ≤ 4GB 必须) │ │ ✅ 从 registry.cn-beijing.aliyuncs.com 拉取 v4.x 镜像 │ │ ✅ 手动创建 .env 配置 (跳过 jmsctl.sh) │ │ ✅ 检查 SECRET_KEY/BOOTSTRAP_TOKEN 不含特殊字符 │ │ ✅ 修复 https_server.conf 中 80 端口重定向 Bug │ │ ✅ 验证所有容器 healthy API 健康检查通过 │ │ │ └─────────────────────────────────────────────────────────────────────┘8.2 常见问题速查表问题原因解决方案manifest unknownDocker Hub 无 v4.x 镜像从阿里云镜像仓库拉取jmsctl.sh卡住网络超时手动创建 .env docker compose upERR_INVALID_REDIRECTserver_name为空导致重定向到https:///修改https_server.conf将 80 端口改为 proxy_pass容器unhealthyDB/Redis 密码含特殊字符密码不能包含单引号或双引号登录后空白页Nginx 代理配置错误检查proxy_set_header配置8.3 下一步添加jms2-01/0002/0004为资产 (Asset)创建用户并配置资产授权 (Authorization)测试 SSH 和 RDP 会话录制功能配置 LDAP/AD 统一认证启用 HTTPS (配置可信 SSL 证书)作者: LiaCin | 最后更新: 2026-06-07 | JumpServer v4.10.16-ce