# Deploy LPK TIP ke AlmaLinux dengan Docker

Panduan build & deploy aplikasi **LPK TIP** (Laravel + Livewire) ke server **AlmaLinux 9** menggunakan Docker & Docker Compose.

---

## 1. Prasyarat Server

- AlmaLinux 9 (x86_64), minimal 2 vCPU / 4 GB RAM / 20 GB disk
- Domain (mis. `trocon-lpk.aplikasigo.com`) diarahkan ke IP server (DNS A record)
- Firewall aktif (`firewalld`)

---

## 2. Install Docker & Docker Compose

```bash
# Install paket docker
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Jalankan & aktifkan
sudo systemctl enable --now docker

# Tambah user ke group docker (log out/login ulang setelahnya)
sudo usermod -aG docker $USER
newgrp docker
```

Verifikasi:
```bash
docker --version
docker compose version
```

---

## 3. Salin Source Aplikasi

```bash
# Clone dari GitLab (atau rsync dari mesin dev)
cd /opt
sudo git clone https://gitlab.com/husnimubarok/lpk-2026.git lpk
cd lpk/lpk-laravel
```

> Pastikan `.dockerignore` ikut (mengabaikan `node_modules`, `vendor`, `.env`).

---

## 4. Konfigurasi `.env` (Docker)

```bash
cp .env.example .env
# atau salin env produksi dari repo
cp env.production.example .env
```

Sesuaikan untuk Docker:

```env
APP_NAME="LPK TIP"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://trocon-lpk.aplikasigo.com

DB_CONNECTION=mysql
DB_HOST=db            # nama service compose (bukan 127.0.0.1)
DB_PORT=3306
DB_DATABASE=lpk
DB_USERNAME=lpk
DB_PASSWORD=GANTI_PASSWORD_KUAT
DB_ROOT_PASSWORD=GANTI_ROOT_PASSWORD

APP_TIMEZONE=Asia/Jakarta
APK_LINK=https://drive.google.com/...   # opsional

# Face service (opsional — aktifkan bila face-service di-deploy)
FACE_SERVICE_URL=http://127.0.0.1:8001

# Mail (SMTP)
MAIL_MAILER=smtp
MAIL_HOST=mail.wiyaga.com
MAIL_PORT=465
MAIL_USERNAME=trocon-noreply@wiyaga.com
MAIL_PASSWORD=GANTI
MAIL_FROM_ADDRESS=trocon-noreply@wiyaga.com
MAIL_FROM_NAME="LPK TIP"
MAIL_ENCRYPTION=ssl
```

> DB password di `.env` harus sama dengan yang dipakai di `docker-compose.yml` (env diambil dari `.env`).

---

## 5. Build & Jalankan

```bash
cd /opt/lpk/lpk-laravel
docker compose up -d --build
```

Perintah ini:
1. Build image `lpk-app` (PHP 8.3 + Composer + Node → `composer install`, `npm run build`, `storage:link`)
2. Jalankan **Nginx** (port `8080`), **MariaDB** (volume `db_data`), **PHP-FPM**
3. Entrypoint otomatis: `config:cache`, `route:cache`, `view:cache`, `migrate --force`, `storage:link`

Cek status:
```bash
docker compose ps
docker compose logs -f lpk-app   # lihat log migrasi/optimasi
```

Uji lokal:
```bash
curl -I http://127.0.0.1:8080/login   # harap 200
```

---

## 6. Reverse Proxy + SSL (Nginx host)

Install Nginx + Certbot:

```bash
sudo dnf install -y nginx certbot python3-certbot-nginx
```

Buat `/etc/nginx/conf.d/trocon-lpk.conf`:

```nginx
server {
    listen 80;
    server_name trocon-lpk.aplikasigo.com;
    client_max_body_size 20M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

```bash
sudo systemctl enable --now nginx
sudo certbot --nginx -d trocon-lpk.aplikasigo.com
sudo systemctl reload nginx
```

Firewall:

```bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
```

> Port `8080` cukup dibuka untuk localhost saja (reverse proxy), tidak perlu dibuka publik.

---

## 7. Migrasi Data dari cPanel (opsional)

Jika sudah punya DB di cPanel:

```bash
# 1) Backup di cPanel (phpMyAdmin / mysqldump)
mysqldump -h aplikasigo.com -u nusatekm_trocon_lpk -p'Super@123!!' nusatekm_trocon_lpk > lpk_full.sql

# 2) Import ke container DB
docker cp lpk_full.sql lpk-db:/tmp/lpk_full.sql
docker compose exec db sh -c 'exec mariadb -ulpk -p"$MARIADB_PASSWORD" lpk < /tmp/lpk_full.sql'

# 3) Jalankan migrasi kolom baru & seed shifts
docker compose exec lpk-app php artisan migrate --force
docker compose exec lpk-app php artisan lpk:seed-shifts
```

---

## 8. Backup Rutin (cron)

```bash
# /etc/cron.d/lpk-backup
0 3 * * * root docker exec lpk-db sh -c 'exec mariadb-dump -ulpk -p"$MARIADB_PASSWORD" lpk' | gzip > /var/backups/lpk-$(date +\%F).sql.gz
```

Restore:
```bash
gunzip -c /var/backups/lpk-2026-09-01.sql.gz | docker exec -i lpk-db sh -c 'exec mariadb -ulpk -p"$MARIADB_PASSWORD" lpk'
```

---

## 9. Face Service (opsional, VPS terpisah / container)

Edit `docker-compose.yml` — aktifkan service `face-service` (Python + FastAPI, port 8001):

```yaml
face-service:
  build: ./face_service
  container_name: lpk-face
  restart: unless-stopped
  ports:
    - "8001:8001"
  networks: [lpk-net]
```

```bash
docker compose up -d --build face-service
curl http://127.0.0.1:8001/health   # {status:"ok"}
```

Set `FACE_SERVICE_URL=http://127.0.0.1:8001` di `.env` → verifikasi wajah aktif.

---

## 10. Update Aplikasi (deploy versi baru)

```bash
cd /opt/lpk/lpk-laravel
git pull
docker compose up -d --build lpk-app   # rebuild image
docker compose exec lpk-app php artisan migrate --force
```

---

## 11. Troubleshooting

| Masalah | Solusi |
|---|---|
| `Connection refused` DB saat migrate | pastikan `DB_HOST=db` di `.env`, `docker compose ps` menunjukkan db Up |
| Error permission storage | `docker compose exec lpk-app chown -R www-data:www-data storage` |
| Halaman 419 (CSRF) | pastikan `APP_URL` benar & `php artisan key:generate` jika baru |
| Port 8080 tidak bisa diakses publik | memang tertutup — gunakan Nginx host |
| Vite/build tidak muncul | `npm run build` gagal? cek `docker compose logs lpk-app`; rebuild tanpa cache: `docker compose build --no-cache lpk-app` |
| Cache lama | `docker compose exec lpk-app php artisan optimize:clear` |
| Migrasi duplikat | jangan jalankan `migrate` dua kali tanpa `--pretend`; tabel `migrations` mencatat |

---

## 12. Arsitektur

```
Internet ──> Nginx host (443, SSL/certbot)
                 │
                 ▼
          lpk-nginx:8080  (container)
                 │ proxy → lpk-app:9000 (PHP-FPM 8.3)
                 │
        ┌────────┴─────────┐
        │   lpk-app        │
        │  (Laravel +      │
        │   public/build)  │
        └────────┬─────────┘
                 │ DB_HOST=db
                 ▼
            lpk-db (MariaDB 10.11, volume db_data)
```
