# Podman Quadlets: Ganti Docker Compose dengan systemd

> Bagaimana saya memindahkan server self-hosted dari Docker Compose ke Podman Quadlets — kontainer rootless yang dideskripsikan sebagai unit systemd asli, dengan auto-restart, log journald, dan auto-update bawaan.

URL: https://www.matthewswong.com/id/blog/podman-quadlets-replace-docker-compose/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2026-08-01
- Updated: 2026-08-01
- Category: DevOps

> **Key takeaway:** Podman Quadlets memungkinkan Anda mendeskripsikan kontainer sebagai unit systemd asli. Anda menulis file .container biasa, lalu podman-system-generator mengubahnya menjadi service yang dikelola langsung oleh systemd. Hasilnya kontainer rootless, auto-restart, urutan boot, log journald, dan auto-update registry bawaan tanpa daemon Docker atau tool Compose terpisah.

Saya menjalankan server pribadi dengan Docker Compose selama bertahun-tahun. Itu berfungsi, tetapi selalu terasa seperti init system kedua yang ditempelkan di atas yang pertama: daemon Docker berjalan sebagai root, kontainer restart karena sebuah string policy menyuruh daemon, dan log tersimpan dalam file JSON yang hanya bisa dibaca oleh CLI docker. Saat mesin reboot, systemd menjalankan daemon Docker, lalu daemon menjalankan kontainer saya. Dua supervisor untuk satu pekerjaan.

Podman Quadlets meruntuhkan tumpukan itu. Alih-alih docker-compose.yml yang ditafsirkan oleh daemon yang berjalan terus-menerus, Anda menulis file unit deklaratif yang dimengerti langsung oleh systemd. Tidak ada daemon, kontainer bisa berjalan sepenuhnya rootless, dan setiap fitur yang sudah dimiliki systemd untuk service biasa juga berlaku untuk kontainer. Beginilah cara saya menjalankan semuanya di VPS sekarang, dan saya tidak pernah merindukan Compose sekali pun.

## Apa itu Quadlet sebenarnya

Quadlet adalah file kecil bergaya INI yang mendeskripsikan kontainer sebagaimana unit systemd mendeskripsikan sebuah service. Podman menyertakan generator bernama podman-system-generator yang berjalan di awal urutan boot, memindai sekumpulan direktori, dan menerjemahkan setiap Quadlet menjadi unit .service asli secara otomatis. Anda tidak pernah menulis file service yang rumit dengan tangan, dan tidak pernah menyimpan file hasil generate ke disk — generator membuatnya ulang setiap kali daemon-reload.

Quadlet menangani lebih dari sekadar kontainer tunggal. Selain file .container ada file .network, .volume, dan .pod untuk network, named volume, dan pod yang dibutuhkan aplikasi Anda, ditambah .kube, .image, .build, dan .artifact untuk kasus yang lebih lanjut. Karena rilis Podman yang lebih baru menyertakan generator yang lebih baik, service Anda diam-diam menerima perbaikannya saat daemon-reload berikutnya berjalan — deskripsi tetap sama sementara mekanisme di baliknya menjadi lebih baik.

## File unit .container yang nyata

Berikut Quadlet yang berfungsi untuk blog Ghost, ditaruh di direktori pengguna rootless. Bentuknya hampir seperti bagian environment sebuah file Compose, tetapi setiap seksinya memetakan langsung ke konsep systemd yang mungkin sudah Anda kenal: Unit untuk urutan dan dependensi, Container untuk opsi khusus Podman, Service untuk restart policy, dan Install untuk apa yang mengaktifkan unit saat boot.

Simpan file itu, lalu biarkan systemd menemukannya. Sebuah daemon-reload memicu generator, dan setelah itu kontainer menjadi service biasa yang Anda start, stop, enable, dan periksa dengan perintah yang sama seperti apa pun yang dijalankan systemd. Nama service adalah nama file dengan ekstensi diganti, jadi ghost.container menjadi ghost.service.

> Quadlet rootless untuk seorang pengguna diletakkan di direktori yang ada di bagian atas sampel, yang memetakan ke XDG_CONFIG_HOME di dalam containers dan systemd. Unit rootful sistem-wide berada di bawah etc, containers, systemd. Letakkan file di tempat yang benar lebih dulu — generator hanya memindai sekumpulan search path tetap, jadi unit di direktori yang salah akan diabaikan tanpa peringatan.

## Rootless, restart, urutan boot, dan journald

Alasan terbesar saya berpindah adalah rootless. Sebuah Quadlet di direktori pengguna Anda berjalan sebagai pengguna tanpa hak istimewa, tanpa daemon dan tanpa root, sehingga sebuah container breakout mendarat di dalam akun pengguna biasa alih-alih di host sebagai root. Semua hal lain mengikuti karena kontainer menjadi unit systemd kelas satu, bukan proses yang dikelola daemon.

Karena kontainer adalah unit sungguhan, tool yang sudah Anda percaya langsung bekerja, dan tidak ada hal khusus kontainer yang perlu dipelajari:

- Auto-restart cukup Restart=always di seksi Service — direktif yang sama dipakai setiap service systemd lain, bukan string policy khusus.
- Urutan boot memakai After= dan Wants= di seksi Unit, sehingga Quadlet database bisa mulai sebelum aplikasi yang bergantung padanya.
- Log mengalir ke journald, jadi journalctl --user -u ghost.service menampilkan output kontainer berdampingan dengan log service lain, dengan filter dan rotasi yang sama.
- WantedBy=default.target di seksi Install membuat kontainer rootless mulai bersama sesi pengguna Anda, sehingga ia kembali setelah reboot.

> Service rootless berhenti saat pengguna logout kecuali lingering diaktifkan. Jalankan loginctl enable-linger untuk akun tersebut, atau kontainer Anda akan mati begitu sesi SSH ditutup dan tidak akan pernah bertahan melewati reboot. Ini satu jebakan yang menjerat semua orang yang memindahkan beban kerja self-hosted ke Podman rootless — aktifkan linger sebelum Anda mengandalkannya.

## Auto-update tanpa pipeline CI

Setel AutoUpdate=registry di seksi Container, seperti pada sampel, dan Podman bisa memperbarui kontainer untuk Anda. Timer podman-auto-update.timer berjalan setiap hari tengah malam, memeriksa registry untuk image lebih baru di balik setiap label auto-update, menariknya, lalu me-restart unit. Ini hanya berfungsi dengan referensi image yang fully qualified, karena Podman butuh nama pasti untuk memeriksa ulang — sebuah tag polos atau image ID tidak memberinya pembanding.

Jaring pengamannya adalah rollback. Jika unit gagal restart dengan bersih setelah pembaruan, Podman kembali ke image sebelumnya dan me-restart service lagi, sehingga rilis buruk tidak meninggalkan Anda dengan kontainer mati di tengah malam. Ada juga AutoUpdate=local untuk image yang Anda build sendiri di host, di mana Podman membandingkan kontainer dengan penyimpanan image lokal Anda alih-alih registry jarak jauh.

## Quadlet versus Docker Compose, berdampingan

Compose dan Quadlet memecahkan masalah yang tumpang tindih, tetapi keduanya berada di lapisan berbeda. Compose adalah tool yang berbicara ke daemon; Quadlet adalah deskripsi yang dikonsumsi langsung oleh systemd. Tabel ini adalah perbandingan yang saya harap saya miliki saat memulai migrasi.

| Aspek | Docker Compose | Podman Quadlet |
| --- | --- | --- |
| Model proses | Daemon Docker berjalan terus, biasanya root | Tanpa daemon; rootless, dijalankan langsung systemd |
| Format definisi | Satu docker-compose.yml dalam YAML | File unit .container, .network, .volume terpisah |
| Pengelola siklus hidup | CLI compose membungkus daemon | systemd mengelola service hasil generate secara asli |
| Restart saat boot | restart policy plus daemon yang harus mulai dulu | WantedBy=default.target plus lingering pengguna |
| Log | docker logs membaca file JSON per kontainer | journald, dikueri dengan journalctl seperti service lain |
| Auto-update | Tool eksternal seperti Watchtower | AutoUpdate=registry bawaan plus timer harian |
| Urutan dependensi | depends_on di dalam file compose | After= dan Requires= dari systemd |

Quadlet bukan pengganti langsung untuk setiap alur kerja Compose — tidak ada satu perintah up yang membaca seluruh proyek, dan aplikasi multi-kontainer menjadi beberapa file unit alih-alih satu dokumen. Tetapi untuk server self-hosted yang seharusnya boot, restart, log, dan update seperti bagian sistem operasi lainnya, menjalankan kontainer sebagai unit systemd adalah model yang lebih bersih. Mulailah dengan memindahkan satu service, buktikan jalur reboot dan auto-update, lalu pindahkan sisanya.

## Sources

- podman-systemd.unit — referensi file unit Quadlet (dokumentasi resmi Podman)
- podman-auto-update — pembaruan image otomatis dan rollback (dokumentasi resmi Podman)
- Make systemd better for Podman with Quadlet (Red Hat, oleh Dan Walsh)

## Source links

- https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html
- https://docs.podman.io/en/latest/markdown/podman-auto-update.1.html
- https://www.redhat.com/en/blog/quadlet-podman

## FAQ

### Apa itu Podman Quadlet?

Quadlet adalah file unit bergaya INI (.container, .network, .volume, .pod, dan lainnya) yang mendeskripsikan kontainer kepada systemd. podman-system-generator berjalan saat boot, memindai direktori Quadlet, dan menghasilkan unit .service asli dari setiap file. Anda mengelola kontainer dengan perintah systemctl biasa, bukan CLI khusus kontainer.

### Di mana file Podman Quadlet diletakkan?

Unit rootless pengguna diletakkan di folder containers/systemd di bawah XDG_CONFIG_HOME, sedangkan unit rootful sistem-wide di /etc/containers/systemd/. Generator hanya memindai sekumpulan search path tetap, jadi unit di direktori yang salah diabaikan tanpa peringatan. Setelah menambahkan file, jalankan systemctl daemon-reload agar generator membacanya.

### Bisakah Podman Quadlets menggantikan Docker Compose?

Untuk server self-hosted, bisa. Quadlet memberi kontainer rootless, auto-restart, urutan boot, log journald, dan auto-update bawaan tanpa daemon Docker. Komprominya adalah tidak ada satu perintah up yang membaca seluruh proyek, jadi aplikasi multi-kontainer menjadi beberapa file unit alih-alih satu dokumen docker-compose.yml.

### Bagaimana auto-update Podman bekerja dengan Quadlets?

Setel AutoUpdate ke registry di seksi Container. Timer podman-auto-update.timer berjalan setiap hari tengah malam, memeriksa registry untuk image lebih baru, menariknya, lalu me-restart unit. Ini membutuhkan referensi image yang fully qualified. Jika unit gagal restart setelah pembaruan, Podman otomatis rollback ke image sebelumnya.

### Mengapa kontainer Quadlet rootless berhenti setelah logout?

Service systemd rootless terikat pada sesi pengguna dan berhenti saat Anda logout kecuali lingering diaktifkan. Jalankan loginctl enable-linger untuk akun tersebut agar kontainer tetap berjalan setelah sesi SSH ditutup dan menyala lagi setelah reboot. Dikombinasikan dengan WantedBy diset ke default.target, kontainer berperilaku seperti service sistem biasa.

---

- HTML version: https://www.matthewswong.com/id/blog/podman-quadlets-replace-docker-compose/
- English: https://www.matthewswong.com/en/blog/podman-quadlets-replace-docker-compose/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
