--- title: Permission Content & Assets (Rootless Podman) order: 16 category: deployment --- # Permission `content/` & `assets/` — Rootless Podman `keep-id` **Tanggal:** 2026-10-26 **Status:** Aktif **Lokasi kode:** `podman-compose.yml`, `cli/commands.py`, `cli/runner.py` --- ## 1. Masalah Pada Podman rootless, container berjalan di *user namespace* sendiri. Secara default uid 1000 di dalam container (`app`) dipetakan ke **subuid host** (mis. `100999`, tergantung isi `/etc/subuid`), bukan ke user yang menjalankan Podman (`a2nr`, uid 1000). Akibatnya dua arah sama-sama rusak: | Arah | Gejala | |------|--------| | Container → host | File hasil publish/upload/create dimiliki host `100999`; user `a2nr` tidak bisa menghapus/mengubahnya dari file manager tanpa sudo. | | Host → container | File hasil `./elemes.sh init` (milik host `1000`) tampak sebagai **root** di container; proses `app` tidak bisa menulis → editor konten gagal (403). | Tidak ada mekanisme penyelarasan permission di repo sebelum perbaikan ini. ## 2. Solusi: `userns_mode: keep-id` Service `elemes` di `podman-compose.yml` kini memakai: ```yaml elemes: userns_mode: keep-id ``` Dengan `keep-id`, uid container 1000 (`app`) dipetakan **1:1** ke host uid 1000 (user yang menjalankan compose). File yang dibuat backend otomatis dimiliki user host, dan file milik user host bisa ditulis `app`. > ⚠️ `keep-id` hanya untuk Podman rootless di Linux. Docker Desktop sudah > memetakan user secara otomatis; opsi ini tidak diperlukan (dan tidak > dikenali Docker Compose klasik). ## 3. Perbaikan deployment lama: `./elemes.sh fixperms` File yang terlanjur dimiliki subuid (`100999`) tidak berubah otomatis hanya karena compose diubah. Perbaiki sekali dengan: ```bash cd elemes ./elemes.sh fixperms ``` Perintah ini menjalankan: ```bash podman unshare chown -R 0:0 ../content ../assets ``` Di namespace default `podman unshare`, uid 0 = user host. Jadi seluruh isi `content/` dan `assets/` kembali dimiliki `a2nr` dan tetap terbaca sebagai uid 1000 (`app`) di container `keep-id`. Perintah bersifat **idempotent**: jika semua file sudah dimiliki user host, tidak ada `chown` yang dijalankan. `./elemes.sh run`, `runbuild`, dan `runclearbuild` juga memanggil pemeriksaan yang sama secara otomatis sebelum `up -d`. ## 4. Troubleshooting | Gejala | Penyebab | Tindakan | |--------|----------|----------| | Tidak bisa hapus file di `content/`/`assets/` dari file manager | File lama dimiliki subuid `100999` | `./elemes.sh fixperms`, lalu cek `ls -ln` | | Editor konten 403 / "Permission denied" saat simpan | Container tidak memakai `keep-id`, atau file milik root host | Pastikan `userns_mode: keep-id` aktif, jalankan ulang `./elemes.sh runbuild` | | `fixperms` bilang "Docker Desktop sudah memetakan user" | Runtime terdeteksi Docker, bukan Podman | Tidak ada tindakan — permission Docker Desktop sudah benar | | `podman unshare` gagal | Podman rootless belum dikonfigurasi / dijalankan sebagai root | Jalankan sebagai user biasa; cek `/etc/subuid` dan `/etc/subgid` | Verifikasi cepat: ```bash ls -ln ../content ../assets | head # owner harus uid user Anda (mis. 1000), bukan 100999 ```