# Keamanan, backup, dan operasi

## Yang sudah diterapkan

- Container app dijalankan dengan UID/GID **10001**, tanpa Linux capabilities tambahan.
- App hanya dapat dijangkau via reverse proxy Caddy (Compose default tidak mempublikasikan port 8000).
- Login satu password workspace, session cookie Secure+HttpOnly+SameSite=Lax, session HMAC.
- APP_ENV=production, session secret unik, validasi Host/Origin, docs FastAPI tidak dipublikasikan.
- Caddy HTTPS otomatis dan security headers dasar. Data disimpan di folder server `./data`, tidak di `public_html`.
- Build Docker tidak menyalin `.env`, `data/`, dan `backups/`.

## Tanggung jawab admin

1. Jangan bagikan isi `.env`, password workspace, atau SSH key.
2. Gunakan password VPS/SSH dan firewall yang kuat. Pertimbangkan SSH key, pembatasan IP admin dan 2FA pada panel provider.
3. Batasi akses dashboard hanya untuk tim tepercaya: versi ini **single-operator**, bukan SaaS publik dengan akun per pengguna.
4. Monitor biaya OpenAI API; tidak ada limit pengeluaran built-in. Batasi budget dari sisi provider.
5. Jalankan update OS, Docker, paket aplikasi, dan backup rutin. Uji restore backup pada VPS terpisah.
6. Jangan menghapus `data/` saat update. File `.env` jangan dibagikan lewat pesan publik.

## Backup

```bash
sudo bash scripts/backup.sh
```

Script akan menghentikan **hanya container studio** sebentar, menyalin database SQLite dan media ke file `.tar.gz` dalam `backups/`, lalu menghidupkan container lagi. Caddy akan tetap hidup, namun request aplikasi dapat gagal sementara. Backup `.env` harus disimpan aman secara terpisah.

Lihat daftar backup:

```bash
ls -lh backups/
sha256sum -c backups/studio-data-YYYYMMDDTHHMMSSZ.tar.gz.sha256
```

## Restore manual pada VPS baru (sangat hati-hati)

1. Siapkan source code, `.env` yang aman, dan Caddy di VPS baru.
2. **Hentikan** aplikasi: `sudo docker compose -f compose.yaml stop studio`.
3. Backup/copy folder `data/` saat ini bila ada.
4. Inspect nama file archive, lalu restore di **folder proyek**: `sudo tar -xzf backup-anda.tar.gz` (archive berisi folder `data/`).
5. `sudo chown -R 10001:10001 data`.
6. `sudo docker compose -f compose.yaml start studio`.
7. Periksa `/api/health`, login, galeri, dan unduh hasil.

Hati-hati jika database backup berasal dari versi skema aplikasi yang berbeda. Tidak tersedia mekanisme migrasi penuh atau disaster recovery otomatis pada MVP ini.
