Skip to main content

app.properties Guide

All runtime settings for PlantPulse Edge. Locations:

  • Container mode (2026.05+): The authoritative file is /etc/kopens/conf/app.properties on the host (bind mount, chmod 0640 root). /etc/kopens/app.properties is a legacy compatibility symlink pointing to it — editing either path modifies the same file. If the file does not exist, it is seeded once from the image default at installation time and is never overwritten afterwards (operator edits survive image upgrades).
  • Native mode: $PE_HOME/conf/app.properties. $PE_HOME/app/plantpulse-edge-web/WEB-INF/classes/app.properties is a runtime mirror used for classpath loading.

In container mode, install.sh generates a 165-line full template on first installation (16 sections plus a per-box random password of 16–32 characters). The default values on this page are reference material — check the file on the actual production box for its real values.

Applying Changes

# 컨테이너 모드
sudo bash /opt/kopens/install/bin/config.sh --set edge.rest.api.auth false
sudo bash /opt/kopens/install/bin/config.sh --restart

# native 모드
sudo vi /opt/kopens/plantpulse-edge/conf/app.properties
sudo /opt/kopens/plantpulse-edge/bin/restart.sh

Edge Identity / Operation

edge.id=EDGE_00303
edge.site_id=SITE_00001
edge.ttl=30
edge.always-on=false
KeyMeaning
edge.idUnique edge ID (required, must be unique within the site)
edge.site_idSite ID — must be registered on the platform in advance
edge.ttlheartbeat TTL (seconds)
edge.always-onWhether the collector starts immediately at boot (if false, start explicitly from the UI or REST)

Administrator Account

edge.admin_login_id=${ENV:EDGE_ADMIN_USER:admin}
edge.admin_password=${SECRET:EDGE_ADMIN_PASSWORD_HASH}

Inject the administrator password as a PBKDF2 hash via EDGE_ADMIN_PASSWORD_HASH_FILE or EDGE_ADMIN_PASSWORD_HASH.

Collector

edge.collector.plc.thread_pool_count=4
edge.collector.plc.connection_reset_ms=0
edge.collector.plc.connection_warn_ms=1000
edge.collector.plc.address_scan_thread_warn_ms=200
edge.collector.plc.address_map_scan_thread_warn_ms=5000
KeyMeaning
thread_pool_countRead worker pool size per OPC
connection_reset_msAutomatic connection reset interval (0 = off)
connection_warn_msLogs a WARN if connection time exceeds this value
address_scan_thread_warn_msRead time threshold for a single address
address_map_scan_thread_warn_msRead time threshold for a full cycle

Test/Demo Data

Automatic startup of the built-in OPCUA/MODBUS simulator is not supported. For test/demo data, use an external plantpulse-simulator or test tags.

Diagnostics Transmission

edge.diagnostic.send.enabled=true

Toggle for sending the edge's own diagnostics (system metrics, etc.) to the platform.

OPC-UA Server (Publishing Own Nodes)

opc.ua.server.domain=127.0.0.1
opc.ua.server.tcp.port=12000
opc.ua.server.tls.port=12443
opc.ua.server.user=${ENV:OPCUA_USER:edge}
opc.ua.server.password=${SECRET:OPCUA_PASSWORD}
opc.ua.server.keystore.password=${ENV:CERT_PASS:}
opc.ua.server.ananymous=yes

The edge acts as its own OPC-UA server, exposing collected tags as nodes. External SCADA systems can connect as OPC-UA clients and read them. If ananymous=yes, anonymous connections are allowed (a typo, but retained for code compatibility).

TSE (Time Series Engine)

tse.server.host=127.0.0.1
tse.server.port=7800
tse.server.user=tse
tse.server.password=tse123!

Optional. Used when integrating with a separate time series engine (plantpulse-timeseries-engine).

MQTT Publishing

mqtt.enable=true
mqtt.server.host=127.0.0.1
mqtt.server.port=1883
mqtt.server.user=${ENV:MQTT_USER:edge}
mqtt.server.password=${SECRET:MQTT_PASSWORD}
mqtt.server.topic=/edge/point
  • If mqtt.enable=true, MQTTQueueTransfer publishes as it processes the queue.
  • All Points flow through a single topic (/edge/point).

Sparkplug B

sparkplug.enable=false
sparkplug.group.id= # 비우면 site_id
sparkplug.edge.node.id= # 비우면 EdgeContext.id
sparkplug.device.strategy=per-opc # per-opc | single (현재 per-opc 만 구현)
sparkplug.qos=0 # DDATA 빈번 → 0 권장
sparkplug.bdseq.path= # 비우면 ./data/sparkplug/bdseq
sparkplug.alias.enable=true # Phase 2 토글 (현 무영향)
sparkplug.cmd.enable=false # Phase 3 토글 (현 무영향)

Broker connection information is reused as-is from mqtt.server.*. See the Sparkplug documentation for details.

Plantpulse Server API

server.host=192.168.0.41
server.port=80
server.ssl=false
server.username=
server.api_key=${SECRET:PLANTPULSE_SERVER_API_KEY}
server.messaging=MQTT
KeyMeaning
server.host/portPlatform API host
server.sslWhether HTTPS is used
server.api_keyPlatform API token authentication. PLANTPULSE_SERVER_API_KEY_FILE recommended
server.messagingMQTT or API. If MQTT, APIQueueTransfer acts as the secondary role

Development Mode

dev.mode=EDGE

EDGE (default) and STANDALONE are supported. PLATFORM is rejected.

Command/Event Handlers / SQL Paths

app.es.scan.package=plantpulse.app
app.sql.path=classpath:resouces/sql
Typo (Retained for Compatibility)

The resouces in app.sql.path is a typo, but the directory is kept under the same name (/WEB-INF/resouces/sql/), so it works. If you change it, you must change both.

API Usage

api.use=true

Toggle for enabling REST controllers.

Cassandra DB

app.db.host=127.0.0.1
app.db.port=9042
app.db.username=${ENV:CASSANDRA_USER:cassandra}
app.db.password=${SECRET:CASSANDRA_PASSWORD:cassandra}
app.db.keyspace=pe
app.db.replication=1
app.db.scheme_ddl=/WEB-INF/db/scheme.cql

oltp.cassandra.driver=plantpulse.cassandra.jdbc.CassandraDriver
oltp.cassandra.url=jdbc:cassandra://127.0.0.1:9042/pe
oltp.cassandra.user=${ENV:CASSANDRA_USER:cassandra}
oltp.cassandra.password=${SECRET:CASSANDRA_PASSWORD:cassandra}
KeyMeaning
app.db.*Cassandra native driver (com.datastax.oss.driver) connection
oltp.cassandra.*JDBC adapter connection (used by parts of the application code)
app.db.scheme_ddlPath to the DDL file applied automatically at boot

Host / user / password must match in both.

File Upload

file.upload.dir=/tmp/

Temporary path used by the file upload component. A dedicated directory is recommended in production.


ItemReason for Change
edge.admin_passwordInject the PBKDF2 hash via EDGE_ADMIN_PASSWORD_HASH_FILE
mqtt.server.password / opc.ua.server.passwordInject via MQTT_PASSWORD_FILE / OPCUA_PASSWORD_FILE
app.db.passwordInject via CASSANDRA_PASSWORD_FILE
sparkplug.bdseq.pathAbsolute path recommended (/opt/kopens/.../data/sparkplug/bdseq)
server.host / passwordPlantpulse Platform connection information