跳到主要内容

服务运维

AI 技术栈是**docker compose 唯一的一个**。运维命令全部都在安装本体的 bin/ 中, 会代为调用 compose。

cd /opt/kopens/plantpulse-ai-docker/bin

常用命令​

想做的事命令备注
启动./up.sh退出码为 0 即为«已就绪»
关闭./down.sh
重新启动./restart.sh为 0 则重启后已就绪
查看当前状态./status.shcompose 技术栈状态摘要
详细诊断./health.sh按服务划分的详细报告
跟踪查看日志./logs.sh
重新拉取镜像并上线./update.sh拉取后一并重启
请相信退出码

up.sh · restart.sh 以 0 来通知的不是容器已启动,而是已可以使用。 在脚本中自动化时,无需额外添加等待循环。

排查问题所在时​

./doctor.sh

🔴 doctor.sh 不会改动任何东西。 只读取并判断。因此在故障期间 可以放心先行运行——修复与否由人来决定。

env 文件中会阻碍启动的行标记为 «bad»;而保留原样也不会产生任何变化的旧名称 · 重复行(启动前判定的 [warn] — alias · oldname · media-same)则单独显示为 «old or redundant lines»。后者 并非故障原因。整理用的命令由 bin/lint-env.sh 给出 → 环境变量设置

仅操作单个容器时​

若无需撼动整个技术栈,可在脚本中指定服务名称。

cd /opt/kopens/plantpulse-ai-docker/bin
./status.sh # 무엇이 떠 있나
./restart.sh plantpulse-rag-api # 0 이면 재시작 후 준비됨
./logs.sh plantpulse-lightrag
不要直接手动调用 docker compose

compose 文件位于 compose/ 之下,配置位于 /etc/kopens/plantpulse-ai.env。在安装目录下 直接执行 docker compose …,可能找不到文件,即使找到了也会以不同的配置运行——如果是 up, 已部署的镜像可能会被回退。脚本会明确指定 compose 文件和配置文件来调用。

容器名称及各自的职责见安装概览中的表格。

需要进入容器内部时:

bin/shell.sh plantpulse-rag-api

日志​

./logs.sh # 스택 전체를 따라 본다
./logs.sh plantpulse-llm # 서비스 하나

容器日志由Docker 负责轮转(已在 compose 中配置)。主机上不会 积累需要单独清理的文件。

容器以非 root 方式运行​

自 2026.10 起,compose 中的所有服务都明确指定了运行用户(user:),以 root 方式运行的 只有读取 GPU 指标的 plantpulse-dcgm 一个(读取 GPU 性能剖析字段需要 root 和 SYS_ADMIN)。

内容运行用户 (uid:gid)
我们的镜像 — 入口代理 · 协作助手 · 管理控制台 · RAG · 时序洞察 · 文档理解 · 视觉 · 数字线程等10001:0
vLLM(plantpulse-llm · -emb · -rerank,开启视频 · 语音的安装中的 plantpulse-asr) · plantpulse-asr-audio10001:0
Neo4j 两者7474:7474
Qdrant1000:1000
Phoenix65532:65532
Docling1001:0
plantpulse-dcgmroot(例外)

随着入口代理(plantpulse-proxy)也改为非 root 运行,容器内部端口变更为 8080 · 9443 · 8443。 主机上可见的 80 · 443 · 5960 保持不变 → 服务端口映射

旧安装中以 root 创建的写入卷,非 root 进程无法写入。Docker 不会更改已存在卷的 所有者,写入失败通常是悄无声息的(例如不写入日志文件而只输出到控制台)或者直接崩溃(Qdrant 在 root 所有的存储上会直接挂掉)。因此 up.sh · restart.sh · update.sh 所经过的启动脚本 会在启动 compose 之前调用 bin/volumes-nonroot.sh。

服务调整对象调整后的所有者
plantpulse-copilot-web · plantpulse-timeseries-insight-api应用日志10001:0
plantpulse-timeseries-insight-server应用日志 · 按安装定制的微调权重10001:0
plantpulse-lightrag索引存储 · 输入原始数据10001:0
vLLM 系列(录音 plantpulse-asr 仅在开启的安装中)编译缓存10001:0
plantpulse-asr-audio(仅在开启的安装中)音频库卷(pi-asr-audio)10001:0
plantpulse-neo4j · plantpulse-digital-thread-neo4j数据7474:7474
plantpulse-qdrant向量存储1000:1000
plantpulse-phoenix数据65532:65532
plantpulse-proxy证书(pp-proxy-certs)10001:0
plantpulse-registry(仅在开启对应配置时)镜像存储10001:0

只有在存在哪怕一个非该服务用户的文件时才会进行调整,因此首次会执行一次调整,此后只是确认而 直接通过。若无法完成调整则会停止启动(因为所有权不正确的情况下启动,写入会悄无声息地失败)。

直接手动调用 docker compose up 会跳过此步骤

2026.09 及以下版本启动的主机,首次启动务必使用 bin/up.sh(或 update.sh · restart.sh)。

默认不启动的内容 — compose 配置文件(profile)​

配置文件容器用途
registryplantpulse-registry · plantpulse-registry-ui隔离网络枢纽节点的本地镜像存储
mediaplantpulse-asr · plantpulse-asr-audio视频 · 语音录音(含语音提问)。通过主机 env 中的一行 PI_MEDIA_ENABLED=true 开启 —— 运维脚本(up.sh · restart.sh · status.sh · logs.sh 等)会读取该值并附加相应配置文件 → 视频 · 语音采集

media 请不要直接指定配置文件名称,而使用 PI_MEDIA_ENABLED 开启 —— 该开关会一并调整 rag-api · 文档理解的取值 以及是否拉取录音模型。若在主机 env 中写入 COMPOSE_PROFILES,启动前判定会以 unknown 来启动。

plantpulse-asr-audio 是将音频库迁移到卷中后即结束的一次性服务。在 status.sh 中 显示«Exited (0)»即为正常,会计入正常。若以非 0 的代码结束,则 plantpulse-asr 也不会启动。

备份与密码​

想做的事命令文档
启动备份./backup.sh(具体备份内容见 ./backup.sh --list —— 日志 · 缓存以及录音音频库卷不包含在内)数据库管理
更改密码 · 密钥./passwd.sh更改密码 · API 密钥
卸载安装./remove.sh无法撤销

数据库使用的是 Platform 的​

PostgreSQL · Aster TSDB · Redis(Valkey) · RustFS 并非由 AI 技术栈启动。 与 Platform 安装实例共用(PP_DATALAKE_ADMIN_URL 的主机)。这四者一旦停止,AI 也会随之停止, 因此发生故障时请先通过服务端口映射判断问题出在哪一侧。

自 2026.10 起,该账户 · 密码由容器在启动时从 Platform 获取。 若 Platform 无法连通, 接收方容器会以 FATAL 停止;若在 Platform 中更改了密码,只需重启对应容器即 可解决 → 环境变量设置

相关文档​