Zum Hauptinhalt springen

Property-Referenz

Dieses Dokument wird aus der real ausgelieferten Konfigurationsvorlage (*.properties) neu generiert (2026-07-28) — der aktuelle Speicherort der Vorlage ist plantpulse-datalake-cli/config/templates, und /etc/kopens/conf des Hosts wird per Bind-Mount an diese Stelle gemountet Die maßgebliche Referenz für die Zuordnung der Deployment-Pfade ist plantpulse-startup/src/plantpulse/startup/config/ConfigTemplates.java, die maßgebliche Referenz für die Ladepriorität ist plantpulse-core/src/plantpulse/core/engine/utils/PropertiesUtils.java.

Wenn ein Schlüssel hinzugefügt/gelöscht/umbenannt wurde, ist nicht dieses Dokument, sondern die Vorlage maßgeblich. Füllen Sie das Dokument nicht von Hand aus, sondern erzeugen Sie es erneut aus der Vorlage. Der „Standardwert" in jeder Tabelle steht exakt so in der Vorlage, und ${PP_XXX} ist die Stelle, an der configure.sh durch den Wert env.sh ersetzt wird.

3-Stufen-Modell der Konfiguration

StufeOrtÄnderungsmethode
Globale Konfigurationplantpulse-startup/env.shDirekt bearbeiten, dann ./configure.sh → betreffendes Modul neu starten
Standort-Overrideplantpulse-startup/env.local.shenv.sh liegen alle in der Form ${PP_VAR:-default} vor, daher gewinnt der bereits exportierte Wert
Modul-Konfigurationconfig/ des jeweiligen ModulsDirekt bearbeitbar, wird aber bei der nächsten Ausführung von configure.sh überschrieben

Empfehlung: Bearbeiten Sie im Produktivbetrieb nur env.sh (oder env.local.sh) und lassen Sie configure.sh alle Modulkonfigurationen erzeugen.

Standardablauf für Änderungen an env.sh

cd /opt/kopens/plantpulse-platform/plantpulse-datalake-cli/bin

vi env.sh # 1. 편집
./env-validate.sh # 2. 검증 (선택)
./configure.sh # 3. 템플릿 치환 + 각 모듈 config/ 로 배포
./restart.sh # 4. 재시작 (또는 ./restart-<module>.sh)
./status.sh # 5. 확인

configure.sh rendert lediglich die Konfigurationsdateien neu und startet die Dienste nicht neu. Bis zum Neustart existiert die neue Konfiguration nur auf der Festplatte, während der alte Prozess weiterläuft.

Ladepriorität der Konfigurationsdateien

Die Webanwendungen (server / batch / cep / sql / data-gateway) suchen Konfigurationsdateien in folgender Reihenfolge. Die Implementierung ist PropertiesUtils.readExternalFirst().

  1. Das über die Systemproperty -Dpp.conf.dir angegebene Verzeichnis (Konstante PropertiesUtils.CONF_DIR_SYSTEM_PROPERTY = "pp.conf.dir")
  2. ${catalina.base}/../config — das config/-Verzeichnis des Moduls
  3. Web-App-Classpath (in der WAR enthaltener Standardwert) — Fallback

Externe Dateien werden als UTF-8 gelesen. Wenn die externe Konfiguration erfolgreich geladen wurde, erscheint im Start-Log Folgendes:

Properties loaded from external conf: <absolute-path>

Schlägt das Lesen der externen Datei fehl, wird ein Error-Log geschrieben und auf den Classpath zurückgefallen.

Auch die Logging-Konfiguration (log4j2.xml) ist über dieselbe Kette externalisiert (Self-Seeding — ohne externe Datei wird der WAR-Standardwert einmalig in config/log4j2.xml des Moduls kopiert und dann verwendet). Bei Anwendung erscheint im Start-Log Logging reconfigured from external conf: <absolute-path>. Änderungen der Log-Stufe werden durch Bearbeiten von config/log4j2.xml des Moduls und Neustart wirksam und bleiben auch bei WAR-Neubereitstellung erhalten. Details siehe Konfigurations- und Deployment-Leitfaden.

Hinweis: Interne Dateien der Web-App (z. B. server/webapps/ROOT/WEB-INF/classes/) dürfen nicht direkt bearbeitet werden — sie gehen bei WAR-Neubereitstellung verloren.

Die ${ENV:기본값}-Ersetzung erfolgt zweimal

Die Notation ${PP_XXX} / ${PP_XXX:기본값} in der Vorlage wird zu zwei Zeitpunkten aufgelöst.

ZeitpunktAkteurVerhalten
Beim Deploymentconfigure.shTemplateProcessor.resolvePlaceholdersErsetzung durch env.sh. Reihenfolge: replacements map → Umgebungsvariable → :기본값 → Original beibehalten. Verschachtelte Placeholder werden nicht unterstützt
Zur LaufzeitPropertiesUtils.resolveEnvPlaceholdersFür alle Werte der geladenen Properties wird ${ENV_VAR[:default]} erneut ausgewertet

Das heißt, auch nach dem Deployment verbleibende ${...} können durch Umgebungsvariablen des Prozesses gefüllt werden. Deshalb hat eine Docker--e VAR=...-Injektion Vorrang vor dem Standardwert der Vorlage.

PP_*-Variablen, die nicht in env.sh vorkommen (der Standardwert der Vorlage wird unverändert angewendet)

Die folgenden Variablen werden von der Vorlage als ${PP_XXX:기본값} referenziert, aber von env.sh nicht exportiert. Ohne separate Injektion wird daher immer der Standardwert der Vorlage verwendet.

PP_STORAGE_PASSWORD · PP_METASTORE_PASSWORD · PP_EXTERNAL_DB_PASSWORD · PP_MAIL_SMTP_HOST · PP_MAIL_SMTP_PORT · PP_MAIL_SMTP_AUTH · PP_MAIL_SMTP_USER · PP_MAIL_SMTP_PASSWORD · PP_MAIL_SMTP_STARTTLS · PP_DIAGNOSTIC_EMAIL · PP_AI_OPENAI_CHAT_PATH · PP_AI_OPENAI_RESPONSES_PATH · PP_AI_MCP_ENABLED · PP_AI_MCP_ALLOWED_ORIGINS · PP_AI_CHAT_ENABLED

PP_MAIL_SMTP_* wird absichtlich nicht exportiert. Wie der Kommentar bei env.sh verdeutlicht, gab es einen Vorfall, bei dem eine exportierte Umgebungsvariable den Standardwert der Vorlage (Brevo-Relais-SSOT) überschrieben und die SMTP-Login-Kombination stillschweigend zerstört hat (2026-07-22, veraltete 25/no-auth-Werte überdeckten die Brevo-587/auth-Werte). Standortspezifische Overrides gehören in env.local.sh.

5 serververwaltete Konfigurationen

Es gibt 5 Konfigurationsdateien, die durch das ConfigTemplates.SERVER_CONFIGS-Array definiert und via plantpulse-server/config/ ausgeliefert werden.

#VorlageDeployment-Pfad
1plantpulse-engine.properties/plantpulse-server/config/plantpulse-engine.properties
2plantpulse-storage.properties/plantpulse-server/config/plantpulse-storage.properties
3plantpulse-mq.properties/plantpulse-server/config/plantpulse-mq.properties
4plantpulse-mail.properties/plantpulse-server/config/plantpulse-mail.properties
5plantpulse-ai.properties/plantpulse-server/config/plantpulse-ai.properties

Von diesen werden 1–4 von PropertiesLoader.load() gemeinsam gelesen (engine/mail/mq/storage) und rekonstruieren die typisierten Konfigurationsbeans EngineConfig · StorageConfig · MqConfig. Nr. 5 (plantpulse-ai.properties) wird von AIConfig separat über dieselbe externe Kette gelesen.

plantpulse-startup/sh/server-managed-webapp-files.list ist derzeit leer (nur Kommentare). Nach Abschluss der Konfigurationsexternalisierung im Juni 2026 verbleibt keine serververwaltete Konfiguration mehr innerhalb der WAR.

application.properties (entfernt)

application.properties wurde im Juni 2026 entfernt. Es gibt keinen Code, der diese Datei liest (0 Verwendungsstellen im gesamten Repository); die bisherigen Einträge wurden wie folgt migriert:

  • Konsolenverhalten wie Theme / Startseite → Konsole System > Konfigurationsverwaltung (PostgreSQL-Tabelle mm_config)
  • alarm.duplicate.check.minutes → Reihe plantpulse-engine.properties (gelesen von EngineConfig)

plantpulse-engine.properties

Pfad: plantpulse-server/config/plantpulse-engine.properties · Vorlage: template/plantpulse-engine.properties

Steuert das Kernverhalten der Datenverarbeitungs-Engine.

Asynchron / Pipeline

PropertyStandardwertErsetzungBeschreibung (Vorlagenkommentar)
engine.async.parallelism256Async worker pool parallelism (total cores ~= 256)
engine.pipeline.threads36Anzahl der Pipeline-Threads
engine.pipeline.ratelimit40000Obergrenze der Pipeline-Verarbeitung pro Sekunde (rate limit)
engine.pipeline.queue.size1200000Pipeline-Warteschlangengröße (Backpressure-Grenze)
engine.pipeline.queue.o3.delay50Zulässige Verzögerung für nicht in Reihenfolge eingetroffene (out-of-order) Daten (ms)
engine.pipeline.task.modeSINGLETask-Ausführungsmodus (SINGLE / PARALLEL)

NTP

PropertyStandardwertErsetzungBeschreibung
engine.ntpdate.server.ip127.0.0.1NTP-Server-IP
engine.ntpdate.syncfalseOb beim Booten eine NTP-Synchronisation durchgeführt wird

Stream / CEP

PropertyStandardwertErsetzungBeschreibung
engine.stream.processorDIRECTStream-Verarbeitungsmodus (DIRECT/BUFFERED)
engine.cep.server.ip127.0.0.1${PP_CEP_HOST:127.0.0.1}CEP-Server-IP
engine.cep.server.port7400${PP_CEP_CONNECT_PORT:7400}CEP-Server-Port (wird automatisch je nach Protokoll gesetzt: http→7400, https→7401)
engine.cep.server.protocolhttp${PP_CEP_PROTOCOL:http}CEP-Protokoll. Interne Kommunikation standardmäßig http, verteilt/containerisiert https
engine.cep.server.api.key(keiner)${PP_CEP_API_KEY}Für den X-API-Key-Header von CEPClient. Muss mit dem cep.api.key des CEP-Servers übereinstimmen

Streaming-Nachrichtenzustellung

PropertyStandardwertErsetzungBeschreibung
engine.streaming.messaging.warning.ms5000Warnung bei Zustellungsverzögerung (ms)
engine.streaming.messaging.timeout.ms10000Timeout für Nachrichtenzustellung (ms)
engine.streaming.messaging.timeout.store.typeFILE_QUEUESpeicherart für timeoutete Nachrichten (FILE_QUEUE/MEMORY)
engine.streaming.messaging.timeout.recovery.typeDBWiederherstellungsquelle für timeoutete Nachrichten (DB/FILE)

Job-Worker-Threads

PropertyStandardwertErsetzungBeschreibung
engine.job.thread.asset8Anzahl der Anlagen-Job-Threads
engine.job.thread.point8Anzahl der Point-Job-Threads

DDS

PropertyStandardwertErsetzungBeschreibung
engine.dds.enabledtrueGlobale DDS-Aktivierung
engine.dds.data.tag.enabledtrueVeröffentlichung von Tag-Daten via DDS
engine.dds.data.asset.enabledtrueVeröffentlichung von Anlagendaten via DDS

Anomalieerkennung / Datenfluss

PropertyStandardwertErsetzungBeschreibung
engine.data.anomaly.enabledfalseAktivierung der Anomalieerkennung (Anbindung externer Dienste)
engine.data.anomaly.urlhttps://127.0.0.1:8970URL des Anomalieerkennungs-Dienstes
engine.dataflow.classplantpulse.core.engine.pipeline.dataflow.BaseDataFlowImplementierungsklasse des Datenflusses
engine.dataflow.server-timestamp.overridefalseOb der Server-Zeitstempel erzwungen wird (true: Erfassungszeitpunkt, false: Original)
engine.dataflow.negative-timestamp.overridetrueOb negative Zeitstempel korrigiert werden
engine.factory.model.updater.classplantpulse.core.engine.model.impl.DefaultFactoryMetaModelUpdaterAktualisierer des Factory-Metamodells
engine.event.handler.classplantpulse.core.engine.event.DefaultEventHanlderImplementierung des Event-Handlers (Tippfehler im Klassennamen Hanlder bleibt exakt als tatsächlicher Klassenname erhalten)
engine.javagc.enabledfalseOb explizite System.gc()-Aufrufe erlaubt sind

Flow-Engine

PropertyStandardwertErsetzungBeschreibung
flow.debug.execution.logfalseINFO-Log für Knotenausführung. Nur bei Debugging-Sessions auf true setzen
flow.stats.prune.interval.ms86400000Ausführungsintervall der Zähler-Bereinigung (ms, 24 Stunden). Da Cassandra-Zählertabellen default_time_to_live nicht nutzen können, erfolgt die Bereinigung auf Anwendungsebene
flow.stats.prune.hourly.days30Aufbewahrungsdauer (Tage) für hour_bucket von tm_flow_stats_hourly
flow.stats.prune.daily.days90Aufbewahrungsdauer (Tage) für day_bucket von tm_flow_stats_daily
flow.health.check.interval.ms600000Intervall des Flow-Health-Checks (ms, 10 Minuten). Ist der errors-Wert des aktuellen Zeit-Buckets > 0, ERROR, sonst NORMAL (nach KST)
flow.webhook.api.keydev-webhook-19ba7a54-1132-49f2-967e-3c6f5cd989a0${PP_FLOW_WEBHOOK_API_KEY:...}Authentifizierung für externe Webhooks der Flow-Engine

Von Flow-Health-Check genutzte Cassandra-Tabellen: tm_flow_health_status (flow_id, hour_bucket — laufender Zähler für die aktuelle Zeit), tm_flow_health_status_10m (flow_id, min10_bucket — Zeitreihe im 10-Minuten-Takt).

Edge-Health-Check

PropertyStandardwertErsetzungBeschreibung
edge.health.check.interval.ms600000Intervall des Edge-Health-Checks (ms, 10 Minuten)

Die Beurteilungsquelle sind die Flags _ON / _NORMAL der Cassandra-tm_edge_status-Payload. Da keine RT-REST-Aufrufe erfolgen, ist die Last 0 und der Vorgang endet innerhalb einer Sekunde. Tabellen: tm_edge_health_status (edge_id, hour_bucket), tm_edge_health_status_10m (edge_id, min10_bucket).

Authentifizierung / Sicherheit

PropertyStandardwertErsetzungBeschreibung
api.key(keiner)${PP_API_KEY}Interner Platform-API-Schlüssel (Authentifizierung Server ↔ Edge-Agent)
engine.api.v5.auth.bruteforce.enabledtrueBrute-Force-Schutz für V5-API-Authentifizierung
engine.api.v5.auth.bruteforce.ip_limit30Versuchslimit pro IP
engine.api.v5.auth.bruteforce.user_limit10Versuchslimit pro Benutzer
engine.api.v5.auth.bruteforce.window.seconds60Zählfenster (Sekunden)
engine.api.v5.trusted_proxies(leer)Whitelist vertrauenswürdiger Proxy-IPs. Nur bei Konfiguration wird, wenn remoteAddr in dieser Liste steht, die erste IP aus X-Forwarded-For als Client-IP verwendet. Ist die Liste leer, wird nur getRemoteAddr() verwendet (fail-safe)
engine.session.bruteforce.enabledtrueBrute-Force-Schutz für die Browser-Sitzung von /login/login
engine.session.bruteforce.ip_limit30Versuchslimit pro IP
engine.session.bruteforce.user_limit10Versuchslimit pro Benutzer
engine.session.bruteforce.window.seconds300Zählfenster (Sekunden)

Der Brute-Force-Zähler für Sitzungen ist Caffeine-Inmemory — gemeinsame Nutzung über mehrere Knoten (Redis) ist nicht implementiert.

API-Token

PropertyStandardwertErsetzungBeschreibung
engine.api.token.cleanup.enabledtrueBereinigung abgelaufener (expires_at < now)/widerrufener (revoked_at IS NOT NULL) Tokens
engine.api.token.cleanup.retention_days30Nach Ablauf dieser Frist Hard Delete aus mm_token. Einmal alle 24 Stunden (erste Ausführung 60 Sekunden nach dem Booten)
engine.api.token.default_ttl_days90Standard-Ablaufzeit (Tage) bei Ausstellung eines neuen Tokens. 0 = permanentes Token. Gibt die Ausstellungsanfrage ttl_days vor, hat dieser Wert Vorrang → API-Token-Ausstellung

Bestehende Tokens, bei denen expires_at NULL ist, bleiben dauerhaft aktiv (Abwärtskompatibilität).


plantpulse-storage.properties

Pfad: plantpulse-server/config/plantpulse-storage.properties · Vorlage: template/plantpulse-storage.properties

Verwaltet die Verbindungen zu Metastore (PostgreSQL) · Cache (Valkey) · Zeitreihe (Cassandra) · TSE · Data Gateway sowie Storage-Richtlinien.

⚠️ In dieser Datei existieren tatsächlich fehlerhaft geschriebene Schlüssel. 3 Schlüssel weichen von der Schreibweise ab, die der Code liest — lesen Sie unbedingt den Abschnitt Warnung zu Tippfehler-Schlüsseln.

PostgreSQL-Metastore

PropertyStandardwertErsetzungBeschreibung
metastore.driverorg.postgresql.DriverJDBC-Treiberklasse
metastore.urljdbc:postgresql://...${PP_POSTGRES_HOST} · ${PP_POSTGRES_PORT} · ${PP_DB_NAME}JDBC-URL des Metastores. Enthält Query-String ?characterEncoding=UTF-8&reWriteBatchedInserts=true
metastore.user${PP_PG_USER}Metastore-Konto
metastore.password${PP_PG_PASSWORD}Metastore-Passwort

Cache (Valkey / Redis-kompatibel)

PropertyStandardwertErsetzungBeschreibung
cache.host${PP_REDIS_HOST}Cache-Host
cache.port${PP_REDIS_PORT}Cache-Port (internes plaintext Valkey-Backend)
cache.password${PP_REDIS_PASSWORD}Cache-Passwort
cache.ssl.enabledfalseCache-TLS. Interne Clients standardmäßig redis://
cache.ssl.truststore.location/var/security/plantpulse/master/master.truststore.p12Truststore-Pfad
cache.ssl.truststore.passwordkopens123!${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!}Truststore-Passwort
cache.ssl.truststore.typePKCS12Truststore-Typ
cache.ssl.endpoint.identification.enabledfalseEndpoint-Identity-Prüfung

Die maßgebliche Referenz der Schlüsselkonstanten ist InMemoryConfigKeys von plantpulse-inmemory.

TSE (TimeSeries Engine)

PropertyStandardwertErsetzungBeschreibung
tse.protocolhttp${PP_TSE_PROTOCOL:http}TSE-Protokoll. Da interne Kommunikation, standardmäßig plaintext http (2026-08)
tse.host${PP_TSE_HOST}TSE-Host
tse.port7800${PP_TSE_CONNECT_PORT:7800}TSE-Port. Standardmäßig plaintext Listener 7800
tse.usertse${PP_TSE_USER:tse}TSE-Konto
tse.passwordtse123!${PP_TSE_PASSWORD:tse123!}TSE-Passwort

Cassandra-Zeitreihenspeicher

PropertyStandardwertErsetzungBeschreibung
storage.db_typeCASSANDRADB-Typ (Vorlagenkommentar nennt weiterhin CASSANDRA/DSE/SCYLLADB, aktuell aber nur Cassandra 5.0)
storage.db_version5.0DB-Version (bestimmt Treiber-/Funktionskompatibilität)
storage.host${PP_CASSANDRA_HOST}Contact-Point-Host
storage.port9042${PP_STORAGE_PORT:9042}Native-Protokoll-Port
storage.keyspace${PP_KEYSPACE}verwendeter Keyspace
storage.user${PP_CASSANDRA_USER}Zugangskonto
storage.passwordcassandra${PP_STORAGE_PASSWORD:cassandra}Passwort. PP_STORAGE_PASSWORD wird von env.sh nicht exportiert → Standardwert gilt
storage.durable_writestrueVerwendung des Commit-Logs (⚠️ kein Code liest das — siehe unten)
storage.append_columns[]Automatisches Hinzufügen benutzerdefinierter Spalten
storage.replication{ 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 }Replikationsstrategie (Standard für Einzelknoten)
storage.data.disk.name${PP_DATA_DISK_NAME}Name der Datenträger-Disk

TTL (Einheit: Tage)

PropertyStandardwertBeschreibung
storage.tag.point.ttl62Tag-Zeitreihe, Original
storage.tag.point.map.ttl1Tag-Point-Map
storage.tag.point.sampling.ttl93Tag-Sampling
storage.tag.point.snapshot.ttl93Tag-Snapshot
storage.tag.point.aggregation.ttl93Tag-Aggregation
storage.tag.point.archive.ttl365Tag-Archiv (Langzeitaufbewahrung)
storage.tag.blob.ttl93Tag-BLOB
storage.asset.data.ttl10Anlagendaten
storage.asset.data.sampling.ttl31Anlagen-Sampling

Intervall des Anlagen-Snapshots

PropertyStandardwertBeschreibung
storage.asset.data.snapshot.interval10 SECONDSVor jedem Zyklus wird die Tag-Map (data_map) aller Anlagen in der asset_data-Zeitreihe (data/second/timestamp + Minuten-/Stunden-/Tagesgrenzen) festgehalten

Der Vorlagenkommentar nennt die Begründung: 1 SECONDS führte bei 121 Anlagen zu ca. 22K Schreibvorgängen pro Minute (ca. 4 % des gesamten Cassandra-Aufkommens) — zu dicht. Da das Tag-Original (Sekundentakt) vollständig in tm_tag_point/TSE erhalten bleibt, wurde der Anlagen-View-Snapshot auf 10 s gesenkt (deckt sich mit dem Code-Standardwert) — Schreiblast −90 %, Aufzeichnungsvollständigkeit bleibt erhalten.

Dieser Wert wird zum ASSET_DATA_JOB-Intervall des Schedulers. Er muss im Format aus 2 Token von "<n> <unit>" vorliegen; die Regeln finden Sie in der Scheduler-Architektur.

Interne Metastore-Synchronisation (experimentell)

PropertyStandardwertBeschreibung
storage.internal.metastore.enabledfalseAktivierung der internen Metastore-Synchronisation
storage.internal.metastore.thread.count4Anzahl der Sync-Worker-Threads
storage.internal.metastore.queue.size12000000Sync-Warteschlangengröße
storage.internal.metastore.point.retation.days10Aufbewahrungsdauer für Points in Tagen (⚠️ Tippfehler-Schlüssel — siehe unten)

Row-Cache

PropertyStandardwertBeschreibung
storage.asset.data.row.cache.sizeNONERow-Cache für Anlagendaten (NONE/ROWS_ONLY/ALL) — ⚠️ kein Code liest das
storage.tag.point.row.cache.sizeNONERow-Cache für Tag-Points — ⚠️ kein Code liest das

Compaction

PropertyStandardwertBeschreibung
storage.table.compaction.strategyUCSStandardstrategie (TWCS: TimeWindow, UCS: Unified). Wird von CassandraCreateDAO gelesen (Code-Fallback ist TWCS)
storage.table.compaction.strategy.twcs.window_size1TWCS-Fenstergröße — ⚠️ kein Code liest das
storage.table.compaction.strategy.twcs.window_unitDAYSTWCS-Fenstereinheit — ⚠️ kein Code liest das
storage.table.compaction.strategy.ucs.scailing_parameterT8UCS-Skalierungsparameter (T8 = tiered 8 levels). Schreibweise scailing stimmt mit dem Code überein
storage.table.compaction.strategy.ucs.min_sstable_size128MiBMinimale UCS-SSTable-Größe (Code-Fallback 100MiB)
storage.table.compaction.strategy.ucs.target_sstable_size512MiBZiel-UCS-SSTable-Größe
storage.table.compaction.strategy.ucs.base_shard_count8Anzahl der UCS-Base-Shards
storage.table.compaction.strategy.ucs.max_sstables_to_compact6Maximale Anzahl an SSTables, die in einem Durchgang kompaktiert werden
storage.table.compaction.strategy.ucs.sstable_growth0.7UCS-SSTable-Wachstumsrate

Kompression / Query-Limits / Backup / Data Gateway

PropertyStandardwertErsetzungBeschreibung
storage.compresion.zstd.level3zstd-Kompressionsstufe (1~22) — ⚠️ Tippfehler-Schlüssel, siehe unten
storage.tag.point.select.limit.size1000000Maximale Zeilenzahl bei einem Select auf einen einzelnen Tag-Point
storage.doamin.model.changed.to.metastore.backuptrueMetastore-Backup bei Änderung des Domänenmodells — ⚠️ Tippfehler-Schlüssel + kein Code liest das
data.gateway.protocolhttp${PP_DATA_GATEWAY_PROTOCOL:http}Data-Gateway-Protokoll
data.gateway.host127.0.0.1${PP_DATA_GATEWAY_HOST:127.0.0.1}Data-Gateway-Host (setzt lokale Koexistenz voraus)
data.gateway.port5500${PP_DATA_GATEWAY_CONNECT_PORT:5500}Data-Gateway-Port (Code-Fallback 5501)
data.gateway.api.key${PP_DATA_GATEWAY_API_KEY}Data-Gateway-API-Schlüssel

⚠️ Tippfehler-Schlüssel — werden trotz Bearbeitung ignoriert

Die folgenden 3 Schlüssel existieren tatsächlich in der Vorlage, weichen aber von der Schreibweise ab, die der Code liest. Auch wenn ein Administrator den Wert dieser Zeile ändert, wird dies stillschweigend ignoriert und der Code-Standardwert angewendet.

Schlüssel der Vorlage (Tippfehler)Vom Code tatsächlich gelesener SchlüsselCode-StandardwertLesestelle
storage.compresion.zstd.levelstorage.compression.zstd.level3StorageConfigCassandraCreateDAO
storage.internal.metastore.point.retation.daysstorage.internal.metastore.point.retention.days10StorageConfigPointDAO
storage.doamin.model.changed.to.metastore.backupkeiner (auch mit korrekter Schreibweise liest kein Code diesen Wert)

Um den Wert tatsächlich zu ändern, fügen Sie in derselben Datei den Schlüssel mit der vom Code erwarteten Schreibweise hinzu. Um z. B. die zstd-Stufe auf 6 zu erhöhen, muss storage.compression.zstd.level=6 eingefügt werden (nicht der Tippfehler-Schlüssel wird korrigiert, sondern eine Zeile mit der korrekten Schreibweise wird ergänzt). Die Tippfehler-Zeile kann unschädlich stehen bleiben, aber die Vorlage selbst zu korrigieren ist die grundlegendere Lösung.

storage.doamin.model.changed.to.metastore.backup wird von keiner Schreibweise gelesen. Für Backups bei Änderung des Domänenmodells ist nicht dieser Schlüssel, sondern MetastoreBackupDeployer (cron 0 0 12 1 1/1 ? *, jeden 1. des Monats um 12:00 Uhr) zuständig — siehe Scheduler-Architektur.

Storage-Schlüssel, die nicht in der Vorlage stehen, aber vom Code gelesen werden

PropertyCode-StandardwertBeschreibung
storage.compression.zstd.typeZstdCompressorKlassenname des Kompressors

Storage-Vorlagenschlüssel, die von keinem Code gelesen werden (Bearbeitung wirkungslos)

storage.durable_writes · storage.asset.data.row.cache.size · storage.tag.point.row.cache.size · storage.table.compaction.strategy.twcs.window_size · storage.table.compaction.strategy.twcs.window_unit (+ die oben genannten 3 Tippfehler-Schlüssel)

Auch wenn die beiden TWCS-bezogenen Schlüssel geändert werden zu storage.table.compaction.strategy=TWCS, steuern sie weder Fenstergröße noch -einheit.


plantpulse-mq.properties

Pfad: plantpulse-server/config/plantpulse-mq.properties · Vorlage: template/plantpulse-mq.properties

Verwaltet die Verbindung zum Kafka-/MQTT-Broker und die DDS-Publish-Topics. Die codeseitige SSOT ist MqConfig (Verbindung) und UNSTopicDefaults (Topics).

Broker-Verbindung

PropertyStandardwertErsetzungBeschreibung
mq.host${PP_KAFKA_HOST}Broker-Host (gemeinsam für Kafka/MQTT)
mq.user${PP_MQ_USER}Verwaltungskonto des Brokers
mq.password${PP_MQ_PASSWORD}Broker-Passwort
mq.kafka.port9092${PP_KAFKA_PORT:9092}Kafka-Port
mq.kafka.security.protocolSASL_PLAINTEXTKafka-Sicherheitsprotokoll
mq.ssl.truststore.location/var/security/plantpulse/master/master.truststore.p12Messaging-TLS-Truststore (MQTT + optional Kafka-TLS)
mq.ssl.truststore.passwordkopens123!${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!}Truststore-Passwort
mq.ssl.truststore.typePKCS12Truststore-Typ
mq.ssl.endpoint.identification.algorithm(leer)Algorithmus zur Hostname-Prüfung (leer = keine Prüfung)
mq.mqtt.port${PP_MQTT_TLS_PORT}MQTT-Verbindungsport
mq.mqtt.ssl.enabledtrueNutzung von MQTT-TLS

MqConfig liest neben den obigen Schlüsseln auch die Kafka-spezifischen Truststore-Overrides mq.kafka.ssl.truststore.location / .password / .type sowie mq.kafka.ssl.endpoint.identification.algorithm (nicht in der Vorlage enthalten; ist er nicht gesetzt, wird mq.ssl.* verwendet).

DDS-Topics

14 Kafka-Topics (mq.dds.kafka.topic.*) + 14 MQTT-UNS-Topics (mq.dds.mqtt.topic.*) + 2 SparkplugB-Topics (mq.dds.mqtt.sparkplugb.*).

Sämtliche Schlüssel und Standardwerte sind unter Messaging-Architektur → DDS-Publish-Topics zusammengefasst. Die Topic-Werte sind Teil des Kafka-/MQTT-Wire-Contracts, den UNSTopicDefaultsContractTest als Literale einfriert — beliebige Änderungen sind untersagt.

${PP_TOPIC_PREFIX} bestimmt gleichzeitig das Präfix des Kafka-Topics (pp-), die Root des MQTT-UNS-Pfads (pp/) und die SparkplugB-Group-ID.


plantpulse-mail.properties

Pfad: plantpulse-server/config/plantpulse-mail.properties · Vorlage: template/plantpulse-mail.properties

SMTP-/SMS-Konfiguration für den Versand von Alarmen/Reports.

PropertyStandardwertErsetzungBeschreibung
mail.send.enabledfalse${PP_MAIL_SEND_ENABLED:false}Master-Versand-Gate. Ist true nicht gesetzt, wird jeglicher Mailversand mit einem WARN-Log übersprungen (SMTP wird gar nicht erst versucht). Opt-in pro Standort
mail.smtp.hostsmtp-relay.brevo.com${PP_MAIL_SMTP_HOST:...}SMTP-Host
mail.smtp.port587${PP_MAIL_SMTP_PORT:587}SMTP-Port (25:plain, 465:SSL, 587:STARTTLS)
mail.smtp.authtrue${PP_MAIL_SMTP_AUTH:true}Ob SMTP-Authentifizierung genutzt wird
mail.smtp.userb2df89001@smtp-brevo.com${PP_MAIL_SMTP_USER:...}SMTP-Absenderkonto
mail.smtp.passwordbskHIVJqcFQaFtb${PP_MAIL_SMTP_PASSWORD:...}SMTP-Passwort (dev-Standardwert — bei Auslieferung ersetzen)
mail.smtp.starttls.enabletrue${PP_MAIL_SMTP_STARTTLS:true}Ob STARTTLS verwendet wird
sms.sender.classplantpulse.cep.listener.alarm.sms.DefaultSMSSenderSMS-Versand-Implementierungsklasse (CEP-Listener)
diagnostic.log.emaildiag@kopens.com${PP_DIAGNOSTIC_EMAIL:diag@kopens.com}E-Mail-Empfänger für Diagnosebenachrichtigungen — ⚠️ kein Code liest das

PP_MAIL_SMTP_* wird von env.sh nicht exportiert. Diese Vorlage (Brevo-Relais) ist die SSOT, und ein Überschreiben per Umgebungsvariable zerstört stillschweigend die Login-Kombination. Standort-Overrides gehören in env.local.sh. Weitere Hintergründe siehe Abschnitt Placeholder-Ersetzung.


plantpulse-ai.properties

Pfad: plantpulse-server/config/plantpulse-ai.properties · Vorlage: template/plantpulse-ai.properties

Verwaltet das OpenAI-kompatible AI-Gateway und die AI-Feature-Flags. Codeseitig liest plantpulse.core.service.ai.AIConfig über dieselbe externe Konfigurationskette.

Gateway

PropertyStandardwertErsetzungBeschreibung
ai.openai.enabledfalse${PP_AI_OPENAI_ENABLED:false}Master-Feature-Flag. Bei false werden AI-UI und -Endpunkte ausgeblendet und deaktiviert
ai.openai.base.urlhttps://api.openai.com${PP_AI_OPENAI_BASE_URL:...}OpenAI-kompatibles Gateway. Kein abschließender Slash
ai.openai.chat.path/v1/chat/completions${PP_AI_OPENAI_CHAT_PATH:...}Pfad für Chat Completions
ai.openai.responses.path/v1/responses${PP_AI_OPENAI_RESPONSES_PATH:...}Pfad für Responses
ai.openai.api.key(leer)${PP_AI_OPENAI_API_KEY:}LiteLLM-Virtual-Key / Proxy-Key. Kein Standardwert im Repository
ai.openai.modelgpt-5-mini${PP_AI_OPENAI_MODEL:gpt-5-mini}Von LiteLLM config.yaml exponierter Modellname
ai.openai.timeout.ms15000Request-Timeout (ms)
ai.openai.max.output.tokens1200Maximale Output-Tokens
ai.openai.temperature-1Sampling-Temperature. Bei negativem Wert wird der Parameter im Request-Body vollständig weggelassen

⚠️ ai.openai.temperature-Falle. Modelle der gpt-5-Reihe (gpt-5-mini, gpt-5.5 usw.) unterstützen keine Temperature, sodass ein anderer Wert als der Standard 1 zu 400 Unsupported value führt. Deshalb muss der Wert negativ (Sentinel für „weglassen") sein. Der Vorlagenkommentar mit „Standardwert 0,1" bezieht sich auf das LiteLLM-/vLLM-Gateway (gpt-4o usw.); der aktuelle Wert in der Vorlage ist -1.

Betriebs-Assistent

PropertyStandardwertBeschreibung
ai.alarm.rca.enabledtrueUrsachenanalyse für Alarme
ai.alarm.eql.enabledtrueEQL-Unterstützung für Alarme
ai.uns.topic.enabledtrueUNS-Topic-Assist
ai.result.audit.enabledtrueAuditierung der AI-Ergebnisse
ai.similar.incident.enabledtrueEmpfehlung ähnlicher Störungsfälle
ai.similar.incident.max.items5Maximale Anzahl an Empfehlungen
ai.similar.incident.min.score40Mindestscore für Empfehlungen
6 im August 2026 entfernte Schlüssel

Die 3 ai.diagnostic.summary.*-Schlüssel (AI-Zusammenfassung der Diagnoselogs) und die 3 ai.operations.report.*-Schlüssel (AI-Betriebsreports) wurden am 2026-08-25 aus dem Produkt entfernt. Da auch Screens, JS und Controller mit entfernt wurden, lebt die Funktion nicht wieder auf, selbst wenn Sie die Werte zurücksetzen.

Bleiben diese Schlüssel vor dem Upgrade in der Konfigurationsdatei stehen, schadet das nicht — da kein Code sie liest, werden sie einfach ignoriert. Sie können sie bei Bedarf löschen.

MCP / Chat

PropertyStandardwertErsetzungBeschreibung
ai.mcp.enabledtrue${PP_AI_MCP_ENABLED:true}MCP (AI-Chat-Ops-Endpunkt)
ai.mcp.allowed.origins(leer)${PP_AI_MCP_ALLOWED_ORIGINS:}Liste der für MCP zulässigen Origins
ai.chat.enabledfalse${PP_AI_CHAT_ENABLED:false}AI-Chat-Drawer der server-web-Konsole. Funktioniert nur, wenn das ai.openai.*-Gateway aktiviert ist

Weitere Vorlagen

In template/ gibt es neben den oben genannten 5 Typen noch weitere Konfigurationsvorlagen für Anwendungen und Infrastruktur. Die maßgebliche Referenz für die Zuordnung der Deployment-Pfade ist ConfigTemplates.java.

VorlageDeployment-PfadZweck
plantpulse-batch.properties/plantpulse-batch/config/Batch (Zeitreihen-Sync/Aggregation)
plantpulse-cep.properties/plantpulse-cep/config/CEP-Engine
plantpulse-jdbc.properties/plantpulse-data-gateway/config/ und /plantpulse-sql/config/JDBC-Integrationskonfiguration (beide Module teilen sich dieselbe Vorlage)
plantpulse-data-gateway.properties/plantpulse-data-gateway/config/Data-Gateway-Verhalten
plantpulse-warehouse.properties/plantpulse-warehouse/config/Cassandra → Iceberg(S3)-Archivierung
plantpulse-monitor.properties/plantpulse-monitor/config/Monitor (JMX-Erfassung)
plantpulse-plugin-opcua.properties/plantpulse-plugin/opc-ua/config/OPC-UA-Server-Plugin
plantpulse-plugin-aas.properties/plantpulse-plugin/aasx-server/config/AAS-V3 (aasx-server)-Plugin
kafka.properties/plantpulse-messaging/kafka/config/kafka.propertiesKafka(KRaft)-Broker
kafka-jaas.conf/plantpulse-messaging/kafka/config/jaas.confKafka JAAS
hivemq.xml/plantpulse-messaging/mqtt/conf/config.xmlHiveMQ-Broker
plantpulse-mq-auth.properties/plantpulse-messaging/mqtt/conf/auth.propertiesHiveMQ-Authentifizierungsquelle
hive-auth.properties/plantpulse-analytics/spark/conf/Authentifizierungsquelle für Hive-/Analytics-Konten
plantpulse-timeseries-engine.conf/plantpulse-timeseries/engine/conf/ (2 Stellen)TSE
valkey.conf · postgresql.conf · pg_hba.conf · cassandra.yaml · jvm-server.options/plantpulse-storage/...Storage
spark-env.sh · spark-defaults.conf · hive-site.xml · kyuubi-defaults.conf · gravitino-iceberg-rest-server.conf/plantpulse-analytics/...Analytics
workflow.yaml · application.yaml/plantpulse-workflow/...Temporal / Kestra
plantpulse-startup.properties(wird von startup selbst genutzt)Verbindungsinformationen für den Data-Lake-Health-Check beim Booten

plantpulse-sql.properties existiert nicht. Das SQL-Modul erhält plantpulse-jdbc.properties. plantpulse-websocket.properties existiert ebenfalls nicht. Es gibt keine Konfigurationsdatei für WebSocket/STOMP. template/cluster/ ist ein Override ausschließlich für Worker-Knoten — wird die Master-Vorlage geändert, muss auch dies synchronisiert werden.

plantpulse-batch.properties

Besteht aus Verbindungsblöcken (Platform/Metastore/Cache/TSE/Kafka/Cassandra/Spark) und der Konfiguration des Batch-Verhaltens. Achtung: Die Verbindungsschlüssel unterscheiden sich namentlich von storage/jdbc — z. B. Cassandra: storage.db.host / storage.db.port / storage.db.keyspace (server: storage.host / storage.port / storage.keyspace).

PropertyStandardwertBeschreibung
platform.host${PP_MASTER_IP}Host der Platform (server-web)
mq.port9092Kafka-Port (Literal — keine Ersetzung)
kafka.topicpp-batchEingangs-Topic des Batch
kafka.group.idPP-BATCH-GROUPBatch-Consumer-Gruppe
batch.timer_schedule_delay5000Intervall des Batch-Timers (ms)
batch.thread_pool_batch_thread_size4Anzahl der Batch-Worker-Threads
batch.buffer_drain_limit_size10000Maximale Anzahl der Einträge pro Leerungsdurchgang
batch.sync.inmemory.enabledfalseIn-Memory-Synchronisation
batch.sync.inmemory.ttl.minute10TTL der In-Memory-Synchronisation (Minuten)
batch.sync.tse.enabledtrueVerteilung an TSE
batch.sync.external.db.enabledfalseSynchronisation mit externer DB
external.db.nameTIMESCALEDBTyp der externen DB. Die Blöcke INFLUXDB/QUESTDB sind in der Vorlage auskommentiert
analytics.urljdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/defaultSpark Thrift JDBC

plantpulse-cep.properties

PropertyStandardwertBeschreibung
cep.ha.enabledtrueRedis-basierter HA-Killswitch (bewahrt Deployment/Named-Window-/Single-Key-Tabellen-Status beim Neustart)
cep.ha.snapshot.interval_ms1000Snapshot-Intervall (nicht blockierend im Hintergrund zum Event-Thread)
cep.ha.snapshot.named_windowstrueNamed-Window-Snapshot
cep.ha.snapshot.tablestrueTabellen-Snapshot
cep.async.core_pool_size32Async-Core-Pool
cep.async.max_pool_size256Async-Max-Pool
cep.async.queue_capacity50000Async-Queue
cep.async.keep_alive_seconds60Thread-Keep-Alive
cep.async.shutdown_timeout_seconds30Wartezeit für Graceful Shutdown
cep.consumer.thread_count16Consumer-Threads
cep.stream.shard_count16Anzahl Stream-Shards
cep.stream.drain_limit_size1000Drain-Limit
cep.stream.drain_warn_ms1000Drain-Warnung (ms)
cep.monitor.initial_delay_seconds5Anfangsverzögerung des Monitors
cep.monitor.interval_seconds1Monitor-Intervall
cep.monitor.store_interval_seconds60Speicherintervall für Metriken je EQL-Statement in Cassandra
cep.monitor.statement_metrics_enabledtrueErfassung von Metriken je Statement
cep.performance.cpu_warn_threshold_ns1000000000CPU-Warnschwelle (ns)
cep.performance.wall_warn_threshold_ns1000000000Wall-Warnschwelle (ns)
cep.api.key${PP_CEP_API_KEY}Authentifizierung des EQL-Verwaltungsendpunkts (X-API-Key)
cep.api.max_eql_text_length100000Maximale Länge des EQL-Texts (DOS-Schutz)
cep.storage.request_timeout_seconds10Cassandra-Request-Timeout
cep.storage.max_inflight_writes256Obergrenze der in-flight Schreibvorgänge
cep.storage.connect_max_retries3Verbindungswiederholung
cep.storage.ttl_seconds864000Metriken-TTL (Sekunden, 10 Tage)
cep.stream.pending_idle_threshold_ms60000Idle-Schwelle für pending
cep.stream.cleaner_initial_delay_ms60000Anfangsverzögerung des Cleaners
cep.stream.cleaner_interval_ms10000Cleaner-Intervall
cep.stream.max_clean_duration_ms30000Maximale Bereinigungsdauer
cep.stream.cleaner_max_claim_count5000Maximale Anzahl beanspruchter Einträge
cep.stream.ack_chunk_size500ACK-Chunk-Größe

Die 60 von cep.monitor.store_interval_seconds hat eine Begründung — proportional zur Anzahl der Statements (Anlage × EMS/Alarmregel, in dev tatsächlich 1.263) entstanden bei 10 s 7,6K Schreibvorgänge pro Minute. Da es sich um rein bedarfsorientierte Abfragen handelt, wurde auf 60 s entspannt (−83 %).

Die HA-eigene Redis-Verbindung (cep.ha.redis.host/port/password) ist in der Vorlage auskommentiert — nur bei Verwendung eines anderen Redis als des Caches aktivieren.

plantpulse-jdbc.properties

Integrierte Verbindungskonfiguration für externe JDBC-Clients (SQL-Modul · Data Gateway). Präfix ist jdbc.<tech> (postgres/cassandra/spark/tse).

PropertyWertBeschreibung
jdbc.postgres.driverorg.postgresql.DriverMETA / PQL
jdbc.postgres.urljdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/${PP_DB_NAME}?characterEncoding=UTF-8
jdbc.cassandra.driverplantpulse.cassandra.jdbc.CassandraDriverOLTP-Zeitreihe (CQL). Treiberwert dient der Konfigurationskonsistenz (funktional ungenutzt)
jdbc.cassandra.urljdbc:cassandra://${PP_CASSANDRA_HOST}:${PP_CASSANDRA_PORT}/${PP_SCHEME}
jdbc.tse.driverplantpulse.timeseries.tql.TQLDriverOTAP / TQL
jdbc.tse.urljdbc:ts://${PP_TSE_HOST}:${PP_TSE_PORT}/${PP_SCHEME}⚠️ fest auf plain http(ts/7800)
jdbc.spark.driverplantpulse.spark.jdbc.SparkSQLDriverOLAP-Analytics
jdbc.spark.urljdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/default/${PP_SCHEME}
data.gateway.api.key${PP_DATA_GATEWAY_API_KEY}Für die Authentifizierung von JDBC-Aufrufen

⚠️ Ändern Sie jdbc.tse.url nicht auf https(tss/7801). Der TQL-JDBC-Treiber verwendet den Plaintext-TSE-Listener (7800). Für TSE-Clients ist global standardmäßig plaintext http/7800 voreingestellt (2026-08, TSE-Abschnitt in env.sh). Wird tss/7801 gesetzt, schlägt die JDBC-Verbindung fehl → Boot-Fehler von data-gateway → alle /api/v1/* liefern 404 → das führt zu 404 im analytics-Katalog. Deshalb ist es auf ts/PP_TSE_PORT fest verdrahtet.

jdbc.spark.username ist ein reines Analytics-Konto, ${PP_ANALYTICS_USER}. Es ist vom internen Kyuubi-Metastore-Konto (PP_HIVE_*) getrennt. Als optionale Schlüssel können jdbc.<tech>.pool.initial|min|max (postgres/spark/tse) und jdbc.<tech>.query.timeout|fetch-size verwendet werden (vollständige Referenz siehe plantpulse-jdbc/docs/configuration.md). jdbc.cassandra.local-datacenter ist in der Vorlage auskommentiert; ist es nicht gesetzt, gilt datacenter1.

plantpulse-data-gateway.properties

PropertyStandardwertBeschreibung
data.gateway.api.key${PP_DATA_GATEWAY_API_KEY:ADFA-URDV-QWED-1234}API-Authentifizierungsschlüssel (Pflicht). dev-Standardwert bei Auslieferung ersetzen
data.gateway.rate.limit1000Maximale Anzahl Requests pro Sekunde (bezogen auf IP + API-Schlüssel)
data.gateway.slow.query.ms10000Warnschwelle für langsame Abfragen (ms)
data.gateway.slow.update.ms2000Warnschwelle für langsame Aktualisierungen (ms)
data.gateway.async.timeout.ms60000Async-Timeout (ms)

plantpulse-monitor.properties

Sammlung der JMX-/Verwaltungsendpunkte jedes Dienstes bezogen auf einen Einzelknoten (type=MASTER). Die einzige Datei, in der Schlüssel Unterstriche (_) statt Punkte (.) verwenden.

PropertyStandardwertBeschreibung
typeMASTEREinzelner Knoten oder Cluster-Master
db_typeCASSANDRAZu überwachender DB-Typ
master / host${PP_MASTER_IP} / ${PP_HOST_IP}Master / eigener Host
db_host · db_port · db_keyspace · db_username · db_password · db_replication_factor${PP_CASSANDRA_*} · 9042 · ${PP_SCHEME} · 1Cassandra-Verbindung
tse_host · tse_port · tse_protocol · tse_username · tse_password${PP_TSE_*} · 7801 · https · tse · tse123!TSE-Verbindung (Metrik-Erfassung)
kafka_jmx_uriservice:jmx:rmi:///jndi/rmi://${PP_KAFKA_HOST}:7299/jmxrmiKafka JMX
mqtt_jmx_uri...://${PP_MQTT_HOST}:7279/jmxrmiHiveMQ JMX
cep_jmx_uri...://${PP_HOST_IP}:6499/jmxrmiCEP JMX
datagateway_jmx_uri...://${PP_HOST_IP}:7499/jmxrmiData-Gateway JMX
sql_jmx_uri...://${PP_HOST_IP}:7599/jmxrmiSQL JMX
tse_jmx_uri...://${PP_HOST_IP}:7899/jmxrmiTSE JMX
cassandra_jmx_uri...://${PP_CASSANDRA_HOST}:7199/jmxrmiCassandra JMX
spark_jmx_uri...://${PP_SPARK_HOST}:10010/jmxrmiSpark JMX
redis_jmx_uriredis://${PP_REDIS_HOST}:${PP_REDIS_PORT}?password=...Valkey-Verbindungs-URI
redis_ssl_truststore_location / _password / _type / redis_ssl_endpoint_identification_enabledp12 · ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} · PKCS12 · falseValkey-TLS
postgres_jmx_urijdbc:postgresql://.../${PP_DB_NAME}?user=...&password=...PostgreSQL-Verbindungs-URI

Zusammenfassung der JMX-Ports: HiveMQ 7279, Kafka 7299, CEP 6499, Data Gateway 7499, SQL 7599, TSE 7899, Cassandra 7199, Spark 10010.

plantpulse-warehouse.properties

Batch-Archivierung Cassandra → Iceberg(S3). Nur in dieser Datei sind die Schlüssel in Großbuchstaben-Snake-Case (UPPER_SNAKE).

GruppeWichtige SchlüsselStandardwert
TemporalTEMPORAL_SERVER · TEMPORAL_TASK_QUEUE · TEMPORAL_WORKFLOW_ID · TEMPORAL_SCHEDULE_ID · OPTIMIZER_SCHEDULE_ID · OPTIMIZER_WORKFLOW_ID${PP_TEMPORAL_HOST}:${PP_TEMPORAL_PORT} · PP-S3-QUEUE · PP-S3-ARCHIVE-DAILY-WORKFLOW · PP-S3-ARCHIVER-DAILY · PP-S3-OPTIMIZER-WEEKLY · PP-S3-OPTIMIZER-WEEKLY-WORKFLOW
ZeitplanDAILY_HOUR · DAILY_MINUTE · OPTIMIZER_DAY_OF_WEEK · OPTIMIZER_HOUR · OPTIMIZER_MINUTE · TIMEZONE2 · 20 · 0 (Sonntag) · 3 · 0 · ${PP_TZ}
AusführungsmodusARCHIVER_MODESHELL (oder KESTRA)
KestraKESTRA_SERVER · KESTRA_NAMESPACE · KESTRA_TASK_ID · KESTRA_USER · KESTRA_PASS${PP_KESTRA_HOST}:${PP_KESTRA_PORT} · plantpulse · plantpulse-daily-s3-archiver · admin@plantpulse.io · (leer)
SkriptS3_SCRIPT_DIR · S3_SCRIPT_NAME · S3_OPTIMIZER_SCRIPT_NAME${PP_HOME}/plantpulse-warehouse/s3 · archive.sh · optimize.sh
SparkSPARK_APP_NAME · SPARK_MASTER · SPARK_JAR_PATH · SPARK_DRIVER_MEMORY · SPARK_EXECUTOR_MEMORY · SPARK_EXECUTOR_CORES · SPARK_NUM_EXECUTORS · ARCHIVER_PARALLELISM · SPARK_CHECKPOINT_DIRPP-SPARK-S3-LAKEHOUSE · local[*] · .../plantpulse-warehouse-s3.jar · 2g · 4g · 4 · 3 · 4 · s3a://${PP_MINIO_BUCKET:-plantpulse}/spark-checkpoint/
Quelle/ZielCASSANDRA_CATALOG · CASSANDRA_DATABASE · S3_BUCKET · ICEBERG_CATALOG · ICEBERG_DATABASEcassandra · ${PP_SCHEME:pp} · ${PP_MINIO_BUCKET:-plantpulse} · spark_catalog · ${PP_SCHEME:pp}
OptimierungSNAPSHOT_RETENTION_DAYS · OPTIMIZER_MIN_INPUT_FILES · OPTIMIZER_TARGET_FILE_SIZE_BYTES3 · 10 · 134217728 (128MB)
TimeoutARCHIVER_WF_EXECUTION/RUN/TASK_TIMEOUT_HOURS · OPTIMIZER_WF_EXECUTION/RUN/TASK_TIMEOUT_HOURS · ACTIVITY_MAX_ATTEMPTS · ACTIVITY_TIMEOUT_HOURS · OPTIMIZER_ACTIVITY_TIMEOUT_HOURS · SCRIPT_TIMEOUT_SECONDS · OPTIMIZER_TIMEOUT_SECONDS · HEARTBEAT_INTERVAL_SECONDS12/12/12 · 8/7/12 · 3 · 12 · 8 · 21600 (6h) · 25200 (7h) · 60
WebWEB_SERVER_PORT9600

Messaging- / Authentifizierungsquellen-Vorlagen

plantpulse-mqtt.properties — HiveMQ-Brokerkonfiguration.

PropertyStandardwert
mqtt.host · mqtt.user · mqtt.password${PP_MQTT_HOST} · ${PP_MQ_USER} · ${PP_MQ_PASSWORD}
mqtt.port · mqtt.ssl.enabled${PP_MQTT_TLS_PORT} · true
mqtt.websocket_port8888
mqtt.data_dir/data1/pp-data/hivemq

plantpulse-mq-auth.properties — Authentifizierungsquelle, auf die die HiveMQ-Security-Extension (FileAuthAuthenticator) über die Umgebungsvariable HIVEMQ_AUTH_FILE verweist. Es gibt nur die beiden Schlüssel mqtt.user / mqtt.password.

hive-auth.properties — wird von plantpulse-hive-auth (PasswordAuthenticator) gelesen. Umgebungsvariable HIVE_AUTH_FILE oder $PP_HOME/plantpulse-analytics/spark/conf/hive-auth.properties. Ungewöhnlich ist, dass der Schlüsselname selbst ein Placeholder ist.

${PP_HIVE_USER}=${PP_HIVE_PASSWORD}
${PP_ANALYTICS_USER}=${PP_ANALYTICS_PASSWORD}

kafka.properties — Kafka-Broker im KRaft-Modus. Wichtige Werte: process.roles=broker,controller, node.id=1, num.partitions=4, 3 Listener-Typen (SASL_PLAINTEXT/CONTROLLER/SASL_SSL), sasl.enabled.mechanisms=PLAIN, super.users=User:admin, allow.everyone.if.no.acl.found=false, log.dirs=${PP_DATA_DIR}/kafka/kraft_combined_logs, log.retention.ms=3600000 (1 Stunde), message.max.bytes=157286400, default.replication.factor=1, auto.create.topics.enable=true.

⚠️ log.retention.ms=3600000 = 1 Stunde. Voraussetzung ist, dass Kafka als Puffer dient und die Persistierung Cassandra/TSE übernimmt. Bleibt ein Consumer länger als 1 Stunde stehen, gehen Daten verloren.

Plugin-Vorlagen

plantpulse-plugin-opcua.properties — Verbindung zu PostgreSQL / Cassandra / Valkey / Kafka + OPC-UA-Server-Endpunkt.

PropertyStandardwertBeschreibung
kafka.topicpp-tag-point⚠️ Literal — keine ${PP_TOPIC_PREFIX}-Ersetzung
kafka.thread · kafka.group.id8 · opcua-plugin-group
opc.ua.server.domain · opc.ua.server.port${PP_HOST_IP} · 8007
opc.ua.server.user · password · anonymousopcua · 설치-시-변경 · false
opc.ua.server.tcp.port · tls.port${PP_OPCUA_TCP_PORT:11004} · ${PP_OPCUA_TLS_PORT:11005}
redis.thread · redis.ssl.enabled4 · false

plantpulse-plugin-aas.properties — AAS-V3-Server + Kafka-Konsum-Konfiguration.

PropertyStandardwertBeschreibung
aas.v3.port${PP_AAS_V3_PORT:8090}V3-HTTP-Port
kafka.topic${PP_TOPIC_PREFIX}-tag-pointEmpfang von Echtzeit-Tag-Points
kafka.thread · kafka.poll.count8 · 1000
group.id · auto.offset.reset · enable.auto.commitpp-plugin-aas-server · earliest · false
session.timeout.ms · auto.commit.interval.ms30000 · 1000
plugin.message.listenerplantpulse.plugin.opcua.messaging.KafkaPluginMessageListener

Die Registry-/AAS-Ports von BaSyx V2 sind nicht konfigurierbar, sondern im Code hartkodiertREGISTRY_PORT=4800, AAS_PORT=4801 in AASServer.java.

plantpulse-startup.properties

Verbindungsinformationen, die Checker beim Booten für Data-Lake/Health-Check nutzt. Besteht aus den Blöcken platform.host · metastore.* · cache.* · tse.* · storage.db.* · analytics.* · object.* (MinIO). Alle Werte sind env.sh-Ersetzungen und folgen derselben Schlüsselnamenskonvention (storage.db.*) wie die Batch-Vorlage.


Engine-Schlüssel, die nicht in der Vorlage stehen, aber vom Code gelesen werden

EngineConfig liest auch die folgenden Schlüssel. Da sie nicht in der Vorlage (plantpulse-engine.properties) enthalten sind, gilt normalerweise der Code-Standardwert; um den Wert zu ändern, muss die Zeile direkt in plantpulse-server/config/plantpulse-engine.properties hinzugefügt werden.

Edge-Uhr / Status-Polling

PropertyCode-Standardwert
edge.clock.poll.term.sec60
edge.clock.skew.threshold.ms10000
edge.clock.rtt.max.ms2000
edge.clock.autosync.enabledtrue
edge.clock.autosync.cooldown.ms600000
edge.clock.warn.cooldown.ms600000
edge.clock.skip.warn.count5
edge.status.poll.seconds30
edge.status.poll.jitter.max.ms3000

edge.clock.poll.term.sec und edge.status.poll.seconds bestimmen das Ausführungsintervall der Scheduler-Jobs — Wertbeschränkungen siehe Edge-Abschnitt der Scheduler-Architektur.

DDS / Event-Bus / Push / Puffer

PropertyCode-Standardwert
engine.dds.queue.size80000
engine.dds.worker.threads4
engine.dds.latency.warn.ms1000
engine.eventbus.queue.capacity65536
engine.push.threads4
engine.push.queue.size10000
engine.storage.buffer.typeKAFKA
engine.streaming.timeout.backup.queue.capacity12000000

Der Code-Standardwert von engine.dds.enabled · engine.dds.data.tag.enabled · engine.dds.data.asset.enabled ist false. Da die Vorlage sie explizit auf true setzt, sind sie nur in der ausgelieferten Version aktiviert — löscht man diese drei Zeilen, wird DDS stillschweigend deaktiviert.

Job-Threads (nicht in der Vorlage enthalten)

PropertyCode-Standardwert
engine.job.thread.oee10
engine.job.thread.ram5
engine.job.thread.ems5
engine.job.thread.system4
engine.job.asset.slow.threshold.ms20000

⚠️ Der Code-Standardwert von engine.job.thread.point ist 4, während die Vorlage 8 vorgibt (engine.job.thread.asset stimmt in beiden Fällen mit 8 überein). Löscht man die Vorlagenzeile, halbiert sich der Wert.

Flow-Engine (nicht in der Vorlage enthalten)

PropertyCode-Standardwert
flow.engine.enabledtrue
flow.executor.parallelism64
flow.executor.queue.capacity10000
flow.executor.queue.size10000
flow.executor.poll.timeout.ms50
flow.scheduler.pool.size4
flow.timer.pool.size2
flow.jdbc.trigger.pool.size2
flow.shutdown.timeout.sec5
flow.enabled.cache.ttl.ms5000
flow.webhook.auth.enabledtrue

Alarm / ISO-Kennzahlen / OEE

PropertyCode-Standardwert
alarm.duplicate.check.minutes10
engine.oee.debounce.ms100
iso.oee.rolling.window.minutes10
iso.ems.rolling.window.minutes10
iso.ram.rolling.window.minutes1440

Details der Anomalieerkennung (Anlagen-Point / System)

Nur relevant, wenn engine.data.anomaly.enabled=true aktiviert ist.

PropertyCode-Standardwert
engine.data.anomaly.asset.point.intervalMINUTE
engine.data.anomaly.asset.point.lookback.minutes14400
engine.data.anomaly.asset.point.recent.seconds600
engine.data.anomaly.asset.point.limit2100
engine.data.anomaly.asset.point.context.length2048
engine.data.anomaly.asset.point.prediction.length96
engine.data.anomaly.asset.point.score.history60
engine.data.anomaly.asset.point.threshold.k3.5
engine.data.anomaly.asset.point.threshold.min0.80
engine.data.anomaly.asset.point.threshold.max0.98
engine.data.anomaly.asset.point.topk.request5
engine.data.anomaly.asset.point.topn.report5
engine.data.anomaly.system.lookback.minutes1440
engine.data.anomaly.system.recent.seconds60
engine.data.anomaly.system.limit2100
engine.data.anomaly.system.context.length2048
engine.data.anomaly.system.pred.length96
engine.data.anomaly.system.threshold.min0.80
engine.data.anomaly.system.topk2

Nicht existierende Einstellungen

Die folgenden Namen tauchen in früheren Dokumenten oder externen Quellen auf, existieren aber weder in der Vorlage noch im Code. Wird eine Einstellung unter diesem Namen hinzugefügt, hat das keinerlei Wirkung.

GesuchtesTatsächlicher Ort
storage.postgresql.*metastore.driver / metastore.url / metastore.user / metastore.password
storage.redis.*cache.host / cache.port / cache.password / cache.ssl.*
storage.cassandra.*storage.host / storage.port / storage.keyspace / storage.user / storage.password
storage.tse.*tse.protocol / tse.host / tse.port / tse.user / tse.password
storage.ttl.realtime usw.storage.tag.point.ttl / storage.asset.data.ttl pro Tabelle usw. (TTL-Abschnitt)
storage.compression.enable / .algorithmstorage.compression.zstd.level / storage.compression.zstd.type (die Vorlagenzeile ist ein Tippfehler — Warnung zu Tippfehler-Schlüsseln)
storage.compaction.enable / .scheduleReihe storage.table.compaction.strategy (Compaction-Abschnitt)
storage.metastore.* / storage.cache.*keiner
mq.type / mq.kafka.bootstrap.servers / mq.kafka.group.idmq.host + mq.kafka.port. Die Consumer-Gruppe ist keine Konfiguration, sondern eine Code-Konstante (PP-KAFKA-POINT-GROUP usw., Messaging-Architektur)
mail.* außerhalb von plantpulse-server/config/nur an einer Stelle plantpulse-mail.properties
websocket.* / plantpulse-websocket.propertieskeiner. STOMP/WebSocket wurde im Juli 2026 abgeschafft, Browser-Push läuft über SSE (/push/sse) — Messaging-Architektur
scheduler.enabled / scheduler.thread.count / scheduler.misfire.* / scheduler.history.*keiner. Quartz-Konfiguration liegt in plantpulse-server-web/src/quartz.properties (WAR-Classpath) — Scheduler-Architektur
engine.ntp.enable / engine.ntp.serverengine.ntpdate.sync / engine.ntpdate.server.ip
engine.cep.enable / engine.cep.host / engine.cep.portengine.cep.server.ip / engine.cep.server.port / engine.cep.server.protocol
engine.anomaly.*engine.data.anomaly.*
engine.dds.enable / engine.dds.topic.prefixengine.dds.enabled, das Topic-Präfix stammt aus PP_TOPIC_PREFIX (mq-Vorlage)
engine.async.queue.size / engine.async.timeout / engine.pipeline.batch.size / engine.timeout.* / engine.dataflow.threads / engine.dataflow.buffer.sizekeiner
PP_STOMP_* / PP_WEBSOCKET_* env-Variablennicht in env.sh enthalten

Properties mit enthaltenen Passwörtern

Werte, die vor der Auslieferung zwingend ersetzt werden müssen. Die dev-Klartext-Standardwerte sind Placeholder in env.sh (oder der Vorlage); bei Produktivbetrieb/Kundenauslieferung müssen sie durch kundenspezifische Werte ersetzt oder per Docker -e VAR=... / export überschrieben werden.

DateiSchlüssel
plantpulse-storage.propertiesmetastore.password · cache.password · cache.ssl.truststore.password · storage.password · tse.password · data.gateway.api.key
plantpulse-engine.propertiesapi.key · flow.webhook.api.key · engine.cep.server.api.key
plantpulse-mq.propertiesmq.password · mq.ssl.truststore.password
plantpulse-mail.propertiesmail.smtp.password
plantpulse-ai.propertiesai.openai.api.key
plantpulse-cep.propertiescache.password · storage.password · cep.api.key
plantpulse-batch.propertiesmetastore.password · cache.password · tse.password · mq.password · storage.db.password · analytics.password · external.db.password
plantpulse-jdbc.propertiescache.password · jdbc.postgres.password · jdbc.cassandra.password · jdbc.tse.password · jdbc.spark.password · data.gateway.api.key
plantpulse-data-gateway.propertiesdata.gateway.api.key
plantpulse-monitor.propertiesdb_password · tse_password · redis_jmx_uri (Passwort in der URL) · redis_ssl_truststore_password · postgres_jmx_uri (Passwort in der URL)
plantpulse-mqtt.properties · plantpulse-mq-auth.propertiesmqtt.password
plantpulse-plugin-opcua.propertiespostgres.password · cassandra.password · redis.password · kafka.password · opc.ua.server.password
plantpulse-plugin-aas.propertiesaas.db.password · cassandra.password · kafka.password
kafka.propertiesssl.keystore.password · ssl.key.password · ssl.truststore.password
hive-auth.propertiesGesamter Wert ist das Passwort

API-Schlüssel-Richtlinie: PP_API_KEY · PP_DATA_GATEWAY_API_KEY · PP_FLOW_WEBHOOK_API_KEY · PP_CEP_API_KEY bleiben mit dev-Klartext-Standardwert als Fallback (${VAR:-<dev-default>}) — damit dev/Test ohne zusätzliche Secret-Injektion booten und deployen können. Nicht auf Hard-Fail (:?) umstellen — sonst stirbt restart-server.sh sofort beim Sourcen von env.sh und das Deployment schlägt fehl.

Empfohlene Maßnahmen

# 설정 파일 권한 제한
chmod 600 /opt/kopens/plantpulse-platform/plantpulse-*/config/*.properties

# 사이트별 비밀값은 env.local.sh 로 분리 (env.sh 는 SSOT 유지)
vi /opt/kopens/plantpulse-platform/plantpulse-startup/env.local.sh

Secrets werden nicht in das Repository committet.