JumpServer:开源堡垒机
JumpServer 是开源 PAM / 堡垒机系统,用于集中管理 SSH、RDP、数据库与 Web 资产访问。
Pigsty 的 app/jumpserver 模板使用 Docker Compose 运行 JumpServer 社区版应用层,并使用 Pigsty 托管的 PostgreSQL 作为持久后端数据库。
当前模板基于 JumpServer v5.0.0-ce,保留社区版 core、celery、koko、kael、chen、web 与本地 Redis,移除上游安装器中的内置 PostgreSQL 服务。
PostgreSQL、备份、监控、Nginx 入口和数据库生命周期由 Pigsty 管理。
镜像组合按 官方 v5.0.0 安装器 校准,核验日期为 2026-10-08。当天 Docker Hub 的 Core、KoKo、Chen、Web v5.0.0-ce 标签返回 MANIFEST_UNKNOWN,官方阿里云命名空间提供完整组合,故模板使用 IMAGE_PULL_PREFIX。不要混搭组件版本或仅替换 Core 标签。
快速开始
在运行 兼容操作系统 的全新 Linux x86_64 服务器上执行。当前镜像组合与实测平台为 linux/amd64,未验证 ARM64:
一次性 init 服务先执行数据库迁移,再用独立 Django 进程创建缺失的终端主机密钥并验证它;已有密钥不会被替换。只有初始化成功,Core 才会启动,Celery 与连接组件随后等待 Core 健康。检查启动结果:
默认入口:
默认 Web 登录:
首次登录后应立即修改管理员密码。
部署前检查
- 准备一台新 Linux 服务器,至少
4C8G、100 GB 磁盘;生产环境按并发与录像保留量增加资源。 - 确认服务器 IP、DNS、NTP、SSH 与 sudo 可用。
- 确认 Docker daemon 能拉取
IMAGE_PULL_PREFIX指定的镜像仓库;默认使用官方阿里云镜像。代理应在实际执行拉取的 daemon 上配置,容器内127.0.0.1指向容器自身。 - 执行
./configure -c app/jumpserver后,修改pigsty.yml中的默认密码、SECRET_KEY、BOOTSTRAP_TOKEN、CHAT_AI_DELEGATION_SECRET与DOMAINS。 - 确认
DOMAINS包含浏览器实际访问的主机名或 IP,例如10.10.10.10:8080。 - 确认 PostgreSQL 备份任务正常,部署后检查
pig pb info或pgbackrest info。
配置模板
conf/app/jumpserver.yml 定义了单节点 JumpServer 自建模板。默认拓扑包括:
jumpserver:JumpServer 应用容器与本地 Redis 所在节点。pg-jumpserver:Pigsty 托管的 PostgreSQL 数据库集群。infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。etcd:Patroni 所需的分布式配置存储。
app.yml 会将 app/jumpserver 复制到 /opt/jumpserver,使用 apps.jumpserver.conf 更新 /opt/jumpserver/.env 中的配置项,然后执行 docker compose up -d。
核心应用服务:
jms_core:Django API / Web 后端,监听容器内8080。jms_celery:异步任务、定时任务与后台队列。jms_web:Nginx Web 入口,默认映射宿主机8080。jms_koko:SSH / SFTP 终端入口,默认映射宿主机2222。jms_kael:5.x 社区版 AI 网关,内部端口8083,通过 Web 的/kael/访问。jms_chen:Web 数据库连接组件,内部端口8082。jms_init:一次性迁移与终端密钥验证;正常完成后状态为Exited (0)。jms_redis:本地 Redis,用于缓存、队列与 Channels 后端。
关键参数
常见参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
IMAGE_PULL_PREFIX | registry.cn-beijing.aliyuncs.com/jumpservice | 完整官方镜像命名空间 |
JUMPSERVER_VERSION | v5.0.0-ce | 所有 JumpServer 组件使用同一社区版版本 |
REDIS_VERSION | 7.4.11-bookworm | 本地 Redis 镜像版本 |
JUMPSERVER_DATA | /data/jumpserver | 应用持久化目录 |
DOMAINS | 10.10.10.10:8080,10.10.10.10,jump.pigsty | 允许登录的可信访问域名 / IP |
SECRET_KEY | 示例值 | 加密密钥,生产必须替换且长期保存 |
BOOTSTRAP_TOKEN | 示例值 | 组件注册令牌,生产必须替换且长期保存 |
CHAT_AI_DELEGATION_SECRET | 示例值 | Core / Kael 委托密钥,生成后长期保存 |
DB_HOST / DB_PORT | 10.10.10.10 / 5432 | Pigsty PostgreSQL 入口 |
DB_USER / DB_NAME | jumpserver / jumpserver | 业务用户与业务数据库 |
DB_PASSWORD | DBUser.JumpServer | 业务用户密码,生产必须替换 |
DOCKER_SUBNET | 192.168.250.0/24 | JumpServer Compose 内部网段 |
REDIS_HOST | 192.168.250.2 | 本地 Redis 容器固定 IP |
CORE_HOST | http://192.168.250.4:8080 | JumpServer core 内部入口 |
HTTP_PORT | 8080 | Web 入口端口 |
SSH_PORT | 2222 | KoKo 宿主机 SSH/SFTP 端口;容器内固定 2222 |
KOKO_WEB_PROXY_PORT | 5001 | KoKo 网站代理端口 |
KOKO_PRIVILEGED | true | 保留上游 KoKo 权限默认值;SSH 路径也验证了关闭此选项 |
WEB_PROXY_ALLOWED_HOSTS | localhost,127.0.0.1 | 网站资产目标主机的允许列表;保留回环地址供 KoKo 控制 API 使用 |
ANSIBLE_DOCKER_ENABLED | false | 在 Celery 容器内执行 Ansible,使用当前数据目录布局 |
CORE_WORKER | 2 | Core Gunicorn worker 数 |
CELERY_WORKER_COUNT | 2 | 每个 Celery 队列 worker 并发数 |
使用网站资产代理时,在 WEB_PROXY_ALLOWED_HOSTS 中添加目标网站的主机名或 IP,并保留 localhost,127.0.0.1。JumpServer Endpoint 中的网站代理端口应与 KOKO_WEB_PROXY_PORT 一致。
生成生产密钥示例:
SECRET_KEY、BOOTSTRAP_TOKEN 与 CHAT_AI_DELEGATION_SECRET 生成后长期保存;升级时保留原始值。它们必须与数据库备份、/data/jumpserver、/opt/jumpserver/.env 一起保存;丢失原始 SECRET_KEY 后,数据库中的加密账号密钥可能无法恢复。
DB_PASSWORD 与 REDIS_PASSWORD 不要包含单引号或双引号,这与 JumpServer 官方安装器行为一致。
登录与 DOMAINS
JumpServer 会在登录流程中检查可信访问域名。DOMAINS 必须包含浏览器实际访问的 Host:
正常登录 URL:
如果登录页显示:
请检查 /opt/jumpserver/.env 与容器环境:
修正后需要重建 core 容器:
同时修改 pigsty.yml 或 conf/app/jumpserver.yml,否则下次执行 ./app.yml 会再次覆盖 /opt/jumpserver/.env。
不要用带 csrf_failure=1 的旧 URL 判断配置是否仍然错误;该页面会按照失败请求上下文显示 DOMAINS=... 提示。应使用正常登录页重新测试,必要时打开无痕窗口。
Docker 网络
模板使用固定 Docker bridge 网段:
固定 IP 有两个目的:
- 避免 JumpServer Python / Java 组件启动时遇到 Docker DNS 临时解析失败。
- 让 PostgreSQL HBA 规则可以精确放行应用网段。
PostgreSQL 看到的容器客户端来源是 192.168.250.0/24,因此模板包含:
如果 192.168.250.0/24 与现有网络冲突,需要同时修改:
DOCKER_SUBNET与各组件固定 IP,包括INIT_IP。REDIS_HOST、CORE_HOST。pg_hba_rules.addr与pgb_hba_rules.addr。- 重新创建 Compose 网络与容器。
不要把 DB_HOST 设置为 127.0.0.1;在容器里这指向容器自身。请使用宿主机内网 IP 或 Pigsty L2 VIP。
PostgreSQL
上游默认关闭作业中心。如需使用,在“系统设置 → 功能设置”启用作业中心,并保持“Ansible Docker 隔离”关闭。本模板使用 ANSIBLE_DOCKER_ENABLED=false 和现有数据目录;若数据库中已有该设置,其值优先于 .env,升级后应检查。启用 Docker 隔离需要额外的执行器镜像、宿主机 Docker 控制权和对应路径,不能仅切换一个变量。
JumpServer 5.x 使用 PostgreSQL,并要求 PostgreSQL 16 或更新版本。模板使用 Pigsty 创建数据库、用户、HBA、备份计划和可选 PgBouncer 入口。
应用数据库不需要额外 PostgreSQL 扩展:
模板默认 PostgreSQL 18;本次在外部 PostgreSQL 18.6 上验证。上游要求 PostgreSQL 16 或更新版本,其他主版本需按环境验证。若使用高可用数据库形态,可以参考模板中注释的 pg_vip_enabled 示例,将应用侧 DB_HOST 指向主库 VIP。
JumpServer 的 Django 迁移与 Celery Beat 不适合 PgBouncer transaction pooling。默认使用 PostgreSQL 5432 直连;如需通过 PgBouncer,请为 jumpserver 用户使用 session pooling。
部署验证
安装后执行:
期望:
jms_core、jms_celery、jms_web、jms_redis、jms_koko、jms_kael、jms_chen均为healthy。make health返回status=true、db_status=true、redis_status=true。jms_init正常退出为Exited (0);日志显示迁移完成与终端公钥指纹。初始化失败时 Core 不启动。- 实际登录,创建测试资产与授权,执行安全命令,并检查审计和录像。健康检查不等于全部功能通过。
数据库侧检查:
期望:
- Patroni 集群 Leader
running。 - PostgreSQL 版本为 16 或更新。
django_migrations中存在已应用的迁移记录;不要用固定表数量判断安装是否完成。- pgBackRest stanza 状态为
ok。
常见问题
登录页提示 DOMAINS 配置错误
确认两层配置一致:
修改 .env 后必须重建 core 容器:
同时修改 Pigsty inventory 中的 apps.jumpserver.conf.DOMAINS,否则下次 ./app.yml 会覆盖。
admin / ChangeMe 无法登录
先区分两类错误:
- 页面顶部是
DOMAINS=...红框:这是域名 / CSRF 配置问题,不是密码问题。 - 表单提示用户名或密码错误:才是账号密码问题。
可在容器内验证默认密码是否仍然有效:
Web 返回 502
检查 core 与 web:
如果是首次启动时 core 日志目录竞争,确认 /data/jumpserver/core/data/logs 已存在。模板已预创建该目录。
容器反复重启或健康检查超时
JumpServer 建议至少 4C8G;模板默认使用:
如果仍然出现 Gunicorn worker timeout、SIGKILL 或系统内存不足,请增加内存 / Swap,或继续降低 worker 数。查看资源:
运维命令
安装后进入 /opt/jumpserver:
从 4.10.19 升级到 5.0.0
官方 v5.0.0 升级脚本 接受 v3.10.11 及更新源版本;本模板实测路径为 v4.10.19-ce → v5.0.0-ce,没有额外的中间版本。其他旧版本应先按官方升级指南确认路径。
- 确认 PostgreSQL 备份可恢复,安排维护窗口,并停止旧栈。
- 同时备份数据库、整个
/opt/jumpserver与/data/jumpserver,在独立数据库和目录实际恢复验证。 - 更新完整 Compose、
init.sh、Makefile 和.env;所有组件统一到v5.0.0-ce。保留原始SECRET_KEY、BOOTSTRAP_TOKEN、数据库与 Redis 密码,新增随机CHAT_AI_DELEGATION_SECRET。 - 将
LION_IP改为KAEL_IP,创建 Kael 持久化目录。停止并移除旧 Lion 容器或解除其网络连接,避免占用 Kael 的固定 IP;保留旧数据目录和备份。 - 检查镜像前缀、代理、网段与端口,拉取整套镜像后启动:
复验原账号登录、资产与授权、凭据解密、主机公钥指纹、真实会话和历史录像。make restart、make migrate 和 make upgrade-db 都先停止服务,再通过同一个初始化依赖顺序启动。不要用 docker compose restart 并行重启 init 与 Core。
若 init 失败,保留日志并修复原因后重试。数据库已执行 5.x 迁移后,不能仅改回 4.x 镜像;回退必须恢复升级前数据库、应用文件和原始密钥。
备份与恢复
升级备份应在应用停止写入后,将数据库快照、整个 /opt/jumpserver 和 /data/jumpserver 保存在同一检查点,备份文件权限应限制为管理员可读。恢复验证使用独立数据库、文件目录、Compose 项目名、网段和端口,避免覆盖在线实例。Kael 的普通会话历史保存在 Core 数据库;Terminal AI 与组件状态保存在应用目录,需要同时备份。
JumpServer 状态分为两层:
- PostgreSQL 数据库:使用 Pigsty pgBackRest / PITR 备份。
- 应用文件:
/data/jumpserver与/opt/jumpserver/.env,包含日志、录像、组件数据、Redis 持久化和密钥。
恢复时应使用同一环境中的数据库、.env 与文件目录:
只恢复 PostgreSQL 而没有原始 SECRET_KEY,会导致 JumpServer 中加密保存的账号密钥无法正常解密。
社区版边界
本模板使用 JumpServer 5.0.0 社区版的 Core、Celery、KoKo、Chen、Kael 和 Web,另有一次性 init 与本地 Redis。5.x 不再部署独立 Lion 容器,其远程桌面实现已整合到 KoKo。JumpServer 项目采用 GPLv3,Pigsty 模板采用 Apache-2.0。
外部 PostgreSQL 18 后端与 PostgreSQL 数据库资产是两条独立连接路径。实测范围见下表;RDP/VNC、原生客户端、ARM64、企业版组件和外部模型推理不在本次验收范围内。Kael 的登录鉴权、会话存储与权限隔离可以在未配置模型提供商时验证,模型推理仍需另行配置和验证。上游仅持久保存含消息的普通会话,空白会话草稿在重启后不保留。Core / Kael 委托认证也已验证,成功加载 952 项操作定义。
| 验证路径 | 5.x 新装 | 4.10.19 → 5.0.0 |
|---|---|---|
| 外部 PostgreSQL 18.6、普通应用角色 | 通过 | 通过 |
| API 与网页登录、越权拒绝 | 通过 | 通过,保留原始用户与权限 |
| 用户/资产/账号/授权完整 CRUD | 通过,独立临时对象增删改查 | 通过,原有对象保持一致 |
| KoKo SSH 与终端 WebSocket 安全命令 | 通过 | 通过,保留主机密钥 |
| 会话审计、命令记录、录像下载 | 通过 | 通过,历史录像校验值一致 |
| Chen PostgreSQL 资产查询 | 通过,返回版本 180006 与合成值 42 | 通过 |
| Celery 凭据验证 | 通过 | 通过 |
| Kael 登录鉴权、含消息会话持久化、权限隔离 | 通过 | 通过 |
升级前备份已恢复到独立 PostgreSQL 数据库与应用目录,原密文、主机密钥和录像通过比对。验收使用 M3 隔离 VM 内的合成用户、资产和数据。
参考
- JumpServer v5.0.0 官方发布
- 固定版本安装器
- 官方升级指南
- JumpServer 项目: https://github.com/jumpserver/jumpserver
- JumpServer 安装器: https://github.com/jumpserver/installer
- Pigsty JumpServer 模板: https://github.com/pgsty/pigsty/blob/main/conf/app/jumpserver.yml
- Pigsty Docker 模块
- Pigsty Nginx 入口
这个页面对您有帮助吗?
感谢反馈,我们会据此改进这篇文档。
哪里没有解决?(可选)