Cara Mudah Setup PostgreSQL di Podman
Menjalankan PostgreSQL lewat container itu jauh lebih praktis dibanding install langsung di sistem: tidak ada konflik versi, gampang dihapus kalau sudah tidak dipakai, dan datanya tetap aman selama disimpan di volume. Artikel ini membahas cara menjalankan PostgreSQL pakai Podman, termasuk cara konek ke database-nya dan isu izin volume yang sering muncul di rootless Podman.
Prasyarat
- Podman sudah terinstall di sistem kamu.
- (Opsional) Client
psqldi host, kalau mau konek dari luar container. - (Opsional) File dump
.sql,.sql.gz, atau.dump, kalau kamu berencana migrasi/restore data di Langkah 6.
Langkah 1: Pull dan Jalankan Container
podman run -d \
--name postgres16 \
-e POSTGRES_PASSWORD=yourpassword \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=myuser \
-p 127.0.0.1:5432:5432 \
-v postgres16_data:/var/lib/postgresql/data \
docker.io/library/postgres:16
Penjelasan tiap opsinya:
POSTGRES_PASSWORD— password untuk user superuser (wajib diisi).POSTGRES_USER— nama superuser yang dipakai; kalau tidak diisi, defaultnyapostgres.POSTGRES_DB— nama database yang otomatis dibuat saat container pertama kali jalan; kalau tidak diisi, defaultnya sama denganPOSTGRES_USER.-v postgres16_data:/var/lib/postgresql/data— named volume, supaya data tetap aman meskipun container-nya dihapus.-p 127.0.0.1:5432:5432— membuka port PostgreSQL hanya kelocalhost:5432. Ini lebih aman dibanding-p 5432:5432polos, yang otomatis bind ke semua network interface dan bisa diakses dari luar host kalau tidak ada firewall. Kalau memang butuh diakses dari mesin lain, ganti ke-p 5432:5432dan atur firewall-nya sendiri.
💡 Ganti
yourpassworddengan password yang kuat, terutama kalau container ini akan diakses lebih dari sekadar localhost.
Langkah 2: Pastikan Container Sudah Jalan
podman ps
podman logs -f postgres16
Tunggu sampai muncul baris seperti database system is ready to accept connections di log sebelum mencoba konek — ini tandanya PostgreSQL sudah selesai inisialisasi dan siap menerima koneksi.
💡 Khusus di run pertama (saat volume masih kosong dan database baru diinisialisasi), baris ini biasanya muncul dua kali: sekali untuk server sementara yang dipakai menjalankan skrip inisialisasi, lalu sekali lagi setelah PostgreSQL restart otomatis dan jalan permanen. Kalau kamu konek persis di antara dua baris itu, biasanya akan kena connection refused sesaat — tunggu baris kedua supaya aman.
Langkah 3: Konek ke Database
Dari dalam container:
podman exec -it postgres16 psql -U myuser -d mydb
Dari host (kalau sudah punya client psql terinstall):
psql -h 127.0.0.1 -p 5432 -U myuser -d mydb
Langkah 4: Catatan untuk Rootless Podman
Kalau kamu menjalankan Podman dalam mode rootless dan container gagal start atau muncul error izin (permission denied) saat menulis ke volume, biasanya penyebabnya adalah SELinux. Tambahkan suffix :Z di mount volume-nya supaya Podman melakukan relabeling otomatis:
-v postgres16_data:/var/lib/postgresql/data:Z
💡 Flag
:Zmemberi tahu Podman bahwa volume ini hanya dipakai oleh satu container, jadi konteks SELinux-nya di-set khusus untuk itu. Kalau volume yang sama dipakai bareng oleh beberapa container, pakai:z(huruf kecil) sebagai gantinya.
Langkah 5: Mengelola Container
Beberapa perintah dasar untuk sehari-hari:
podman stop postgres16 # hentikan container
podman start postgres16 # jalankan lagi (data tetap ada)
podman rm postgres16 # hapus container (volume tetap ada)
podman volume rm postgres16_data # hapus volume juga, kalau memang mau reset data
Langkah 6: Import Dump SQL ke Database
Kalau kamu migrasi dari server lama atau restore backup, ini cara import dump ke PostgreSQL yang jalan di container. Ada dua format dump yang umum: plain SQL (.sql) dan format custom pg_dump (.dump) — cara import-nya beda, jadi disesuaikan dulu formatnya.
Opsi 1: Pipe Langsung dari Host (Dump Plain SQL)
podman exec -i postgres16 psql -U myuser -d mydb < /path/to/dump.sql
-imenjaga stdin tetap terbuka, supaya isi file bisa di-stream masuk ke container.mydbadalah database tujuan — harus sudah ada (otomatis ada kalau kamu setPOSTGRES_DBdi Langkah 1, atau buat dulu manual pakaiCREATE DATABASE).- Cara ini cukup untuk kebanyakan dump, tapi bisa lambat untuk file yang sangat besar karena semuanya lewat stdin.
Opsi 2: Copy File ke Container Dulu, Baru Import di Dalam
Lebih cocok untuk file .sql yang besar:
podman cp /path/to/dump.sql postgres16:/tmp/dump.sql
podman exec -it postgres16 psql -U myuser -d mydb -f /tmp/dump.sql
Kalau Dumpnya Format Custom pg_dump (.dump)
Dump format custom (hasil pg_dump -Fc) tidak bisa di-pipe ke psql, harus pakai pg_restore:
podman cp /path/to/dump.dump postgres16:/tmp/dump.dump
podman exec -it postgres16 pg_restore -U myuser -d mydb --no-owner /tmp/dump.dump
--no-ownersupaya restore tidak berusaha set ulang ownership object sesuai user di server asal, yang biasanya tidak ada di container barumu.- Tambahkan
-j 4(atau sesuai jumlah core) untuk restore paralel kalau dump-nya besar.
Beberapa Tips Praktis
- Password di command line:
psqltidak menerima password lewat flag seperti MariaDB, tapi tetap ada jejaknya kalau dipasang lewat environment variablePGPASSWORDdi command yang sama (psbisa melihatnya sesaat). Untuk penggunaan interaktif, biarkanpsqlmenanyakan password lewat prompt. Untuk script otomatis, lebih aman pakai file.pgpassyang di-mount ke container daripadaPGPASSWORD. - File besar: pantau progresnya pakai
pv:pv /path/to/dump.sql | podman exec -i postgres16 psql -U myuser -d mydb - Dump terkompresi (
.sql.gz):gunzip -c /path/to/dump.sql.gz | podman exec -i postgres16 psql -U myuser -d mydb
Langkah Selanjutnya
Setup manual seperti di atas sudah cukup untuk development sehari-hari. Kalau kamu butuh PostgreSQL yang otomatis jalan setiap kali sistem boot — misalnya untuk kebutuhan server — pertimbangkan untuk memindahkan konfigurasi ini ke podman-compose atau Quadlet file, supaya lifecycle container-nya dikelola oleh systemd.