服务运维
AI 技术栈是**docker compose 唯一的一个**。运维命令全部都在安装本体的 bin/ 中,
会代为调用 compose。
cd /opt/kopens/plantpulse-ai-docker/bin
常用命令
| 想做的事 | 命令 | 备注 |
|---|---|---|
| 启动 | ./up.sh | 退出码为 0 即为«已就绪» |
| 关闭 | ./down.sh | |
| 重新启动 | ./restart.sh | 为 0 则重启后已就绪 |
| 查看当前状态 | ./status.sh | compose 技术栈状态摘要 |
| 详细诊断 | ./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 composecompose 文件位于 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-audio | 10001:0 |
| Neo4j 两者 | 7474:7474 |
| Qdrant | 1000:1000 |
| Phoenix | 65532:65532 |
| Docling | 1001:0 |
plantpulse-dcgm | root(例外) |
随着入口代理(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)
| 配置文件 | 容器 | 用途 |
|---|---|---|
registry | plantpulse-registry · plantpulse-registry-ui | 隔离网络枢纽节点的本地镜像存储 |
media | plantpulse-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 中更改了密码,只需重启对应容器即 可解决 → 环境变量设置