尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

断网两周,我是如何在生产裸机上把 JumpServer 跑起来的:可复刻的离线部署全流程

断网两周,我是如何在生产裸机上把 JumpServer 跑起来的:可复刻的离线部署全流程 断网两周我是如何在生产裸机上把 JumpServer 跑起来的可复刻的离线部署全流程【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver前一阵子给某内网客户交付 JumpServer 特权账号管理平台时机房出口被安全策略卡死全程无法访问外网。更要命的是服务器上连 Docker 都没有只有一台纯净的 CentOS 裸机。这一趟走下来我把断网环境离线安装无网环境如何备齐依赖这两件事彻底摸透了。这篇文章就是那次实战的完整复盘从为什么必须提前打包到离线落地后如何一次启动成功全程不依赖任何外网资源。跟着走一遍哪怕你手头只有一台内网机器和一个 U 盘也能把 JumpServer 完整跑起来实现 SSH、RDP、数据库、Kubernetes 等资产的无缝纳管与安全审计。先说结论离线部署的成败九成在断网之前很多人以为离线部署的难点在装系统其实恰恰相反。真正的坑都在打包环节——外网机器上少备了一个 rpm、pip 源里漏了某个传递依赖、或者编译工具链没带全到了内网才发现就只能干瞪眼。所以整条思路可以浓缩成一句话在联网机器上把依赖 代码 静态资源三样东西一次性备齐 → 打包搬运进内网 → 离线安装启动。好消息是JumpServer 官方仓库把提前准备这件事的工具都给你备好了。下面按我实际操作的顺序一步步讲清楚。动手前先给目标机器做个条件体检先别急着复制命令。根据你的现场条件选路线能帮你省掉一大半的返工。对照这张自检清单打勾操作系统CentOS 7/8 或 Ubuntu 18.04/20.04 LTS其他 RHEL/Debian 系同理脚本要对应改包管理器内存至少 4GB建议 8GB并发会话多时不够用磁盘至少 20GB 空闲建议给数据目录单独挂盘权限必须能拿到 root目标机器是否支持 Docker这是决定路线的关键分叉口围绕最后一条两条主流路线的取舍如下你的现场条件推荐路线理由需要提前准备的东西内网机器可装 Docker且允许导入镜像容器镜像迁移环境自包含几乎不碰系统依赖一个镜像 tar 包 compose 配置不允许用容器只能裸机安装传统包管理离线仓库系统级部署可控性强系统依赖包、Python 包、代码、静态资源只有测试/演示需求内置 SQLite 起步零数据库依赖最快跑通只需要 Python 依赖包 如果你两种都具备条件我建议优先走容器路线省时省力本文两条路都会给全你可以按需取用。断网前一次性备齐全部口粮的四个步骤这个阶段我把它称为备粮期。以裸机路线为例需要准备四类东西系统依赖、Python 依赖、静态资源、项目代码。第一步系统依赖包按发行版下载JumpServer 需要一堆编译库LDAP、MySQL 客户端、freerdp 等这些必须由系统包管理器提供。仓库里已经有现成的清单脚本requirements/rpm_pkg.shRHEL/CentOS 系requirements/deb_pkg.shDebian/Ubuntu 系以 CentOS 为例在联网的同版本机器上执行# 安装下载工具 yum install -y yum-utils # 读取脚本里的包名连同传递依赖一起下载到 rpms 目录 yumdownloader --resolve $(grep -v # requirements/rpm_pkg.sh | tr \n ) --destdir/root/rpmsDebian 系则用 apt 的下载模式# 只下载不安装产物会落在当前目录 cd /root/debs apt-get download $(grep -v # requirements/deb_pkg.sh | tr \n )⚠️ 这里有个坑必须在与目标机同版本的系统上打包。CentOS 7 上打的 rpm 拿到 CentOS 8 上装轻则缺依赖重则直接装不上。第二步Python 依赖包用 pip 落盘JumpServer 的 Python 依赖声明在pyproject.toml和requirements/requirements.txt中。在联网机器上把它们全部拉下来# -d 指定落盘目录把源码和 wheel 包全量下载 pip download -r requirements/requirements.txt -d /root/pypkgs如果你想连 PyPI 的传递依赖一起兜底可以再加--no-binary :all:或直接不带约束全量下载。宁可多带几百 MB也别漏包。第三步静态资源用官方脚本补全JumpServer 有少数资源如 IP 归属地库、弱口令库体积大且不随源码分发仓库里提供了专用下载脚本requirements/static_files.sh。在联网机器上执行bash requirements/static_files.sh跑完后它会补上apps/common/utils/ip/geoip/GeoLite2-City.mmdb这类文件连同源码一起进 U 盘避免内网里就差一个文件的尴尬。第四步项目代码打成一个干净的包克隆仓库并打包默认分支即为最新稳定版也可以 checkout 到指定 taggit clone https://gitcode.com/GitHub_Trending/ju/jumpserver cd jumpserver # 排除 .git 等无关目录减小体积 tar czf jumpserver-offline.tar.gz --exclude.git .到这里备粮期结束。你手上应该有四个东西rpms或debs、pypkgs、补全了静态资源的源码包、以及如果走容器路线一个镜像 tar 包。全部塞进 U 盘准备进内网。把口粮送进内网的三种搬运姿势内网环境的差别主要在怎么把东西传进去。给你三个可用的姿势按现场条件选U 盘 / 移动硬盘直拷最原始但最可靠注意传输后校验一下 tar 包的 md5。内网 HTTP 服务器把离线目录放到一台内网机器上python3 -m http.server 8000目标机用 wget 拉取适合多台机器批量分发。配置本地软件源把 rpm 包目录做成 yum 本地源之后所有内网机器都能直接用yum install这是运维视角最顺手的做法# 在承载包的机器上用 createrepo 生成仓库元数据 createrepo /data/rpms # 目标机新增一个本地源文件指向内网文件服务 cat /etc/yum.repos.d/local.repo EOF [local] nameLocal Offline Repo baseurlhttp://内网IP/rpms enabled1 gpgcheck0 EOF # 之后就可以正常安装了 yum install -y $(grep -v # requirements/rpm_pkg.sh | tr \n )容器路线镜像导出与离线装载能省一半的事如果你的内网机器允许 Docker那我强烈建议走这条路。容器镜像把所有运行环境和依赖都打包好了根本不需要碰系统依赖和 Python 包断网风险被压缩到最小。在联网机器上用仓库自带的utils/build_docker.sh构建镜像并导出# 脚本用法后面跟版本号例如 v4.0.0 bash utils/build_docker.sh v4.0.0 # 把镜像导出成 tar 包便于搬运 docker save -o jumpserver-v4.tar jumpserver/jumpserver:v4.0.0到内网机器上装载并运行# 装载镜像 docker load -i jumpserver-v4.tar # 确认装载成功 docker images | grep jumpserver 白话解释一下这步在干什么docker save相当于把整个打包好的系统压缩成一个文件docker load就是把这个文件原样解压回 Docker 的镜像仓库里全程不碰网络。容器方式下配置、数据库、Redis 都可以通过 compose 文件编排这里不展开裸机流程跑通后容器只是把同样的配置换个载体而已。起服务的关键一跃配置、迁移、初始化管理员这是整个离线部署里最容易出错的一段我拆成三步走每一步都给了可直接照抄的命令。第一步生成密钥写配置文件JumpServer 用两份密钥保护安全SECRET_KEY加密密钥和BOOTSTRAP_TOKEN组件注册令牌。生成随机值后填进配置文件# 生成两组随机字符串分别填到配置里 cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49; echo # 从模板复制出正式配置 cp config_example.yml config.yml打开config.yml至少把这几项改好模板里已有中文注释照着填即可# 加密密钥生产环境务必改成随机字符串切勿外泄 SECRET_KEY: 上面生成的随机串 # 预共享 Tokencoco 和 guacamole 组件用它来注册 BOOTSTRAP_TOKEN: 另一组随机串 # 数据库连接默认 PostgreSQL测试环境可改回 sqlite3 DB_ENGINE: postgresql DB_HOST: 127.0.0.1 DB_PORT: 5432 DB_USER: jumpserver DB_PASSWORD: 数据库密码 DB_NAME: jumpserver # Web 服务监听地址与端口 HTTP_BIND_HOST: 0.0.0.0 HTTP_LISTEN_PORT: 8080第二步建表迁移 收集静态文件确认数据库服务已在监听PostgreSQL 或 MySQL 都行裸机环境记得先起好然后执行迁移# 数据库初始化建表、写入迁移记录 python apps/manage.py migrate # 把静态资源收集到统一目录Web 界面才能正常加载样式 python apps/manage.py collectstatic --noinput如果中途报缺模块说明第二步的pypkgs没装全。回到内网机器上用离线方式补装# --no-index 强制不走网络--find-links 指向本地包目录 pip install --no-index --find-links/data/pypkgs -r requirements/requirements.txt第三步创建管理员并启动# 按提示输入用户名、邮箱、密码 python apps/manage.py createsuperuser # 使用官方 entrypoint 启动全部服务web、ws 等 bash entrypoint.sh start all启动脚本内部会依次拉起 Web 服务和 WebSocket 服务日志输出在终端。看到监听8080后浏览器访问http://内网IP:8080用刚创建的管理员登录即可。翻车急救手册高频故障的症状→原因→解法对照表现场踩过的坑整理成一张速查表出了问题先对号入座症状可能原因排查与解法migrate时报缺某个 Python 模块传递依赖没打包全回联网机器pip download补齐对应包重新搬运后用--no-index --find-links安装启动时报libldap/libfreerdp相关错误系统依赖包版本与系统不匹配确认是在同版本系统上打的包用本地 yum 源重新yum install浏览器打不开页面端口无响应服务没起来或端口被防火墙拦截先看启动日志确认进程存活再检查HTTP_LISTEN_PORT和防火墙策略登录报错、组件无法注册BOOTSTRAP_TOKEN或SECRET_KEY不一致检查config.yml中两项是否与各组件配置完全一致页面样式错乱、图标丢失collectstatic未执行或静态资源缺失重跑python apps/manage.py collectstatic --noinput确认static_files.sh补过资源数据迁移卡住、无法回滚数据库版本或字符集不匹配检查数据库字符集建议 utf8mb4必要时从备份恢复再重试⚠️ 任何一次升级、改库操作之前先跑一遍仓库里的utils/backup_db.sh备份脚本输出到data/backup目录这是你最后的后悔药。收尾复盘三条经验一个起点这一趟下来最值钱的不是命令本身而是三条判断经验打包在断网前成功在断网前。离线部署的工程量九成集中在备粮期联网机器上多花一小时内网现场少折腾一整天。能走容器就优先走容器。镜像自带环境把系统依赖 Python 依赖两个最大的风险源直接消灭掉是离线场景下的最优解。配置先行启动殿后。先核对SECRET_KEY、BOOTSTRAP_TOKEN、数据库连接三项再谈启动能避开 80% 的翻车现场。如果你想顺着代码把原理吃透可以从这几个入口继续深挖系统依赖清单在 requirements/deb_pkg.sh 与 requirements/rpm_pkg.sh静态资源补全脚本在 requirements/static_files.sh镜像构建与数据库备份分别对应 utils/build_docker.sh 和 utils/backup_db.sh。下次再遇到机房断网、限期交付的局先深呼吸然后把这篇文章翻出来照着走——零联网也能把 JumpServer 稳稳当当跑起来。【免费下载链接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.项目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表