# 📊 PANDUAN STANDAR OPERASIONAL (SOP) SETUP MONITORING SERVER
## Target OS: AlmaLinux 8 (RHEL-family), Apache (httpd) VirtualHost, PHP-FPM
**Standar Keamanan:** ISO 27001 (Audit Logging & System Monitoring), Zero-Downtime Deployment

---

## 🗺️ Gambaran Arsitektur

```text
[ SERVER PRODUKSI ERP (AlmaLinux 8) ]                      [ SERVER MONITORING TERPISAH ]
┌──────────────────────────────────────────┐               ┌─────────────────────────────────┐
│ • Apache httpd (/server-status)          │               │                                 │
│ • PHP-FPM (/run/php-fpm/www.sock)        │ ────────────> │ • Prometheus Server (Port 9090) │
│ • node_exporter       (Port 9100)        │  Tarik Metrik │ • Grafana Dashboard (Port 3000) │
│ • apache_exporter     (Port 9117)        │  Tiap 10s     │ • Alertmanager (Telegram/Email) │
│ • php-fpm_exporter    (Port 9253)        │               │                                 │
└──────────────────────────────────────────┘               └─────────────────────────────────┘
```

---

## 🚀 BAGIAN 1: SETUP DI SERVER PRODUKSI (AlmaLinux 8 - Zero Downtime)

Eksekusi perintah berikut di terminal SSH Server Produksi sebagai user `root` atau `sudo`:

### 1.1. Aktifkan Endpoint Status di Apache (`httpd`)

Pada AlmaLinux 8, modul `mod_status` sudah aktif secara default. Kita cukup membuat konfigurasi status global.

1. Buat file `/etc/httpd/conf.d/status.conf`:
   ```bash
   sudo nano /etc/httpd/conf.d/status.conf
   ```
2. Masukkan konfigurasi berikut:
   ```apache
   ExtendedStatus On

   <Location /server-status>
       SetHandler server-status
       Require local
       # Jika server monitoring berada di IP LAN yang sama (misal 192.168.5.x):
       # Require ip 192.168.5.0/24
   </Location>
   ```

3. **PENTING untuk Apache VirtualHost:**
   Jika di file VirtualHost Anda (`/etc/httpd/conf.d/vhost.conf` atau sejenisnya) terdapat directive `ProxyPass` ke PHP-FPM, pastikan `/server-status` **dikecualikan** agar tidak dilempar ke PHP:
   ```apache
   # Tambahkan baris ini SEBELUM ProxyPass PHP:
   ProxyPass /server-status !
   ```

4. Uji Sintaks & Graceful Reload Apache (Tanpa Putus Koneksi):
   ```bash
   sudo apachectl configtest
   # Output wajib: Syntax OK
   sudo apachectl graceful
   ```

5. Uji Coba Langsung di Terminal:
   ```bash
   curl http://127.0.0.1/server-status?auto
   ```

---

### 1.2. Aktifkan Endpoint Status di PHP-FPM AlmaLinux 8

1. Buka file konfigurasi pool FPM bawaan AlmaLinux:
   ```bash
   sudo nano /etc/php-fpm.d/www.conf
   ```
2. Cari dan aktifkan (hilangkan tanda `;` di depan) baris berikut:
   ```ini
   pm.status_path = /status
   ping.path = /ping
   ```

3. Uji Sintaks & Reload service PHP-FPM Remi:
   ```bash
   # Path binary Remi PHP 5.6 yang terverifikasi di server produksi:
   sudo /opt/remi/php56/root/usr/sbin/php-fpm -t
   # Jika output: test is successful
   sudo systemctl reload php56-php-fpm
   ```

---

### 1.3. Unduh & Pasang 3 Agen Ringan (Exporters) di AlmaLinux 8

#### A. Pasang `node_exporter` (Metrik CPU, RAM, Disk, Jaringan)
```bash
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.8.1.linux-amd64.tar.gz
sudo cp node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter 2>/dev/null || true

# Buat Systemd Service:
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
```

#### B. Pasang `apache_exporter` (Metrik Traffic & Workers Apache)
```bash
cd /tmp
wget https://github.com/Lusitaniae/apache_exporter/releases/download/v1.0.8/apache_exporter-1.0.8.linux-amd64.tar.gz
tar xvfz apache_exporter-1.0.8.linux-amd64.tar.gz
sudo cp apache_exporter-1.0.8.linux-amd64/apache_exporter /usr/local/bin/

# Buat Systemd Service:
sudo tee /etc/systemd/system/apache_exporter.service <<EOF
[Unit]
Description=Apache Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/apache_exporter --scrape_uri="http://127.0.0.1/server-status?auto" --telemetry.address=:9117

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now apache_exporter
```

#### C. Pasang `php-fpm_exporter` (Metrik Worker & Antrean FPM)
Di AlmaLinux 8, PHP-FPM default menggunakan Unix socket `/run/php-fpm/www.sock`.
```bash
cd /tmp
wget https://github.com/hipages/php-fpm_exporter/releases/download/v2.2.0/php-fpm_exporter_2.2.0_linux_amd64.tar.gz
tar xvfz php-fpm_exporter_2.2.0_linux_amd64.tar.gz
sudo cp php-fpm_exporter /usr/local/bin/

# Buat Systemd Service (Langsung membaca socket AlmaLinux):
sudo tee /etc/systemd/system/php-fpm_exporter.service <<EOF
[Unit]
Description=PHP-FPM Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/php-fpm_exporter --phpfpm.scrape-uri="unix:///run/php-fpm/www.sock;/status" --web.listen-address=:9253

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now php-fpm_exporter
```

---

### 1.4. Buka Port Firewall di AlmaLinux 8 (`firewalld`)

Agar server monitoring (Prometheus) bisa menarik metrik dari port 9100, 9117, dan 9253:

* **Opsi A: Jika Server Monitoring berada di IP tertentu (Sangat Disarankan Demi Keamanan):**
  ```bash
  # Misal IP Server Monitoring adalah 192.168.5.50
  sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.50" port port="9100" protocol="tcp" accept'
  sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.50" port port="9117" protocol="tcp" accept'
  sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.50" port port="9253" protocol="tcp" accept'
  sudo firewall-cmd --reload
  ```

* **Opsi B: Buka untuk semua LAN lokal:**
  ```bash
  sudo firewall-cmd --permanent --add-port={9100,9117,9253}/tcp
  sudo firewall-cmd --reload
  ```

---

## 🖥️ BAGIAN 2: SETUP DI SERVER MONITORING (PROMETHEUS + GRAFANA)

Jalankan seluruh langkah berikut di **server monitoring** (bukan server produksi AlmaLinux).

---

### 2.0. Instalasi Docker Engine & Docker Compose Plugin

#### A. Jika Server Monitoring = Ubuntu 22.04 / 24.04 (Paling Umum)
```bash
# 1. Hapus versi Docker lama jika ada
sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null

# 2. Tambahkan repository resmi Docker
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 3. Install Docker Engine + Compose Plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 4. Aktifkan & start Docker service
sudo systemctl enable --now docker

# 5. Verifikasi instalasi
docker --version
docker compose version
```

#### B. Jika Server Monitoring = AlmaLinux 8 / RHEL 8 / Rocky Linux 8
```bash
# 1. Tambahkan repository Docker CE resmi
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# 2. Install Docker Engine + Compose Plugin
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 3. Aktifkan & start Docker service
sudo systemctl enable --now docker

# 4. Izinkan port Grafana & Prometheus di firewalld (jika perlu akses dari luar)
sudo firewall-cmd --permanent --add-port={3000,9090}/tcp
sudo firewall-cmd --reload

# 5. Verifikasi instalasi
docker --version
docker compose version
```

#### C. Jika Server Monitoring = Debian 12
```bash
# 1. Tambahkan repository Docker CE resmi
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 2. Install Docker Engine + Compose Plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 3. Aktifkan & start Docker
sudo systemctl enable --now docker

# 4. Verifikasi
docker --version
docker compose version
```

---

### 2.1. Buat Folder Kerja Monitoring
```bash
mkdir -p ~/monitoring
cd ~/monitoring
```

Jalankan di Server Monitoring (menggunakan Docker-Compose):

### 2.1. Buat File `docker-compose.yml`
```yaml
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin_password_kuat_disini

volumes:
  prometheus_data:
  grafana_data:
```

### 2.2. Buat File `prometheus.yml`
Ganti `IP_ALMALINUX_PRODUKSI` dengan IP server AlmaLinux Anda (misal `192.168.5.14`):
```yaml
global:
  scrape_interval: 10s
  evaluation_interval: 10s

scrape_configs:
  - job_name: 'almalinux_os'
    static_configs:
      - targets: ['IP_ALMALINUX_PRODUKSI:9100']

  - job_name: 'almalinux_apache'
    static_configs:
      - targets: ['IP_ALMALINUX_PRODUKSI:9117']

  - job_name: 'almalinux_php_fpm'
    static_configs:
      - targets: ['IP_ALMALINUX_PRODUKSI:9253']
```

Jalankan container:
```bash
docker compose up -d
```

---

## 📊 BAGIAN 3: IMPORT DASHBOARD GRAFANA (SIAP PAKAI)

1. Buka browser: `http://IP_SERVER_MONITORING:3000` (Login: `admin` / password yang dibuat).
2. Hubungkan Data Source:
   * Masuk ke **Connections** $\rightarrow$ **Data Sources** $\rightarrow$ **Add data source** $\rightarrow$ Pilih **Prometheus**.
   * URL: `http://prometheus:9090` (atau `http://localhost:9090`).
   * Klik **Save & test**.
3. Import Dashboard Resmi:
   * Masuk ke menu **Dashboards** $\rightarrow$ **New** $\rightarrow$ **Import**.
   * Masukkan **Dashboard ID**:
     * **`15033`** $\rightarrow$ Dashboard PHP-FPM (Workers, Listen Queue, Max Children Reached).
     * **`3894`** $\rightarrow$ Dashboard Apache Web Server (Requests/sec, Traffic, Scoreboard Workers).
     * **`1860`** $\rightarrow$ Dashboard Node Exporter Full (CPU, RAM, Disk I/O, Load Average).
   * Pilih DataSource Prometheus $\rightarrow$ Klik **Import**.

---

## 🚨 BAGIAN 4: METRIK KRITIS UNTUK ALMALINUX & ERP

1. **`phpfpm_listen_queue > 0` (Kritis):**
   * Transaksi ERP mengantre karena seluruh worker FPM sibuk.
2. **`phpfpm_max_children_reached > 0` (Peringatan):**
   * Kapasitas `pm.max_children` di `/etc/php-fpm.d/www.conf` sudah menyentuh batas maksimum.
3. **`apache_workers{state="busy"} / total > 85%` (Waspada):**
   * Kapasitas koneksi Apache VirtualHost mendekati penuh.
4. **`node_load1 / count(node_cpu_seconds_total{mode="idle"}) > 1.5` (CPU Overload):**
   * Server mengalami beban proses berlebih.

---

## ✅ BAGIAN 5: CHECKLIST STATUS PEKERJAAN (Update: 22 Agustus 2026)

### 🖥️ Server Monitoring (Ubuntu 22.04 — `192.168.5.10`)

| Komponen | Status | Catatan |
| :--- | :---: | :--- |
| Docker Engine | ✅ SELESAI | Sudah terinstall, container lain sudah berjalan |
| `docker-compose.yml` | ✅ SELESAI | Di `~/monitoring/docker-compose.yml` |
| `prometheus.yml` | ✅ SELESAI | Target: `192.168.11.100` (rita) |
| Container `prometheus_erp` | ✅ LIVE | Port `9090`, data scrape aktif |
| Container `grafana_erp` | ✅ LIVE | Port `3006`, login `admin/ERP_Monitor_2026!` |
| Dashboard `1860` Node Exporter | ✅ LIVE | Data riil CPU/RAM/Disk/Network rita tampil |
| Dashboard `3894` Apache | ⏸️ PENDING | Menunggu apache_exporter aktif malam ini |
| Dashboard `15033` PHP-FPM | ⏸️ PENDING | Menunggu php-fpm_exporter aktif malam ini |
| Firewall rule `192.168.11.2` | ✅ SELESAI | Router diizinkan akses port 9100/9117/9253 |

---

### 🖥️ Server Produksi ERP AlmaLinux 8 (`rita` — `192.168.11.100`)

| Komponen | Status | Catatan |
| :--- | :---: | :--- |
| Binary `node_exporter` | ✅ SELESAI | `/usr/local/bin/node_exporter` |
| Binary `apache_exporter` | ✅ SELESAI | `/usr/local/bin/apache_exporter` |
| Binary `php-fpm_exporter` | ✅ SELESAI | `/usr/local/bin/php-fpm_exporter` |
| Systemd `node_exporter.service` | ✅ SELESAI | Active running port `9100` |
| Systemd `apache_exporter.service` | ✅ SELESAI | File dibuat, **belum distart** |
| Systemd `php-fpm_exporter.service` | ✅ SELESAI | File dibuat, **belum distart** |
| `pm.status_path = /status` di www.conf | ✅ SELESAI | Baris sudah di-uncomment via nano |
| `/etc/httpd/conf.d/status.conf` | ✅ SELESAI | Sudah ada di server (terverifikasi pre-flight) |
| `apachectl graceful` | ⏸️ PENDING | **Belum dieksekusi** — tunggu off-peak |
| `systemctl reload php56-php-fpm` | ⏸️ PENDING | **Belum dieksekusi** — tunggu off-peak |
| Start `apache_exporter` | ⏸️ PENDING | Setelah graceful Apache |
| Start `php-fpm_exporter` | ⏸️ PENDING | Setelah reload PHP-FPM |

---

### 🌙 PERINTAH EKSEKUSI MALAM INI (Off-Peak — 4 Langkah Saja)

> ✅ **Pre-flight check PASSED** pada 22 Agustus 2026 pukul 16:54 WIB.
> `status.conf` sudah ada, `httpd -t` Syntax OK, `php-fpm -t` successful.
> Tinggal eksekusi 4 langkah berikut saat off-peak:

#### Langkah 1 — Graceful Reload Apache (aktifkan `/server-status`)
```bash
sudo apachectl graceful

# Verifikasi endpoint aktif:
curl -s http://127.0.0.1/server-status?auto | head -5
# Harus menampilkan metrik teks Apache
```

#### Langkah 2 — Reload PHP-FPM (aktifkan `pm.status_path`)
```bash
sudo systemctl reload php56-php-fpm

# Verifikasi socket status aktif:
curl -s --unix-socket /var/opt/remi/php56/run/php-fpm/www.sock \
  http://localhost/status 2>/dev/null | head -5
# Harus menampilkan pool status PHP-FPM
```

#### Langkah 3 — Start Kedua Exporter
```bash
sudo systemctl enable --now apache_exporter
sudo systemctl enable --now php-fpm_exporter

# Verifikasi keduanya running:
systemctl is-active apache_exporter
systemctl is-active php-fpm_exporter
```

#### Langkah 4 — Verifikasi Metrics & Import Dashboard Grafana
```bash
# Cek metrics mengalir dari exporter:
curl -s http://localhost:9117/metrics | head -3   # Apache
curl -s http://localhost:9253/metrics | head -3   # PHP-FPM
```

Buka `http://192.168.5.10:3006` → **Dashboards** → **New** → **Import**:
- ID **`3894`** → Apache Web Server Dashboard
- ID **`15033`** → PHP-FPM Dashboard
