app.properties Reference
All runtime settings for PlantPulse Edge. Locations:
- Container mode (2026.05+): The actual file is on the host at
/etc/kopens/conf/app.properties(bind mount, chmod 0640 root)./etc/kopens/app.propertiesis a symlink pointing to it — editing either one modifies the same file. If the file does not exist, it's seeded once from the image default during installation, and is never overwritten afterward (operator edits persist across image upgrades). - Native mode:
$PE_HOME/conf/app.properties.$PE_HOME/app/plantpulse-edge-web/WEB-INF/classes/app.propertiesis the runtime mirror for classpath loading.
In container mode, install.sh generates a 165-line full template on first installation (16 sections + a random password for each box, 16–32 characters). The default values on this page are for reference — check the actual file inside the box for the real values in production.
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 Identification / Operations
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 pre-registered on the platform |
edge.ttl | Heartbeat TTL (seconds) |
edge.always-on | Whether the collector starts immediately at boot (if false, it must be started explicitly via the UI/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 |
connection_reset_ms | Automatic connection reset interval (0 = off) |
connection_warn_ms | Log 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 | Overall read time threshold per cycle |
Test/Demo Data
Automatic startup of the built-in OPCUA/MODBUS simulators is not supported. Use an external plantpulse-simulator or test tags for test/demo data.
Diagnostics Transmission
edge.diagnostic.send.enabled=true
Toggle for transmitting edge 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.anonymous=yes
opc.ua.server.security.none=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 these nodes. anonymous=yes allows anonymous access (the old typo key ananymous is read only when the new key is absent); security.none=yes opens the unsecured (None/None) session endpoint on the TCP port. Both default to yes.
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=trueis enabled,MQTTQueueTransferpublishes when processing the queue. - All Points flow to 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 reuses mqtt.server.* as-is. 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 is recommended |
server.messaging | Either MQTT or API. If MQTT is enabled, APIQueueTransfer acts as a secondary role |
Development Mode
dev.mode=EDGE
Supports EDGE (default) and STANDALONE. PLATFORM is rejected.
Command/Event Handler / SQL Path
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 also kept with the same name (/WEB-INF/resouces/sql/), so it works.
If you change it, you must update both.
API Usage
api.use=true
Toggle to enable 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 some application code) |
app.db.scheme_ddl | Path to a DDL file to apply automatically at boot |
The host/user/password must match for both.
File Upload
file.upload.dir=/tmp/
Temporary path used by the file upload component. A separate directory is recommended for production environments.
Recommended Change Checklist
| Item | Reason for Change |
|---|---|
edge.admin_password | Inject 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 |