app.properties Guide
All runtime settings for PlantPulse Edge. Locations:
- Container mode (2026.05+): The authoritative file is
/etc/kopens/conf/app.propertieson the host (bind mount, chmod 0640 root)./etc/kopens/app.propertiesis 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.propertiesis 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
| Key | Meaning |
|---|---|
edge.id | Unique edge ID (required, must be unique within the site) |
edge.site_id | Site ID — must be registered on the platform in advance |
edge.ttl | heartbeat TTL (seconds) |
edge.always-on | Whether 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
| Key | Meaning |
|---|---|
thread_pool_count | Read worker pool size per OPC |
connection_reset_ms | Automatic connection reset interval (0 = off) |
connection_warn_ms | Logs a WARN if connection time exceeds this value |
address_scan_thread_warn_ms | Read time threshold for a single address |
address_map_scan_thread_warn_ms | Read 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,MQTTQueueTransferpublishes 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
| Key | Meaning |
|---|---|
server.host/port | Platform API host |
server.ssl | Whether HTTPS is used |
server.api_key | Platform API token authentication. PLANTPULSE_SERVER_API_KEY_FILE recommended |
server.messaging | MQTT 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
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}
| Key | Meaning |
|---|---|
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_ddl | Path 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.
Recommended Change Checklist
| Item | Reason for Change |
|---|---|
edge.admin_password | Inject the PBKDF2 hash via EDGE_ADMIN_PASSWORD_HASH_FILE |
mqtt.server.password / opc.ua.server.password | Inject via MQTT_PASSWORD_FILE / OPCUA_PASSWORD_FILE |
app.db.password | Inject via CASSANDRA_PASSWORD_FILE |
sparkplug.bdseq.path | Absolute path recommended (/opt/kopens/.../data/sparkplug/bdseq) |
server.host / password | Plantpulse Platform connection information |