$ aoox

DocsStack & database

Backup & restore

Backup managed database dan volume aplikasi: manual atau terjadwal, retensi otomatis, salinan ke S3, dan restore.

Apa
Database, volume aplikasi, dan panel sendiri
Kapan
Manual, atau cron dengan retensi
Di mana
Volume aoox_backups + S3 opsional

Alur satu backup

  1. 01dumpcontainer sekali-jalan dari image engine, kredensial via env
  2. 02simpanfile di volume aoox_backups
  3. 03unggahrclone ke S3 bila tujuan dipilih
  4. 04prunebackup terjadwal tertua > retensi dihapus (lokal + S3)

File tidak pernah lewat proses API — dump, unggah, dan restore semuanya dilakukan container sekali-jalan. Backup manual tidak pernah dipangkas oleh retensi; hanya yang terjadwal.

Backup database

Halaman database → tab Backup.

EngineCara dumpRestore
PostgreSQLpg_dump | gzip (atau pg_dumpall untuk semua database)Online — stream ke psql, tanpa downtime.
MySQL / MariaDBmysqldump / mariadb-dump sebagai rootOnline — stream ke mysql.
Redisredis-cli --rdbOffline — container di-stop, snapshot dipasang sebagai base AOF, lalu di-start lagi.

Backup manual

Klik Backup. Baris baru muncul dengan status, ukuran, waktu, pemicu (manual/terjadwal), penanda S3 bila tersalin (atau hanya di S3 bila file lokal sudah tidak ada), dan tombol unduh / restore / hapus.

Jadwal & tujuan

  1. Form Jadwal & tujuan backup

    FrekuensiCron
    Nonaktif—
    Setiap jam0 * * * *
    Setiap hari 02:000 2 * * *
    Setiap minggu (Minggu 03:00)0 3 * * 0
    Kustomcron 5 kolom, mis. 30 1 * * *
    • Jumlah simpan — default 7; backup terjadwal tertua di luar jumlah ini dihapus setelah backup berikutnya.
    • Tujuan S3 — Hanya lokal atau salah satu tujuan yang terdaftar (lihat bawah).
    • Semua database di server — untuk PostgreSQL/MySQL/MariaDB dengan database tambahan: dump mencakup semuanya (PostgreSQL memakai pg_dumpall, termasuk role). Baris backup ditandai semua database.
  2. Simpan

    Jadwal langsung didaftarkan ulang tanpa restart API. Cron memakai zona waktu API: UTC kecuali TZ diisi di .env.dist; form menampilkan zona yang dipakai.

Restore

  1. Klik restore pada baris backup → konfirmasi

    Bila file lokalnya sudah tidak ada (dipangkas retensi, disk baru) tapi salinan S3 masih ada, baris ditandai hanya di S3 — restore dan unduh tetap bisa: file ditarik kembali dari S3 otomatis lebih dulu. Untuk aplikasi di server remote, penarikan itu terjadi di daemon server tersebut.

  2. Tunggu selesai

    SQL: tanpa downtime, tapi statement DROP/CREATE di dump akan mengganti isi tabel. Redis: container berhenti sebentar.

Backup volume aplikasi

Halaman aplikasi → tab Mount → bagian Backup volume. Berlaku untuk mount jenis volume saja (bind mount belum). Bila aplikasi punya lebih dari satu volume, pilih volumenya dulu.

AksiYang terjadi
Backupbusybox sekali-jalan, volume di-mount :ro, tar czf ke <app>/<mount>/<stamp>.tar.gz. Container aplikasi tetap jalan.
RestoreStop container → kosongkan volume → extract → start. Ada downtime singkat.
JadwalForm Jadwal backup volume: frekuensi, jumlah simpan, tujuan S3 — berlaku untuk semua volume aplikasi; prune per volume.
  • Berlaku juga untuk aplikasi di server remote — backup, unggah/unduh S3, dan restore dijalankan di daemon server itu.
  • Backup saat aplikasi sedang menulis bisa menangkap file setengah jadi — jadwalkan di jam sepi.
  • Menghapus database (Hapus dengan data) atau project (Hapus juga datanya) juga menghapus berkas backup database dan volumenya di server beserta salinan S3-nya. Tanpa opsi itu berkasnya dibiarkan sebagai pengaman, tetapi tetap berada di volume aoox_backups dan tidak lagi tampil di dashboard; hapus manual bila sudah tidak diperlukan.

Backup instance (panel sendiri)

Settings → Backup instance (owner) menyimpan database internal aoox: pengguna, project, aplikasi, database, jadwal, kredensial terenkripsi — semuanya sebagai satu file JSON ter-gzip di volume backup, tanpa pg_dump.

AksiKeterangan
Backup sekarangMembuat snapshot langsung; muncul di daftar dengan ukuran dan waktu.
JadwalCron 5 kolom + Tujuan S3 opsional, seperti backup database.
UnduhSimpan file di luar server — inilah yang dipakai saat memasang ulang.
Restore dari fileUnggah file backup; seluruh tabel ditulis ulang dalam satu transaksi, lalu penjadwal dan sesi SSH dibangun ulang.
Yang perlu diperhatikan saat restore
  • File hanya bisa dipulihkan ke versi skema yang sama — restore ke versi aoox yang jauh berbeda ditolak.
  • ENCRYPTION_KEY harus sama dengan saat backup dibuat; bila berbeda, kredensial tersimpan tidak bisa dibaca dan aoox melaporkannya.
  • Ini memulihkan panel, bukan data aplikasi. Container, volume, dan image tetap urusan backup database/volume.

Kombinasi untuk pindah server: backup instance + backup database + backup volume, semuanya dengan tujuan S3. Alternatif yang lebih ringan untuk memindahkan satu project saja: export/import project.

Tujuan S3

  1. Integrasi → Tujuan backup → Tujuan backup baru (owner/admin)

    FieldKeterangan
    NamaLabel.
    EndpointKosong = AWS S3. Isi untuk MinIO, Wasabi, R2, dsb. — mis. https://minio.example.com, atau http://<container stack>:9000 untuk server S3 seperti RustFS yang berjalan di aoox (lihat kotak di bawah).
    RegionWajib untuk AWS (us-east-1); provider lain biasanya bebas.
    BucketHarus sudah ada — aoox tidak membuatnya.
    PrefixOpsional, mis. aoox/prod.
    Access key ID / Secret access keySecret hanya ditulis sekali, disimpan terenkripsi.
    Path-styleDefault aktif (MinIO); matikan untuk virtual-host style (AWS, R2).
  2. Tes koneksi

    Menjalankan rclone lsjson ke bucket lewat container rclone/rclone; error provider ditampilkan apa adanya.

  3. Pilih di jadwal backup database / volume

    Setiap backup (manual maupun terjadwal) yang sukses diunggah ke <prefix>/<slug>/<stamp>.<ext>. Menghapus/prune backup juga menghapus objek remote.

Memakai RustFS (atau stack lain) sebagai tujuan
Unggahan berjalan di container helper pada network aoox, jadi server S3 harus terjangkau dari sana. Stack compose baru masuk ke network itu bila minimal satu service-nya punya domain: beri stack RustFS sebuah domain pada service apa pun (konsol pilihan yang baik), lalu pakai http://<nama container>:9000 sebagai endpoint (nama ada di halaman stack, aoox-<slug stack>-rustfs-1), path-style aktif, dan bucket dibuat dulu. Jangan mengandalkan port host yang terikat ke 127.0.0.1: container tidak bisa menjangkaunya. Port host publik bisa lewat http://<IP server>:9000, tetapi membuka S3 ke internet.
Gagal unggah membuat backup berstatus failed dan memicu notifikasi — file lokal tetap ada untuk diunduh. Tujuan dipasang justru supaya salinan ada di tempat lain, jadi kegagalan tidak disembunyikan.

Strategi yang disarankan

KebutuhanPengaturan
Produksi kecilSetiap hari 02:00, simpan 7, tujuan S3. Uji restore sebulan sekali ke database baru.
Data sering berubahSetiap jam, simpan 24–48, tujuan S3.
Sebelum migrasi/impor besarBackup manual (tidak pernah dipangkas) — beri nama di catatan tim.
Pindah server / pemulihan bencanaBackup instance + database + volume, ketiganya dengan tujuan S3; simpan juga .env.dist (JWT_SECRET & ENCRYPTION_KEY).
Aplikasi dengan uploadBackup volume harian + backup database pada jam yang sama.

Jebakan umum

GejalaPenyebab & solusi
Backup 20 byte / kosongSudah ditangani (status dump dipropagasi). Bila terjadi, cek pesan error backup — biasanya kredensial atau database belum siap.
Tes tujuan S3 gagal: NoSuchBucketBucket belum dibuat, atau region salah (AWS).
Tes gagal ke server S3 lokal (RustFS, MinIO)Endpoint memakai localhost dari dalam container, atau stack tidak punya domain sehingga tidak ada di network aoox. Beri stack domain pada service apa pun, lalu pakai nama container + port 9000, atau domain publiknya.
Restore Redis: data tidak berubahBackup Redis 7 dipasang sebagai base AOF; pastikan container benar-benar di-start ulang (status running kembali) dan tidak ada tulisan baru sebelum restore selesai.
Volume backup penuhTurunkan jumlah simpan, hapus backup manual lama, atau pindahkan ke S3 dan hapus lokal.
Belum tersedia
Retensi terpisah untuk objek di S3; backup bind mount; backup untuk stack compose & database di dalamnya; restore instance lintas versi skema.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitHub ↗