Port Configuration Reference
PlantPulse operates as a Docker Compose stack, with each container maintaining its own ports. Both single-server and cluster deployments follow the same port design.
The ports bound to the host are determined by compose/docker-compose.yml's ports:. The firewall list that install.sh opens is broader. Having a port in the firewall does not mean a response comes back on that port.
The first table on this page shows all ports actually open on the host. All other ports work only inside containers.
Which container opens what
| Container | Ports open to host |
|---|---|
plantpulse-proxy | 80 · 443 · 1883 · 1884 — the only gateway users and equipment touch |
plantpulse-plugin-opcua-server | 11004 · 11005 |
plantpulse-ha | 10210 |
plantpulse-datalake | All infrastructure tier (table below) |
plantpulse-server-web · plantpulse-batch-web · plantpulse-warehouse · plantpulse-plugin-aasx-server | None — operate only behind the proxy |
plantpulse-certs | None (one-shot) |
Port topology
Recommended external exposure (users / external systems)
| Port | Container | Protocol | Purpose | Recommended |
|---|---|---|---|---|
| 80 | proxy | HTTP | Operations console / REST API | Reverse proxy recommended |
| 443 | proxy | HTTPS | Operations console / REST API (TLS) | ✓ |
| 7443 | datalake | HTTPS | Admin console | ✓ |
| 4950 | datalake | HTTPS | Monitor UI + /api/health | Monitoring systems |
| 1883 | proxy | TCP | MQTT plaintext — Edge device / sensor collection | Private network recommended |
| 1884 | proxy | TCP+TLS | MQTT over TLS (proxy passthrough, broker end-to-end) | TLS recommended |
| 11004 / 11005 | opcua-server | OPC-UA | External equipment endpoint | TLS recommended |
| 10210 | ha | HTTP | HA daemon /api/health · /api/cluster — peers connect in 2-cluster setup | Peer IP only |
| 9094 | datalake | TCP+TLS | Kafka external clients | TLS required |
| 5500 / 5501 | datalake | HTTP / HTTPS | External system data queries | API Key |
Operations recommendation: expose only 80/443 to the outside; keep all others on private networks.
Real-time push goes through the proxy (443). No separate WebSocket port is opened to the host.
Messaging
| Port | Container | Protocol | Purpose |
|---|---|---|---|
| 1883 / 1884 | proxy | TCP / TLS | MQTT (HiveMQ). proxy publishes |
| 18883 / 18884 | datalake | TCP / TLS | Reserved. No listeners on these ports currently |
| 9092 | datalake | TCP | Kafka PLAINTEXT (private network only) |
| 9093 | datalake | TCP | Kafka KRaft controller |
| 9094 | datalake | TCP+TLS | Kafka SASL_SSL |
Kafka clients, after bootstrap, reconnect to the address that advertised.listeners provides. A proxy in front requires rewriting that address too, and if wrong, bootstrap succeeds but then fails silently. Therefore, Kafka ports are published directly by the datalake.
With browser real-time push moving to SSE, the STOMP broker was removed from the datalake image. 61000 / 61004 are no longer serviced. Clean up any old firewall rules mentioning them.
Storage (private network only)
| Port | Protocol | Purpose |
|---|---|---|
| 9042 | CQL | Cassandra |
| 7000 / 7001 | TCP | Cassandra Gossip / SSL |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Valkey (Redis-compatible) |
| 6380 | TCP+TLS | Valkey TLS listener |
| 9000 | HTTP | MinIO API |
| 9001 | HTTP | MinIO Console |
Analytics / SQL (private network only)
| Port | Protocol | Purpose |
|---|---|---|
| 7077 | TCP | Spark Master RPC |
| 4440 | HTTP | Spark Master UI — not 8080 |
| 8081 | HTTP | Spark Worker UI |
| 10000 | Thrift | Kyuubi SQL Gateway |
| 10099 | HTTP | Kyuubi REST API |
| 19001 | HTTP | Gravitino unified catalog |
| 9083 | Thrift | Hive Metastore |
| 3500 / 3600 | HTTP | Lab analytics environment |
| 4000 / 4001 | HTTP / HTTPS | SQL query service |
Processing / Time series (private network only)
| Port | Protocol | Purpose |
|---|---|---|
| 7400 / 7401 | HTTP / HTTPS | CEP (Esper) |
| 7800 / 7801 | HTTP / HTTPS | Time series engine (TSE) |
| 3000 | HTTP | Grafana dashboard |
| 5500 / 5501 | HTTP / HTTPS | Data Gateway |
Workflow (private network only)
| Port | Protocol | Purpose |
|---|---|---|
| 7233 | gRPC | Temporal Frontend |
| 8233 | HTTP | Temporal Web UI |
| 8380 | HTTP | Kestra (UI + API) |
| 8381 | HTTP | Kestra management port |
Other datalake ports
| Port | Purpose |
|---|---|
| 7003 | Diagnostics console (private network only) |
| 60000 / 60001 | OPC Agent data collection (private network only) |
| 6199 / 6299 / 6399 / 6499 / 7099 | JMX agent — allow management node IP only |
9500 / 9501 were Tomcat in plantpulse-batch-web, and 9600 was the web server in plantpulse-warehouse — app tier. Definitions from when batch and warehouse lived in the same container as datalake lingered on the datalake side but have been cleaned up.
Both applications run in their own containers and do not open host ports; check their status via bin/status.sh and bin/logs.sh <컨테이너> instead. If these three ports remain in old monitoring settings, remove them.
Container-internal only (not exposed to host)
The following ports work only inside containers. Querying them from the host via curl gets no response.
| Port | Target | Check instead |
|---|---|---|
| 8090 · 4800 / 4801 | AAS (BaSyx) V3 API · V2 Registry/AAS | Contact reverse proxy separately if external access is needed |
| 7199 · 7279 | Cassandra · HiveMQ JMX | Enter datalake via bin/shell.sh to inspect |
| App ports of server, batch, warehouse | Each app container internal | bin/status.sh / bin/logs.sh <컨테이너> |
Console and health API are serviced on both ports — 4950 (HTTPS) and 4949 (plaintext HTTP). Same console, same API, scheme only differs. 4949 no longer redirects to 4950.
4949 is plaintext — login passwords and session cookies flow unencrypted. On untrusted networks, use 4950. Port 4949 exists as an option for environments where self-signed certificate warnings actually block operators.
# 호스트 / 외부에서
curl -kfsS https://<server-ip>:4950/api/health | jq
# 컨테이너 안에서 (어떤 구성에서도 동작합니다)
docker exec plantpulse-datalake curl -kfsS https://127.0.0.1:4950/api/health | jq
Check for port conflicts before installation
# 핵심 포트 점유 확인
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'
No output means no conflicts. If there is output:
# 점유 프로세스 확인
sudo lsof -i :<port>
sudo ss -tlnp | grep ":<port>"
Frequently conflicting ports: 80 (Apache/Nginx), 5432 (external PostgreSQL), 3000 (Grafana/Node.js), 9092 (external Kafka), 6379 (external Redis). If you run external services, moving their ports is simpler.
bin/preflight.sh performs non-destructive inspection of major ports (80 · 443 · 7443 · 4949 · 4950) before installation.
Firewall setup examples
install.sh automatically configures host firewall (firewalld / ufw). Below are examples for when you must allow ports directly on an upstream firewall (corporate network, cloud security group, router).
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
Verify automatic configuration
# RHEL/Rocky/Oracle
sudo firewall-cmd --list-ports
sudo firewall-cmd --list-rich-rules
# Ubuntu
sudo ufw status numbered
Cloud security groups (e.g., AWS / GCP / Azure)
Cloud security groups must be configured identically alongside host firewall rules.
| Inbound rule | Source | Port |
|---|---|---|
| Operations console | 0.0.0.0/0 (or company IP) | 80, 443, 7443 |
| Health check | Monitoring node | 4950 |
| MQTT | Devices | 1883, 1884 |
| OPC-UA | Equipment | 11004, 11005 |
| Kafka TLS | External clients | 9094 |
| Private network | VPC CIDR | 1883, 5432, 6379, 7077, 9042, 9092, 10000, 10210, … |
Related documentation
- System Requirements — hardware / OS / tuning
- One-line Installation (recommended) — automatic firewall setup
- Docker Installation — container composition and port mapping
- Module Index — per-module port details
- Admin: Port and Service Management — operations inspection procedures