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
# 安装 Dockerdnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repodnf install -y docker-ce docker-ce-cli containerd.io
# 启动 Dockersystemctl enable dockersystemctl start docker
# 安装 Docker Composecurl -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 --versiondocker-compose --version1.3 关闭 SELinux 和防火墙
bash
# 临时关闭 SELinuxsetenforce 0
# 永久关闭 SELinuxsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 配置防火墙(开放必要端口)systemctl enable firewalldsystemctl start firewalldfirewall-cmd --permanent --add-port=80/tcpfirewall-cmd --permanent --add-port=2222/tcpfirewall-cmd --permanent --add-port=3306/tcpfirewall-cmd --permanent --add-port=6379/tcpfirewall-cmd --permanent --add-port=5000/tcpfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --reload2. 创建集群部署目录结构
bash
# 创建主目录mkdir -p /opt/jumpserver-clustercd /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-netEOF3.2 创建核心服务环境变量文件
bash
cat > /opt/jumpserver-cluster/core/.env << 'EOF'VERSION=v3.10.5SECRET_KEY=your-super-secret-key-change-in-production-123456BOOTSTRAP_TOKEN=your-bootstrap-token-change-this-789EOF3.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}/" .envsed -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-netEOF4.2 创建 Web1 环境变量
bash
cat > /opt/jumpserver-cluster/web1/.env << EOFVERSION=v3.10.5BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}EOF5. 部署 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-netEOF5.2 创建 Web2 环境变量
bash
cat > /opt/jumpserver-cluster/web2/.env << EOFVERSION=v3.10.5BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}EOF6. 部署负载均衡器
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; } }}EOF6.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-netEOF7. 修改主机 hosts 文件
bash
# 添加本地域名解析echo "127.0.0.1 web1 web2 core mysql redis" >> /etc/hosts8. 启动 JumpServer 集群
8.1 启动核心服务
bash
cd /opt/jumpserver-cluster/coredocker-compose up -d mysql redis
# 等待数据库启动sleep 30
# 启动核心服务docker-compose up -d core
# 等待核心服务初始化sleep 608.2 初始化数据库
bash
# 进入核心容器执行初始化docker exec -it jms_core bash -c "cd /opt/jumpserver && ./jms upgrade"
# 重启核心服务docker-compose restart core8.3 启动 Web 节点
bash
# 启动 Web1cd /opt/jumpserver-cluster/web1docker-compose up -d
# 启动 Web2cd /opt/jumpserver-cluster/web2docker-compose up -d8.4 启动负载均衡器
bash
cd /opt/jumpserver-cluster/lbdocker-compose up -d9. 验证部署
9.1 检查服务状态
bash
# 检查所有容器状态docker ps
# 检查网络docker network ls
# 检查端口监听netstat -tlnp | grep -E ':(80|2222|8081|8082)'
# 查看服务日志docker logs jms_coredocker logs jms_web1docker logs jms_web29.2 测试负载均衡
bash
# 测试 Web 服务curl -I http://localhostcurl -I http://localhost:8081curl -I http://localhost:8082
# 测试 SSH 服务telnet localhost 22229.3 访问 JumpServer
text
访问地址: http://服务器IP默认账号: admin默认密码: admin10. 创建管理脚本
10.1 创建启动脚本
bash
cat > /opt/jumpserver-cluster/start-cluster.sh << 'EOF'#!/bin/bashecho "正在启动 JumpServer 集群..."
cd /opt/jumpserver-cluster/coredocker-compose up -d mysql redissleep 30docker-compose up -d coresleep 60
cd /opt/jumpserver-cluster/web1docker-compose up -d
cd /opt/jumpserver-cluster/web2docker-compose up -d
cd /opt/jumpserver-cluster/lbdocker-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.sh10.2 创建停止脚本
bash
cat > /opt/jumpserver-cluster/stop-cluster.sh << 'EOF'#!/bin/bashecho "正在停止 JumpServer 集群..."
cd /opt/jumpserver-cluster/lb && docker-compose downcd /opt/jumpserver-cluster/web2 && docker-compose downcd /opt/jumpserver-cluster/web1 && docker-compose downcd /opt/jumpserver-cluster/core && docker-compose down
echo "JumpServer 集群已停止"EOF
chmod +x /opt/jumpserver-cluster/stop-cluster.sh10.3 创建状态检查脚本
bash
cat > /opt/jumpserver-cluster/status-cluster.sh << 'EOF'#!/bin/bashecho "=== JumpServer 集群状态 ==="echo "核心服务:"docker ps | grep jms_coredocker ps | grep jms_mysqldocker ps | grep jms_redis
echo -e "\nWeb 节点:"docker ps | grep jms_webdocker 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 LISTENEOF
chmod +x /opt/jumpserver-cluster/status-cluster.sh11. 备份和监控
11.1 创建备份脚本
bash
cat > /opt/jumpserver-cluster/backup.sh << 'EOF'#!/bin/bashBACKUP_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.sh12. 故障排查
12.1 常见问题解决
bash
# 查看特定服务日志docker logs jms_core -fdocker logs jms_web1 -fdocker logs jms_lb -f
# 检查网络连通性docker exec jms_web1 ping coredocker exec jms_web2 ping core
# 重启单个服务cd /opt/jumpserver-cluster/core && docker-compose restart core12.2 性能监控
bash
# 监控 Docker 资源使用docker stats
# 查看系统资源htopdf -hfree -h这个单机集群部署方案提供了完整的 JumpServer 高可用环境,所有服务都运行在 Docker 容器中,通过负载均衡实现流量分发。您可以根据实际需求调整资源配置和副本数量。
192.168.61.129:15839/da22dd7e48
面板用户: 31a2957b90 面板密码: 94459e27fc
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 13 天
部分内容可能已过时
评论