1760 字
9 分钟
页面浏览--访问次数--
JumpServer部署教程

在一台服务器上部署 JumpServer 集群模式,主要通过 Docker 容器模拟多节点环境。以下是详细步骤:

1. 环境准备#

1.1 系统要求#

  • Rocky Linux 9.5
  • 最小配置:8核CPU,16GB内存,200GB硬盘
  • 开放端口:80, 2222, 3306, 6379, 5000

1.2 安装必要软件#

bash

# 更新系统
dnf update -y
#自动安装 vim(编辑器)、wget/curl(网络工具)、net-tools(网络管理)、epel-release(扩展软件源)、git(版本控制)
dnf install -y vim wget curl net-tools epel-release git
# 安装 Docker
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker
systemctl enable docker
systemctl start docker
# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#安装 Docker Compose国内源
sudo curl -L "https://mirrors.aliyun.com/docker-toolbox/linux/compose/2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version

1.3 关闭 SELinux 和防火墙#

bash

# 临时关闭 SELinux
setenforce 0
# 永久关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 配置防火墙(开放必要端口)
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --permanent --add-port=5000/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

2. 创建集群部署目录结构#

bash

# 创建主目录
mkdir -p /opt/jumpserver-cluster
cd /opt/jumpserver-cluster
# 创建子目录结构
mkdir -p {core,web1,web2,lb}/{config,data,logs}
mkdir -p shared/{media,tmp,static}

3. 部署核心服务#

3.1 创建核心服务 docker-compose.yml#

bash

cat > /opt/jumpserver-cluster/core/docker-compose.yml << 'EOF'
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: jms_mysql
environment:
MYSQL_ROOT_PASSWORD: JumpServer123
MYSQL_DATABASE: jumpserver
MYSQL_USER: jumpserver
MYSQL_PASSWORD: JumpServer123
volumes:
- ../shared/mysql:/var/lib/mysql
- ./config/mysql.cnf:/etc/mysql/conf.d/custom.cnf
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=1G
restart: unless-stopped
networks:
- jumpserver-net
redis:
image: redis:7.0-alpine
container_name: jms_redis
command: redis-server --requirepass JumpServer123 --maxmemory 512mb --maxmemory-policy allkeys-lru
volumes:
- ../shared/redis:/data
restart: unless-stopped
networks:
- jumpserver-net
core:
image: jumpserver/jms_core:${VERSION}
container_name: jms_core
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_NAME=jumpserver
- DB_USER=jumpserver
- DB_PASSWORD=JumpServer123
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=JumpServer123
- SECRET_KEY=${SECRET_KEY}
- BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
- LOG_LEVEL=INFO
- SESSION_COOKIE_DOMAIN=.jumpserver.local
volumes:
- ../shared/media:/opt/jumpserver/data/media
- ../shared/static:/opt/jumpserver/data/static
- ../shared/tmp:/opt/jumpserver/data/tmp
- ./logs/core:/opt/jumpserver/logs
depends_on:
- mysql
- redis
restart: unless-stopped
networks:
- jumpserver-net
networks:
jumpserver-net:
driver: bridge
name: jumpserver-core-net
EOF

3.2 创建核心服务环境变量文件#

bash

cat > /opt/jumpserver-cluster/core/.env << 'EOF'
VERSION=v3.10.5
SECRET_KEY=your-super-secret-key-change-in-production-123456
BOOTSTRAP_TOKEN=your-bootstrap-token-change-this-789
EOF

3.3 生成安全的密钥#

bash

cd /opt/jumpserver-cluster/core
# 生成随机密钥
export SECRET_KEY=$(openssl rand -base64 48)
export BOOTSTRAP_TOKEN=$(openssl rand -base64 24)
# 更新环境变量文件
sed -i "s/your-super-secret-key-change-in-production-123456/${SECRET_KEY}/" .env
sed -i "s/your-bootstrap-token-change-this-789/${BOOTSTRAP_TOKEN}/" .env
echo "生成的密钥:"
echo "SECRET_KEY: ${SECRET_KEY}"
echo "BOOTSTRAP_TOKEN: ${BOOTSTRAP_TOKEN}"

4. 部署 Web 节点 1#

4.1 创建 Web1 docker-compose.yml#

bash

cat > /opt/jumpserver-cluster/web1/docker-compose.yml << 'EOF'
version: '3.8'
services:
web:
image: jumpserver/jms_web:${VERSION}
container_name: jms_web1
environment:
- CORE_HOST=core
- BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
- SESSION_COOKIE_DOMAIN=.jumpserver.local
volumes:
- ../shared/media:/opt/jumpserver/data/media
- ../shared/static:/opt/jumpserver/data/static
- ../shared/tmp:/opt/jumpserver/data/tmp
- ./logs/web:/opt/jumpserver/logs
ports:
- "8081:80"
depends_on:
- core
restart: unless-stopped
networks:
- jumpserver-net
koko:
image: jumpserver/jms_koko:${VERSION}
container_name: jms_koko1
environment:
- CORE_HOST=core
- BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
- LOG_LEVEL=INFO
volumes:
- ../shared/tmp:/opt/jumpserver/data/tmp
- ./logs/koko:/opt/koko/logs
ports:
- "22221:2222"
depends_on:
- core
restart: unless-stopped
networks:
- jumpserver-net
networks:
jumpserver-net:
external: true
name: jumpserver-core-net
EOF

4.2 创建 Web1 环境变量#

bash

cat > /opt/jumpserver-cluster/web1/.env << EOF
VERSION=v3.10.5
BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
EOF

5. 部署 Web 节点 2#

5.1 创建 Web2 docker-compose.yml#

bash

cat > /opt/jumpserver-cluster/web2/docker-compose.yml << 'EOF'
version: '3.8'
services:
web:
image: jumpserver/jms_web:${VERSION}
container_name: jms_web2
environment:
- CORE_HOST=core
- BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
- SESSION_COOKIE_DOMAIN=.jumpserver.local
volumes:
- ../shared/media:/opt/jumpserver/data/media
- ../shared/static:/opt/jumpserver/data/static
- ../shared/tmp:/opt/jumpserver/data/tmp
- ./logs/web:/opt/jumpserver/logs
ports:
- "8082:80"
depends_on:
- core
restart: unless-stopped
networks:
- jumpserver-net
koko:
image: jumpserver/jms_koko:${VERSION}
container_name: jms_koko2
environment:
- CORE_HOST=core
- BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
- LOG_LEVEL=INFO
volumes:
- ../shared/tmp:/opt/jumpserver/data/tmp
- ./logs/koko:/opt/koko/logs
ports:
- "22222:2222"
depends_on:
- core
restart: unless-stopped
networks:
- jumpserver-net
networks:
jumpserver-net:
external: true
name: jumpserver-core-net
EOF

5.2 创建 Web2 环境变量#

bash

cat > /opt/jumpserver-cluster/web2/.env << EOF
VERSION=v3.10.5
BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
EOF

6. 部署负载均衡器#

6.1 创建 Nginx 配置#

bash

mkdir -p /opt/jumpserver-cluster/lb/conf.d
cat > /opt/jumpserver-cluster/lb/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 上游服务器配置
upstream jumpserver_web {
least_conn;
server web1:80 weight=1 max_fails=3 fail_timeout=30s;
server web2:80 weight=1 max_fails=3 fail_timeout=30s;
}
upstream jumpserver_koko {
least_conn;
server web1:2222 weight=1 max_fails=3 fail_timeout=30s;
server web2:2222 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name _;
client_max_body_size 5000m;
# 静态文件
location /static/ {
alias /opt/jumpserver/data/static/;
expires 30d;
add_header Cache-Control "public";
}
location /media/ {
alias /opt/jumpserver/data/media/;
expires 30d;
add_header Cache-Control "public";
}
# Web 服务
location / {
proxy_pass http://jumpserver_web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
}
# WebSocket 支持
location /ws/ {
proxy_pass http://jumpserver_web;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# Koko SSH 服务
server {
listen 2222;
server_name _;
location / {
proxy_pass http://jumpserver_koko;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_buffering off;
}
}
}
EOF

6.2 创建负载均衡器 docker-compose.yml#

bash

cat > /opt/jumpserver-cluster/lb/docker-compose.yml << 'EOF'
version: '3.8'
services:
nginx:
image: nginx:1.24-alpine
container_name: jms_lb
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ../shared/static:/opt/jumpserver/data/static
- ../shared/media:/opt/jumpserver/data/media
- ./logs/nginx:/var/log/nginx
ports:
- "80:80"
- "2222:2222"
depends_on:
- web1
- web2
restart: unless-stopped
networks:
- jumpserver-net
networks:
jumpserver-net:
external: true
name: jumpserver-core-net
EOF

7. 修改主机 hosts 文件#

bash

# 添加本地域名解析
echo "127.0.0.1 web1 web2 core mysql redis" >> /etc/hosts

8. 启动 JumpServer 集群#

8.1 启动核心服务#

bash

cd /opt/jumpserver-cluster/core
docker-compose up -d mysql redis
# 等待数据库启动
sleep 30
# 启动核心服务
docker-compose up -d core
# 等待核心服务初始化
sleep 60

8.2 初始化数据库#

bash

# 进入核心容器执行初始化
docker exec -it jms_core bash -c "cd /opt/jumpserver && ./jms upgrade"
# 重启核心服务
docker-compose restart core

8.3 启动 Web 节点#

bash

# 启动 Web1
cd /opt/jumpserver-cluster/web1
docker-compose up -d
# 启动 Web2
cd /opt/jumpserver-cluster/web2
docker-compose up -d

8.4 启动负载均衡器#

bash

cd /opt/jumpserver-cluster/lb
docker-compose up -d

9. 验证部署#

9.1 检查服务状态#

bash

# 检查所有容器状态
docker ps
# 检查网络
docker network ls
# 检查端口监听
netstat -tlnp | grep -E ':(80|2222|8081|8082)'
# 查看服务日志
docker logs jms_core
docker logs jms_web1
docker logs jms_web2

9.2 测试负载均衡#

bash

# 测试 Web 服务
curl -I http://localhost
curl -I http://localhost:8081
curl -I http://localhost:8082
# 测试 SSH 服务
telnet localhost 2222

9.3 访问 JumpServer#

text

访问地址: http://服务器IP
默认账号: admin
默认密码: admin

10. 创建管理脚本#

10.1 创建启动脚本#

bash

cat > /opt/jumpserver-cluster/start-cluster.sh << 'EOF'
#!/bin/bash
echo "正在启动 JumpServer 集群..."
cd /opt/jumpserver-cluster/core
docker-compose up -d mysql redis
sleep 30
docker-compose up -d core
sleep 60
cd /opt/jumpserver-cluster/web1
docker-compose up -d
cd /opt/jumpserver-cluster/web2
docker-compose up -d
cd /opt/jumpserver-cluster/lb
docker-compose up -d
echo "JumpServer 集群启动完成"
echo "Web 访问地址: http://$(hostname -I | awk '{print $1}')"
echo "SSH 访问地址: $(hostname -I | awk '{print $1}'):2222"
EOF
chmod +x /opt/jumpserver-cluster/start-cluster.sh

10.2 创建停止脚本#

bash

cat > /opt/jumpserver-cluster/stop-cluster.sh << 'EOF'
#!/bin/bash
echo "正在停止 JumpServer 集群..."
cd /opt/jumpserver-cluster/lb && docker-compose down
cd /opt/jumpserver-cluster/web2 && docker-compose down
cd /opt/jumpserver-cluster/web1 && docker-compose down
cd /opt/jumpserver-cluster/core && docker-compose down
echo "JumpServer 集群已停止"
EOF
chmod +x /opt/jumpserver-cluster/stop-cluster.sh

10.3 创建状态检查脚本#

bash

cat > /opt/jumpserver-cluster/status-cluster.sh << 'EOF'
#!/bin/bash
echo "=== JumpServer 集群状态 ==="
echo "核心服务:"
docker ps | grep jms_core
docker ps | grep jms_mysql
docker ps | grep jms_redis
echo -e "\nWeb 节点:"
docker ps | grep jms_web
docker ps | grep jms_koko
echo -e "\n负载均衡:"
docker ps | grep jms_lb
echo -e "\n网络信息:"
docker network ls | grep jumpserver
echo -e "\n服务端口:"
netstat -tlnp | grep -E ':(80|2222)' | grep LISTEN
EOF
chmod +x /opt/jumpserver-cluster/status-cluster.sh

11. 备份和监控#

11.1 创建备份脚本#

bash

cat > /opt/jumpserver-cluster/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/jumpserver-cluster/backup"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
echo "开始备份 JumpServer 集群数据..."
# 备份数据库
docker exec jms_mysql mysqldump -u root -pJumpServer123 jumpserver > $BACKUP_DIR/jumpserver_db_$DATE.sql
# 备份共享数据
tar -czf $BACKUP_DIR/jumpserver_shared_$DATE.tar.gz -C /opt/jumpserver-cluster shared
# 备份配置文件
tar -czf $BACKUP_DIR/jumpserver_config_$DATE.tar.gz -C /opt/jumpserver-cluster core/web1 web2 lb
# 保留最近7天备份
find $BACKUP_DIR -type f -mtime +7 -delete
echo "备份完成: $BACKUP_DIR"
EOF
chmod +x /opt/jumpserver-cluster/backup.sh

12. 故障排查#

12.1 常见问题解决#

bash

# 查看特定服务日志
docker logs jms_core -f
docker logs jms_web1 -f
docker logs jms_lb -f
# 检查网络连通性
docker exec jms_web1 ping core
docker exec jms_web2 ping core
# 重启单个服务
cd /opt/jumpserver-cluster/core && docker-compose restart core

12.2 性能监控#

bash

# 监控 Docker 资源使用
docker stats
# 查看系统资源
htop
df -h
free -h

这个单机集群部署方案提供了完整的 JumpServer 高可用环境,所有服务都运行在 Docker 容器中,通过负载均衡实现流量分发。您可以根据实际需求调整资源配置和副本数量。

192.168.61.129:15839/da22dd7e48

面板用户: 31a2957b90 面板密码: 94459e27fc

JumpServer部署教程
https://xiaomai.bot.cd/posts/jumpserver/
作者
XiaoMai
发布于
2026-09-08
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

评论

正在加载评论...