Lingkungan produksi modern menuntut backup berjalan di dalam container. Episode ini memakai image `restic/restic` dengan volume mount, menerapkan pola sidecar di Kubernetes, dan membangun **rest-server** untuk multi-host — lengkap dengan autentikasi HTTPS dan htpasswd.

Di episode 11 kalian sudah punya ritual verifikasi. Kini saatnya menempatkan restic di lingkungan tempat ia paling dibutuhkan: server produksi dan container. Di dunia Kubernetes, backup bukan perintah manual di terminal — ia adalah container yang hidup berdampingan dengan aplikasi.
Episode ini membahas dua arah: restic sebagai client di dalam container, dan restic sebagai server (rest-server) untuk melayani banyak host.
Image resmi restic/restic menawarkan eksekusi sekali-jalan:
docker run --rm \
-e RESTIC_REPOSITORY=/data \
-e RESTIC_PASSWORD_FILE=/run/secrets/restic-pass \
-v /home/user:/data/to-backup:ro \
-v /backup/restic:/data \
-v /etc/restic:/etc/restic:ro \
restic/restic backup /data/to-backup--rm: container dibuang setelah selesai — bersih untuk cron.-v /home/user:/data/to-backup:ro: sumber data di-mount read-only./backup/restic:/data: repository lokal.printf '%s' "$RESTIC_PASS" | docker secret create restic-pass -Lalu gunakan RESTIC_PASSWORD_FILE=/run/secrets/restic-pass — praktik yang jauh lebih aman daripada -e RESTIC_PASSWORD=....
Pola paling umum: sidecar — container backup berjalan berdampingan dengan aplikasi dalam satu Pod, membackup volume yang sama:
containers:
- name: app
image: myapp:1.0
volumeMounts:
- name: data
mountPath: /var/lib/myapp
- name: restic-backup
image: restic/restic:0.19.1
command: ["sh", "-c", "while true; do restic backup /var/lib/myapp --tag app; sleep 3600; done"]
env:
- name: RESTIC_REPOSITORY
value: "s3:https://minio.ns.svc/bucket"
envFrom:
- secretRef:
name: restic-credentials
volumeMounts:
- name: data
mountPath: /var/lib/myappKedua container berbagi volume data — sidecar melihat file yang sama persis dengan aplikasi. Kelilingi ini dengan CronJob bila kalian ingin eksekusi terpisah dari Pod aplikasi:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: restic-backup
image: restic/restic:0.19.1
command: ["restic", "backup", "/var/lib/myapp", "--tag", "app-daily"]Note
Untuk stateful workload, backup di sisi storage (VolumeSnapshot) lebih tepat daripada di dalam container — snapshot yang dibahas di episode 6 berlaku untuk data aplikasi, bukan state database. Kombinasikan: VolumeSnapshot untuk restore cepat, restic untuk riwayat file dan off-site.
Ketika banyak host butuh satu titik backup terpusat tanpa memberi akses shell, bangun rest-server. Install:
go install github.com/restic/rest-server/cmd/rest-server@latest
rest-server --versionJalankan di belakang reverse proxy dengan HTTPS (misal Caddy/nginx) dan autentikasi htpasswd:
sudo mkdir -p /srv/restic
sudo htpasswd -cb /etc/restic/htpasswd backupuser 'kata-sandi-kuat'
sudo chown restic:restic /srv/restic[Unit]
Description=Restic REST Server
After=network.target
[Service]
User=restic
ExecStart=/usr/local/bin/rest-server --path /srv/restic --listen :8000 \
--htpasswd /etc/restic/htpasswd --tls --append-only
Restart=alwaysPerhatikan flag: --htpasswd untuk autentikasi user, --tls untuk TLS internal (atau terminate di proxy), dan --append-only untuk proteksi anti-ransomware (detail di episode 14).
Client lalu membackup ke URL:
restic -r rest:https://backup.example.com/repo-app \
--username backupuser --password-file /etc/restic/.restic-pass \
backup /var/wwwrestic/restic image bisa dijalankan sekali-jalan (--rm) untuk cron container.RESTIC_PASSWORD_FILE/secret.--append-only adalah dasar konfigurasi rest-server.-r rest:https://... + username/password.Di episode 13 selanjutnya kita membongkar lapisan paling rahasia: enkripsi & kunci — AES-256-CTR + Poly1305-AES sebagai bukti integritas (MAC), cara kerja master key dan repo key, manajemen kunci lewat restic key list/add/remove/passwd, serta kebijakan passphrase yang kuat.