「JumpServer」- 更新 2.4.4 到 2.8.2 版本

  CREATED BY JENKINSBOT

问题描述

今天(03/27/2021)原本要做别的事情,但是突然发现 JumpServer 发布新版本。并且,我们还发现优化资产树节点排序问题(这是我们比较关心的问题,2.4.4 的资产排序方式“似乎没有规律”,导致资产节点显示有些“不整齐”)。

因此,我们决定对我们的 JumpServer 服务进行升级,升级到最新的版本(2.8.2)。也许这太鲁莽,但是换个角度看:(1)做好数据备份以后,即使升级失败,我们也能够进行回滚;(2)鉴于 JumpServer 的配置不会经常变动,哪怕回滚导致数据遗失也不会遗失重要数据,对于我们来说是在可接受范围内的。(3)我们最担心的问题是,由于长时间不升级,最后必将面对“大幅度的跨版本升级”,那时候才是真正的灾难(很可能无法升级:-)。所以,权衡之后,积极主动地升级才是适合我们的最好策略,而且我们也能够接受升级失败带来的后果。

该笔记将记录:将 JumpServer 从 2.4.4 升级 2.8.2 版本的过程,以及常见问题出来。

解决方案

每个人的部署方式和配置信息都不相同,我们创建该笔记是仅是为他人提供经验与参考。我们记录我们的升级过程,以及常见问题的解决方案。

另外,此次升级的变动还是很大的,比如:从 2.6 后,统一企业版本与开源版本安装方式,企业版和社区版可以无缝切换。今后只会维护这种安装方式(通过 jmsctl.sh 管理),其他安装方式不再提供技术支持。所以,此次升级需要完成的工作不像以往那样直接。

我们的原始部署信息

部署方式:我们的 JumpServer 2.4.4 的部署方式为 Docker 运行,使用 jms_all 镜像。这样,便于管理。

数据目录:数据目录(/srv/jumpserver/data、/srv/jumpserver/mysql)是挂载到容器外的。

其他信息:参考 1.5.6 to 2.4.4 笔记;

第一步、数据库备份(重要)

docker container stop jumpserver_2.4.4
rsync -avz /srv/jumpserver/data /srv/jumpserver/.backup/2.4.4/data
rsync -avz /srv/jumpserver/mysql /srv/jumpserver/.backup/2.4.4/mysql

至此,我们已经创建数据备份,那么之后我们便可大胆升级。不管最终结果如何,不管最终怎么失败,我们都能够利用备份数据进行还原。当然,要小心误操作而把备份数据删除。

第二步、导出数据库

docker container start jumpserver_2.4.4

docker container exec -it jumpserver_2.4.4 \
    bash -c 'mysqldump -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASSWORD $DB_NAME' \
    > /opt/jumpserver.sql
cp /opt/jumpserver.sql /opt/jumpserver.sql.backup # 可选操作,避免当后面操作失败时我们还要在重新执行导出

if grep -q 'COLLATE=utf8_bin' /opt/jumpserver.sql; then
    echo "备份数据库字符集正确";
else
    cp /opt/jumpserver.sql /opt/jumpserver_bak.sql
    sed -i 's@CHARSET=utf8;@CHARSET=utf8 COLLATE=utf8_bin;@g' /opt/jumpserver.sql
fi

if grep -q 'CHARSET=utf8;' /opt/jumpserver.sql; then
    cp /opt/jumpserver.sql /opt/jumpserver_bak.sql.1
    sed -i 's@CHARSET=utf8;@CHARSET=utf8 COLLATE=utf8_bin;@g' /opt/jumpserver.sql
else
    echo "备份数据库字符集正确";
fi

docker container stop jumpserver_2.4.4

第三步、安装 JumpServer 服务

cd /opt
yum -y install wget
wget https://github.com/jumpserver/installer/releases/download/v2.8.2/jumpserver-installer-v2.8.2.tar.gz
tar -xf jumpserver-installer-v2.8.2.tar.gz
cd jumpserver-installer-v2.8.2

vi config-example.txt
SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxx    # 从旧版本的配置文件获取后填入 (*)
BOOTSTRAP_TOKEN=xxxxxxxxxxxx          # 从旧版本的配置文件获取后填入 (*)

./jmsctl.sh install

注意事项:后面,根据提示进行选择即可,无需进行特殊设置。

# 04/24/2021 注意事项,我们第一次升级时,是在 CentOS 7.x 中完成,整个过程比较顺利。但是第二次在 Ubuntu 18.04 中该步骤出现问题,我们通过降级 docker-compose 命令到 1.17.1 版本解决。

第四步、导入原始数据,并启动服务

# ./jmsctl.sh stop

# docker exec -it jms_mysql /bin/bash -c 'mysql -uroot -p$DB_PASSWORD'
...
mysql> drop database jumpserver;
Query OK, 88 rows affected (0.11 sec)

mysql> create database jumpserver default charset 'utf8' collate 'utf8_bin';
Query OK, 1 row affected (0.02 sec)

mysql> exit;
Bye

# ./jmsctl.sh restore_db /opt/jumpserver.sql
Start restoring database: /opt/jumpserver.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[SUCCESS] Database recovered successfully

# ./jmsctl.sh start

第五步、配置 Nginx 转发

server {

    listen 80;
    server_name demo.jumpserver.org;  # 自行修改成你的域名

    client_max_body_size 4096m;  # 上传文件大小限制

    location / {
            # 这里的 ip 是后端 JumpServer nginx 的 ip
            proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;
            proxy_buffering off;
            proxy_request_buffering off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

注意事项,我们是内网使用,因此仅简单配置 HTTP 访问。关于 Nginx 的更多设置,参考 JumpServer 文档/反向代理 文档。

最后,升级成功,登录查看!!!

此次升级,新版本的登录界面也发生变化,以及资产树的排序是有规律的。

常见问题汇总

ERROR: for XXX Container “XXX” is unhealthy.

问题描述:在启动服务时,产生如下错误信息

# ./jmsctl.sh start
Recreating jms_redis ... 
Recreating jms_redis ... done
Creating jms_core ... 

ERROR: for lina  Container "cd64d6d81be5" is unhealthy.

ERROR: for koko  Container "cd64d6d81be5" is unhealthy.

ERROR: for guacamole  Container "cd64d6d81be5" is unhealthy.

ERROR: for celery  Container "cd64d6d81be5" is unhealthy.

ERROR: for luna  Container "cd64d6d81be5" is unhealthy.
ERROR: Encountered errors while bringing up the project.

问题原因:容器 cd64d6d81be5 是 jms_core 容器。鉴于 jms_core 调整数据库的时间比较长,导致其他容器健康检查失败,所以出现该错误信息。

解决方法:

# docker logs -f jms_core
...
2021-03-27 01:48:57 Check service status: gunicorn -> running at 764
2021-03-27 01:48:57 Check service status: flower -> running at 770
2021-03-27 01:48:57 Check service status: daphne -> running at 772
2021-03-27 01:49:30 Check service status: gunicorn -> running at 764
...

// 等待出现类似如上日志,然后重新启动服务即可

# ./jmsctl.sh start

参考文献

JumpServer 文档 / 升级文档 / docker 部署