System Requirements
This guide outlines the hardware, OS, and network requirements for the stable operation of the PlantPulse Platform. These specifications are based on a verified standard environment.
Requirements at a Glance
| Category | Minimum (Dev / Test) | Standard (Ops) | Large Scale |
|---|---|---|---|
| CPU | 16 vCPU | 32 vCPU | 48+ vCPU |
| Memory | 128 GB | 128 GB | 256 GB+ |
| OS Disk | 200 GB | 256 GB | 512 GB |
| Data Disk | 1 TB (SSD) | 1 TB (NVMe SSD) | 4 TB+ (NVMe SSD) |
| Network | 1 Gbps | 1 Gbps | 10 Gbps |
| OS | RHEL · Rocky · Oracle Linux 8.x or higher | 9.x or 10.x | Same |
| JDK | OpenJDK 21 LTS | OpenJDK 21 LTS | OpenJDK 21 LTS |
The Data Lake master container (plantpulse-datalake) requires a memory limit of 96 GB or more. 96 GB is the minimum, not a margin, and 64 GB boxes are not supported specifications.
- Why 96 GB — The declared limits of essential resident services (Aster TSDB heap 16 GB + direct 6 GB, CEP, HiveMQ, Valkey, PostgreSQL, TSE, Kafka, etc.) alone total approximately 67 GB. In a verified environment on 2026-10-29, this container reached the 96 GB limit, and Kafka crashed due to memory allocation failure (ENOMEM).
- The host must be larger — The installation script caps the Data Lake limit at 90% of the host RAM. Therefore, if the host RAM is less than 107 GB, it cannot be assigned 96 GB, and that host is underspecified. A 64 GB box will have its limit capped at 57.6 GB, and the Data Lake will not fit.
- Adding the app container share — The sum of limits for basic app containers running on the same host is 32 GB (server-web 14 · batch 4 · warehouse 4 · OPC UA 3 · AASX 3 · HA 2 · frontline 1 · proxy 1). Master 96 GB + basic app limit 32 GB = 128 GB, which aligns with the 128 GB minimum. Enabling mirror-maker (+2 GB) or increasing app limits will require more memory. The limit is a ceiling, not the actual usage. 256 GB is recommended for operations.
Whether the actual limit is sufficient after installation is determined by pd doctor of the Data Lake CLI ([9] memory budget section, passing HostConfig.Memory value of docker inspect to --memory-limit).
Verified Environment: The operational verification environment (reference dev server) is running on 48 vCPU / 188 GB RAM / 4.8 TB NVMe SSD / RHEL 9 / Temurin OpenJDK 21.0.11 LTS.
Hardware
CPU
- Recommended: 32 vCPU or more (Intel Xeon, AMD EPYC, ARM Graviton, etc.)
- The IIoT engine uses a 36-thread pipeline (
engine.pipeline.threads) - Spark distributed analysis uses an additional
PP_CLUSTER_CORES - More cores increase concurrent message throughput ↑
Memory
- Base 128 GB or more · Ops Recommended 256 GB
- Data Lake Master Container 96 GB or more — Underspecified if host RAM is less than 107 GB; 64 GB is not a supported specification (refer to warning above)
- Memory directly affects Aster TSDB / Kafka performance as a page cache
- Aster TSDB heap: 16 GB fixed + 6 GB direct memory
- Data Lake container memory limit:
DOCKER_DATALAKE_MEMORY— Default96G, capped to not exceed 90% of host RAM
Disk
OS / Data Disk Separation Recommended: Separating the OS disk (
/) from the data disk (/data1) simplifies backup, expansion, and fault isolation.
/ # OS 디스크 (256 GB)
└── opt/kopens/ # PlantPulse 설치 트리
/data1/ # 데이터 디스크 (1 TB+ NVMe SSD)
├── pp-data/ # Aster TSDB · PostgreSQL · RustFS · Valkey
├── pp-temp/ # Spark / 처리 임시
└── pp-backup/ # 백업 산출물
| Mount | Capacity | Disk Type | Usage |
|---|---|---|---|
/ | 256 GB | SSD | OS, installation tree |
/data1 | 1 TB+ | NVMe SSD Required | Main data |
/data2 ~ /dataN | 1 TB+ | NVMe SSD | (Optional) Aster TSDB data / commitlog separation |
Aster TSDB Disk Optimization (Advanced)
In large-scale environments, placing the commitlog and data on separate disks significantly improves write throughput.
/data1/pp-data/cassandra/data/ # SSTable (대용량 NVMe)
/data2/pp-data/cassandra/commitlog/ # commitlog (별도 NVMe, sync I/O)
Operating System
Supported OS
RHEL · Rocky Linux · Oracle Linux 8.x · 9.x · 10.x — These three distributions are treated as the same (RPM-based · same package names · same firewall tools).
| OS | Version |
|---|---|
| RHEL · Rocky Linux · Oracle Linux | 8.x · 9.x · 10.x |
| AlmaLinux | 8.x · 9.x |
| Ubuntu | 20.04 or higher |
| Amazon Linux | 2 · 2023 |
All subsequent guidance is based on RHEL · Rocky Linux · Oracle Linux 8.x · 9.x · 10.x. When using Ubuntu / Amazon Linux, only change the package commands (
apt/dnf) to match your environment.
Java (JDK)
PlantPulse is based on Java 21 LTS. setup.sh / tools/java/ will install it automatically.
$ java -version
openjdk version "21.0.11" 2026-04-21 LTS
OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS)
If manual installation is required:
# RHEL/Rocky/Oracle
dnf install -y java-21-openjdk java-21-openjdk-devel
# Ubuntu
apt-get install -y openjdk-21-jdk
The JAVA_HOME environment variable is registered automatically, and all modules are integrated via JAVA_TOOL_OPTIONS="-Duser.language=${PP_LANG} -Duser.timezone=${PP_TZ}".
Network / Hostname
Hostname
hostnamectl set-hostname plantpulse-prod-01
# /etc/hosts
vi /etc/hosts
# 첫 행 직후에 추가:
# 192.168.0.41 plantpulse-prod-01 plantpulse-prod-01.local
Static IP
A static IP must be used because if the server IP changes, cluster and client connections will be lost.
# NetworkManager (RHEL 9+)
nmcli con mod ens33 ipv4.method manual \
ipv4.addresses 192.168.0.41/24 \
ipv4.gateway 192.168.0.1 \
ipv4.dns "168.126.0.1 8.8.8.8"
nmcli con up ens33
Time Synchronization (Required)
Distributed components (Aster TSDB, Kafka, etc.) are highly sensitive to time accuracy between nodes.
dnf install -y chrony
systemctl enable --now chronyd
chronyc tracking # 동기화 상태 확인
chronyc -a makestep # 즉시 동기화
OS Tuning (Required)
The values below are automatically applied by install.sh (one-line / Docker installation). Please configure them manually only in manual environments.
File Descriptor / Process Limits
# /etc/security/limits.conf
* - memlock unlimited
* - nofile 1048576
* - nproc 32768
* - as unlimited
Kernel Parameters
# /etc/sysctl.conf (install.sh 자동 적용)
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 1024
vm.max_map_count = 1048576
vm.overcommit_memory = 0
fs.file-max = 1048576
sysctl -p /etc/sysctl.conf
Disable Swap
Database / Java processes must avoid swapping.
swapoff --all
# /etc/fstab 의 swap 라인 주석 처리
sed -i '/swap/s/^/#/' /etc/fstab
SELinux
setup.sh automatically switches it to permissive. Manual change:
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
Native Library
Library for Aster TSDB performance enhancement.
dnf install -y jna jemalloc jemalloc-devel zstd libpq
Disk I/O Tuning
NVMe SSD
# /etc/udev/rules.d/60-ioscheduler.rules
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# 즉시 적용
udevadm trigger
HDD (Not Recommended for Ops)
echo mq-deadline > /sys/block/sdb/queue/scheduler
blockdev --setra 128 /dev/sdb
Firewall
install.sh enables firewalld (systemctl enable --now firewalld) and automatically opens the ports required by the platform. Skip this step using SKIP_FW=1 only if the firewall is managed externally (corporate firewall / cloud security group).
Example of manual port opening:
systemctl enable --now firewalld
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=4950/tcp
firewall-cmd --permanent --add-port=1883/tcp
firewall-cmd --permanent --add-port=1884/tcp
firewall-cmd --permanent --add-port=9092/tcp
firewall-cmd --permanent --add-port=9094/tcp
firewall-cmd --reload
Refer to Port Configuration Information for the full port list.
Upper Firewall / Cloud Security Groups: Corporate / cloud firewalls are separate, so please allow them accordingly. For private network ranges (RFC 1918, Tailscale CGN), it is recommended to restrict the source to trusted IPs.
External Access / Exposure Recommendations
| External Exposure | Port | Recommendation |
|---|---|---|
| Web Console | 80, 443 | Recommended via nginx/HAProxy |
| Health Check | 4950 | Monitoring system only (HTTPS) |
| MQTT (External Device) | 1884 (TLS), 18884 | TLS Recommended |
| Kafka External Client | 9094 (TLS) | TLS Required |
| Data Gateway | 5500 | API Key + TLS |
Please restrict DB / messaging PLAINTEXT ports / JMX to private network only.
Supported Browsers
The web console supports the latest standard browsers.
| Browser | Minimum Version | Recommended |
|---|---|---|
| Google Chrome | 100+ | Recommended |
| Microsoft Edge | 100+ | ✓ |
| Firefox | 100+ | ✓ |
| Safari | 15+ | ✓ |
Pre-Installation Checklist
Please verify the following before installation.
- CPU 16+ vCPU, Memory 128+ GB (must be able to assign 96 GB to Data Lake Master — 64 GB is not a supported specification), Data Disk 200+ GB
- Data disk mounted on a separate
/data1 - OS RHEL/Rocky/Oracle 8+ or Ubuntu 20.04+
- Static IP configured
-
chronydenabled (Time Synchronization) - Hostname +
/etc/hostsregistration - Swap disabled
- Limits such as
nofile 1048576applied - Sysctl such as
vm.max_map_countapplied - Firewall policy (external exposure ports clearly defined)
- DNS functioning normally (
getent hosts <hostname>) - Internet access or air-gapped network bundle ready
Next Steps
- Quick Install → One-line Install (Recommended)
- Container-based Install → Docker Install
- Check Port Conflicts → Port Configuration Information