安装概览
PlantPulse AI 以一套 docker compose 堆栈运行。正本是
compose/docker-compose.yml,所有运维脚本也都通过该文件来操作容器。
curl -fsSL https://product.kopens.io/plantpulse-ai/install.sh | sudo bash
详情请参阅一行命令安装。本页说明 什么装在哪里,以及安装脚本实际做了什么。
装在哪里
/opt/kopens/
├── plantpulse-ai-docker/ ← 설치 본체 (bin · compose)
├── plantpulse-ai-inference-server/ ← 형제 저장소
└── plantpulse-timeseries-insight-server/ ← 형제 저장소
compose/docker-compose.yml 会以相对路径 bind-mount 这两个仓库中的文件(例如网关
配置 litellm-config.yaml)。缺失时堆栈无法启动 —— 即使是 START=1,安装器也会拒绝启动并打印
缺失的仓库名。一行命令安装和隔离网络离线包会一并下载解压这三者,无需操心;但若
手动执行 git clone,就必须把三者放在同级目录下。
| 什么 | 在哪里 |
|---|---|
| 安装主体 | /opt/kopens/plantpulse-ai-docker |
| 配置·凭据正本 | /etc/kopens/plantpulse-ai.env (0600) |
| 其原始模板 | <설치 본체>/compose/env.gb10.example(AWS g7e 为 env.g7e.example) |
| 硬件配置文件 | <설치 본체>/compose/profiles/gb10.env · g7e.env —— GPU 相关部分。由主机 env 中的 PP_HW_PROFILE 选择 |
| Docker 存储根目录 | /data1/docker-data(用 DOCKER_DATA_DIR 更改) |
会启动什么 —— 二十五个容器
| 分类 | 容器 | 作用 |
|---|---|---|
| 入口 | plantpulse-proxy | nginx(非 root)。接收主机的 80 · 443 和管理控制台 HTTPS(5960)并转发到内部 |
| 界面 | plantpulse-copilot-web · plantpulse-admin-web | 副驾界面 · 管理控制台(HTTP 5959) |
| 推理 | plantpulse-llm · plantpulse-emb · plantpulse-rerank | vLLM —— 生成 · 嵌入 · 重排序 |
| 网关 | plantpulse-litellm(4000) | 将模型调用汇聚到一处 |
| 文档 | plantpulse-rag-api · plantpulse-lightrag · plantpulse-docling-serve · plantpulse-document-understanding-api | 读取文档 · 切分 · 检索 |
| 知识 | plantpulse-neo4j(7474 · 7687) · plantpulse-qdrant | 知识图谱 · 向量索引 |
| 数字主线 | plantpulse-digital-thread-api(7140,不对主机开放) · plantpulse-digital-thread-neo4j | 工厂图谱镜像与连接器注册表 · 其专用 Neo4j(不对主机开放) |
| 时序 | plantpulse-timeseries-insight-api(8970) · plantpulse-timeseries-insight-server(8980,不对主机开放) | 异常检测 · 预测 |
| 视觉 | plantpulse-vision-api | 图像理解 |
| 管理 | plantpulse-admin-api | 管理控制台后端 |
| 观测 | plantpulse-phoenix(6006,不对主机开放) · plantpulse-dcgm | 链路追踪 UI · GPU 指标 |
| 转录 | plantpulse-asr · plantpulse-asr-audio | 语音 → 文本(vLLM Whisper) · 将其音频库搬到卷后即结束的一次性服务。仅在启用视频 · 语音的安装(PI_MEDIA_ENABLED=true)中启动 → 视频 · 语音采集 |
| 镜像仓库 | plantpulse-registry · plantpulse-registry-ui | 隔离网络用的内部镜像存储 —— 默认启动时不会运行 |
默认启动的是除转录两个和镜像仓库两个之外的二十一个。启用视频 · 语音后加上转录两个,共二十三个
(plantpulse-asr-audio 完成任务后保持 «Exited (0)» 是正常的)。数字主线两个是 2026.10 新增的。
8970 和 7115 是 MCP 客户端直接连接的位置(Platform CEP 异常检测、 Claude Desktop 之类)。其余都在代理之后。
install.sh 做什么
一行命令安装就是由 bootstrap.sh 下载仓库并执行该脚本。
判别 OS(RHEL 系 / Debian 系)后,按日志中打印的编号顺序处理。
| 阶段 | 做什么 | 主机全局 |
|---|---|---|
| 1 | 区域设置(ko_KR.UTF-8) · 时区 —— 将 PP_TZ 的值统一确定,并把主机 OS 也调整为该时区(安装时给定的值 → env 中已有的值 → 主机时区(非 UTC 时) → Asia/Seoul) | ✅ |
| 2 | 关闭 swap(同时反映到 /etc/fstab) | ✅ |
| 3 | 安装 Docker CE + buildx + compose v2 插件 —— 已存在则跳过 | |
| 3b | 安装 NVIDIA 驱动 + container toolkit,在 Docker 中注册 nvidia 运行时(为 SKIP_GPU=1 时跳过) | |
| 4 | /etc/docker/daemon.json 与数据目录(见下) | |
| 5 | OS 调优 —— chrony · limits · sysctl · tmpfiles | ✅ |
| 6 | 开放防火墙 —— 仅开放 compose 实际发布的端口(SSH 22 会预先开放)。其中已被本堆栈之外的进程占用的端口会以警告打印,并提示可用于迁移的键 | ✅ |
| 7 | 确认内部镜像仓库登录(为 SKIP_LOGIN=1 时跳过) | |
| 8 | 准备配置 sidecar —— 将模板复制为 /etc/kopens/plantpulse-ai.env 并填值 → 仅当 START=1 时才接收模型 · pull 镜像 · 启动 |
标有«主机全局»的阶段改变的不是本产品,而是整台主机的设置。
HOST_TUNING 控制这四个阶段(见下表)。
未给定 HOST_TUNING 而本 compose 项目之外的容器处于 Up 状态时,默认变为 plan ——
只打印将要变更的内容,不写入任何东西。查看输出后若可以应用,
请用 HOST_TUNING=apply 重新运行。专用设备(没有其他容器)时默认为 apply。
若主机上 sysctl 已有更高的值,不会被调低。
第 4 阶段 —— 不触碰已存在的 Docker
| 本主机的 Docker | 做什么 |
|---|---|
| 本次执行新安装 | 以默认值(overlay2,DOCKER_DATA_DIR=/data1/docker-data)写入 daemon.json |
| 原本就有 | 存储(data-root · storage-driver)以运行中守护进程的 docker info 为正本,不重新写入。 变更内容仅打印,不重启 |
若要修改原有 Docker 的配置并允许重启,请给定 ALLOW_DOCKER_RECONFIGURE=1。
想使用其他 DOCKER_DATA_DIR 时同样需要它。
以前当现有 daemon.json 中缺少键时会填入默认值,结果曾导致使用其他存储根目录的
主机上的容器和镜像变得不可见。因此现在默认是«不触碰»。
ALLOW_DOCKER_RECONFIGURE=1 请仅在理解其后果时使用。
未给定 START=1 时,会创建好配置文件后停止。这是为确认取值后希望自行启动的
运维人员准备的默认行为。
常用环境变量
| 变量 | 含义 |
|---|---|
START=1 | 不在 .env 准备阶段停止,而是一直到启动 —— 此时也会自动接收模型并执行安装验证 |
INTERACTIVE=1 | 对空值进行询问(默认为非交互式) |
ENV_TEMPLATE | sidecar 的原始模板。默认 env.gb10.example(GB10 · arm64),AWS g7e 为 env.g7e.example(amd64)。不会自动选择 |
ENV_TEMPLATE_SKIP_ARCH_CHECK=1 | 模板与本机架构不一致时安装器会停止。仅在测试新硬件等有意为之的情况下跳过该检查 |
HOST_TUNING | skip · plan · apply —— 主机全局设置(区域设置 · 时区 · swap · chrony · limits · sysctl · tmpfiles · 防火墙)与软件包安装(Docker CE · NVIDIA 驱动/toolkit · jq)。为 skip · plan 时不安装软件包,也不注册 nvidia 运行时(不重启 Docker)—— 只打印将要做的事,并在缺之不可的阶段停止。默认为 apply;若主机上有其他容器运行则为 plan |
DOCKER_DATA_DIR | 本次执行新安装的 Docker 的存储根目录(默认 /data1/docker-data)。原有 Docker 仍使用自己的根目录 |
ALLOW_DOCKER_RECONFIGURE=1 | 允许更改并重启原有(运行中)Docker 的 daemon.json |
SKIP_GPU=1 | 跳过第 3b 阶段(NVIDIA 驱动 · toolkit 安装)—— 适用于驱动由运维团队另行管理的主机 |
SKIP_WAIT=1 | 跳过 START=1 之后的«等待响应»与安装验证 |
WAIT_READY_MIN | 上述等待的上限(分钟)。默认 15 |
SKIP_LOGIN=1 | 跳过内部镜像仓库登录 —— 用于隔离网络。同时跳过镜像 pull |
SKIP_PULL=1 | 在有互联网的设备上用已下载的镜像启动 |
INSECURE_REGISTRY | 将客户内部镜像仓库(HTTP)加入 daemon.json 允许列表 |
SKIP_PULL=1 可能«用旧构建启动»镜像标签为 YYYY.MM,且以相同名称更新。 本地缓存的同名标签
可能是上个月的构建。若必须确保版本一致,请勿使用该选项。
会询问什么、会«生成»什么
安装器会询问只有人或 Platform 才知道的值,而仅在堆栈内部使用的密钥由它自己生成。
| 值 | |
|---|---|
| 询问 | TLS 证书 SAN(PP_PROXY_CERT_SAN) · 接收 Platform 凭据的地址与密钥(PP_DATALAKE_ADMIN_URL · PP_DATALAKE_ADMIN_API_KEY)—— 之后逐个询问剩余的占位符(Platform API 令牌 · 管理员密码 · Neo4j 密码等) |
| 生成 | 网关主密钥 · 盐 · 推理服务器密钥 · 入站密钥 · RAG 密钥 · 管理会话密钥 · 两个存储凭据加密密钥(PI_COPILOT_SECRET_KEY · PI_DT_SECRET_KEY) |
询问发生在 INTERACTIVE=1 时。所询问的值都可以用同名环境变量传入 ——
按 PP_DATALAKE_ADMIN_URL=… PP_DATALAKE_ADMIN_API_KEY=… PP_API_TOKEN=… PI_ADMIN_PASSWORD=… bash 的方式给定时,安装器
只会把仍为占位符的键填成该值(2026.10 重新发布 —— 以前只接收 TLS SAN 和 Platform 凭据两个值)。
仍然剩余的部分可通过交互填入,或直接修改 /etc/kopens/plantpulse-ai.env。生成的值也
仅在为占位符时填入,不会覆盖人已填写的值。env 文件中已写入的 TLS SAN 在重新安装时也保持不变 —— 若要更改,
请显式指定 PP_PROXY_CERT_SAN=… 后运行。
Platform 主机(PP_HOST)以及 Platform PG · Aster TSDB · Redis 的账号 · 密码不再询问,也不写入 env。
Platform 主机由 PP_DATALAKE_ADMIN_URL 的主机推算,账号 · 密码由容器和主机脚本
在启动时从 Platform 获取。 若本次执行传入 PP_PG_USER 之类的值,只会打印不写入 env 的警告。
信任锚 root.crt 不由安装器放置,需自行准备 → 见下文「获取 Platform 凭据 —— 启动前需准备的内容」
代理的自签名证书中必须包含人实际访问时使用的地址·名称,浏览器才不会拦截。 安装器会把本主机的地址设为默认值,但 NAT 外的公网 IP · 负载均衡 VIP · 域名 在这台机器上是看不到的。交互式安装一定会询问;非交互式时只按主机地址设定并 给出警告。若通过外部名称访问,请用逗号传入多个。
curl -fsSL https://product.kopens.io/plantpulse-ai/install.sh \
| sudo PP_PROXY_CERT_SAN=ai.example.com,203.0.113.10 bash
让人照抄会导致出现又短又重复的值 —— 实际发生过两台主机一起照用文档中示例密钥 的情况。现在由安装器生成,运维人员只需轮换即可。
安装器生成的入站密钥(PI_INBOUND_API_KEY)是 RAG · 时序洞察 · 文档理解 · 视觉 · 数字主线共同
使用的入口密钥。为空时启动前判定(bin/lint-env.sh)不会拉起堆栈,各服务也会各自拒绝启动 ——
唯一能在无密钥状态下开放启动的途径,是刻意给定开发用开关 PI_INBOUND_AUTH_DISABLED=true。若手动创建了 env,
务必填好这一行 → 环境变量配置
START=1 时发生的事 —— 还多了三件
自 2026.09 起,启动路径会«获取 · 填充 · 验证»这些值。
| 阶段 | 做什么 |
|---|---|
| 占位符检查 | 🔴 若仍残留 CHANGE_ME_* 或 <PLACEHOLDER> 则停止。以前只是警告并以「安装完成」结束 |
| Platform 凭据预检 | 在拉取镜像前先从 Platform 获取一次凭据。若密钥错误或没有 root.crt,则以 [FATAL] [platform-credentials] … 不启动任何东西并停止。两个值为空时同样停止 |
| 模型自动接收 | 从 model.kopens.ai 下载缺失的模型并校验 SHA256 后解包。以前这是由人工照做的步骤 |
| 等待响应 | 等待管理控制台(:5959/health)和 RAG 入口(:7115/ping)响应,最多 WAIT_READY_MIN(15)分钟。超时则以安装失败结束。也会打印控制台 HTTPS(:5960)是否响应,但不计入失败判定 |
| 安装验证 | 检查的不是堆栈«是否起来了»,而是«是否能工作»(见下) |
占位符未填就启动,界面看起来正常,只有功能是死的。因此 START=1 时
拒绝启动。 若只想准备,不给 START 即可(隔离网络安装仍沿用稍后填值的流程)。自 2026.10 起,
之后用 bin/up.sh 启动时也会执行相同检查 —— 若残留占位符,会打印剩余键名并拒绝启动。
曾发生过在全新安装中状态全部 running · HTTP 200,却有三处是死的 —— 这三者都能通过容器健康检查。
- 没人下载模型,导致推理服务器不断重启
- 网关密钥为空值,导致所有对话都是 401
- Platform 令牌是占位符,导致 MCP 工具静默为 0 个
安装验证(bin/verify-install.sh)会检查这三项。每项检查以 OK · FAIL · 「无法测量」
作答,而无法测量的项不计为通过。
判断安装是否«正常»的四个步骤
bin/status.sh——21/21 running · HTTP=200(默认启动的二十一个)bin/verify-install.sh——OK 4 · FAIL 0。只要有一项 FAIL,安装即以失败结束- AI 管理控制台 › MCP 网关 › 服务器 —— Platform · 时序洞察 · 数字主线 · 工程计算等内置服务器应为正常,且工具数不为 0。 若为 0,请检查 Platform 令牌 → MCP 工具地图
- 用提问实际问一次 —— 曾出现 1~3 全绿但只有对话返回 401 的情况
- 首次启动的主机上可能需要启动两次。 如果文档解析器未在依赖等待时间内 变为健康状态,流程就会停在那里。重新拉起即可达到 21/21。
- 🔴 直接运行
docker compose up会回退到已部署之前的镜像。 部署只把标签绑定到那次调用, 不写入.env(这是设计行为)。拉起时请使用提供的脚本。
获取 Platform 凭据 —— 启动前需准备的内容
自 2026.10 起,Platform PG · Aster TSDB · Redis · RustFS 的账号 · 密码 · 端口由容器在启动时 从 Platform 获取(副驾 · 时序洞察 API · LightRAG · RAG API · 数字主线 · LiteLLM)。 compose 不传递这些值,因此若下面四项未备齐,这些容器会以 FATAL 停止。
| 需准备的内容 | 来源 |
|---|---|
PP_DATALAKE_ADMIN_URL | https://<플랫폼 호스트>:4950 —— 本主机即为 PP_HOST |
PP_DATALAKE_ADMIN_API_KEY | Platform 主机 /etc/kopens/plantpulse-platform.env 中同名的那一行 |
| Platform 允许列表 | 🔴 AI 主机的 IP 必须在 Platform 侧的允许列表中才能获取 |
/etc/kopens/ca/root.crt | Platform 信任锚 —— Platform GET /api/credentials/tls 响应中的 root_pem。与同一响应中的 root_fingerprint_sha256 及指纹核对后放置 |
/etc/kopens/ca/CA.crt | 与 root.crt 内容相同。应用按此名称读取 |
前两个值写入 /etc/kopens/plantpulse-ai.env —— 模板中以占位符形式存在,由交互式安装询问或
通过环境变量传入。compose 会把 /etc/kopens/ca 目录整体挂载到容器中。
- 这两个值是必填项。为空时 compose 拒绝启动;只有其中一个时容器会拒绝。
- 主机脚本(启动前的 DB 预配置等)也用相同的两个值和
root.crt从 Platform 获取。主机 env 中 没有 Platform 账号 · 密码。 - 服务器证书仅用
root.crt验证 —— 文件不存在即为 FATAL,且没有关闭验证的途径。 - 是否获取成功通过日志查看 —— 只会打印键名和数量。
docker logs plantpulse-copilot-web 2>&1 | grep credentials:
要使用视频 · 语音 —— 安装后加一行
视频 · 语音采集与对话中的语音提问默认关闭。要使用时,在主机 env 中加入 PI_MEDIA_ENABLED=true
一行,用 bin/fetch-models.sh 下载转录模型(Aura-ASR-Turbo,约 1.5 GB)后执行 bin/restart.sh。
步骤与确认方法见视频 · 语音采集。
安装之后
| 顺序 | 做什么 | 命令 · 文档 |
|---|---|---|
| 1 | 更改默认密码 | 修改初始密码 |
| 2 | 查看堆栈是否存活 | bin/status.sh · bin/health.sh |
| 3 | 定位卡在哪里 | bin/doctor.sh |
常用运维命令见 bin/ —— up.sh · down.sh · restart.sh ·
logs.sh · backup.sh · update.sh · passwd.sh。详情请参阅
服务运维。