Backup & Restore Overview
Auberge provides built-in backup and restore functionality for all self-hosted applications. Backups are stored locally and can be restored to the same host or migrated to a different host using the cross-host restore feature.
Architecture
Section titled “Architecture”- Local Machine: Where
aubergeCLI is installed, holds SSH keys, stores backups in~/.local/share/auberge/backups/ - Remote VPS: Runs all apps deployed by
auberge, source of backup data - Backup Server: Offsite destination for encrypted restic snapshots (any rclone-supported storage provider)
Supported Applications
Section titled “Supported Applications”- Actual Budget: Server account database and budget blobs (clients keep full local copies)
- Baikal: Calendar and contact data, configuration files
- Bichon: Email archives, search indices, configuration
- FreshRSS: SQLite database, configuration, user data
- Navidrome: Database and configuration (music files only with
--include-music; a backup that holds them restores them) - Calibre: Book library, metadata database, user database (login credentials)
- Gokapi: SQLite database and uploaded shared files
- Grimmory: Book library files (
/srv/books), app data (/srv/grimmory), and MariaDB metadata database - Paperless-ngx: Documents, media, PostgreSQL database (tags, correspondents, document types, users)
- YOURLS: Installation files and MariaDB database (short links, click stats)
Backup Storage
Section titled “Backup Storage”Backups are stored locally in ~/.local/share/auberge/backups/ with the following structure:
backups/└── {hostname}/ ├── 2026-01-23_14-30-00/ │ ├── baikal/ │ ├── freshrss/ │ └── navidrome/ └── 2026-01-23_18-45-12/ ├── baikal/ └── freshrss/One directory per run, holding one directory per app backed up in that run. auberge backup push uploads a whole timestamped run, and backup verify reads the same {hostname}/{timestamp} layout back out of the repository.
Technical Details
Section titled “Technical Details”Backup Process
Section titled “Backup Process”- For apps declaring
attests:, the app is asked where its data actually lives and the answer is checked against the recipe’s declared paths. A path the app reports that no declared path contains fails that app’s backup before anything is stopped, as does an attestation that exits non-zero. Reporting nothing does not fail — every way of failing to ask exits non-zero, so an empty answer just means the app holds no data yet. Grimmory is the only such app today: its library root is a row in its own database, so the role’s declaration is a note that can silently stop matching - Services are stopped via
systemctl stop {service} - For apps with databases: a dump is created on the remote host —
pg_dump -Fcfor PostgreSQL (Paperless-ngx),mariadb-dump --single-transactionfor MariaDB (Grimmory, YOURLS) - Data is synced from remote using
rsyncwith SSH - Database dumps are downloaded via
scpand cleaned up on remote - Services are restarted via
systemctl start {service}
Restore Process
Section titled “Restore Process”- Pre-flight validation (cross-host only)
- Emergency backup creation (cross-host only)
- User confirmation (hostname typing for cross-host, Y/N for same-host)
- Services are stopped on target
- Data is synced to remote using
rsyncwith SSH — every path the backup holds, including optional ones like Navidrome’s/srv/music - For apps with databases: dump is uploaded via
scpand restored —pg_restore --clean --if-existsfor PostgreSQL, piping the dump intomariadbfor MariaDB — then anypost_restore_command(e.g. Paperless-ngx’s Django migrations) is run - File ownership is set to service user (e.g.,
chown -R calibre:calibre /home/calibre) - Services are restarted on target
- Post-restore guidance displayed (cross-host only) — the generic checklist, then each restored app’s
restore_advicefrom its Backup Recipe. Apps declaring none add nothing, and a run where none declares any prints no such section
Offsite Backup
Section titled “Offsite Backup”Local backups can be pushed to an offsite restic repository for disaster recovery. The workflow is:
- Create a local backup with
auberge backup create - Push it offsite with
auberge backup push - Apply retention policies with
auberge backup prune(7 daily, 4 weekly, 12 monthly) - Confirm it landed with
auberge backup verify— the only step that reads the repository back. See backup verify
For automated daily backups, use auberge backup sync which runs the full pipeline (create → push → prune → cleanup) in one command and removes local staging after a successful push. Prune failures are non-fatal. See backup sync.
For the full end-to-end setup guide (installing dependencies, configuring rclone, setting auberge config), see backup push.
Excluded Files
Section titled “Excluded Files”The following patterns are excluded from backups to reduce size:
.git/directories (except Baikal’s VCS)node_modules/venv/,__pycache__/*.pyc,*.pyo,*.tmp,*.log.DS_Store,.cache/.Baikal.cache/
SSH Connection Pooling
Section titled “SSH Connection Pooling”Backup and restore operations use SSH ControlMaster for connection reuse:
- ControlPath:
/tmp/ssh-%r@%h:%p - ControlPersist: 60 seconds
This significantly speeds up operations that require multiple SSH commands.