(legacy) Vollständige H/W-Installation — native tools/setup.sh
Diese Seite beschreibt das Legacy-Verfahren, das bei der Wartung von native ausgelieferten Boxen vor 2026.05 heranzuziehen ist.
Für neue H/W, Serienauslieferung und Neuinstallationen Vor-Ort verwenden Sie Schnellinstallation (install.sh).
tools/setup.sh setzt native plantpulse.service und die direkte Ausführung auf dem Host voraus.
Beim Containerstandard ab 2026.05 verwaltet ein einziges plantpulse-edge.service die Runtime.
Werden beide Modi auf derselben Box gemischt, kollidieren Ports und Datenpfade.
Nur dann, wenn eine bereits native betriebene Altbox neu installiert bzw. wiederhergestellt werden muss oder alte Abnahmedokumente Vor-Ort abzugleichen sind. Bei einer neuen Box kehren Sie zu Installation — Überblick zurück.
1. Voraussetzungen (legacy native)
| Punkt | Wert |
|---|---|
| OS | Fedora 38 (damaliger Verifizierungsstand — andere RHEL-Derivate möglich, Verifizierung separat) |
| Rechte | root (sudo -i oder direkter root-Login) |
| Netzwerk | Internetverbindung (dnf Pakete + Download des legacy native bundle) |
| Festplatte | ~3GB unter /opt, 100GB+ für Daten unter /data1 (separate Partition empfohlen) |
| Speicher | mindestens 8GB (Cassandra 4GB heap + Tomcat 4GB) |
| Anzahl NICs | 2 (Nr. 1 = WAN/extern, Nr. 2 = PLC/intern) — Standard für Industrie-Appliances |
| Zeit | Internet-NTP erreichbar (chrony installiert) |
1.1 Empfohlene H/W-Spezifikation
| Klasse | CPU | RAM | SSD | NIC | Preisklasse |
|---|---|---|---|---|---|
| Klein (≤ 1k Tags) | 4 Kerne / 2.0GHz+ | 8GB | 256GB | 2x 1Gbps | Industrie-Mini-PC |
| Mittel (1k–10k Tags) | 8 Kerne / 2.5GHz+ | 16GB | 512GB SSD + 1TB HDD | 2x 1Gbps | Industrie-Appliance |
| Groß (10k+ Tags) | 16 Kerne / 3.0GHz+ | 32GB+ | 1TB NVMe | 2x 10Gbps | 1U-Server |
2. Speicherort
/opt/kopens/tools/setup.sh ← 메인 setup 스크립트
/opt/kopens/tools/net/ ← 네트워크 set-1.sh / set-2.sh / status.sh / ping.sh
/opt/kopens/tools/firewall/open.sh ← firewalld 포트 오픈
/opt/kopens/tools/file/run.sh ← TCP / file limit / sysctl 튜닝
/opt/kopens/tools/file/sysctl.conf ← 커널 튜닝
/opt/kopens/tools/file/limits.conf ← 프로세스 리소스 한도
/opt/kopens/tools/file/chrony.conf ← NTP
/opt/kopens/tools/docker/setup.sh ← Docker CE 설치
/opt/kopens/tools/java/setup.sh ← Amazon Corretto 17
/opt/kopens/tools/python/setup.sh ← Python 3 + pip
/opt/kopens/tools/nodejs/setup.sh ← Node.js + npm
/opt/kopens/tools/ssl/gen.sh ← 자체 서명 인증서 발급 (CA + 서버)
/opt/kopens/tools/vpn/setup.sh ← VPN 클라이언트
/opt/kopens/tools/service/plantpulse.service ← systemd unit
/opt/kopens/tools/service/service-start.sh ← systemd ExecStart → bin/start.sh
/opt/kopens/tools/service/service-stop.sh ← systemd ExecStop → bin/stop.sh
3. Ausführung — legacy native Einzeilerbefehl
# 1) root 권한
sudo -i
# 2) 작업 디렉토리
cd /opt/kopens/tools
# 3) 실행 (대화형 — 호스트명 + 네트워크 설정을 묻습니다)
./setup.sh
Gesamtdauer: 15–30 Minuten (Internetgeschwindigkeit + dnf-Paketdownload + tuned-Boot).
Danach erfolgt nach 10 Sekunden ein automatischer Reboot — nach dem Neustart startet legacy plantpulse.service automatisch.
4. Schrittweise Eingabehilfe (interaktive Prompts)
Während der Installation erscheinen nacheinander folgende Eingaben.
4.1 Hostname
[?] INPUT THIS EDGE GATEAY HOSTNAME :
=> EDGE_00303
Zur Identifikation des Gateways. Eingabe gemäß EDGE_<4-digits> oder Standortkonvention. Beispiel: EDGE_00303.
4.2 NIC Nr. 1 (WAN / externes Netz) — enp1s0
[?] ETHERNET [enp1s0] MODE [DHCP|STATIC] :
| Modus | Eingabe | Danach |
|---|---|---|
DHCP | IP wird automatisch bezogen | keine weitere Eingabe |
STATIC | feste IP verwenden | IP/Maske, Gateway, DNS zusätzlich eingeben |
Zusätzliche Prompts bei STATIC:
[?] ETHERNET [enp1s0] IP/SUBNETMASK : 192.168.0.50/24
[?] ETHERNET [enp1s0] GATEWAY : 192.168.0.1
[?] ETHERNET [enp1s0] DNS : 8.8.8.8
Diese NIC dient der Erreichbarkeit des Standard-Gateways (externes Internet / Cloud / Platform API). DNS ist der interne oder ein öffentlicher DNS.
4.3 NIC Nr. 2 (PLC / internes Netz) — enp2s0
Noch einmal im gleichen Format. Da sie ausschließlich dem PLC-Netz dient, üblicherweise sauber getrennt als STATIC:
[?] ETHERNET [enp2s0] MODE [DHCP|STATIC] : STATIC
[?] ETHERNET [enp2s0] IP/SUBNETMASK : 192.168.100.10/24
[?] ETHERNET [enp2s0] GATEWAY : 192.168.100.1
[?] ETHERNET [enp2s0] DNS : 192.168.100.1
Diese NIC wird nicht als Standard-Gateway verwendet (
ipv4.never-default yes) — ausschließlich für die private Netzkommunikation mit der PLC. Vom WAN-Routing getrennt.
4.4 Netzwerkprüfung + Zeitsynchronisation
setup.sh prüft nach nmcli con up automatisch die externe Erreichbarkeit mit ping und synchronisiert per chronyc makestep via NTP. Erscheinen in der Ausgabe OK oder IP / RTT, ist alles in Ordnung.
5. Alle 22 Schritte von setup.sh — im Detail
| # | Schritt | Aktion | Erwartete Ausgabe |
|---|---|---|---|
| 1 | KOPENS_HOME Umgebungsvariablen registrieren | Ergänzung in /etc/bashrc | (still) |
| 2 | Hostname setzen | hostnamectl set-hostname | (still) |
| 3 | ${PE_HOME}/conf/env.sh erzeugen | PE_HOME / PE_DATA_DIR / JAVA_HOME / CLEAN_ON_STARTUP | Ausgabe von env.sh |
| 4 | Verzeichnisse ${PE_DATA_DIR} (/data1) anlegen | mkdir -p | /data1 |
| 5 | Netzwerkkonfiguration | net/set-1.sh (Nr. 1 WAN), net/set-2.sh (Nr. 2 PLC), Neustart des NetworkManager | nmcli-Ausgabe |
| 6 | net/status.sh + net/ping.sh Prüfung | Schnittstellenstatus + externer Ping | RTT-Ausgabe |
| 7 | Locale / Zeitzone | ko_KR.utf8 + Asia/Seoul | date |
| 8 | OS-Update | dnf -y update | dnf-Fortschrittsanzeige |
| 9 | Installation der Pflichtpakete | tar / htop / fping / pv / firefox / java-17-openjdk-devel / jna / jemalloc / zstd / curl-devel / chrony / tuned / net-tools / numactl / nodejs / npm / python3 / fail2ban / gcc / glibc-devel / NetworkManager-tui | dnf-Fortschritt |
| 10 | Tuning | tuned-adm profile throughput-performance + Deaktivierung der GNOME-Energiesparfunktionen | Active profile: throughput-performance |
| 11 | Firewall | tools/firewall/open.sh (Tabelle 5.1 unten) | firewall-cmd --list-all |
| 12 | NTP (chrony) | chrony.conf anwenden + Dienst enable + hwclock -w synchronisieren | chronyc ntpdata |
| 13 | TCP / file limit / sysctl | tools/file/run.sh (Tabelle 5.2 unten) | (still) |
| 14 | CPU governor | alle CPUs im Modus performance | (still) |
| 15 | NUMA + Hugepages | vm.zone_reclaim_mode=0 + transparent hugepage deaktivieren + 9216 hugepages reservieren | numactl --show |
| 16 | Docker | tools/docker/setup.sh (Docker CE) | docker version |
| 17 | Java 17 | Amazon Corretto | java -version |
| 18 | Python 3 / NodeJS | dnf install | python3 --version |
| 19 | SSL-Zertifikat ausstellen | tools/ssl/gen.sh — selbstsignierte CA + Serverzertifikat (/var/security/plantpulse/) | openssl-Ausgabe |
| 20 | VPN | tools/vpn/setup.sh | VPN-Client-Installation |
| 21 | dnf clean all | Cache bereinigen | (still) |
| 22 | systemd registrieren | /etc/systemd/system/plantpulse.service kopieren + systemctl enable plantpulse | Dienstregistrierung |
| 23 | Automatischer Reboot | nach 10-Sekunden-Countdown | *** NOW REBOOT AFTER 10 SEC! *** |
set -e ist aktiv, sodass bei einem Fehler in einem beliebigen Schritt sofort abgebrochen wird.
5.1 Firewall — automatisch geöffnete Ports
tools/firewall/open.sh fügt folgende TCP-Ports dauerhaft der public zone hinzu:
| Port | Verwendung |
|---|---|
| 22 (TCP/UDP) | SSH |
| 80, 443 (TCP) | Web-UI (/ui/main) |
| 123 (TCP/UDP) | NTP |
| 1880 (TCP) | Node-RED (Backend von /ui/flow) |
| 3000 (TCP) | Grafana (Zeitreihen-Dashboard) |
| 4000 (TCP) | APM / Monitoring |
| 7000, 7001, 9042 (TCP) | Cassandra (gossip / SSL gossip / Client) |
| 7799 (TCP) | JMX (Tomcat-Monitor) |
| 7800, 7801 (TCP) | timeseries-engine |
| 9090 (TCP) | Cockpit (Serververwaltung) |
| 12000, 12443 (TCP) | OPC-UA (TCP / TLS) |
| 19999 (TCP) | NetData |
Zusätzlich wird --add-masquerade aktiviert, sodass Docker-Container per NAT ins Hostnetz gelangen.
5.2 sysctl-Tuning (Auszug aus /etc/sysctl.conf)
net.ipv4.tcp_keepalive_time = 60 # PLC TCP keepalive 빠르게
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10
net.core.rmem_max = 16777216 # 16MB 수신 버퍼
net.core.wmem_max = 16777216 # 16MB 송신 버퍼
net.core.somaxconn = 1024
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.max_map_count = 1048575 # Cassandra mmap
vm.overcommit_memory = 1 # Cassandra hint
vm.swappiness = 1 # 최소 스왑
6. Nach dem Neustart — native Funktionsprüfung (1 Minute)
# 1) systemd 서비스 살아있는지
systemctl status plantpulse
# 예: active (running) since ...
# 2) 모든 컴포넌트 프로세스
/opt/kopens/plantpulse-edge/bin/ps.sh
# 3) 시스템 헬스 (200 OK 면 게이트웨이 정상)
curl -s http://127.0.0.1/api/v1/system/health | jq
# 4) OPC-UA 트리 (등록된 OPC 가 0 이어도 OK — 빈 배열)
curl -s http://127.0.0.1/ui/opcua/tree | jq '.data.tree | length'
# 5) 웹 UI
# 브라우저 → https://<gateway>/ui/main
# 좌상단 로고 + 30개 카드가 보이면 정상
7. Integrierter Betrieb über systemd (legacy native)
Nach der Installation verwaltet systemd das Gateway automatisch:
sudo systemctl start plantpulse # 시작 (start.sh 호출)
sudo systemctl stop plantpulse # 정지 (stop.sh 호출)
sudo systemctl status plantpulse # 상태
sudo systemctl restart plantpulse # 풀스택 재시작 (60초+ 다운타임)
sudo journalctl -u plantpulse -n 100 # systemd 로그 마지막 100줄
Nur Tomcat neu starten (Übernahme von Code /
app.properties) überbin/restart.sh(~6 Sekunden). systemdrestartbetrifft den vollen Stack (stop.sh→start.sh).
Internes Wiring:
plantpulse.service→ExecStart=service-start.sh→bin/start.shplantpulse.service→ExecStop=service-stop.sh→bin/stop.sh
8. Häufige Stolperfallen
| Schritt | Symptom | Ursache / Abhilfe |
|---|---|---|
| 5 (Netzwerk) | SSH bricht nach set-1.sh ab | Netzwerkschnittstelle / Gateway falsch konfiguriert. Über Konsole (KVM/IPMI) einsteigen und nmcli con modify enp1s0 ipv4.address ... manuell wiederherstellen |
| 5 (Netzwerk) | NIC heißt nicht enp1s0 (z. B. eth0, eno1) | NIC-Namen des OS prüfen (nmcli dev). Zeile IF=enp1s0 in tools/net/set-1.sh auf den tatsächlichen Namen ändern und setup.sh erneut ausführen |
| 8 (dnf) | dnf-Update bleibt hängen | Leitung / internen dnf-Mirror prüfen. Im Firmennetz internen Mirror in /etc/yum.repos.d/ eintragen |
| 9 (Pakete) | einzelne Pakete fehlen (z. B. firefox nicht vorhanden) | Minimal-Installations-ISO. Fehlt dieses Paket, ist das Gateway selbst nicht betroffen — ignorieren und fortfahren |
| 10 (tuned) | tuned-adm not found | dnf install tuned fehlt. Manuell installieren und setup.sh ab Schritt 11 fortsetzen |
| 11 (Firewall) | firewall-cmd --reload schlägt fehl | firewalld läuft nicht. systemctl start firewalld manuell ausführen. Auch SELinux enforcing prüfen |
| 15 (hugepages) | hugepages nach dem Boot wieder weg | vm.nr_hugepages = 9216 dauerhaft in /etc/sysctl.d/99-plantpulse.conf eintragen |
| 22 (systemd) | Gateway startet nach Reboot nicht | Ursache des Unit-Fehlers mit journalctl -u plantpulse --no-pager ermitteln. bin/start.sh direkt ausführen und feststellen, wo es hängt |
set -e | Abbruch mittendrin | Vorhergehenden Schritt im Meldungstext prüfen. Nur diesen Schritt manuell ausführen und setup.sh ab dem nächsten Schritt fortsetzen |
| Allgemein | Ausführungsrechte des Skripts | chmod +x /opt/kopens/tools/setup.sh (selten erforderlich) |
9. Empfohlene erste Schritte nach der Installation
- Web-UI aufrufen + Passwort ändern —
/ui/main→ Benutzermenü oben rechts → Passwort ändern - Site- / Edge-ID prüfen —
site.id,edge.idunter Systemkonfiguration - Sparkplug B anbinden — Sparkplug B (falls erforderlich)
- Erste PLC-Verbindung anlegen — Neue PLC-Verbindung hinzufügen
- Cron für regelmäßige Backups einrichten — Backup (
backup.sh)
10. Weiterführend
- Schnelle / Einzeiler-Installation (wenn das OS bereits vorbereitet ist): Schnellinstallation (Einzeiler)
- Katalog der Betriebsskripte: Betrieb — Überblick
- Upgrade-Verfahren: Upgrade (
upgrade.sh) - Umgebungsvariablen / Konfiguration: Systemkonfiguration (
app.properties) - Wiederherstellung aus einem Backup: Backup (
backup.sh)