服务端口映射
对外开放的只有一个
在 AI 技术栈中,占用主机 80 / 443 的只有 plantpulse-proxy(nginx) 这一个。
无论是聊天界面、管理控制台,还是各个 API,全部都经由该代理进入。管理控制台的 HTTPS
端口(默认 5960)也由该代理接收 —— 请参阅下文。
AI Chat Web 仅在容器内部(expose: 8080)开放。对外暴露的入口只有代理一个 —— 将暴露点集中到一处,在那里统一处理防火墙、审计与 TLS。
按主机名分流
代理依据 Host 头选择后端。因此必须在 DNS 中将下列名称指向代理 IP,才能访问各服务。
后端直接使用容器名 —— 下表中的值即写入 nginx set $upstream 的字符串,在容器内执行 curl 时也使用该名称。
| 主机 | 后端(容器名:端口) | 用途 |
|---|---|---|
| 其余全部(默认) | plantpulse-copilot-web:8080 | AI Chat Web —— 聊天界面 |
admin.* | plantpulse-admin-web:8080 | 管理控制台 |
llm.* | plantpulse-litellm:4000 | LLM 网关(OpenAI 兼容) |
rag.* | plantpulse-rag-api:7115 | RAG 检索 API |
timeseries.* | plantpulse-timeseries-insight-api:8970 | 时序洞察 API |
parser.* | plantpulse-document-understanding-api:7120 | 文档解析 API |
vision.* | plantpulse-vision-api:7130 | 视觉 API |
默认主机下的路径 —— 仅用一个域名时
为免再创建子域名,**默认主机(聊天界面一侧)**上同时开放了下列路径。用一个域名和一张证书即可访问网关与 MCP 服务器。
| 路径 | 后端 | 用途 |
|---|---|---|
/mcp/gateway/ | plantpulse-mcp-gateway-api:7160/mcp/ | MCP 网关 —— 外部 MCP 客户端接入的地址(网关密钥 ppgw_…)。管理 REST /api/v1 不对外开放 |
/llm/ | plantpulse-litellm:4000/ | LLM 网关(OpenAI 兼容)—— base_url = "https://<호스트>/llm/v1" |
/mcp/rag/ | plantpulse-rag-api:7115/mcp/ | RAG MCP 服务器 |
/mcp/timeseries/ | plantpulse-timeseries-insight-api:8970/mcp/ | 时序洞察 MCP 服务器 |
/mcp/parser/ | plantpulse-document-understanding-api:7120/mcp/ | 文档解析 MCP 服务器 |
/mcp/vision/ | plantpulse-vision-api:7130/mcp/ | 视觉 MCP 服务器 |
- 请连末尾斜杠一并写上。若不带斜杠访问,会自动补成
308(请求体会被保留)。 - MCP 传输仅支持 Streamable HTTP,不提供
/sse。 - 认证由后端完成,而非代理。四个 MCP 在没有
X-API-Key: <PI_INBOUND_API_KEY>(或 Bearer)时一律返回401。/llm/使用网关的主密钥或虚拟密钥。 - 各后端的指标
/metrics不是新端口,而是同一端口下的路径,同样位于入站密钥之后 (2026.10 重新发布)→ 日志与监控
/llm/ui 打开由于转发时会剥离路径前缀,管理界面的资源链接会错位。请通过 llm.* 主机或直接开放的 :4000/ui 打开管理界面。
这些路径可通过公网公开名称直接访问。若 PI_INBOUND_API_KEY 为空,启动前校验会阻止技术栈启动,但 CHANGE_ME_… 占位符能通过该检查。安装完成后务必用 bin/doctor.sh 确认没有遗留的占位符。
copliot 是仓库名,容器名为 copilot仓库名为 plantpulse-ai-copliot-web(拼写错误被沿用至今),但容器名是 plantpulse-copilot-web。若按仓库拼写执行 docker logs 将找不到容器。
代理同时监听 443,但在前端另设负载均衡器或反向代理的部署中,TLS 在那里终止,到达代理的是明文。若配置为忽略前端终止,将产生无限重定向。请先确认属于哪种形态。
管理控制台也通过端口开放
以 IP 访问的内网用户没有主机名,无法在 443 上选中管理控制台。因此自 2026.10 起,管理控制台有两个按端口区分的入口。
| 地址 | 接收方 | 键(默认值) |
|---|---|---|
http://<AI_SERVER_IP>:5959 | 直连 plantpulse-admin-web:8080(明文) | PI_ADMIN_WEB_PORT (5959) |
https://<AI_SERVER_IP>:5960 | 代理终止 TLS 后转至 plantpulse-admin-web:8080 | PI_ADMIN_WEB_TLS_PORT (5960) |
- 两者都开放。明文入口不会被重定向回 HTTPS。
- HTTPS 证书与 443 使用同一套(代理的证书)。控制台不单独持有证书。
- 如需更改端口,修改主机 env(
/etc/kopens/plantpulse-ai.env)中上述两个键后重新启动。
旧版本将管理控制台开放在 :9080。2026.10 中改为 5959(HTTP) · 5960(HTTPS),且控制台容器改为非 root nginx,内部端口也由 80 改为 8080。请一并更新书签与防火墙规则。
代理同样以非 root 运行 —— 外部端口不变,仅内部端口变更
2026.10 的 plantpulse-proxy 不以 root 运行,而是以 uid 10001、gid 0 运行,在容器内部不开放 1024 以下端口。主机(外部)可见的端口没有变化。
| 主机(外部) | 代理内部 | 用途 |
|---|---|---|
| 80 | 8080 | HTTP(明文) |
| 443 | 9443 | HTTPS —— 聊天界面 · admin.* 等按名称路由 |
PI_ADMIN_WEB_TLS_PORT (5960) | 8443 | 管理控制台 HTTPS |
防火墙、前端负载均衡器与 DNS 仍按原样面向 80 · 443 · 5960 即可。内部端口由 compose 与代理镜像在同一发布版本中一同变更,因此若仅将代理镜像回退到旧版本,连接会被拒绝 —— 回退时请将整个技术栈统一到同一版本。
证书卷(pp-proxy-certs)如果是在 root 时期创建的,密钥为 root 专属,非 root 代理无法读取。
bin/up.sh · restart.sh · update.sh 会在启动前一次性校正属主 →
服务运维
直接对 LAN 开放的端口
这些端口不经过代理,直接发布到主机。不是绑定到 127.0.0.1,而是开放在所有网络接口上 —— 请用防火墙阻止从内网之外访问。
| 端口 | 服务 | 为何开放 |
|---|---|---|
| 80 / 443 | plantpulse-proxy | 唯一的用户接入点 |
| 4000 | LiteLLM | LLM 网关直连(也可通过 llm.* 访问) |
| 7115 | RAG API | 供 MCP 客户端(Claude Desktop 等)直连 |
| 8970 | 时序洞察 API | 供 MCP 客户端直连 |
| 5959 | 管理控制台(plantpulse-admin-web)—— HTTP | 运维人员用。也可通过 admin.* 访问 |
| 5960 | 管理控制台 —— HTTPS(由 plantpulse-proxy 接收) | 运维人员用。证书与 443 相同 |
| 7474 | Neo4j Browser | 图数据库管理 UI(plantpulse-neo4j —— RAG 知识图谱) |
| 7687 | Neo4j Bolt | 图数据库查询协议(同一实例) |
自 2026.10 起会额外启动一个数字主线专用 Neo4j(plantpulse-digital-thread-neo4j)。该实例不发布端口 —— 只有 plantpulse-digital-thread-api 在 compose 网络内部连接它。上表中的 7474 · 7687 是原有的 plantpulse-neo4j(LightRAG 的知识图谱)→
数字主线
:4000/ui 是 LiteLLM 管理界面,使用 PI_LITELLM_UI_USERNAME · PI_LITELLM_UI_PASSWORD(默认
admin / admin123!)登录。由于该端口对 LAN 开放,请在调试投运时修改密码 →
初始密码变更
需启用 profile 才会启动的服务
不包含在默认启动中,只有以对应 compose profile 启动时才会运行。
| 端口 | 服务 | profile |
|---|---|---|
| 5000 | 本地镜像仓库 | registry |
LOCAL_REGISTRY_UI_PORT(默认 5080) | 仓库管理 UI | registry |
| (不发布 —— 内部 8000) | 录音转写 vLLM plantpulse-asr | media |
| (无网络) | 录音音频库 plantpulse-asr-audio —— 一次性 | media |
registry 用于在隔离网络中从内部获取镜像 → 隔离网络安装。
media 用于视频 · 语音录制转写。无需手动指定 profile 名称,只需在主机 env 中配置 PI_MEDIA_ENABLED=true 一行即可启用 ——
运维脚本会据此附加 profile → 视频 · 语音采集
Arize Phoenix(追踪 UI · OTLP 采集,6006)默认启动 —— 无需启用 profile。 但自 2026.09 起不再发布主机端口。原因在于 Phoenix 没有认证,而其中保存的是提问与回答的正文(包含工具参数中的设备 id · 标签)。管理控制台的状态检查走容器内部地址,因此不受影响。如诊断需要,可按下文「诊断用端口」临时开放。
2026-07 改版时移除的 Langflow(7860) · Jupyter(3500) 已彻底删除,无法恢复。
诊断用端口 —— PP_DEBUG_PORTS=1
仅在诊断时,将平时关闭的端口按原样开放(compose/docker-compose.debug.yml 覆盖层)。
cd /opt/kopens/plantpulse-ai-docker
PP_DEBUG_PORTS=1 bin/compose-up.sh
| 端口 | 服务 |
|---|---|
| 9081 | 管理控制台后端(admin-api) |
| 8000 · 8003 · 8004 | vLLM 生成 · 嵌入 · 重排序 |
| 8005 | 录音转写 vLLM(仅在启用 media profile 时) |
| 5001 | docling |
| 8980 | 时序推理服务器 |
| 9400 | DCGM Exporter |
| 6333 | Qdrant |
| 6006 | Phoenix |
诊断结束后,请在不带 PP_DEBUG_PORTS 的情况下重新启动以关闭它们。
仅限内部(不发布)
只能在 compose 网络内通过服务名访问。在主机上用 nc -z 探测无响应是正常现象。
| 服务 | 内部地址(容器名:端口) | 作用 |
|---|---|---|
| AI Chat Web | plantpulse-copilot-web:8080 | 聊天界面(代理的默认后端) |
| 管理控制台后端 | plantpulse-admin-api | 认证主体。由 plantpulse-admin-web 的 nginx 转发 |
| 文档解析 API | plantpulse-document-understanding-api:7120 | parser.* 的后端 |
| 视觉 API | plantpulse-vision-api:7130 | vision.* 的后端 |
| LightRAG | plantpulse-lightrag:9621 | RAG 引擎。文档管理 WebUI(/webui) |
| Qdrant | plantpulse-qdrant:6333 | 向量数据库 |
| Docling | plantpulse-docling-serve:5001 | 文档转换 |
| vLLM(生成) | plantpulse-llm:8000 | 本地 LLM 推理 |
| vLLM(嵌入) | plantpulse-emb:8000 | 嵌入 |
| vLLM(重排序) | plantpulse-rerank:8000 | 重排序 |
| 时序推理 | plantpulse-timeseries-insight-server:8980 | 洞察模型服务 |
| 录音转写 vLLM | plantpulse-asr:8000 | 语音 → 文字。仅在 media profile 下启动 |
| DCGM Exporter | plantpulse-dcgm:9400 | GPU 指标 |
| Phoenix | plantpulse-phoenix:6006 | 追踪 UI · OTLP 采集(默认启动,不发布) |
| 数字主线 API | plantpulse-digital-thread-api:7140 | 连接器注册表 · 工厂图谱镜像 · 聊天用 thread_ 工具。由管理控制台与 MCP 网关调用 |
| 数字主线 Neo4j | plantpulse-digital-thread-neo4j:7474 | 工厂图谱镜像存储。仅数字主线 API 连接 |
| 工程计算 API | plantpulse-engcalc-api:7150 | 聊天用 eng_ 工具(MCP /mcp/)。仅 MCP 网关调用 |
| MCP 网关 | plantpulse-mcp-gateway-api:7160 | 汇集平台 · 内置 · 外部 MCP 服务器的单一地址(/mcp/)与管理 REST(/api/v1)。由副驾驶与管理控制台调用。存储为平台 PG pi 的 gw 模式(2026.10 再发布(2026-10-20)) |
plantpulse-mcp-server(50000) 与 plantpulse-ontology(8888) 已不再作为独立服务存在。MCP · 本体论工具由平台的 server-web 集成 MCP(/api/v5/mcp,api_key 认证)提供。
从平台借用的服务
PostgreSQL(5432) · Aster TSDB(9042) · Redis/Valkey(6379) · RustFS(9000/9001) 不由 AI 技术栈启动,而是共用 PlantPulse 平台的安装实例。这些端口的防火墙与账号遵循平台侧的安全设置。
端口状态确认
整体状态确认
cd /opt/kopens/plantpulse-ai-docker/bin
./status.sh
health.sh 会一并探测各服务的健康检查端点。容器已启动与实际能响应是两回事,故障排查时请使用此方式。
单个端口确认
# 특정 포트 리스닝 확인
nc -z 127.0.0.1 <port> && echo "OK" || echo "DOWN"
# 포트 사용 프로세스 확인
ss -tlnp | grep <port>
防火墙需开放的端口
| 对象 | 需开放端口 |
|---|---|
| 全体用户 | 80 / 443(代理) |
| 运维人员(内网) | 5959 · 5960 管理控制台,7474 Neo4j Browser |
| MCP 客户端(内网) | 7115 RAG,8970 TimeSeries |
安装程序(install.sh)在开放防火墙后,会将这些端口中已被本技术栈之外的进程占用的以警告形式输出 —— 若置之不理,首次 bin/up.sh 会在技术栈启动到一半时以 «address already in use» 中断。请释放该端口,或在主机 env 中修改可迁移的三个键(PI_LITELLM_PORT · PI_ADMIN_WEB_PORT · PI_ADMIN_WEB_TLS_PORT)。其余端口在 compose 中是固定的。
其他端口即便在内网也没有开放的理由。数据库端口(5432 · 9042 · 6333 6379 · 7687 · 9000)在任何情况下都不得对外暴露。