Episode ini membawa pgBackRest ke ekosistem modern: pola sidecar pgBackRest di Kubernetes lewat operator CloudNativePG, Docker image dengan config mount, serta backup ke S3/GCS/Azure Blob dengan IAM role atau static key. Backup kini menjadi bagian dari platform, bukan server terpencil.

Semakin banyak database PostgreSQL berjalan di dalam container dan Kubernetes — dan backup tidak boleh ketinggalan. Di episode 20 kita membawa pgBackRest ke dunia modern: pola sidecar di Kubernetes lewat operator CloudNativePG, Docker image dengan config yang di-mount, serta integrasi object storage cloud (S3/GCS/Azure Blob) dengan kredensial yang dikelola cloud-native (IAM role vs static key).
Prinsipnya tidak berubah dari 19 episode sebelumnya: stanza, check, backup, restore, retention. Yang berubah adalah cara binary dijalankan dan cara kredensial diberikan. Pahami keduanya, dan pgBackRest di container sama andalnya dengan di bare metal.
Pendekatan paling sederhana: jalankan pgBackRest dalam container yang image-nya sudah memiliki binary, lalu mount config dan repository:
FROM debian:bookworm-slim
RUN apt-get update \
&& apt-get install -y pgbackrest postgresql-client \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["pgbackrest"]Jalankan dengan volume:
docker run --rm \
-v /etc/pgbackrest.conf:/etc/pgbackrest.conf:ro \
-v /var/lib/pgbackrest:/var/lib/pgbackrest \
pgbackrest:2.59.0 --stanza=main backup --type=fullKunci kesuksesannya adalah volume: config dibaca hanya-baca, repository di-persist. Container itu sendiri bisa dihancurkan kapan saja — data backup aman di volume.
Note
Jika backup berjalan dalam container yang terpisah dari PostgreSQL (bukan satu pod), ingat pg1-host/pg1-path bisa mengarah ke host atau pod database — konsep remote (episode 12) berlaku penuh. Pastikan network antar container tersambung.
Operator CloudNativePG (CNPG) menjadikan pgBackRest bagian tak terpisahkan dari cluster PostgreSQL di Kubernetes: ia membuat stanza, menjadwalkan backup, mengelola WAL archiving, dan menangani restore — semua lewat resource Kubernetes. Kalian tidak lagi menulis pgbackrest backup manual; kalian mendeklarasikan inginnya, operator yang mengerjakan.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: aplikasi-db
spec:
instances: 3
storage:
size: 100Gi
backup:
barmanObjectStore:
destinationPath: s3://cnpg-backup-prod
s3Credentials:
accessKeyId:
name: s3-credentials
key: accessKeyId
secretAccessKey:
name: s3-credentials
key: secretAccessKey
retentionPolicy: "30d"
walStorage:
size: 20GidestinationPath — URL object storage (S3, GCS, Azure).s3Credentials — referensi ke Secret Kubernetes berisi kredensial.retentionPolicy — kebijakan retention dalam durasi (misal 30d).Setiap cluster yang dideklarasikan seperti ini otomatis: stanza dibuat, WAL diarsipkan, backup full terjadwal, dan restore tersedia lewat resource Backup.
Restore dilakukan dengan mendeklarasikan resource Backup — operator menjalankan pgBackRest di balik layar:
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
name: restore-20260813
spec:
cluster:
name: aplikasi-dbPoin penting untuk kalian: apa pun yang dipelajari di 19 episode ini (stanza, WAL, retention, PITR) tetap konsep yang sama di CNPG — operator hanya mengotomatiskan eksekusinya. Mengetahui pgBackRest secara langsung membuat debugging CNPG jauh lebih mudah.
Tip
Dalam pola sidecar CNPG, pgBackRest berjalan sebagai kontainer di pod yang sama dengan database — konsep pg1-host dan repo1-host jadi tidak relevan karena keduanya "lokal" dari sudut pandang pod. Inilah alasan memahami keduanya (episode 12) penting: arsitektur yang sama, cara pandang yang berbeda.
Sudah dibahas di episode 12: repo1-type=s3 mendukung AWS S3 dan semua penyimpanan S3-compatible. Untuk GCS dan Azure Blob, pgBackRest punya tipe tersendiri:
[global]
# GCS
repo1-type = gcs
repo1-gcs-bucket = db-backup-gcs
repo1-gcs-key = /etc/pgbackrest/gcs-key.json
repo1-gcs-endpoint = storage.googleapis.com[global]
# Azure Blob
repo1-type = azure
repo1-azure-account = backupaccount
repo1-azure-container = db-backup
repo1-azure-key = <storage-account-key>Ketiganya memakai konsep yang sama: endpoint, bucket/container, dan kredensial. Setelah config benar, semua perintah (stanza-create, check, backup) identik.
Dua cara memberi kredensial cloud — dan keduanya punya trade-off:
| Static Key | IAM Role / Workload Identity | |
|---|---|---|
| Pengaturan | Key + secret di config | Role dilekatkan ke host/instance |
| Rotasi | Manual, rawan bocor | Otomatis oleh penyedia cloud |
| Sifat | Statis di config file | Dinamis, scoped per resource |
| Cocok untuk | MinIO, lab, eksperimen | Production di cloud |
Untuk instance di cloud, IAM role (AWS), Workload Identity (GCP), atau Managed Identity (Azure) adalah praktik terbaik: kredensial tidak pernah ditulis ke config, dan permission bisa dipersempit (hanya akses bucket tertentu). pgBackRest mendukung repo1-s3-role untuk mengambil kredensial dari role:
[global]
repo1-type = s3
repo1-s3-bucket = db-backup-prod
repo1-s3-endpoint = s3.ap-southeast-1.amazonaws.com
repo1-s3-region = ap-southeast-1
repo1-s3-role = arn:aws:iam::123456789012:role/pgbackrest-backup-roleWarning
Static key di config adalah secret kelas satu — jangan commit ke git, jangan biarkan permission terbuka (episode 11). Untuk production cloud, mulai dengan IAM role/Workload Identity sedini mungkin; memigrasikan config yang sudah tersebar jauh lebih menyakitkan daripada memulainya dengan benar.
Setelah episode 20, pgBackRest kalian bisa hidup di tiga dunia sekaligus: bare metal (episode 3-19), container Docker, dan Kubernetes via CNPG — dengan tujuan backup yang sama (S3/GCS/Azure). Ini bukan tiga sistem berbeda; ini satu sistem dengan tiga rumah. Bekal yang sama, konfigurasi yang sama, debugging yang sama.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita akan melihat ke depan: roadmap & community — arah pengembangan pgBackRest yang fokus pada reliability dan object storage, dokumentasi user guide yang lengkap, serta bagaimana bergabung dengan komunitas di GitHub, Slack, dan mailing list. Tool yang kalian pakai bukan artefak beku — ia hidup bersama komunitas!