# Lucky Spin security deployment

Gunakan PHP 8.3+, Composer, Bun, Nginx, database user dengan hak minimum, dan user Linux terpisah:

- `www-data` menjalankan PHP-FPM dan hanya boleh menulis `storage/` serta `bootstrap/cache/`.
- `deploy` memiliki checkout Git dan menjalankan `bin/secure-update`; jangan gunakan `root`.
- Remote Git untuk production sebaiknya memakai deploy key read-only.

Salin contoh Nginx dan PHP-FPM dari folder `deploy/`, lalu isi `.env` dari `deploy/production.env.example`. Jangan pernah commit `.env` production.

## Tombol update manual

1. Pasang unit `.path` dan `.service` dari `deploy/systemd/` ke `/etc/systemd/system/` dan sesuaikan path/domain.
2. Pastikan direktori `storage/app/private/deployments` dapat ditulis oleh grup `www-data` dan dibaca user `deploy`.
3. Jalankan `systemctl daemon-reload` lalu `systemctl enable --now lucky-spin-secure-update.path`.
4. Aktifkan `DEPLOYMENT_MANUAL_UPDATE_ENABLED=true` dan isi `DEPLOYMENT_ALLOWED_EMAILS` dengan email super-admin yang diizinkan.

Tombol Filament hanya membuat marker privat. Shell, Git, Composer, dan build frontend dijalankan oleh systemd sebagai user non-root. Updater menolak working tree kotor, remote/branch invalid, riwayat non-fast-forward, serta dependency PHP/JavaScript yang memiliki advisory. Untuk repository dengan signed commit, set `APP_DEPLOY_REQUIRE_SIGNATURE=1` pada unit systemd.

## Setelah deployment pertama

Jalankan `php artisan migrate --force`, `php artisan optimize`, dan `php artisan shield:generate --all`. Aktifkan 2FA saat login pertama. Akun bawaan `admin@admin.com` dengan password `password` sengaja ditolak; buat admin aman dengan `ADMIN_EMAIL` dan `ADMIN_PASSWORD` lalu jalankan `php artisan db:seed --class=UserSeeder --force`.
