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.
| Element | Wert |
|---|---|
| Modulname | plantpulse-server |
| Container | plantpulse-server-web (eigenes Image, eigener Container) |
| Pfad im Container | /opt/kopens/plantpulse-platform/plantpulse-server/ |
| Benutzerzugriff | 80 / 443 — plantpulse-proxy empfängt und leitet an diesen Container weiter |
| Admin-Konsole | 7443 (HTTPS, plantpulse-datalake published) |
| Host-Port | keiner — läuft nur hinter einem Proxy |
| Speicherlimit | DOCKER_SERVER_MEMORY Standard 16g / Heap DOCKER_SERVER_HEAP Standard 12g |
| Runtime | Apache Tomcat 9 + Java 21 |
| Durchsatz | 40.000 Nachrichten/Sekunde (36-Thread-Pipeline) |
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.warErsatzmethode bereitgestellt (WAR-Gesamtbereitstellung, Umstellung im Gange). Die alteapp/plantpulse-server-webExploded-Directory-Methode wird auslaufen, und der ContextdocBaseOverride inserver.xmlwurde entfernt. Wenn Sie Dateien direkt inROOT/ändern, werden sie bei der nächsten Bereitstellung gelöscht. Konfigurationsänderungen müssen immer inconfig/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_configTabelle) verwaltet, undalarm.duplicate.check.minuteswurde nachplantpulse-engine.propertiesmigriert.
plantpulse-engine.properties
Abstimmung der IIoT-Engine-Pipeline.
| Element | Standardwert | Beschreibung |
|---|---|---|
engine.pipeline.threads | 36 | Anzahl paralleler Verarbeitungs-Threads |
engine.pipeline.ratelimit | 40000 | Max. Nachrichten pro Sekunde |
engine.pipeline.batch.size | 1000 | Batch-Bundlengröße |
engine.pipeline.queue.size | 1200000 | Warteschlangen-Kapazität |
engine.dedup.enabled | true | Duplikat-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.ymldie 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
restart-server.sh des Data Lake startet dies nicht neuDieses 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
| Log | Pfad | Inhalt |
|---|---|---|
| Hauptlog | logs/system.log | Anwendungslogik, Fehler |
| Tomcat catalina | server/logs/catalina.out | Tomcat-Standardausgabe |
| Zugriffslog | server/logs/localhost_access_log.YYYY-MM-DD.txt | HTTP-Anfrage-Log |
| Engine-Log | logs/engine.log | IIoT-Engine-Verarbeitungsdetails |
| Langsame Abfragen | logs/slow.log | Abfragen ü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 Verbindungen | maxThreads | acceptCount |
|---|---|---|
| ~ 100 | 200 | 100 |
| ~ 500 | 500 | 200 |
| 500+ | 1000 | 500 |
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
| Symptom | Ursache | Maßnahme |
|---|---|---|
OutOfMemoryError | Heap-Erschöpfung | Erhöhen Sie -Xmx in setenv.sh + GC-Log-Analyse |
Too many open files | Dateideskriptor-Limit | Erhöhen Sie nofile in /etc/security/limits.conf auf 65535+ |
| Konsole reagiert langsam | Langsame DB-Abfragen | PostgreSQL Slow-Query-Log, Valkey Cache-Hit-Rate prüfen |
| Login-Endlosschleife | Session/Cookie-Problem | Browser-Cache leeren, sessionCookieName in server/conf/Catalina/localhost/ROOT.xml prüfen |
| 502 / 504 (Reverse Proxy) | Backend-Timeout | Erhöhen Sie proxy_read_timeout in nginx |
| WebSocket-Verbindungsabbruch | Firewall Idle Timeout | Firewall 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.xmlentfernen oder starkes Passwort - Externen Zugriff auf
shutdown port (7000)inserver.xmlblockieren - HTTPS-Zertifikat anwenden (
prepare-ssl.shAusgabe 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.