Property-Referenz
Dieses Dokument wird aus der real ausgelieferten Konfigurationsvorlage (
*.properties) neu generiert (2026-07-28) — der aktuelle Speicherort der Vorlage istplantpulse-datalake-cli/config/templates, und/etc/kopens/confdes Hosts wird per Bind-Mount an diese Stelle gemountet Die maßgebliche Referenz für die Zuordnung der Deployment-Pfade istplantpulse-startup/src/plantpulse/startup/config/ConfigTemplates.java, die maßgebliche Referenz für die Ladepriorität istplantpulse-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 derconfigure.shdurch den Wertenv.shersetzt wird.
3-Stufen-Modell der Konfiguration
| Stufe | Ort | Änderungsmethode |
|---|---|---|
| Globale Konfiguration | plantpulse-startup/env.sh | Direkt bearbeiten, dann ./configure.sh → betreffendes Modul neu starten |
| Standort-Override | plantpulse-startup/env.local.sh | env.sh liegen alle in der Form ${PP_VAR:-default} vor, daher gewinnt der bereits exportierte Wert |
| Modul-Konfiguration | config/ des jeweiligen Moduls | Direkt bearbeitbar, wird aber bei der nächsten Ausführung von configure.sh überschrieben |
Empfehlung: Bearbeiten Sie im Produktivbetrieb nur
env.sh(oderenv.local.sh) und lassen Sieconfigure.shalle 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.shrendert 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().
- Das über die Systemproperty
-Dpp.conf.dirangegebene Verzeichnis (KonstantePropertiesUtils.CONF_DIR_SYSTEM_PROPERTY = "pp.conf.dir") ${catalina.base}/../config— dasconfig/-Verzeichnis des Moduls- 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.
| Zeitpunkt | Akteur | Verhalten |
|---|---|---|
| Beim Deployment | configure.sh → TemplateProcessor.resolvePlaceholders | Ersetzung durch env.sh. Reihenfolge: replacements map → Umgebungsvariable → :기본값 → Original beibehalten. Verschachtelte Placeholder werden nicht unterstützt |
| Zur Laufzeit | PropertiesUtils.resolveEnvPlaceholders | Fü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.
| # | Vorlage | Deployment-Pfad |
|---|---|---|
| 1 | plantpulse-engine.properties | /plantpulse-server/config/plantpulse-engine.properties |
| 2 | plantpulse-storage.properties | /plantpulse-server/config/plantpulse-storage.properties |
| 3 | plantpulse-mq.properties | /plantpulse-server/config/plantpulse-mq.properties |
| 4 | plantpulse-mail.properties | /plantpulse-server/config/plantpulse-mail.properties |
| 5 | plantpulse-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.listist 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→ Reiheplantpulse-engine.properties(gelesen vonEngineConfig)
plantpulse-engine.properties
Pfad: plantpulse-server/config/plantpulse-engine.properties · Vorlage: template/plantpulse-engine.properties
Steuert das Kernverhalten der Datenverarbeitungs-Engine.
Asynchron / Pipeline
| Property | Standardwert | Ersetzung | Beschreibung (Vorlagenkommentar) |
|---|---|---|---|
engine.async.parallelism | 256 | — | Async worker pool parallelism (total cores ~= 256) |
engine.pipeline.threads | 36 | — | Anzahl der Pipeline-Threads |
engine.pipeline.ratelimit | 40000 | — | Obergrenze der Pipeline-Verarbeitung pro Sekunde (rate limit) |
engine.pipeline.queue.size | 1200000 | — | Pipeline-Warteschlangengröße (Backpressure-Grenze) |
engine.pipeline.queue.o3.delay | 50 | — | Zulässige Verzögerung für nicht in Reihenfolge eingetroffene (out-of-order) Daten (ms) |
engine.pipeline.task.mode | SINGLE | — | Task-Ausführungsmodus (SINGLE / PARALLEL) |
NTP
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.ntpdate.server.ip | 127.0.0.1 | — | NTP-Server-IP |
engine.ntpdate.sync | false | — | Ob beim Booten eine NTP-Synchronisation durchgeführt wird |
Stream / CEP
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.stream.processor | DIRECT | — | Stream-Verarbeitungsmodus (DIRECT/BUFFERED) |
engine.cep.server.ip | 127.0.0.1 | ${PP_CEP_HOST:127.0.0.1} | CEP-Server-IP |
engine.cep.server.port | 7400 | ${PP_CEP_CONNECT_PORT:7400} | CEP-Server-Port (wird automatisch je nach Protokoll gesetzt: http→7400, https→7401) |
engine.cep.server.protocol | http | ${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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.streaming.messaging.warning.ms | 5000 | — | Warnung bei Zustellungsverzögerung (ms) |
engine.streaming.messaging.timeout.ms | 10000 | — | Timeout für Nachrichtenzustellung (ms) |
engine.streaming.messaging.timeout.store.type | FILE_QUEUE | — | Speicherart für timeoutete Nachrichten (FILE_QUEUE/MEMORY) |
engine.streaming.messaging.timeout.recovery.type | DB | — | Wiederherstellungsquelle für timeoutete Nachrichten (DB/FILE) |
Job-Worker-Threads
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.job.thread.asset | 8 | — | Anzahl der Anlagen-Job-Threads |
engine.job.thread.point | 8 | — | Anzahl der Point-Job-Threads |
DDS
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.dds.enabled | true | — | Globale DDS-Aktivierung |
engine.dds.data.tag.enabled | true | — | Veröffentlichung von Tag-Daten via DDS |
engine.dds.data.asset.enabled | true | — | Veröffentlichung von Anlagendaten via DDS |
Anomalieerkennung / Datenfluss
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.data.anomaly.enabled | false | — | Aktivierung der Anomalieerkennung (Anbindung externer Dienste) |
engine.data.anomaly.url | https://127.0.0.1:8970 | — | URL des Anomalieerkennungs-Dienstes |
engine.dataflow.class | plantpulse.core.engine.pipeline.dataflow.BaseDataFlow | — | Implementierungsklasse des Datenflusses |
engine.dataflow.server-timestamp.override | false | — | Ob der Server-Zeitstempel erzwungen wird (true: Erfassungszeitpunkt, false: Original) |
engine.dataflow.negative-timestamp.override | true | — | Ob negative Zeitstempel korrigiert werden |
engine.factory.model.updater.class | plantpulse.core.engine.model.impl.DefaultFactoryMetaModelUpdater | — | Aktualisierer des Factory-Metamodells |
engine.event.handler.class | plantpulse.core.engine.event.DefaultEventHanlder | — | Implementierung des Event-Handlers (Tippfehler im Klassennamen Hanlder bleibt exakt als tatsächlicher Klassenname erhalten) |
engine.javagc.enabled | false | — | Ob explizite System.gc()-Aufrufe erlaubt sind |
Flow-Engine
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
flow.debug.execution.log | false | — | INFO-Log für Knotenausführung. Nur bei Debugging-Sessions auf true setzen |
flow.stats.prune.interval.ms | 86400000 | — | Ausfü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.days | 30 | — | Aufbewahrungsdauer (Tage) für hour_bucket von tm_flow_stats_hourly |
flow.stats.prune.daily.days | 90 | — | Aufbewahrungsdauer (Tage) für day_bucket von tm_flow_stats_daily |
flow.health.check.interval.ms | 600000 | — | Intervall des Flow-Health-Checks (ms, 10 Minuten). Ist der errors-Wert des aktuellen Zeit-Buckets > 0, ERROR, sonst NORMAL (nach KST) |
flow.webhook.api.key | dev-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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
edge.health.check.interval.ms | 600000 | — | Intervall 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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
api.key | (keiner) | ${PP_API_KEY} | Interner Platform-API-Schlüssel (Authentifizierung Server ↔ Edge-Agent) |
engine.api.v5.auth.bruteforce.enabled | true | — | Brute-Force-Schutz für V5-API-Authentifizierung |
engine.api.v5.auth.bruteforce.ip_limit | 30 | — | Versuchslimit pro IP |
engine.api.v5.auth.bruteforce.user_limit | 10 | — | Versuchslimit pro Benutzer |
engine.api.v5.auth.bruteforce.window.seconds | 60 | — | Zä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.enabled | true | — | Brute-Force-Schutz für die Browser-Sitzung von /login/login |
engine.session.bruteforce.ip_limit | 30 | — | Versuchslimit pro IP |
engine.session.bruteforce.user_limit | 10 | — | Versuchslimit pro Benutzer |
engine.session.bruteforce.window.seconds | 300 | — | Zählfenster (Sekunden) |
Der Brute-Force-Zähler für Sitzungen ist Caffeine-Inmemory — gemeinsame Nutzung über mehrere Knoten (Redis) ist nicht implementiert.
API-Token
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
engine.api.token.cleanup.enabled | true | — | Bereinigung abgelaufener (expires_at < now)/widerrufener (revoked_at IS NOT NULL) Tokens |
engine.api.token.cleanup.retention_days | 30 | — | Nach 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_days | 90 | — | Standard-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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
metastore.driver | org.postgresql.Driver | — | JDBC-Treiberklasse |
metastore.url | jdbc: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)
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
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.enabled | false | — | Cache-TLS. Interne Clients standardmäßig redis:// |
cache.ssl.truststore.location | /var/security/plantpulse/master/master.truststore.p12 | — | Truststore-Pfad |
cache.ssl.truststore.password | kopens123! | ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} | Truststore-Passwort |
cache.ssl.truststore.type | PKCS12 | — | Truststore-Typ |
cache.ssl.endpoint.identification.enabled | false | — | Endpoint-Identity-Prüfung |
Die maßgebliche Referenz der Schlüsselkonstanten ist InMemoryConfigKeys von plantpulse-inmemory.
TSE (TimeSeries Engine)
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
tse.protocol | http | ${PP_TSE_PROTOCOL:http} | TSE-Protokoll. Da interne Kommunikation, standardmäßig plaintext http (2026-08) |
tse.host | — | ${PP_TSE_HOST} | TSE-Host |
tse.port | 7800 | ${PP_TSE_CONNECT_PORT:7800} | TSE-Port. Standardmäßig plaintext Listener 7800 |
tse.user | tse | ${PP_TSE_USER:tse} | TSE-Konto |
tse.password | tse123! | ${PP_TSE_PASSWORD:tse123!} | TSE-Passwort |
Cassandra-Zeitreihenspeicher
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
storage.db_type | CASSANDRA | — | DB-Typ (Vorlagenkommentar nennt weiterhin CASSANDRA/DSE/SCYLLADB, aktuell aber nur Cassandra 5.0) |
storage.db_version | 5.0 | — | DB-Version (bestimmt Treiber-/Funktionskompatibilität) |
storage.host | — | ${PP_CASSANDRA_HOST} | Contact-Point-Host |
storage.port | 9042 | ${PP_STORAGE_PORT:9042} | Native-Protokoll-Port |
storage.keyspace | — | ${PP_KEYSPACE} | verwendeter Keyspace |
storage.user | — | ${PP_CASSANDRA_USER} | Zugangskonto |
storage.password | cassandra | ${PP_STORAGE_PASSWORD:cassandra} | Passwort. PP_STORAGE_PASSWORD wird von env.sh nicht exportiert → Standardwert gilt |
storage.durable_writes | true | — | Verwendung 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)
| Property | Standardwert | Beschreibung |
|---|---|---|
storage.tag.point.ttl | 62 | Tag-Zeitreihe, Original |
storage.tag.point.map.ttl | 1 | Tag-Point-Map |
storage.tag.point.sampling.ttl | 93 | Tag-Sampling |
storage.tag.point.snapshot.ttl | 93 | Tag-Snapshot |
storage.tag.point.aggregation.ttl | 93 | Tag-Aggregation |
storage.tag.point.archive.ttl | 365 | Tag-Archiv (Langzeitaufbewahrung) |
storage.tag.blob.ttl | 93 | Tag-BLOB |
storage.asset.data.ttl | 10 | Anlagendaten |
storage.asset.data.sampling.ttl | 31 | Anlagen-Sampling |
Intervall des Anlagen-Snapshots
| Property | Standardwert | Beschreibung |
|---|---|---|
storage.asset.data.snapshot.interval | 10 SECONDS | Vor 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)
| Property | Standardwert | Beschreibung |
|---|---|---|
storage.internal.metastore.enabled | false | Aktivierung der internen Metastore-Synchronisation |
storage.internal.metastore.thread.count | 4 | Anzahl der Sync-Worker-Threads |
storage.internal.metastore.queue.size | 12000000 | Sync-Warteschlangengröße |
storage.internal.metastore.point.retation.days | 10 | Aufbewahrungsdauer für Points in Tagen (⚠️ Tippfehler-Schlüssel — siehe unten) |
Row-Cache
| Property | Standardwert | Beschreibung |
|---|---|---|
storage.asset.data.row.cache.size | NONE | Row-Cache für Anlagendaten (NONE/ROWS_ONLY/ALL) — ⚠️ kein Code liest das |
storage.tag.point.row.cache.size | NONE | Row-Cache für Tag-Points — ⚠️ kein Code liest das |
Compaction
| Property | Standardwert | Beschreibung |
|---|---|---|
storage.table.compaction.strategy | UCS | Standardstrategie (TWCS: TimeWindow, UCS: Unified). Wird von CassandraCreateDAO gelesen (Code-Fallback ist TWCS) |
storage.table.compaction.strategy.twcs.window_size | 1 | TWCS-Fenstergröße — ⚠️ kein Code liest das |
storage.table.compaction.strategy.twcs.window_unit | DAYS | TWCS-Fenstereinheit — ⚠️ kein Code liest das |
storage.table.compaction.strategy.ucs.scailing_parameter | T8 | UCS-Skalierungsparameter (T8 = tiered 8 levels). Schreibweise scailing stimmt mit dem Code überein |
storage.table.compaction.strategy.ucs.min_sstable_size | 128MiB | Minimale UCS-SSTable-Größe (Code-Fallback 100MiB) |
storage.table.compaction.strategy.ucs.target_sstable_size | 512MiB | Ziel-UCS-SSTable-Größe |
storage.table.compaction.strategy.ucs.base_shard_count | 8 | Anzahl der UCS-Base-Shards |
storage.table.compaction.strategy.ucs.max_sstables_to_compact | 6 | Maximale Anzahl an SSTables, die in einem Durchgang kompaktiert werden |
storage.table.compaction.strategy.ucs.sstable_growth | 0.7 | UCS-SSTable-Wachstumsrate |
Kompression / Query-Limits / Backup / Data Gateway
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
storage.compresion.zstd.level | 3 | — | zstd-Kompressionsstufe (1~22) — ⚠️ Tippfehler-Schlüssel, siehe unten |
storage.tag.point.select.limit.size | 1000000 | — | Maximale Zeilenzahl bei einem Select auf einen einzelnen Tag-Point |
storage.doamin.model.changed.to.metastore.backup | true | — | Metastore-Backup bei Änderung des Domänenmodells — ⚠️ Tippfehler-Schlüssel + kein Code liest das |
data.gateway.protocol | http | ${PP_DATA_GATEWAY_PROTOCOL:http} | Data-Gateway-Protokoll |
data.gateway.host | 127.0.0.1 | ${PP_DATA_GATEWAY_HOST:127.0.0.1} | Data-Gateway-Host (setzt lokale Koexistenz voraus) |
data.gateway.port | 5500 | ${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üssel | Code-Standardwert | Lesestelle |
|---|---|---|---|
storage.compresion.zstd.level | storage.compression.zstd.level | 3 | StorageConfig → CassandraCreateDAO |
storage.internal.metastore.point.retation.days | storage.internal.metastore.point.retention.days | 10 | StorageConfig → PointDAO |
storage.doamin.model.changed.to.metastore.backup | keiner (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=6eingefü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.backupwird von keiner Schreibweise gelesen. Für Backups bei Änderung des Domänenmodells ist nicht dieser Schlüssel, sondernMetastoreBackupDeployer(cron0 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
| Property | Code-Standardwert | Beschreibung |
|---|---|---|
storage.compression.zstd.type | ZstdCompressor | Klassenname 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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
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.port | 9092 | ${PP_KAFKA_PORT:9092} | Kafka-Port |
mq.kafka.security.protocol | SASL_PLAINTEXT | — | Kafka-Sicherheitsprotokoll |
mq.ssl.truststore.location | /var/security/plantpulse/master/master.truststore.p12 | — | Messaging-TLS-Truststore (MQTT + optional Kafka-TLS) |
mq.ssl.truststore.password | kopens123! | ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} | Truststore-Passwort |
mq.ssl.truststore.type | PKCS12 | — | Truststore-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.enabled | true | — | Nutzung 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.
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
mail.send.enabled | false | ${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.host | smtp-relay.brevo.com | ${PP_MAIL_SMTP_HOST:...} | SMTP-Host |
mail.smtp.port | 587 | ${PP_MAIL_SMTP_PORT:587} | SMTP-Port (25:plain, 465:SSL, 587:STARTTLS) |
mail.smtp.auth | true | ${PP_MAIL_SMTP_AUTH:true} | Ob SMTP-Authentifizierung genutzt wird |
mail.smtp.user | b2df89001@smtp-brevo.com | ${PP_MAIL_SMTP_USER:...} | SMTP-Absenderkonto |
mail.smtp.password | bskHIVJqcFQaFtb | ${PP_MAIL_SMTP_PASSWORD:...} | SMTP-Passwort (dev-Standardwert — bei Auslieferung ersetzen) |
mail.smtp.starttls.enable | true | ${PP_MAIL_SMTP_STARTTLS:true} | Ob STARTTLS verwendet wird |
sms.sender.class | plantpulse.cep.listener.alarm.sms.DefaultSMSSender | — | SMS-Versand-Implementierungsklasse (CEP-Listener) |
diagnostic.log.email | diag@kopens.com | ${PP_DIAGNOSTIC_EMAIL:diag@kopens.com} | E-Mail-Empfänger für Diagnosebenachrichtigungen — ⚠️ kein Code liest das |
PP_MAIL_SMTP_*wird vonenv.shnicht exportiert. Diese Vorlage (Brevo-Relais) ist die SSOT, und ein Überschreiben per Umgebungsvariable zerstört stillschweigend die Login-Kombination. Standort-Overrides gehören inenv.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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
ai.openai.enabled | false | ${PP_AI_OPENAI_ENABLED:false} | Master-Feature-Flag. Bei false werden AI-UI und -Endpunkte ausgeblendet und deaktiviert |
ai.openai.base.url | https://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.model | gpt-5-mini | ${PP_AI_OPENAI_MODEL:gpt-5-mini} | Von LiteLLM config.yaml exponierter Modellname |
ai.openai.timeout.ms | 15000 | — | Request-Timeout (ms) |
ai.openai.max.output.tokens | 1200 | — | Maximale Output-Tokens |
ai.openai.temperature | -1 | — | Sampling-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.5usw.) unterstützen keine Temperature, sodass ein anderer Wert als der Standard 1 zu400 Unsupported valuefü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
| Property | Standardwert | Beschreibung |
|---|---|---|
ai.alarm.rca.enabled | true | Ursachenanalyse für Alarme |
ai.alarm.eql.enabled | true | EQL-Unterstützung für Alarme |
ai.uns.topic.enabled | true | UNS-Topic-Assist |
ai.result.audit.enabled | true | Auditierung der AI-Ergebnisse |
ai.similar.incident.enabled | true | Empfehlung ähnlicher Störungsfälle |
ai.similar.incident.max.items | 5 | Maximale Anzahl an Empfehlungen |
ai.similar.incident.min.score | 40 | Mindestscore für Empfehlungen |
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
| Property | Standardwert | Ersetzung | Beschreibung |
|---|---|---|---|
ai.mcp.enabled | true | ${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.enabled | false | ${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.
| Vorlage | Deployment-Pfad | Zweck |
|---|---|---|
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.properties | Kafka(KRaft)-Broker |
kafka-jaas.conf | /plantpulse-messaging/kafka/config/jaas.conf | Kafka JAAS |
hivemq.xml | /plantpulse-messaging/mqtt/conf/config.xml | HiveMQ-Broker |
plantpulse-mq-auth.properties | /plantpulse-messaging/mqtt/conf/auth.properties | HiveMQ-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.propertiesexistiert nicht. Das SQL-Modul erhältplantpulse-jdbc.properties.plantpulse-websocket.propertiesexistiert 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).
| Property | Standardwert | Beschreibung |
|---|---|---|
platform.host | ${PP_MASTER_IP} | Host der Platform (server-web) |
mq.port | 9092 | Kafka-Port (Literal — keine Ersetzung) |
kafka.topic | pp-batch | Eingangs-Topic des Batch |
kafka.group.id | PP-BATCH-GROUP | Batch-Consumer-Gruppe |
batch.timer_schedule_delay | 5000 | Intervall des Batch-Timers (ms) |
batch.thread_pool_batch_thread_size | 4 | Anzahl der Batch-Worker-Threads |
batch.buffer_drain_limit_size | 10000 | Maximale Anzahl der Einträge pro Leerungsdurchgang |
batch.sync.inmemory.enabled | false | In-Memory-Synchronisation |
batch.sync.inmemory.ttl.minute | 10 | TTL der In-Memory-Synchronisation (Minuten) |
batch.sync.tse.enabled | true | Verteilung an TSE |
batch.sync.external.db.enabled | false | Synchronisation mit externer DB |
external.db.name | TIMESCALEDB | Typ der externen DB. Die Blöcke INFLUXDB/QUESTDB sind in der Vorlage auskommentiert |
analytics.url | jdbc:spark://${PP_SPARK_HOST}:${PP_KYUUBI_PORT}/default | Spark Thrift JDBC |
plantpulse-cep.properties
| Property | Standardwert | Beschreibung |
|---|---|---|
cep.ha.enabled | true | Redis-basierter HA-Killswitch (bewahrt Deployment/Named-Window-/Single-Key-Tabellen-Status beim Neustart) |
cep.ha.snapshot.interval_ms | 1000 | Snapshot-Intervall (nicht blockierend im Hintergrund zum Event-Thread) |
cep.ha.snapshot.named_windows | true | Named-Window-Snapshot |
cep.ha.snapshot.tables | true | Tabellen-Snapshot |
cep.async.core_pool_size | 32 | Async-Core-Pool |
cep.async.max_pool_size | 256 | Async-Max-Pool |
cep.async.queue_capacity | 50000 | Async-Queue |
cep.async.keep_alive_seconds | 60 | Thread-Keep-Alive |
cep.async.shutdown_timeout_seconds | 30 | Wartezeit für Graceful Shutdown |
cep.consumer.thread_count | 16 | Consumer-Threads |
cep.stream.shard_count | 16 | Anzahl Stream-Shards |
cep.stream.drain_limit_size | 1000 | Drain-Limit |
cep.stream.drain_warn_ms | 1000 | Drain-Warnung (ms) |
cep.monitor.initial_delay_seconds | 5 | Anfangsverzögerung des Monitors |
cep.monitor.interval_seconds | 1 | Monitor-Intervall |
cep.monitor.store_interval_seconds | 60 | Speicherintervall für Metriken je EQL-Statement in Cassandra |
cep.monitor.statement_metrics_enabled | true | Erfassung von Metriken je Statement |
cep.performance.cpu_warn_threshold_ns | 1000000000 | CPU-Warnschwelle (ns) |
cep.performance.wall_warn_threshold_ns | 1000000000 | Wall-Warnschwelle (ns) |
cep.api.key | ${PP_CEP_API_KEY} | Authentifizierung des EQL-Verwaltungsendpunkts (X-API-Key) |
cep.api.max_eql_text_length | 100000 | Maximale Länge des EQL-Texts (DOS-Schutz) |
cep.storage.request_timeout_seconds | 10 | Cassandra-Request-Timeout |
cep.storage.max_inflight_writes | 256 | Obergrenze der in-flight Schreibvorgänge |
cep.storage.connect_max_retries | 3 | Verbindungswiederholung |
cep.storage.ttl_seconds | 864000 | Metriken-TTL (Sekunden, 10 Tage) |
cep.stream.pending_idle_threshold_ms | 60000 | Idle-Schwelle für pending |
cep.stream.cleaner_initial_delay_ms | 60000 | Anfangsverzögerung des Cleaners |
cep.stream.cleaner_interval_ms | 10000 | Cleaner-Intervall |
cep.stream.max_clean_duration_ms | 30000 | Maximale Bereinigungsdauer |
cep.stream.cleaner_max_claim_count | 5000 | Maximale Anzahl beanspruchter Einträge |
cep.stream.ack_chunk_size | 500 | ACK-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).
| Property | Wert | Beschreibung |
|---|---|---|
jdbc.postgres.driver | org.postgresql.Driver | META / PQL |
jdbc.postgres.url | jdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/${PP_DB_NAME}?characterEncoding=UTF-8 | |
jdbc.cassandra.driver | plantpulse.cassandra.jdbc.CassandraDriver | OLTP-Zeitreihe (CQL). Treiberwert dient der Konfigurationskonsistenz (funktional ungenutzt) |
jdbc.cassandra.url | jdbc:cassandra://${PP_CASSANDRA_HOST}:${PP_CASSANDRA_PORT}/${PP_SCHEME} | |
jdbc.tse.driver | plantpulse.timeseries.tql.TQLDriver | OTAP / TQL |
jdbc.tse.url | jdbc:ts://${PP_TSE_HOST}:${PP_TSE_PORT}/${PP_SCHEME} | ⚠️ fest auf plain http(ts/7800) |
jdbc.spark.driver | plantpulse.spark.jdbc.SparkSQLDriver | OLAP-Analytics |
jdbc.spark.url | jdbc: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.urlnicht 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 aufts/PP_TSE_PORTfest verdrahtet.
jdbc.spark.usernameist ein reines Analytics-Konto,${PP_ANALYTICS_USER}. Es ist vom internen Kyuubi-Metastore-Konto (PP_HIVE_*) getrennt. Als optionale Schlüssel könnenjdbc.<tech>.pool.initial|min|max(postgres/spark/tse) undjdbc.<tech>.query.timeout|fetch-sizeverwendet werden (vollständige Referenz sieheplantpulse-jdbc/docs/configuration.md).jdbc.cassandra.local-datacenterist in der Vorlage auskommentiert; ist es nicht gesetzt, giltdatacenter1.
plantpulse-data-gateway.properties
| Property | Standardwert | Beschreibung |
|---|---|---|
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.limit | 1000 | Maximale Anzahl Requests pro Sekunde (bezogen auf IP + API-Schlüssel) |
data.gateway.slow.query.ms | 10000 | Warnschwelle für langsame Abfragen (ms) |
data.gateway.slow.update.ms | 2000 | Warnschwelle für langsame Aktualisierungen (ms) |
data.gateway.async.timeout.ms | 60000 | Async-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.
| Property | Standardwert | Beschreibung |
|---|---|---|
type | MASTER | Einzelner Knoten oder Cluster-Master |
db_type | CASSANDRA | Zu ü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} · 1 | Cassandra-Verbindung |
tse_host · tse_port · tse_protocol · tse_username · tse_password | ${PP_TSE_*} · 7801 · https · tse · tse123! | TSE-Verbindung (Metrik-Erfassung) |
kafka_jmx_uri | service:jmx:rmi:///jndi/rmi://${PP_KAFKA_HOST}:7299/jmxrmi | Kafka JMX |
mqtt_jmx_uri | ...://${PP_MQTT_HOST}:7279/jmxrmi | HiveMQ JMX |
cep_jmx_uri | ...://${PP_HOST_IP}:6499/jmxrmi | CEP JMX |
datagateway_jmx_uri | ...://${PP_HOST_IP}:7499/jmxrmi | Data-Gateway JMX |
sql_jmx_uri | ...://${PP_HOST_IP}:7599/jmxrmi | SQL JMX |
tse_jmx_uri | ...://${PP_HOST_IP}:7899/jmxrmi | TSE JMX |
cassandra_jmx_uri | ...://${PP_CASSANDRA_HOST}:7199/jmxrmi | Cassandra JMX |
spark_jmx_uri | ...://${PP_SPARK_HOST}:10010/jmxrmi | Spark JMX |
redis_jmx_uri | redis://${PP_REDIS_HOST}:${PP_REDIS_PORT}?password=... | Valkey-Verbindungs-URI |
redis_ssl_truststore_location / _password / _type / redis_ssl_endpoint_identification_enabled | p12 · ${PP_TLS_TRUSTSTORE_PASSWORD:kopens123!} · PKCS12 · false | Valkey-TLS |
postgres_jmx_uri | jdbc: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).
| Gruppe | Wichtige Schlüssel | Standardwert |
|---|---|---|
| Temporal | TEMPORAL_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 |
| Zeitplan | DAILY_HOUR · DAILY_MINUTE · OPTIMIZER_DAY_OF_WEEK · OPTIMIZER_HOUR · OPTIMIZER_MINUTE · TIMEZONE | 2 · 20 · 0 (Sonntag) · 3 · 0 · ${PP_TZ} |
| Ausführungsmodus | ARCHIVER_MODE | SHELL (oder KESTRA) |
| Kestra | KESTRA_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) |
| Skript | S3_SCRIPT_DIR · S3_SCRIPT_NAME · S3_OPTIMIZER_SCRIPT_NAME | ${PP_HOME}/plantpulse-warehouse/s3 · archive.sh · optimize.sh |
| Spark | SPARK_APP_NAME · SPARK_MASTER · SPARK_JAR_PATH · SPARK_DRIVER_MEMORY · SPARK_EXECUTOR_MEMORY · SPARK_EXECUTOR_CORES · SPARK_NUM_EXECUTORS · ARCHIVER_PARALLELISM · SPARK_CHECKPOINT_DIR | PP-SPARK-S3-LAKEHOUSE · local[*] · .../plantpulse-warehouse-s3.jar · 2g · 4g · 4 · 3 · 4 · s3a://${PP_MINIO_BUCKET:-plantpulse}/spark-checkpoint/ |
| Quelle/Ziel | CASSANDRA_CATALOG · CASSANDRA_DATABASE · S3_BUCKET · ICEBERG_CATALOG · ICEBERG_DATABASE | cassandra · ${PP_SCHEME:pp} · ${PP_MINIO_BUCKET:-plantpulse} · spark_catalog · ${PP_SCHEME:pp} |
| Optimierung | SNAPSHOT_RETENTION_DAYS · OPTIMIZER_MIN_INPUT_FILES · OPTIMIZER_TARGET_FILE_SIZE_BYTES | 3 · 10 · 134217728 (128MB) |
| Timeout | ARCHIVER_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_SECONDS | 12/12/12 · 8/7/12 · 3 · 12 · 8 · 21600 (6h) · 25200 (7h) · 60 |
| Web | WEB_SERVER_PORT | 9600 |
Messaging- / Authentifizierungsquellen-Vorlagen
plantpulse-mqtt.properties — HiveMQ-Brokerkonfiguration.
| Property | Standardwert |
|---|---|
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_port | 8888 |
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.
| Property | Standardwert | Beschreibung |
|---|---|---|
kafka.topic | pp-tag-point | ⚠️ Literal — keine ${PP_TOPIC_PREFIX}-Ersetzung |
kafka.thread · kafka.group.id | 8 · opcua-plugin-group | |
opc.ua.server.domain · opc.ua.server.port | ${PP_HOST_IP} · 8007 | |
opc.ua.server.user · password · anonymous | opcua · 설치-시-변경 · false | |
opc.ua.server.tcp.port · tls.port | ${PP_OPCUA_TCP_PORT:11004} · ${PP_OPCUA_TLS_PORT:11005} | |
redis.thread · redis.ssl.enabled | 4 · false |
plantpulse-plugin-aas.properties — AAS-V3-Server + Kafka-Konsum-Konfiguration.
| Property | Standardwert | Beschreibung |
|---|---|---|
aas.v3.port | ${PP_AAS_V3_PORT:8090} | V3-HTTP-Port |
kafka.topic | ${PP_TOPIC_PREFIX}-tag-point | Empfang von Echtzeit-Tag-Points |
kafka.thread · kafka.poll.count | 8 · 1000 | |
group.id · auto.offset.reset · enable.auto.commit | pp-plugin-aas-server · earliest · false | |
session.timeout.ms · auto.commit.interval.ms | 30000 · 1000 | |
plugin.message.listener | plantpulse.plugin.opcua.messaging.KafkaPluginMessageListener |
Die Registry-/AAS-Ports von BaSyx V2 sind nicht konfigurierbar, sondern im Code hartkodiert —
REGISTRY_PORT=4800,AAS_PORT=4801inAASServer.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
| Property | Code-Standardwert |
|---|---|
edge.clock.poll.term.sec | 60 |
edge.clock.skew.threshold.ms | 10000 |
edge.clock.rtt.max.ms | 2000 |
edge.clock.autosync.enabled | true |
edge.clock.autosync.cooldown.ms | 600000 |
edge.clock.warn.cooldown.ms | 600000 |
edge.clock.skip.warn.count | 5 |
edge.status.poll.seconds | 30 |
edge.status.poll.jitter.max.ms | 3000 |
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
| Property | Code-Standardwert |
|---|---|
engine.dds.queue.size | 80000 |
engine.dds.worker.threads | 4 |
engine.dds.latency.warn.ms | 1000 |
engine.eventbus.queue.capacity | 65536 |
engine.push.threads | 4 |
engine.push.queue.size | 10000 |
engine.storage.buffer.type | KAFKA |
engine.streaming.timeout.backup.queue.capacity | 12000000 |
Der Code-Standardwert von
engine.dds.enabled·engine.dds.data.tag.enabled·engine.dds.data.asset.enabledistfalse. Da die Vorlage sie explizit auftruesetzt, 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)
| Property | Code-Standardwert |
|---|---|
engine.job.thread.oee | 10 |
engine.job.thread.ram | 5 |
engine.job.thread.ems | 5 |
engine.job.thread.system | 4 |
engine.job.asset.slow.threshold.ms | 20000 |
⚠️ Der Code-Standardwert von
engine.job.thread.pointist4, während die Vorlage8vorgibt (engine.job.thread.assetstimmt in beiden Fällen mit8überein). Löscht man die Vorlagenzeile, halbiert sich der Wert.
Flow-Engine (nicht in der Vorlage enthalten)
| Property | Code-Standardwert |
|---|---|
flow.engine.enabled | true |
flow.executor.parallelism | 64 |
flow.executor.queue.capacity | 10000 |
flow.executor.queue.size | 10000 |
flow.executor.poll.timeout.ms | 50 |
flow.scheduler.pool.size | 4 |
flow.timer.pool.size | 2 |
flow.jdbc.trigger.pool.size | 2 |
flow.shutdown.timeout.sec | 5 |
flow.enabled.cache.ttl.ms | 5000 |
flow.webhook.auth.enabled | true |
Alarm / ISO-Kennzahlen / OEE
| Property | Code-Standardwert |
|---|---|
alarm.duplicate.check.minutes | 10 |
engine.oee.debounce.ms | 100 |
iso.oee.rolling.window.minutes | 10 |
iso.ems.rolling.window.minutes | 10 |
iso.ram.rolling.window.minutes | 1440 |
Details der Anomalieerkennung (Anlagen-Point / System)
Nur relevant, wenn engine.data.anomaly.enabled=true aktiviert ist.
| Property | Code-Standardwert |
|---|---|
engine.data.anomaly.asset.point.interval | MINUTE |
engine.data.anomaly.asset.point.lookback.minutes | 14400 |
engine.data.anomaly.asset.point.recent.seconds | 600 |
engine.data.anomaly.asset.point.limit | 2100 |
engine.data.anomaly.asset.point.context.length | 2048 |
engine.data.anomaly.asset.point.prediction.length | 96 |
engine.data.anomaly.asset.point.score.history | 60 |
engine.data.anomaly.asset.point.threshold.k | 3.5 |
engine.data.anomaly.asset.point.threshold.min | 0.80 |
engine.data.anomaly.asset.point.threshold.max | 0.98 |
engine.data.anomaly.asset.point.topk.request | 5 |
engine.data.anomaly.asset.point.topn.report | 5 |
engine.data.anomaly.system.lookback.minutes | 1440 |
engine.data.anomaly.system.recent.seconds | 60 |
engine.data.anomaly.system.limit | 2100 |
engine.data.anomaly.system.context.length | 2048 |
engine.data.anomaly.system.pred.length | 96 |
engine.data.anomaly.system.threshold.min | 0.80 |
engine.data.anomaly.system.topk | 2 |
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.
| Gesuchtes | Tatsä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 / .algorithm | storage.compression.zstd.level / storage.compression.zstd.type (die Vorlagenzeile ist ein Tippfehler — Warnung zu Tippfehler-Schlüsseln) |
storage.compaction.enable / .schedule | Reihe storage.table.compaction.strategy (Compaction-Abschnitt) |
storage.metastore.* / storage.cache.* | keiner |
mq.type / mq.kafka.bootstrap.servers / mq.kafka.group.id | mq.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.properties | keiner. 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.server | engine.ntpdate.sync / engine.ntpdate.server.ip |
engine.cep.enable / engine.cep.host / engine.cep.port | engine.cep.server.ip / engine.cep.server.port / engine.cep.server.protocol |
engine.anomaly.* | engine.data.anomaly.* |
engine.dds.enable / engine.dds.topic.prefix | engine.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.size | keiner |
PP_STOMP_* / PP_WEBSOCKET_* env-Variablen | nicht 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.
| Datei | Schlüssel |
|---|---|
plantpulse-storage.properties | metastore.password · cache.password · cache.ssl.truststore.password · storage.password · tse.password · data.gateway.api.key |
plantpulse-engine.properties | api.key · flow.webhook.api.key · engine.cep.server.api.key |
plantpulse-mq.properties | mq.password · mq.ssl.truststore.password |
plantpulse-mail.properties | mail.smtp.password |
plantpulse-ai.properties | ai.openai.api.key |
plantpulse-cep.properties | cache.password · storage.password · cep.api.key |
plantpulse-batch.properties | metastore.password · cache.password · tse.password · mq.password · storage.db.password · analytics.password · external.db.password |
plantpulse-jdbc.properties | cache.password · jdbc.postgres.password · jdbc.cassandra.password · jdbc.tse.password · jdbc.spark.password · data.gateway.api.key |
plantpulse-data-gateway.properties | data.gateway.api.key |
plantpulse-monitor.properties | db_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.properties | mqtt.password |
plantpulse-plugin-opcua.properties | postgres.password · cassandra.password · redis.password · kafka.password · opc.ua.server.password |
plantpulse-plugin-aas.properties | aas.db.password · cassandra.password · kafka.password |
kafka.properties | ssl.keystore.password · ssl.key.password · ssl.truststore.password |
hive-auth.properties | Gesamter Wert ist das Passwort |
API-Schlüssel-Richtlinie:
PP_API_KEY·PP_DATA_GATEWAY_API_KEY·PP_FLOW_WEBHOOK_API_KEY·PP_CEP_API_KEYbleiben 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 stirbtrestart-server.shsofort beim Sourcen vonenv.shund 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.