본문으로 건너뛰기

포트 구성 정보

PlantPulse 는 Docker Compose 스택으로 동작하며, 컨테이너마다 자기 포트를 가집니다. 단일 서버 / 클러스터 모두 동일한 포트 설계를 따릅니다.

「방화벽이 열려 있다」와 「호스트에 실제로 열린다」는 다릅니다

호스트에 바인드되는 포트는 compose/docker-compose.ymlports: 가 정합니다. install.sh 가 여는 방화벽 목록은 그보다 넓습니다. 방화벽에 있다고 해서 그 포트로 응답이 오는 것은 아닙니다.

이 페이지의 첫 표가 실제로 호스트에 열리는 포트 전부입니다. 그 밖의 포트는 컨테이너 안에서만 통합니다.

어느 컨테이너가 무엇을 여나

컨테이너호스트에 여는 포트
plantpulse-proxy80 · 443 · 1883 · 1884 — 사용자와 설비가 닿는 유일한 입구
plantpulse-plugin-opcua-server11004 · 11005
plantpulse-ha10210
plantpulse-datalake인프라 계열 전부 (아래 표)
plantpulse-server-web · plantpulse-batch-web · plantpulse-warehouse · plantpulse-plugin-aasx-server없습니다 — 프록시 뒤에서만 동작합니다
plantpulse-certs없습니다 (원샷)

포트 토폴로지

외부 노출 권장 (사용자 / 외부 시스템)

포트컨테이너프로토콜용도권장
80proxyHTTP운영 콘솔 / REST API리버스 프록시 권장
443proxyHTTPS운영 콘솔 / REST API (TLS)
7443datalakeHTTPS관리 콘솔
4950datalakeHTTPS모니터 UI + /api/health모니터링 시스템
1883proxyTCPMQTT 평문 — Edge 디바이스 / 센서 수집사설망 권장
1884proxyTCP+TLSMQTT over TLS (프록시는 passthrough, 브로커가 종단)TLS 권장
11004 / 11005opcua-serverOPC-UA외부 설비가 붙는 엔드포인트TLS 권장
10210haHTTPHA 데몬 /api/health · /api/cluster — 2-클러스터 구성에서 피어가 붙습니다피어 IP only
9094datalakeTCP+TLSKafka 외부 클라이언트TLS 필수
5500 / 5501datalakeHTTP / HTTPS외부 시스템 데이터 조회API Key

운영 권고: 80/443 만 외부에 노출하고 나머지는 사설망에만 두는 구성을 권장합니다.

웹 콘솔 실시간 푸시에 별도 포트가 필요하지 않습니다

실시간 푸시는 프록시(443)를 통해 나갑니다. 별도의 WebSocket 포트를 호스트에 열지 않습니다.

메시징

포트컨테이너프로토콜용도
1883 / 1884proxyTCP / TLSMQTT (HiveMQ). 프록시가 publish 합니다
18883 / 18884datalakeTCP / TLS예약. 현재 이 포트를 여는 리스너는 없습니다
9092datalakeTCPKafka PLAINTEXT (사설망 only)
9093datalakeTCPKafka KRaft 컨트롤러
9094datalakeTCP+TLSKafka SASL_SSL
Kafka 는 프록시를 거치지 않습니다

Kafka 클라이언트는 부트스트랩 후 advertised.listeners 가 알려 준 주소로 다시 접속합니다. 앞에 프록시를 두면 그 주소까지 함께 바꿔야 하고, 틀리면 부트스트랩만 성공한 뒤 조용히 실패합니다. 그래서 Kafka 포트는 데이터레이크가 직접 publish 합니다.

STOMP(ActiveMQ)는 은퇴했습니다

브라우저 실시간 푸시가 SSE 로 바뀌면서 STOMP 브로커가 데이터레이크 이미지에서 제외되었습니다. 61000 / 61004 는 더 이상 서비스되지 않습니다. 옛 방화벽 규칙에 남아 있다면 정리해 주세요.

스토리지 (사설망 only)

포트프로토콜용도
9042CQLCassandra
7000 / 7001TCPCassandra Gossip / SSL
5432TCPPostgreSQL
6379TCPValkey (Redis 호환)
6380TCP+TLSValkey TLS 리스너
9000HTTPMinIO API
9001HTTPMinIO Console

분석 / SQL (사설망 only)

포트프로토콜용도
7077TCPSpark Master RPC
4440HTTPSpark Master UI — 8080 이 아닙니다
8081HTTPSpark Worker UI
10000ThriftKyuubi SQL Gateway
10099HTTPKyuubi REST API
19001HTTPGravitino 통합 카탈로그
9083ThriftHive Metastore
3500 / 3600HTTPLab 분석 환경
4000 / 4001HTTP / HTTPSSQL 쿼리 서비스

처리 / 시계열 (사설망 only)

포트프로토콜용도
7400 / 7401HTTP / HTTPSCEP (Esper)
7800 / 7801HTTP / HTTPS시계열 엔진(TSE)
3000HTTPGrafana 대시보드
5500 / 5501HTTP / HTTPS데이터 게이트웨이

워크플로우 (사설망 only)

포트프로토콜용도
7233gRPCTemporal Frontend
8233HTTPTemporal Web UI
8380HTTPKestra (UI + API)
8381HTTPKestra 관리(management) 포트

그 밖의 데이터레이크 포트

포트용도
7003진단 콘솔 (사설망 only)
60000 / 60001OPC Agent 데이터 수집 (사설망 only)
6199 / 6299 / 6399 / 6499 / 7099JMX agent — 관제 노드 IP 만 허용해 주세요
9500 · 9501 · 9600 은 더 이상 호스트에 열리지 않습니다

9500 / 9501 은 plantpulse-batch-web 의 Tomcat, 9600 은 plantpulse-warehouse 의 웹 서버로 앱 티어입니다. 배치·웨어하우스가 데이터레이크와 한 컨테이너에 있던 시절의 정의가 데이터레이크 쪽에 남아 있었지만 정리되었습니다.

두 애플리케이션은 각자의 컨테이너에서 돌고 호스트 포트를 열지 않으므로, 상태는 bin/status.shbin/logs.sh <컨테이너> 로 봅니다. 옛 모니터링 설정에 이 세 포트가 남아 있다면 빼 주세요.

컨테이너 내부 전용 (호스트 미공개)

아래는 컨테이너 안에서만 통하는 포트입니다. 호스트에서 curl 로 물어보면 응답이 없습니다.

포트대상대신 확인할 방법
8090 · 4800 / 4801AAS(BaSyx) V3 API · V2 Registry/AAS외부 접근이 필요하면 리버스 프록시를 별도로 검토
7199 · 7279Cassandra · HiveMQ JMXbin/shell.sh 로 데이터레이크 진입 후 확인
서버·배치·웨어하우스의 앱 포트각 앱 컨테이너 내부bin/status.sh / bin/logs.sh <컨테이너>
4949 는 평문입니다

콘솔과 헬스 API 는 두 포트 모두에서 서비스됩니다 — 4950(HTTPS)와 4949(평문 HTTP). 같은 콘솔·같은 API 이고 스킴만 다릅니다. 4949 는 더 이상 4950 으로 리다이렉트하지 않습니다.

4949 는 평문입니다 — 로그인 비밀번호와 세션 쿠키가 그대로 흐릅니다. 신뢰할 수 없는 망에서는 4950 을 쓰세요. 4949 는 자체 서명 인증서 경고가 실제로 운영자를 막아 세우는 상자를 위한 선택지입니다.

# 호스트 / 외부에서
curl -kfsS https://<서버IP>:4950/api/health | jq

# 컨테이너 안에서 (어떤 구성에서도 동작합니다)
docker exec plantpulse-datalake curl -kfsS https://127.0.0.1:4950/api/health | jq

설치 전 포트 충돌 확인

# 핵심 포트 점유 확인
ss -tlnp | grep -E ':(80|443|1883|1884|3000|4000|4950|5432|5500|6379|7077|7233|7400|7443|7800|8233|8380|9000|9042|9092|10000|10210|11004|19001)\s'

출력이 없으면 충돌 없음. 출력이 있다면:

# 점유 프로세스 확인
sudo lsof -i :<포트>
sudo ss -tlnp | grep ":<포트>"

자주 충돌하는 포트: 80 (Apache/Nginx), 5432 (외부 PostgreSQL), 3000 (Grafana/Node.js), 9092 (외부 Kafka), 6379 (외부 Redis). 외부 서비스를 사용 중이라면 그 서비스의 포트를 옮기는 편이 간단합니다.

bin/preflight.sh 가 설치 전에 주요 포트(80 · 443 · 7443 · 4949 · 4950)를 비파괴로 점검합니다.

방화벽 설정 예시

install.sh 가 호스트 방화벽(firewalld / ufw)을 자동으로 설정합니다. 아래는 상위 방화벽(회사 네트워크, 클라우드 보안 그룹, 라우터)에서 직접 허용해야 할 때의 예시입니다.

firewalld (RHEL/Rocky/Oracle)

# 외부 노출 (모든 IP)
for port in 80 443 7443 4950; do
firewall-cmd --permanent --add-port=${port}/tcp
done

# 외부 노출 (TLS 메시징 / 설비)
for port in 1884 9094 11004 11005; do
firewall-cmd --permanent --add-port=${port}/tcp
done

# 사설망 only (RFC 1918 + Tailscale CGN 허용)
for src in 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 100.64.0.0/10; do
for port in 1883 5432 6379 7077 7233 7800 8233 8380 9000 9001 9042 9092 10000 10210 19001; do
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=${src} port port=${port} protocol=tcp accept"
done
done

firewall-cmd --reload

ufw (Ubuntu)

# 외부 노출
for port in 80 443 7443 4950 1884 9094 11004 11005; do
ufw allow ${port}/tcp
done

# 사설망 only
for port in 1883 5432 6379 7077 7233 7800 8233 8380 9000 9042 9092 10000 10210 19001; do
for src in 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 100.64.0.0/10; do
ufw allow from $src to any port $port
done
done

ufw enable

자동 설정 확인

# RHEL/Rocky/Oracle
sudo firewall-cmd --list-ports
sudo firewall-cmd --list-rich-rules

# Ubuntu
sudo ufw status numbered

클라우드 보안 그룹 (예: AWS / GCP / Azure)

호스트 방화벽 외에 클라우드 보안 그룹도 동일하게 설정해야 합니다.

인바운드 규칙소스포트
운영 콘솔0.0.0.0/0 (또는 회사 IP)80, 443, 7443
헬스체크모니터링 노드4950
MQTT디바이스1883, 1884
OPC-UA설비11004, 11005
Kafka TLS외부 클라이언트9094
사설망VPC CIDR1883, 5432, 6379, 7077, 9042, 9092, 10000, 10210, …

관련 문서