elemes/docs/16-permissions-rootless-pod...

85 lines
3.1 KiB
Markdown
Raw Normal View History

---
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
```