隔离网络安装
概述
对于无法连接互联网的网络,使用单个 Bundle 进行安装。安装流程分为三个步骤。
- 在可上网的设备上创建 Bundle(或下载 KOPENS 发布的文件)。
- 通过允许的介质将其传输至隔离网络服务器。
- 在隔离网络服务器上加载并安装。
Bundle 包含了 Docker 引擎的安装包。因此,目标服务器无需预装 Docker。
Bundle 包含内容
产出物为一个 plantpulse-platform-images-<version>.tar.gz 文件。
| 路径 | 内容 |
|---|---|
images/ | 每个镜像对应一个 docker save 的 tar 文件 |
docker-rpms/ | 适用于 RHEL · Rocky 的 Docker 引擎 rpm |
docker-debs/ | 适用于 Ubuntu 的 Docker 引擎 deb(通过 OS_TARGET 选择) |
repo/ | 安装·运行脚本及 compose/ 全集(含 bin/env.sh) |
NOTICE | 内置第三方组件及其许可证位置 |
EULA.txt | PlantPulse 本身的使用条款 |
NOTICE 和 EULA.txt 虽然也在镜像内部,但被提取至 Bundle 根目录下。 这是为了避免用户在查看内容时必须 docker load 一个 10GB 的 tar 文件。
第 1 步 — 创建 Bundle
推荐路径是获取 KOPENS 发布的 Bundle。
https://product.kopens.io/plantpulse-platform/plantpulse-platform-images-<version>.tar.gz
若需自行创建,请在可上网的设备上执行以下操作。
cd /opt/kopens/plantpulse-platform-docker/bin
./airgap-bundle.sh
| 环境变量 | 默认值 | 含义 |
|---|---|---|
INCLUDE_DATALAKE | 1 | 同时包含数据湖镜像 |
OS_TARGET | rhel | rhel · ubuntu · both — 选择包含哪种 OS 软件包 |
VERSION | 当月(yyyy.mm) | 嵌入在 Bundle 文件名中的版本 |
OUT_TGZ | 仓库下方 | 直接指定产出物路径 |
AIRGAP_KEEP | 3 | 仅保留最新的 N 个,删除旧 Bundle |
INCLUDE_DATALAKE=0 创建集群的 Master 和五台 Worker 全部会以 plantpulse-datalake 镜像启动(自 2026-08-31 起,compose/docker-compose.worker.yml 已更改为此镜像)。若将此值设为 0 创建 Bundle,将导致 Master 和 Worker 均无法启动。这就是默认值为 1 的原因。
airgap-bundle.sh 通过 docker compose config --images 提取要包含的镜像。以前将列表记录在脚本中,但在 2026-09-01 的实测中,堆栈实际需求的镜像为九个,其中并不包含 plantpulse-platform — compose/docker-compose.yml 的任何服务都不会启动该镜像。这意味着当时的 Bundle 包含了「一个不使用的镜像」,却漏掉了「八个必需的镜像」,导致无法在隔离网络安装。请勿维护两套列表。
在创建 Bundle 的设备上,必须预先配置 Platform 凭据。 由于 compose 文件将这些值声明为 :?,若缺失凭据将无法获取镜像,脚本将以错误结束而非生成空 Bundle。
第 2 步 — 传输至隔离网络服务器
使用 USB · 内部文件服务器 · scp 等允许的介质将 .tar.gz 传输至目标服务器。
第 3 步 — 加载与安装
sudo -i
mkdir -p /opt/kopens/plantpulse-platform-docker
tar -xzf plantpulse-platform-images-*.tar.gz -C /opt/kopens/plantpulse-platform-docker
# 자격증명 사이드카는 폐쇄망 서버에도 있어야 한다
vi /etc/kopens/plantpulse-platform.env
cd /opt/kopens/plantpulse-platform-docker/repo/bin
./airgap-load.sh
airgap-load.sh 依次处理以下流程。
- Bundle 验证 — 使用随附文件组确认签名和校验和(详见下文)。
- Docker 引擎离线安装 —
rpm -ivh或dpkg -i。若已安装则跳过。 - 镜像加载 — 将
images/内的所有 tar 文件全部docker load。 - 覆盖检查 — 将加载的镜像与
compose config --images进行比对。 - 调用
install.sh—SKIP_LOGIN=1。由于镜像已在本地,不再执行仓库登录。
0 步 — Bundle 验证(自 2026-09-18 起采用随附文件组)
Bundle 附带一组验证文件。
| 文件 | 内容 |
|---|---|
<번들>.tar.gz.sha256 | sha256sum -c 输入 |
<번들>.tar.gz.sha256.sig | 针对该校验和文件的 cosign 签名 |
<번들>.tar.gz.pub | 验证密钥副本 |
airgap-load.sh 依次执行两个步骤 — 先验证签名,再写入校验和。 因为未经认证的校验和不能作为证据。
# 1) 이 체크섬이 «우리» 것인가
cosign verify-blob --key <번들>.tar.gz.pub \
--signature <번들>.tar.gz.sha256.sig <번들>.tar.gz.sha256
# 2) 번들의 바이트가 그 체크섬과 맞는가
sha256sum -c <번들>.tar.gz.sha256
Bundle 超过 8 GB,而 cosign sign-blob 会将目标全部加载至内存。因此,签名施加在校验和随附文件上,而 Bundle 本身通过该校验和进行验证。旧版 <번들>.tar.gz.sig 不再创建 — 若有提及该名称的程序书,请予以修正。
airgap-load.sh 在缺少随附文件时会记录该事实并继续安装。仅携带旧名称(.tar.gz.sig)的 Bundle 将在跳过验证的状态下被安装。 请务必阅读屏幕上显示的第 0 步相关行。
此验证旨在拦截传输中的损坏或部分替换的情况。如果对方能够整体更换 Bundle,那么也可以同时更换随附文件 — 因此,在需要安全审查的现场,请通过非 Bundle 路径单独接收密钥进行验证。
第 3 步是此脚本的核心价值。如果缺少镜像,将在开始安装之前打印其名称并停止。否则,安装将进行到一半后因仓库拉取超时而崩溃,而在隔离网络中,仓库从一开始就是无法访问的。
若 images/ 为空或任何一个 tar 文件加载失败,将立即停止 — 不会在有缺失的情况下开始安装。
安装后的启动验证(./up.sh, ./stack-verify-boot.sh)与运行巡检(./ops-check.sh)与 Docker 安装 相同。
隔离网络更新
使用新版本重新创建 Bundle 并按相同流程传输,随后解压新 Bundle 并重新执行其中的 bin/airgap-load.sh。
若检测到已安装堆栈,则判定为升级,先进行备份([2.9] An installed stack was found … this is an UPGRADE),加载镜像后再运行安装程序。若失败,将自动回滚至上一版本 — 支持范围及备份 · 回滚详见 升级。
- 回滚要求上一版本的镜像必须保留在服务器上。 若已删除,请重新
docker load之前的 Bundle。 - 仅通过
./update.sh重建容器不属于升级 — 运行脚本 · compose 将保持旧版本。
常见陷阱
| 现象 | 原因 | 对策 |
|---|---|---|
| Bundle 创建过程中提示「未找到任何镜像」而结束 | 创建设备缺失 Platform 凭据 | 先配置 Sidecar 后重新执行 |
| Worker 无法启动 | 使用 INCLUDE_DATALAKE=0 创建的 Bundle | 使用默认值(1)重新创建 |
| 安装过程中出现仓库拉取超时 | 堆栈需要 Bundle 中不存在的镜像 | 根据 airgap-load.sh 打印的「缺失镜像»列表重新创建 |
| 目标服务器为 Ubuntu 但 Docker 未安装 | Bundle 仅包含 rpm | 使用 OS_TARGET=ubuntu 或 both 重新创建 |