Zum Hauptinhalt springen

plantpulse-server (Web-Konsole + IIoT-Engine)

Aufgabe

Das Kernmodul, das Gesicht und Gehirn der Plattform darstellt. Die Web-Konsole für Bediener, die REST API für externe Systeme und die IIoT-Engine, die Industrie-Daten verarbeitet, laufen alle in diesem einen Modul.

ElementWert
Modulnameplantpulse-server
Containerplantpulse-server-web (eigenes Image, eigener Container)
Pfad im Container/opt/kopens/plantpulse-platform/plantpulse-server/
Benutzerzugriff80 / 443plantpulse-proxy empfängt und leitet an diesen Container weiter
Admin-Konsole7443 (HTTPS, plantpulse-datalake published)
Host-Portkeiner — läuft nur hinter einem Proxy
SpeicherlimitDOCKER_SERVER_MEMORY Standard 16g / Heap DOCKER_SERVER_HEAP Standard 12g
RuntimeApache Tomcat 9 + Java 21
Durchsatz40.000 Nachrichten/Sekunde (36-Thread-Pipeline)
Dieser Container öffnet keinen Host-Port

Benutzer-Traffic läuft immer über plantpulse-proxy (80/443). Dadurch müssen Benutzerdaten und Anlagen-Einstellungen nicht angepasst werden, wenn das Backend umzieht oder umbenannt wird. Den Container-Status sehen Sie über bin/status.sh, die Logs über bin/logs.sh plantpulse-server-web.

Verantwortungsbereiche

Verzeichnisstruktur

plantpulse-server/
├── config/ # 서버 관리 설정 (외부화 — 배포해도 유지)
│ ├── plantpulse-engine.properties # IIoT 엔진 튜닝
│ ├── plantpulse-storage.properties # DB 연결
│ ├── plantpulse-mq.properties # 메시징 연결
│ ├── plantpulse-mail.properties # SMTP
│ ├── plantpulse-ai.properties # AI 게이트웨이
│ └── log4j2.xml # 로깅 설정 (자가 시딩 — 최초 기동 시 생성)
├── bin/
│ ├── start.sh
│ ├── stop.sh
│ └── log-viewer.sh
├── logs/
│ └── system.log
├── path/ # 경로 매핑
└── server/ # 내장 Tomcat
├── conf/
│ ├── server.xml # 커넥터 / 포트
│ ├── context.xml # 컨텍스트 / 데이터소스
│ ├── catalina.properties
│ ├── logging.properties
│ ├── tomcat-users.xml
│ ├── web.xml
│ └── Catalina/localhost/
│ └── ROOT.xml # 컨텍스트 설정 (sessionCookieName 등)
└── webapps/
├── ROOT.war # 웹 애플리케이션 (WAR 통배포)
└── ROOT/ # Tomcat 이 unpack 한 디렉토리 (수정 금지)

Bereitstellungsmethode: Die Web-App wird per server/webapps/ROOT.war Ersatzmethode bereitgestellt (WAR-Gesamtbereitstellung, Umstellung im Gange). Die alte app/plantpulse-server-web Exploded-Directory-Methode wird auslaufen, und der Context docBase Override in server.xml wurde entfernt. Wenn Sie Dateien direkt in ROOT/ ändern, werden sie bei der nächsten Bereitstellung gelöscht. Konfigurationsänderungen müssen immer in config/ vorgenommen werden.

Hauptkonfigurationsdateien

Die Konfigurationsdateien befinden sich im config/ Verzeichnis des Moduls. Der Server sucht in dieser Reihenfolge: -Dpp.conf.dir${catalina.base}/../config → Klassenpath (Fallback). Wenn externe Konfiguration geladen wird, wird Properties loaded from external conf: im Startup-Log ausgegeben.

application.properties wurde entfernt (2026.06). Die Konsolen-Betriebseinstellungen wie Design und Startseite werden in der Konsole unter System > Einstellungsverwaltung (mm_config Tabelle) verwaltet, und alarm.duplicate.check.minutes wurde nach plantpulse-engine.properties migriert.

plantpulse-engine.properties

Abstimmung der IIoT-Engine-Pipeline.

ElementStandardwertBeschreibung
engine.pipeline.threads36Anzahl paralleler Verarbeitungs-Threads
engine.pipeline.ratelimit40000Max. Nachrichten pro Sekunde
engine.pipeline.batch.size1000Batch-Bundlengröße
engine.pipeline.queue.size1200000Warteschlangen-Kapazität
engine.dedup.enabledtrueDuplikat-Eliminierung aktiviert

plantpulse-storage.properties

Speicher-Backend-Verbindung.

# Cassandra
cassandra.host=${PP_CASSANDRA_HOST}
cassandra.port=${PP_CASSANDRA_PORT}
cassandra.keyspace=${PP_KEYSPACE}
cassandra.user=${PP_CASSANDRA_USER}
cassandra.password=${PP_CASSANDRA_PASSWORD}

# PostgreSQL (Spring DataSource)
postgres.url=jdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/${PP_DB_NAME}
postgres.user=${PP_PG_USER}
postgres.password=${PP_PG_PASSWORD}

# Valkey
redis.host=${PP_REDIS_HOST}
redis.port=${PP_REDIS_PORT}
redis.password=${PP_REDIS_PASSWORD}

Diese App rendert Konfigurationen nicht. Nach der Container-Aufspaltung startet der Web-Server ohne Config-Renderer des Data Lake. Werte werden aus drei Quellen gelesen — ① externe Dateien des Bedieners → ② im WAR eingebettete Standardwerte → ③ Umgebungsvariablen von compose. Umgebungsvariablen überschreiben eingebettete Standardwerte.

Daher ist compose/docker-compose.yml die einzige authoritative Konfigurationsquelle. Wenn ein Name nur im Data Lake vorhanden ist und nicht in compose, erreicht er diese App nicht — was zu Problemen auf Seiten führt, auf denen der Data Lake einen Bezeichner ändert, aber die App die alte Bezeichnung weiterhin verwendet (2026-08-29).

Ändern Sie keine Dateien in der Web-App selbst (server/webapps/ROOT/) — sie werden bei der Bereitstellung gelöscht.

server/conf/server.xml

Tomcat-Connector-Konfiguration. Port-Änderung / TLS / Komprimierung / Thread-Pool.

<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="500"
acceptCount="200"
URIEncoding="UTF-8"
compression="on"
compressibleMimeType="text/html,text/css,application/json,application/javascript" />

<Connector port="443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
SSLEnabled="true"
maxThreads="500"
sslEnabledProtocols="TLSv1.3,TLSv1.2">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/var/security/plantpulse/server.jks"
certificateKeystorePassword="${PP_TLS_KEYSTORE_PASSWORD}" />
</SSLHostConfig>
</Connector>

Bedienungsbefehle

Vom Host aus — auf Container-Ebene

Das Neustart des Containers ist gleichzeitig der Neustart dieses Moduls. Infrastruktur und andere Apps sind nicht betroffen.

cd /opt/kopens/plantpulse-platform-docker

# 서버만 재시작
docker compose -f compose/docker-compose.yml restart plantpulse-server-web

# 상태 · 로그
bin/status.sh
bin/logs.sh plantpulse-server-web -n 200

In den Container wechseln

cd /opt/kopens/plantpulse-platform-docker/bin
./shell.sh plantpulse-server-web
Das Skript restart-server.sh des Data Lake startet dies nicht neu

Dieses Skript ruft den Launcher des Moduls von innerhalb des eigenen Containers auf. Der Data Lake Container hat keine Web-Server-Ausführungsdatei, daher endet es mit einem Fehler «Modul nicht gefunden». Bitte nutzen Sie den Container-Neustart oben.

Hot Reload (Einstellungen ohne Neustart anwenden)

Einige Einstellungen können in der Konsole unter System > Einstellungsverwaltung ohne Neustart hot-reloaded werden. Eigenschaften in config/ oder Boot-Zeit-Einstellungen wie server.xml erfordern einen Neustart.

Logs

LogPfadInhalt
Hauptloglogs/system.logAnwendungslogik, Fehler
Tomcat catalinaserver/logs/catalina.outTomcat-Standardausgabe
Zugriffslogserver/logs/localhost_access_log.YYYY-MM-DD.txtHTTP-Anfrage-Log
Engine-Loglogs/engine.logIIoT-Engine-Verarbeitungsdetails
Langsame Abfragenlogs/slow.logAbfragen über 200 ms

Log-Level ändern — die Logging-Konfiguration (log4j2.xml) ist im Modul config/ externalisiert (Auto-Seed: Beim ersten Start wird der WAR-Standardwert nach config/log4j2.xml kopiert, beim Anwenden wird Logging reconfigured from external conf: im Startup-Log ausgegeben):

# 웹 서버 컨테이너 안에서
cd /opt/kopens/plantpulse-platform-docker/bin
./shell.sh plantpulse-server-web
vi /opt/kopens/plantpulse-platform/plantpulse-server/config/log4j2.xml
# <Logger name="plantpulse" level="DEBUG"/> 등 수정 후 exit

# 호스트에서 그 컨테이너만 재시작
cd /opt/kopens/plantpulse-platform-docker
docker compose -f compose/docker-compose.yml restart plantpulse-server-web

Da es eine externe Datei ist, wird sie bei der WAR-Neubereitstellung erhalten. Ändern Sie nicht die interne Datei der Web-App (server/webapps/ROOT/WEB-INF/classes/log4j2.xml) — sie wird bei der Bereitstellung gelöscht.

Leistungsoptimierung

JVM-Heap

# server/bin/setenv.sh (없으면 생성)
export CATALINA_OPTS="-Xms16g -Xmx32g \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/plantpulse/heap/ \
-Xlog:gc*:file=/var/log/plantpulse/gc.log:time,uptime:filecount=10,filesize=100M"

Tomcat-Thread-Pool

Passen Sie im Connector in server.xml maxThreads / acceptCount an. In Umgebungen mit hohem parallelem Durchsatz werden folgende Werte empfohlen:

Gleichzeitige VerbindungenmaxThreadsacceptCount
~ 100200100
~ 500500200
500+1000500

IIoT-Engine-Durchsatz

Stellen Sie engine.pipeline.threads in plantpulse-engine.properties auf 70–80 % der Host-Kernzahl. Bei Nachrichtenstau auch engine.pipeline.queue.capacity erhöhen.

Detaillierte Optimierung finden Sie auf der Seite Leistungsoptimierung.

Health Check

# 표준 헬스체크 (익명, readiness — 엔진이 전 단계 기동을 완료(RUNNING)했을 때만 UP. 배포 자동검증 / 모니터링용)
curl -fsS http://127.0.0.1/api/health
# 준비 완료: 200 {"status":"UP","service":"plantpulse-server-web","ts":1765500000000,"checks":{"engine":"RUNNING"}}
# 기동 중: 503 {"status":"STARTING",...} / 기동 실패·중지: 503 {"status":"DEGRADED",...}

# 콘솔 ping
curl -fsS http://127.0.0.1/api/v5/ping

# 인증 필요 헬스체크
curl -fsS -u admin:admin123! http://127.0.0.1/api/v5/health

# WebSocket 핸드셰이크 확인
curl -i -N \
-H "Connection: Upgrade" -H "Upgrade: websocket" \
-H "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==" \
-H "Sec-WebSocket-Version: 13" \
http://127.0.0.1:8000/ws

Häufig auftretende Probleme

SymptomUrsacheMaßnahme
OutOfMemoryErrorHeap-ErschöpfungErhöhen Sie -Xmx in setenv.sh + GC-Log-Analyse
Too many open filesDateideskriptor-LimitErhöhen Sie nofile in /etc/security/limits.conf auf 65535+
Konsole reagiert langsamLangsame DB-AbfragenPostgreSQL Slow-Query-Log, Valkey Cache-Hit-Rate prüfen
Login-EndlosschleifeSession/Cookie-ProblemBrowser-Cache leeren, sessionCookieName in server/conf/Catalina/localhost/ROOT.xml prüfen
502 / 504 (Reverse Proxy)Backend-TimeoutErhöhen Sie proxy_read_timeout in nginx
WebSocket-VerbindungsabbruchFirewall Idle TimeoutFirewall Timeout > 60s, tomcat.websocket.session.timeout anpassen

Für erweiterte Diagnose siehe Fehlerbehebung.

Sicherheits-Checkliste

  • Standard-Admin-Passwort ändern (admin / admin123!)
  • Manager-Konto in tomcat-users.xml entfernen oder starkes Passwort
  • Externen Zugriff auf shutdown port (7000) in server.xml blockieren
  • HTTPS-Zertifikat anwenden (prepare-ssl.sh Ausgabe oder externe CA)
  • X-Frame-Options / CSP / HSTS Header-Einstellung prüfen
  • API Bearer Tokens in Vault speichern
  • Debug-Option in config/ Propertydatei deaktivieren und Zugriff einschränken (chmod 600)

Detaillierte Sicherheitseinstellungen finden Sie auf der Seite Sicherheitskonfiguration.

Zugehörige Dokumentation