Skip to main content

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​

CategoryMinimum (Dev / Test)Standard (Ops)Large Scale
CPU16 vCPU32 vCPU48+ vCPU
Memory128 GB128 GB256 GB+
OS Disk200 GB256 GB512 GB
Data Disk1 TB (SSD)1 TB (NVMe SSD)4 TB+ (NVMe SSD)
Network1 Gbps1 Gbps10 Gbps
OSRHEL · Rocky · Oracle Linux 8.x or higher9.x or 10.xSame
JDKOpenJDK 21 LTSOpenJDK 21 LTSOpenJDK 21 LTS
Data Lake Master requires 96 GB or more — 64 GB is not a supported specification

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 — Default 96G, 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/ # 백업 산출물
MountCapacityDisk TypeUsage
/256 GBSSDOS, installation tree
/data11 TB+NVMe SSD RequiredMain data
/data2 ~ /dataN1 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).

OSVersion
RHEL · Rocky Linux · Oracle Linux8.x · 9.x · 10.x
AlmaLinux8.x · 9.x
Ubuntu20.04 or higher
Amazon Linux2 · 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
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 ExposurePortRecommendation
Web Console80, 443Recommended via nginx/HAProxy
Health Check4950Monitoring system only (HTTPS)
MQTT (External Device)1884 (TLS), 18884TLS Recommended
Kafka External Client9094 (TLS)TLS Required
Data Gateway5500API Key + TLS

Please restrict DB / messaging PLAINTEXT ports / JMX to private network only.

Supported Browsers​

The web console supports the latest standard browsers.

BrowserMinimum VersionRecommended
Google Chrome100+Recommended
Microsoft Edge100+✓
Firefox100+✓
Safari15+✓

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
  • chronyd enabled (Time Synchronization)
  • Hostname + /etc/hosts registration
  • Swap disabled
  • Limits such as nofile 1048576 applied
  • Sysctl such as vm.max_map_count applied
  • Firewall policy (external exposure ports clearly defined)
  • DNS functioning normally (getent hosts <hostname>)
  • Internet access or air-gapped network bundle ready

Next Steps​