Zum Hauptinhalt springen

Port-Konfigurationsinformationen

PlantPulse wird als Docker Compose-Stack betrieben, wobei jeder Container über eigene Ports verfügt. Sowohl Einzelserver als auch Cluster folgen demselben Port-Design.

«Firewall ist offen» und «tatsächlich am Host offen» sind zwei verschiedene Dinge

Die am Host gebundenen Ports werden durch ports: in compose/docker-compose.yml bestimmt. Die von install.sh geöffnete Firewall-Liste ist umfangreicher. Nur weil ein Port in der Firewall steht, bedeutet dies nicht, dass über diesen Port eine Antwort erfolgt.

Die erste Tabelle dieser Seite enthält alle Ports, die tatsächlich am Host geöffnet werden. Alle anderen Ports funktionieren nur innerhalb der Container.

Welcher Container öffnet was​

ContainerAm Host geöffnete Ports
plantpulse-proxy80 · 443 · 1883 · 1884 — Einziger Zugang für Benutzer und Anlagen
plantpulse-plugin-opcua11004 · 11005
plantpulse-ha10210
plantpulse-datalakeAlle Infrastruktur-Komponenten (untenstehende Tabelle)
plantpulse-batch-web9500 · 9501 (PP_BATCH_HTTP_PORT · PP_BATCH_TLS_PORT)
plantpulse-warehouse-web9600 · 9601 (PP_WAREHOUSE_HTTP_PORT · PP_WAREHOUSE_TLS_PORT)
plantpulse-server-web · plantpulse-plugin-aasxKeine — Betrieb nur hinter dem Proxy
plantpulse-certsKeine (öffnet keine Ports)

Port-Topologie​

Empfohlene externe Freigabe (Benutzer / Externe Systeme)​

PortContainerProtokollZweckEmpfehlung
80proxyHTTPBedienkonsole / REST APIReverse Proxy empfohlen
443proxyHTTPSBedienkonsole / REST API (TLS)✓
4950datalakeHTTPSMonitoring-UI + /api/healthMonitoring-System
1883proxyTCPMQTT Klartext — Edge-Gerät / Sensor-ErfassungPrivatnetz empfohlen
1884proxyTCP+TLSMQTT over TLS (Proxy als Passthrough, Broker als Endpunkt)TLS empfohlen
11004 / 11005opcua-serverOPC-UAEndpunkt für externe AnlagenTLS empfohlen
10210haHTTPHA-Daemon /api/health · /api/cluster — Peers verbinden sich in 2-Cluster-KonfigurationenNur Peer-IP
9094datalakeTCP+TLSKafka externer ClientTLS erforderlich
5500 / 5501datalakeHTTP / HTTPSDatenabfrage externe SystemeAPI Key

Betriebsempfehlung: Es wird empfohlen, nur 80/443 extern freizugeben und alle anderen Ports nur im Privatnetz zu betreiben.

9500 · 9501 · 9600 · 9601 werden am Host «geöffnet», sollten aber nicht extern freigegeben werden

Die Batch- und Warehouse-Container binden diese vier Ports am Host (siehe erste Tabelle oben). Dies dient dazu, dass der Operator die Container direkt abfragen kann, und ist nicht für die externe Freigabe gedacht. Sperren Sie diese in der übergeordneten Firewall und führen Sie Prüfungen innerhalb des Hosts durch.

curl -fsS http://127.0.0.1:9500/api/health | jq # 배치
curl -fsS http://127.0.0.1:9600/api/health | jq # 웨어하우스

Um Ports zu verschieben, ändern Sie PP_BATCH_HTTP_PORT · PP_BATCH_TLS_PORT · PP_WAREHOUSE_HTTP_PORT · PP_WAREHOUSE_TLS_PORT in .env.

Für Echtzeit-Push der Web-Konsole ist kein separater Port erforderlich

Der Echtzeit-Push erfolgt über den Proxy (443). Es wird kein separater WebSocket-Port am Host geöffnet.

Messaging​

PortContainerProtokollZweck
1883 / 1884proxyTCP / TLSMQTT (HiveMQ). Wird vom Proxy publiziert
18883 / 18884datalakeTCP / TLSReserviert. Derzeit gibt es keinen Listener für diese Ports
9092datalakeTCPKafka PLAINTEXT (Nur Privatnetz)
9093datalakeTCPKafka KRaft Controller
9094datalakeTCP+TLSKafka SASL_SSL
Kafka läuft nicht über den Proxy

Kafka-Clients verbinden sich nach dem Bootstrap erneut mit der Adresse, die advertised.listeners mitgeteilt hat. Würde ein Proxy davor geschaltet, müsste auch diese Adresse geändert werden; andernfalls würde nur das Bootstrap erfolgreich sein, gefolgt von einem stillen Fehler. Daher publiziert der Datalake die Kafka-Ports direkt.

STOMP(ActiveMQ) wurde eingestellt

Da der Echtzeit-Push im Browser auf SSE umgestellt wurde, wurde der STOMP-Broker aus dem Datalake-Image entfernt. 61000 / 61004 werden nicht mehr bedient. Bitte entfernen Sie diese aus alten Firewall-Regeln.

Storage (Nur Privatnetz)​

PortProtokollZweck
9042CQLAster TSDB
7000 / 7001TCPAster TSDB Gossip / SSL
5432TCPPostgreSQL
6379TCPValkey (Redis-kompatibel)
6380TCP+TLSValkey TLS Listener
9000HTTPRustFS API
9001HTTPRustFS Console

Analyse / SQL (Nur Privatnetz)​

PortProtokollZweck
7077TCPSpark Master RPC
4440HTTPSpark Master UI — Nicht 8080
8081HTTPSpark Worker UI
10000ThriftKyuubi SQL Gateway
10099HTTPKyuubi REST API
19001HTTPGravitino Unified Catalog
9083ThriftHive Metastore
3500 / 3600HTTPLab-Analyseumgebung
4000 / 4001HTTP / HTTPSSQL-Abfrageservice

Verarbeitung / Zeitreihe (Nur Privatnetz)​

PortProtokollZweck
7400 / 7401HTTP / HTTPSCEP (Aster CEP)
7800 / 7801HTTP / HTTPSZeitreihen-Engine (TSE)
3000HTTPPlantPulse Dashboard
5500 / 5501HTTP / HTTPSData Gateway

Workflow (Nur Privatnetz)​

PortProtokollZweck
7233gRPCTemporal Frontend
8233HTTPTemporal Web UI
8380HTTPKestra (UI + API)
8381HTTPKestra Management-Port

Weitere Datalake-Ports​

PortZweck
7003Diagnosekonsole (Nur Privatnetz)
60000 / 60001OPC Agent Erfassung (Nur Privatnetz)
6199 / 6299 / 6399 / 6499 / 7099JMX Agent — Bitte nur IP des Überwachungsknotens zulassen
9500 · 9501 · 9600 · 9601 werden vom «App-Container» geöffnet — nicht vom Datalake

Diese vier Ports gehören zur App-Tier — 9500 · 9501 sind die zwei Tomcat-Connectoren von plantpulse-batch-web, 9600 · 9601 gehören zu plantpulse-warehouse-web. Beides sind HTTP- und HTTPS-Connectoren, wobei 9501 · 9601 keine Umleitungen sind, sondern eigenständige Connectoren mit jeweils eigenem SSLHostConfig.

Die Definitionen aus der Zeit, als Batch und Warehouse noch im selben Container wie der Datalake waren, blieben auf der Datalake-Seite bestehen; damals wurden Host-Ports belegt, aber da dahinter nichts war, kam es zu Verbindungsresets (entdeckt am 02.09.2026). Diese Definitionen wurden bereinigt.

Und am 07.09.2026 begannen die App-Container, diese selbstständig zu öffnen (Entscheidung des Benutzers). Damit ist die Aussage «App-Container publizieren nichts» nicht mehr korrekt. Es ist daher umso wichtiger, diese Ports aus der Datalake-Liste zu entfernen — wenn zwei Container denselben Port belegen, schlägt der Start des später startenden Containers mit einem Fehler fehl, der nur den «Portnamen» nennt.

Nur für interne Container (Nicht am Host öffentlich)​

Die folgenden Ports funktionieren nur innerhalb der Container. Anfragen an curl vom Host bleiben unbeantwortet.

PortZielAlternative Prüfmethode
8090 · 4800 / 4801AAS(BaSyx) V3 API · V2 Registry/AASBei Bedarf für externen Zugriff separate Reverse Proxy Prüfung
7199 · 7279Aster TSDB · HiveMQ JMXÜber bin/shell.sh in den Datalake eintreten und prüfen
App-Ports von plantpulse-server-webInterner Containerbin/status.sh / bin/logs.sh <컨테이너>
4949 ist Klartext

Die Konsole und die Health-API werden auf beiden Ports bedient — 4950 (HTTPS) und 4949 (Klartext HTTP). Es handelt sich um dieselbe Konsole und API, nur das Schema unterscheidet sich. 4949 leitet nicht mehr auf 4950 um.

4949 ist Klartext — Login-Passwörter und Session-Cookies werden unverschlüsselt übertragen. In nicht vertrauenswürdigen Netzen verwenden Sie 4950. 4949 ist eine Option für Systeme, bei denen Selbstsignatur-Zertifikatswarnungen den Operator tatsächlich blockieren würden.

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

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

Prüfung auf Port-Konflikte vor der Installation​

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

Keine Ausgabe bedeutet kein Konflikt. Bei einer Ausgabe:

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

Häufige Konfliktports: 80 (Apache/Nginx), 5432 (externes PostgreSQL), 3000 (Grafana/Node.js), 9092 (externes Kafka), 6379 (externes Redis). Wenn externe Dienste genutzt werden, ist es einfacher, den Port des jeweiligen Dienstes zu verschieben.

bin/preflight.sh prüft vor der Installation die Hauptports (80 · 443 · 4949 · 4950) zerstörungsfrei.

In der obigen Zeile von ss fehlen 9500 · 9501 · 9600 · 9601. Da Batch und Warehouse diese Ports nutzen, fügen Sie diese in den regulären Ausdruck ein, um zu prüfen, ob auch diese frei sind.

Beispiel für Firewall-Einstellungen​

install.sh konfiguriert die Host-Firewall (firewalld / ufw) automatisch. Die folgenden Beispiele gelten für die manuelle Freigabe in der übergeordneten Firewall (Unternezwerk, Cloud-Sicherheitsgruppen, Router).

firewalld (RHEL/Rocky/Oracle)​

# 외부 노출 (모든 IP)
for port in 80 443 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 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

Prüfung der automatischen Konfiguration​

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

# Ubuntu
sudo ufw status numbered

Cloud-Sicherheitsgruppen (z. B. AWS / GCP / Azure)​

Zusätzlich zur Host-Firewall müssen die Cloud-Sicherheitsgruppen identisch konfiguriert werden.

Inbound-RegelQuellePort
Bedienkonsole0.0.0.0/0 (oder Firmen-IP)80, 443
Health-CheckMonitoring-Knoten4950
MQTTGeräte1883, 1884
OPC-UAAnlagen11004, 11005
Kafka TLSExterner Client9094
PrivatnetzVPC CIDR1883, 5432, 6379, 7077, 9042, 9092, 10000, 10210, …

Verwandte Dokumente​