서비스 포트 맵
외부로 열리는 것은 하나뿐입니다
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 | 그래프 DB 관리 UI (plantpulse-neo4j — RAG 지식 그래프) |
| 7687 | Neo4j Bolt | 그래프 DB 쿼리 프로토콜 (같은 인스턴스) |
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 에 열려 있으므로 커미셔닝 때 비밀번호를 바꾸십시오 →
초기 비밀번호 변경
프로필을 켜야 뜨는 것
기본 기동에는 포함되지 않고, 해당 compose 프로필로 올릴 때만 뜹니다.
| 포트 | 서비스 | 프로필 |
|---|---|---|
| 5000 | 로컬 이미지 레지스트리 | registry |
LOCAL_REGISTRY_UI_PORT(기본 5080) | 레지스트리 관리 UI | registry |
| (발행 안 함 — 안쪽 8000) | 녹취 vLLM plantpulse-asr | media |
| (네트워크 없음) | 녹취 오디오 라이브러리 plantpulse-asr-audio — 일회성 | media |
registry 는 폐쇄망에서 이미지를 내부에서 받게 할 때 씁니다 → 폐쇄망 설치.
media 는 영상 · 음성 녹취용입니다. 프로필 이름을 손으로 주지 않고 호스트 env 의 PI_MEDIA_ENABLED=true 한 줄로 켭니다 —
운영 스크립트가 그 값을 보고 프로필을 붙입니다 → 영상 · 음성 수집
Arize Phoenix(트레이스 UI · OTLP 수집, 6006)는 기본으로 뜹니다 — 프로필을 켤 필요가 없습니다. 다만 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 프로필을 켰을 때만) |
| 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 | 벡터 DB |
| 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 프로필일 때만 뜹니다 |
| 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 <포트> && echo "OK" || echo "DOWN"
# 포트 사용 프로세스 확인
ss -tlnp | grep <포트>
방화벽에 열 것
| 대상 | 열 포트 |
|---|---|
| 전체 사용자 | 80 / 443 (프록시) |
| 운영자 (사내망) | 5959 · 5960 관리 콘솔, 7474 Neo4j Browser |
| MCP 클라이언트 (사내망) | 7115 RAG, 8970 TimeSeries |
설치기(install.sh)는 방화벽을 연 뒤 이 포트 중 이 스택 밖의 프로세스가 이미 쥔 것을 경고로
찍습니다 — 그대로 두면 첫 bin/up.sh 가 스택을 반쯤 띄운 뒤 «address already in use» 로 멈춥니다. 그 포트를
비우거나, 옮길 수 있는 세 키(PI_LITELLM_PORT · PI_ADMIN_WEB_PORT · PI_ADMIN_WEB_TLS_PORT)를 호스트 env 에서
바꾸십시오. 나머지 포트는 compose 에 고정돼 있습니다.
그 밖의 포트는 사내망 안에서도 열 이유가 없습니다. 데이터베이스 포트(5432 · 9042 · 6333 6379 · 7687 · 9000)는 어떤 경우에도 외부에 노출하지 마십시오.