跳到主要内容

隔离网络安装

概述​

对于无法连接互联网的网络,使用单个 Bundle 进行安装。安装流程分为三个步骤。

  1. 在可上网的设备上创建 Bundle(或下载 KOPENS 发布的文件)。
  2. 通过允许的介质将其传输至隔离网络服务器。
  3. 在隔离网络服务器上加载并安装。

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.txtPlantPulse 本身的使用条款

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_DATALAKE1同时包含数据湖镜像
OS_TARGETrhelrhel · ubuntu · both — 选择包含哪种 OS 软件包
VERSION当月(yyyy.mm)嵌入在 Bundle 文件名中的版本
OUT_TGZ仓库下方直接指定产出物路径
AIRGAP_KEEP3仅保留最新的 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 依次处理以下流程。

  1. Bundle 验证 — 使用随附文件组确认签名和校验和(详见下文)。
  2. Docker 引擎离线安装 — rpm -ivh 或 dpkg -i。若已安装则跳过。
  3. 镜像加载 — 将 images/ 内的所有 tar 文件全部 docker load。
  4. 覆盖检查 — 将加载的镜像与 compose config --images 进行比对。
  5. 调用 install.sh — SKIP_LOGIN=1。由于镜像已在本地,不再执行仓库登录。

0 步 — Bundle 验证(自 2026-09-18 起采用随附文件组)​

Bundle 附带一组验证文件。

文件内容
<번들>.tar.gz.sha256sha256sum -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」而是「校验和文件」

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 重新创建

更多信息​