Backup & restore
Daily encrypted off-site backups, self-service restore
Percher backs up the entire platform every night to encrypted off-site storage. The goal is that a corrupted database, a deleted volume, or a lost server does not turn into lost user data — restores happen from yesterday's archive, not from scratch.
What we back up
- Every app's
/app/datavolume (your databases, uploaded files, SQLite, caches) - Every PocketBase sidecar's
pb_datadirectory (auth, collections, file uploads) - Platform metadata (apps, users, deployments, env-var ciphertext, custom-domain config)
- Forgejo repositories — the deploy history we keep of every published version
- Caddy TLS certificates so HTTPS keeps working immediately after a restore
Schedule and storage
- Daily, 02:00 UTC
- Encrypted with AES-256 (GPG symmetric)
- Uploaded to encrypted off-site storage in a different EU datacenter from the production server, so a region failure doesn't take both copies
- Retention: 30 days off-site. Recent nightly copies also stay on the production server; under disk pressure, older verified copies move off-site while at least three recent nightly generations stay local.
- If a backup fails, on-call gets a Discord ping and an operations email within minutes
Restoring
Self-service from the CLI. Your AI assistant can do the same via percher_backups and percher_restore.
bunx percher backups <app> # what you can restore from bunx percher restore latest <app> --dry-run # see the plan first bunx percher restore latest <app> # or YYYY-MM-DD / a backup id bunx percher restore latest <app> --components pocketbase
Older archives held only off-site require support to bring the selected copy back for restore. There's no dashboard button yet. For anything the CLI can't reach — a deleted app, a cross-account copy — email support@percher.app with the app name, what was lost, and roughly when.
What this does not protect against
- Writes between 02:00 UTC and the moment of failure (up to ~24 hours of data could be lost)
- Application-level corruption that you replicated into a backup — if your code wrote bad rows for three days, the restore will faithfully bring those rows back too
- Loss older than the 30-day retention window — once an archive ages out of both local and off-site storage, it's gone
Note: bunx percher delete removes the app immediately and skips any extra snapshot, but the previous night's archive still has both the app metadata and its data volume. If you delete by accident, email support within the 30-day retention window and we can usually recover it.
For sub-daily protection or self-service exports, run your own dump from inside the app — for PocketBase apps that's the built-in/api/backups endpoint in the PB admin UI; for custom SQLite, copy the file out of /app/data on a schedule.