85 lines
3.1 KiB
Markdown
85 lines
3.1 KiB
Markdown
---
|
|
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
|
|
```
|