> For the complete documentation index, see [llms.txt](https://kopens.gitbook.io/plantpulse-platform/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kopens.gitbook.io/plantpulse-platform/installation/java-tomcat.md).

# 바이너리 설치

## 개요

이 페이지에서는 **OS 위에 PlantPulse 플랫폼을 직접 설치하는 바이너리(네이티브) 설치 절차**를 안내합니다. tar.gz 패키지를 풀고 한 번의 셋업 스크립트로 OS 의존성, 인프라, 애플리케이션이 모두 구성됩니다.

> **언제 선택하나요?** Docker 를 사용할 수 없거나, OS 레벨에서 세부 자원 / 보안 정책을 직접 관리하고자 할 때 적합합니다. 일반적으로는 [원라인 설치 (권장)](/plantpulse-platform/installation/one-line-install.md) 를 권장합니다.

### 설치 방식 비교

| 항목     | 바이너리 설치                | 원라인 / Docker 설치          |
| ------ | ---------------------- | ------------------------ |
| 설치 시간  | 20\~40분                | 10\~20분                  |
| 환경 의존성 | 호스트 OS 에 패키지 설치        | 컨테이너에 모두 포함              |
| 자원 격리  | 호스트와 공유                | 컨테이너로 격리                 |
| 업데이트   | tar.gz 재배포 + configure | `platform-update.sh` 한 줄 |
| 롤백     | 백업본에서 수동 복원            | 이전 이미지로 자동 rollback      |
| 폐쇄망    | `setup-offline.sh` 지원  | `airgap-load.sh` 지원      |
| 호스트 OS | 직접 영향                  | 거의 영향 없음                 |

## 지원 환경

| OS                 | 버전       | 검증 |
| ------------------ | -------- | -- |
| Oracle Linux       | 8.x, 9.x | ✓  |
| RHEL / Rocky Linux | 8.x, 9.x | ✓  |
| Amazon Linux       | 2, 2023  | ✓  |
| Ubuntu             | 22.04+   | ✓  |

### 하드웨어 권장 사양

| 구분       | 최소          | 표준       | 대규모      |
| -------- | ----------- | -------- | -------- |
| CPU      | 16 vCPU     | 32 vCPU  | 48+ vCPU |
| 메모리      | 64GB        | 128GB    | 200GB+   |
| 데이터 디스크  | 200GB       | 1TB      | 4TB+     |
| 디스크 IOPS | NVMe SSD 권장 | NVMe SSD | NVMe SSD |
| 네트워크     | 1Gbps       | 10Gbps   | 10Gbps   |

> **검증 환경 (참고)**: 운영 검증 환경은 48 vCPU / 188GB RAM / 4.8TB NVMe SSD, RHEL 9 / Temurin OpenJDK 21 LTS 로 운영 중입니다.

## 설치 절차 개요

```mermaid
flowchart LR
  A[1. 패키지 다운로드] --> B[2. 압축 해제<br/>/opt/kopens/plantpulse-platform]
  B --> C[3. setup.sh<br/>OS · JDK · 인프라 설치]
  C --> D[4. env.sh 검토<br/>IP · 자원 · 비밀번호]
  D --> E[5. configure.sh<br/>템플릿 → 실제 설정]
  E --> F[6. start.sh<br/>플랫폼 기동]
  F --> G[7. 헬스 체크]
```

## 1. 사전 준비

### 1.1 root 권한 확보

설치는 `root` 권한으로 진행합니다. 비루트 사용자로 운영하려면 설치 완료 후 별도의 권한 분리 절차가 필요합니다 (운영팀 문의).

```bash
sudo -i
```

### 1.2 데이터 디스크 마운트

대용량 시계열 데이터를 위해 별도 디스크를 `/data1` 에 마운트해 주세요.

```bash
# 사용 가능한 디스크 확인
lsblk

# 예: /dev/sdb 를 ext4 로 포맷 후 /data1 에 마운트
mkfs.ext4 /dev/sdb
mkdir -p /data1
mount /dev/sdb /data1

# 부팅 시 자동 마운트
echo "/dev/sdb  /data1  ext4  defaults  0 0" >> /etc/fstab
```

> **디스크 분리 권장**: OS 디스크와 데이터 디스크를 분리하면 백업, 확장, 장애 격리가 쉬워집니다. 작은 환경이라도 가급적 별도 디스크 / 별도 LV 로 구성해 주세요.

### 1.3 시간 동기화

분산 컴포넌트 (Cassandra, Kafka 등) 는 노드 간 시간 정확도에 민감합니다. NTP 동기화가 필수입니다.

```bash
# RHEL 계열
dnf install -y chrony
systemctl enable --now chronyd
chronyc tracking
```

### 1.4 SELinux / 방화벽

`setup.sh` 가 자동으로 SELinux 를 permissive 로 전환하고 필요한 방화벽 포트를 엽니다. 회사 / 클라우드 상위 방화벽은 별도로 [포트 구성 정보](/plantpulse-platform/installation/ports.md) 페이지를 참고해 허용 규칙을 추가해 주세요.

## 2. 패키지 다운로드 및 압축 해제

KOPENS 운영팀으로부터 받은 `plantpulse-platform-YYYY.MM.tgz` 패키지를 `/opt/kopens/` 에 배치합니다.

```bash
mkdir -p /opt/kopens
cd /opt/kopens

# scp 또는 USB / 내부 미러로 패키지 이전
# 예시: scp 로 받은 파일을 풀기
tar -xzvf plantpulse-platform-2026.05.tgz

# 결과 디렉토리 확인
ls /opt/kopens/plantpulse-platform/
```

압축 해제 후 다음 구조가 만들어집니다.

```
/opt/kopens/plantpulse-platform/
├── plantpulse-startup/            # 모든 운영 스크립트 + startup.jar
│   ├── env.sh                     # 전역 환경 변수 (★ 검토 필요)
│   ├── start.sh / stop.sh         # 시작 / 정지
│   ├── start-daemon.sh            # 데몬 모드 시작
│   ├── restart.sh                 # stop → clean → start-daemon
│   ├── status.sh                  # 포트 기반 상태 점검
│   ├── configure.sh               # 템플릿 → 실제 설정 생성
│   ├── prepare-ssl.sh             # TLS 인증서 생성
│   ├── restart-*.sh               # 모듈별 재시작
│   ├── node-*.sh                  # Cassandra 운영
│   ├── log-viewer.sh              # 통합 로그 뷰어
│   └── ...
├── plantpulse-server/             # 웹 콘솔 (Tomcat 기반)
├── plantpulse-batch/              # 배치 처리
├── plantpulse-cep/                # 복합 이벤트 처리
├── plantpulse-data-gateway/       # 데이터 게이트웨이
├── plantpulse-sql/                # SQL 쿼리 서비스
├── plantpulse-monitor/            # 모니터링
├── plantpulse-warehouse/          # 데이터 웨어하우스
├── plantpulse-plugin/             # OPC-UA / AAS 산업 플러그인
├── plantpulse-storage/            # Cassandra / PostgreSQL / Valkey / MinIO
├── plantpulse-messaging/          # Kafka / MQTT(HiveMQ) / STOMP(ActiveMQ)
├── plantpulse-analytics/          # Spark / Hive / Kyuubi / Gravitino / Hadoop
├── plantpulse-workflow/           # Temporal / Kestra
├── plantpulse-timeseries/         # 시계열 엔진 + UI
├── tools/                         # OS 의존성 / JDK / DB 클라이언트 / 설정 템플릿
│   ├── setup.sh                   # 온라인 셋업
│   ├── setup-offline.sh           # 폐쇄망 셋업
│   ├── java/                      # OpenJDK
│   ├── postgresql/                # psql 클라이언트
│   ├── valkey/                    # redis-cli
│   ├── cron/ firewall/ ssl/ swap/ ntp/ ...
│   └── ...
├── offline/                       # 폐쇄망 설치 리소스 (RPM 리포 + wheels)
└── backup/                        # 자체 백업 디렉토리
```

## 3. 셋업 스크립트 실행

`tools/setup.sh` 가 OS 패키지 설치, JDK 설치, 데이터 디렉토리 생성, 방화벽 / SELinux / NTP / limits / sysctl 까지 한 번에 처리합니다.

```bash
cd /opt/kopens/plantpulse-platform/tools
./setup.sh
```

### 셋업 대화형 입력

`setup.sh` 는 다음 정보를 묻습니다.

| 항목                   | 설명                                 | 예시             |
| -------------------- | ---------------------------------- | -------------- |
| 노드 모드                | `MASTER` (단일/클러스터 마스터) 또는 `WORKER` | `MASTER`       |
| HOST IP              | 서버 내부 IP                           | `192.168.0.41` |
| SERVICE IP           | 외부 접속 IP 또는 도메인                    | `192.168.0.41` |
| MASTER IP (WORKER 만) | 마스터 노드 IP                          | `192.168.0.41` |
| 데이터 디스크명             | `lsblk` 출력 기준                      | `sdb`          |
| 데이터 루트 경로            | 데이터 저장 디렉토리                        | `/data1`       |

### 셋업이 자동으로 수행하는 작업

```mermaid
flowchart TD
  A[OS 감지<br/>RHEL / Rocky / Oracle / Ubuntu] --> B[기본 패키지 설치<br/>jdk · libpq · htop · chrony 등]
  B --> C[locale ko_KR · TZ Asia/Seoul]
  C --> D[JAVA_HOME 등록]
  D --> E[데이터 디렉토리<br/>pp-data · pp-temp · pp-backup]
  E --> F[sysctl / limits / NTP / SELinux]
  F --> G[방화벽 50+ 포트 오픈]
  G --> H[env.sh 초기 값 기록]
```

> **실행 시간**: 처음 실행 시 약 15\~30분 소요됩니다 (OS 업데이트 + 패키지 설치 + 인프라 컴포넌트 설치 포함).

## 4. 환경 변수 검토 (`env.sh`)

`/opt/kopens/plantpulse-platform/plantpulse-startup/env.sh` 가 플랫폼 전체의 단일 설정 소스입니다. 모든 모듈의 템플릿 설정 파일이 이 값을 참조해 생성됩니다.

```bash
vi /opt/kopens/plantpulse-platform/plantpulse-startup/env.sh
```

### 4.1 반드시 확인해야 할 핵심 변수

| 카테고리          | 변수                          | 설명                | 기본값                               |
| ------------- | --------------------------- | ----------------- | --------------------------------- |
| **Platform**  | `PP_HOME`                   | 설치 경로             | `/opt/kopens/plantpulse-platform` |
|               | `PP_MODE`                   | 노드 모드             | `MASTER` / `WORKER`               |
| **Network**   | `PP_HOST_IP`                | 서버 내부 IP          | `192.168.0.41`                    |
|               | `PP_SERVICE_IP`             | 외부 접속 IP          | `192.168.0.41`                    |
|               | `PP_MASTER_IP`              | 마스터 IP            | `192.168.0.41`                    |
|               | `PP_PUBLIC_IP`              | 외부 공개 IP (NAT)    | `${PP_HOST_IP}`                   |
| **Data**      | `PP_DATA_DIR`               | 데이터 저장 경로         | `/data1/pp-data`                  |
|               | `PP_TEMP_DIR`               | 임시 파일 경로          | `/data1/pp-temp`                  |
|               | `PP_BACKUP_DIR`             | 백업 경로             | `/data1/pp-backup`                |
| **Resources** | `PP_CLUSTER_CORES`          | 분산 분석에 할당할 코어     | `30`                              |
|               | `PP_CLUSTER_MEMORY_BY_CORE` | 코어당 메모리           | `2G`                              |
| **Locale**    | `PP_LANG`                   | 로케일 (`ko` / `en`) | `ko`                              |
|               | `PP_TZ`                     | 타임존               | `Asia/Seoul`                      |

### 4.2 서비스 계정 비밀번호

운영 환경에서는 반드시 다음 기본 비밀번호를 변경해 주세요.

```bash
# env.sh 안에서
export PP_REDIS_PASSWORD=$(openssl rand -base64 18)
export PP_CASSANDRA_PASSWORD=$(openssl rand -base64 18)
export PP_PG_PASSWORD=$(openssl rand -base64 18)
export PP_MQ_PASSWORD=$(openssl rand -base64 18)
export PP_HIVE_PASSWORD=$(openssl rand -base64 18)
export PP_MINIO_PASSWORD=$(openssl rand -base64 18)
export PP_TEMPORAL_PASSWORD=$(openssl rand -base64 18)
export PP_TLS_KEYSTORE_PASSWORD=$(openssl rand -base64 18)
```

> **권장**: 변경된 비밀번호는 운영 vault (HashiCorp Vault, AWS Secrets Manager 등) 에 보관하고, `env.sh` 는 환경별 override 로 주입하는 패턴을 사용해 주세요.

### 4.3 TLS / SSL 설정

```bash
# env.sh
export PP_TLS_ENABLED=true
export PP_TLS_DOMAIN=plantpulse.io
export PP_TLS_SAN_DNS="localhost,$(hostname -f),plantpulse.io,plantpulse.kopens.com"
export PP_TLS_SAN_IPS="${PP_HOST_IP},${PP_SERVICE_IP},${PP_PUBLIC_IP},127.0.0.1,100.68.69.41"
export PP_TLS_VALID_DAYS=730
```

> **외부 노출 IP 추가**: NAT / 클라우드 환경에서는 외부 IP / 도메인을 `PP_TLS_SAN_DNS` / `PP_TLS_SAN_IPS` 에 명시해야 클라이언트 인증서 검증이 통과합니다.

### 4.4 env.sh 검증 및 리셋

```bash
cd /opt/kopens/plantpulse-platform/plantpulse-startup

./env-validate.sh                  # 변수 정합성 검증
./env-reset.sh                     # env.sh 변경 후 템플릿 재생성 필요 시
```

## 5. 템플릿 설정 적용 (configure.sh)

`env.sh` 의 값을 모든 모듈의 설정 파일에 일괄 적용합니다.

```bash
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./configure.sh
```

`configure.sh` 는 내부적으로 `startup.jar CONFIGURE` 를 호출하여 다음을 수행합니다.

1. `template/` 디렉토리의 모든 설정 템플릿(`*.template`) 을 스캔
2. `env.sh` 변수로 placeholder (`${PP_HOST_IP}`, `${PP_CASSANDRA_PASSWORD}` 등) 치환
3. 실제 설정 파일 위치로 저장 (각 모듈의 `conf/`, `etc/` 등)

> **변경 후 재실행 필수**: `env.sh` 를 변경할 때마다 `./configure.sh` 를 다시 실행해야 새 값이 모듈에 반영됩니다.

## 6. TLS 인증서 준비 (prepare-ssl.sh)

`PP_TLS_ENABLED=true` 인 경우 첫 기동 전에 인증서를 생성합니다.

```bash
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./prepare-ssl.sh
```

* 자체 서명 인증서 (ECDSA secp256r1) 생성
* keystore / truststore 생성 (`/var/security/plantpulse/`)
* OPC-UA / Kafka / MQTT / Cassandra / Web 인증서 분리 생성
* 외부 CA 인증서를 사용하려면 [보안 설정](/plantpulse-platform/admin/security.md) 페이지 참고

## 7. 플랫폼 시작

### 7.1 포그라운드 시작 (최초 검증)

처음 설치 후에는 시작 로그를 직접 보면서 확인하시는 것이 좋습니다.

```bash
/opt/kopens/plantpulse-platform/plantpulse-startup/start.sh
```

### 7.2 백그라운드 시작 (운영 모드)

운영 환경에서는 데몬 모드로 시작합니다. 터미널을 닫아도 플랫폼이 계속 실행됩니다.

```bash
/opt/kopens/plantpulse-platform/plantpulse-startup/start-daemon.sh
```

### 7.3 기동 순서

`startup.jar` 가 의존성 순서에 따라 컴포넌트를 단계별로 기동합니다.

```mermaid
flowchart TD
  S1[1. Storage<br/>Valkey · PostgreSQL · Cassandra · MinIO]
  S2[2. Analytics<br/>Spark · Hadoop · Hive · Kyuubi · Gravitino]
  S3[3. Time-Series<br/>Engine · UI]
  S4[4. Messaging<br/>Kafka · MQTT · STOMP]
  S5[5. Workflow<br/>Temporal · Kestra]
  S6[6. Processing<br/>CEP · Data Gateway · SQL · Monitor]
  S7[7. Plugins<br/>OPC-UA · AAS]
  S8[8. Applications<br/>Warehouse · Batch · Server]

  S1 --> S2 --> S3 --> S4 --> S5 --> S6 --> S7 --> S8
```

각 단계가 완료될 때까지 자동으로 대기하므로 별도 조작은 필요 없습니다. 전체 기동에 **3 \~ 5분** 소요됩니다.

### 7.4 시작 정상 메시지

```
═══════════════════════════════════════════════════════════════════
   ____  _             _   ____        _
  |  _ \| | __ _ _ __ | |_|  _ \ _   _| |___  ___
  | |_) | |/ _` | '_ \| __| |_) | | | | / __|/ _ \
  |  __/| | (_| | | | | |_|  __/| |_| | \__ \  __/
  |_|   |_|\__,_|_| |_|\__|_|    \__,_|_|___/\___|
                                    PLATFORM
═══════════════════════════════════════════════════════════════════
  ● Status   STARTING  [DAEMON]
  ● Host     ...
  ● URLs     https://...              (web)
═══════════════════════════════════════════════════════════════════
...
플랜트펄스 플랫폼이 정상적으로 시작되었습니다.
```

## 8. 설치 확인

### 8.1 서비스 상태 점검

```bash
/opt/kopens/plantpulse-platform/plantpulse-startup/status.sh
```

각 모듈이 `RUNNING` 상태로 표시되며, 시스템 자원 사용량 (CPU / Memory PSS / Disk) 요약도 함께 나옵니다.

```
=============================================================================================================
 PLANTPULSE PLATFORM - ALL SERVICE STATUS
=============================================================================================================

<SYSTEM RESOURCE OVERVIEW>
--------------------------------------------------------------------------------------------------------------
  CPU LOAD (AVG)         :   12.3% (48 cores)
  MEMORY USAGE           :   65.2% (123.1G / 188.7G)
  DATA DISK USAGE        :   45.8% (2.2T / 4.8T)
--------------------------------------------------------------------------------------------------------------

<SERVICE STATUS BY PORT>
  SERVICE                     | PORT   | STATUS   | PID     | CPU     | MEMORY (PSS)         | PROCESS
  PP_MESSAGING[KAFKA]         | 9092   | RUNNING  | 12345   |   2.3%  |     8.5G (  4.51%)   | java
  PP_STORAGE[CASSANDRA]       | 9042   | RUNNING  | 12567   |   5.1%  |    16.2G (  8.59%)   | java
  PP_SERVER                   | 80     | RUNNING  | 12890   |   1.2%  |     4.8G (  2.55%)   | java
  ...
```

### 8.2 웹 콘솔 접속

브라우저에서 다음 주소로 접속합니다.

| URL                          | 용도                  |
| ---------------------------- | ------------------- |
| `http://[SERVICE_IP]/`       | 운영 콘솔 (포트 80)       |
| `https://[SERVICE_IP]/`      | 운영 콘솔 (포트 443, TLS) |
| `https://[SERVICE_IP]:7443/` | 관리 콘솔 (별도 포트)       |

* 기본 관리자 계정: **admin** / **admin123!**
* 로그인 후 즉시 비밀번호를 변경해 주세요.

### 8.3 헬스 체크 엔드포인트

외부 모니터링 시스템과 연동할 때 사용합니다.

```bash
# 컨테이너 / 프로세스 헬스
curl -kfsS https://127.0.0.1:4950/api/health | jq

# 모니터 모듈
curl -fsS http://127.0.0.1:4949/health
```

## 운영 명령 요약

```bash
cd /opt/kopens/plantpulse-platform/plantpulse-startup

./start.sh                    # 포그라운드 시작
./start-daemon.sh             # 백그라운드 시작
./stop.sh                     # 정지
./restart.sh                  # stop → clean → start-daemon
./status.sh                   # 전체 모듈 상태
./log-viewer.sh               # 통합 로그 뷰어
./log-delete.sh               # 오래된 로그 정리
./clean.sh                    # 임시 파일 정리 (정지 후)
./kill.sh                     # 강제 종료 (응답 없을 때)

# 모듈별 재시작
./restart-server.sh           # 웹 서버
./restart-storage.sh          # 스토리지
./restart-analytics.sh        # 분석
./restart-messaging.sh        # 메시징
./restart-timeseries.sh       # 시계열
./restart-workflow.sh         # 워크플로우
./restart-cep.sh              # CEP
./restart-data-gateway.sh     # 데이터 게이트웨이
./restart-monitor.sh          # 모니터
./restart-batch.sh            # 배치
./restart-warehouse.sh        # 웨어하우스
./restart-plugin.sh           # 플러그인
./restart-opcua-server.sh     # OPC-UA
./restart-aasx-server.sh      # AAS

# Cassandra 운영
./node-status.sh              # 클러스터 상태
./node-info.sh                # 노드 상세
./node-cql.sh                 # CQL 셸
./node-compact.sh             # 수동 컴팩션
./node-cleanup.sh             # 노드 정리
./node-repair.sh              # 데이터 복구
```

상세 운영 절차는 [시작 가이드](/plantpulse-platform/installation/startup-guide.md) 및 [운영 관리](/plantpulse-platform/installation/database.md) 페이지를 참고해 주세요.

## 폐쇄망 (Airgap) 설치

인터넷이 차단된 환경에서는 다음 절차로 설치합니다.

### 빌드 노드 (인터넷 환경)에서 번들 생성

```bash
cd /opt/kopens/plantpulse-platform/offline
./prepare-offline.sh
# 산출물: /offline-install/kopens-offline.tar.gz
```

번들에는 다음이 포함됩니다.

* 전체 `/opt/kopens/plantpulse-platform/` 디렉토리
* 필수 RPM (`offline/repos/rpm/` + `repodata/`)
* Python wheel (`offline/repos/python-wheels/`)
* JDK / 인프라 패키지 (`tools/` 하위)

### 폐쇄망 노드로 이전

USB / 내부 파일 서버 / scp 등으로 `kopens-offline.tar.gz` 전달.

### 폐쇄망 노드에서 설치

```bash
mkdir -p /opt/kopens
tar -xzvf /path/to/kopens-offline.tar.gz -C /opt/kopens/

cd /opt/kopens/plantpulse-platform/tools
./setup-offline.sh

# 환경 변수 검토 및 시작
cd /opt/kopens/plantpulse-platform/plantpulse-startup
vi env.sh
./configure.sh
./start-daemon.sh
./status.sh
```

`setup-offline.sh` 는 로컬 RPM 리포만 사용해 OS 의존성을 설치하고 인프라 컴포넌트를 배포합니다.

## 업데이트

### 마이너 업데이트 (설정 / 패치)

```bash
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./stop.sh

# 패치 파일 적용 (운영팀이 안내한 절차에 따라)
cp -r /tmp/patch/* /opt/kopens/plantpulse-platform/

./configure.sh
./start-daemon.sh
./status.sh
```

### 메이저 업데이트 (전체 재배포)

```bash
# 1. 현재 데이터 / 설정 백업
./stop.sh
cp -a /opt/kopens/plantpulse-platform /opt/kopens/plantpulse-platform.bak-$(date +%Y%m%d)
tar -czf /data1/pp-backup/pre-update-$(date +%Y%m%d).tar.gz /data1/pp-data /data1/pp-backup

# 2. 새 tar.gz 풀기 (env.sh / 데이터는 보존)
cd /opt/kopens
tar -xzvf plantpulse-platform-NEW.tgz --exclude='plantpulse-platform/plantpulse-startup/env.sh'

# 3. 재구성 및 시작
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./configure.sh
./start-daemon.sh

# 4. 문제 시 롤백
./stop.sh
rm -rf /opt/kopens/plantpulse-platform
mv /opt/kopens/plantpulse-platform.bak-YYYYMMDD /opt/kopens/plantpulse-platform
cd /opt/kopens/plantpulse-platform/plantpulse-startup
./start-daemon.sh
```

> **데이터 보호**: 메이저 업데이트 전에 반드시 `/data1/pp-data` 와 `/data1/pp-backup` 의 풀 백업을 수행하시고, 별도 디스크 / 외부 스토리지에 보관해 주세요.

## 문제 해결 핵심

| 증상                 | 1차 조치                                                          |
| ------------------ | -------------------------------------------------------------- |
| 시작 후 일부 모듈 STOPPED | `./status.sh` 로 어느 모듈인지 확인 후 `./restart-<module>.sh`           |
| 메모리 부족 / OOMKilled | `env.sh` 의 `PP_CLUSTER_CORES` / `PP_CLUSTER_MEMORY_BY_CORE` 조정 |
| 포트 충돌              | `ss -tlnp` 로 점유 프로세스 확인 후 종료 또는 `env.sh` 에서 포트 변경              |
| 디스크 부족             | `node-cleanup.sh` / `node-compact.sh` 또는 오래된 백업 정리             |
| 시작 안 됨             | `./log-viewer.sh` 또는 `tail -F /var/log/plantpulse-startup.log` |
| 강제 종료 필요           | `./kill.sh` (최후 수단 — 데이터 손상 위험)                                |

자세한 진단 절차는 [문제 해결](/plantpulse-platform/admin/troubleshooting.md) 페이지를 참고해 주세요.

## 다음 단계

* [시작 가이드](/plantpulse-platform/installation/startup-guide.md) — 일상 시작 / 정지 / 재시작 명령
* [운영 관리](/plantpulse-platform/installation/database.md) — 백업, 업데이트, 모니터링
* [클러스터 설치](/plantpulse-platform/installation/build-deploy.md) — 워커 노드 추가
* [포트 구성 정보](/plantpulse-platform/installation/ports.md) — 방화벽 / 네트워크 설정

## 기술 지원

설치 과정에서 도움이 필요하시면 **<webmaster@kopens.com>** 으로 문의해 주세요. `./log-viewer.sh` 의 화면 캡처 또는 `/opt/kopens/plantpulse-platform/plantpulse-startup/test/` 의 검증 결과를 함께 보내주시면 빠른 분석이 가능합니다.
