%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
# 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 |