Features
Backup and restore
A `.zip` with the database and the files, made by a job and restored selectively.
Exporting is a job, not a download
A .zip with the whole volume does not fit in the time of one request. So the route schedules the generation and returns the state; the file is downloaded later, once the status reaches READY.
Here or in the bucket
The .zip that stays in the container has a fixed name, one copy and an expiry. The one that goes to the bucket has a timestamped name, accumulates and never expires: it is the history, and it is where a remote restore reads from.
Automatic backup
Daily, weekly or by cron expression, in the container's timezone. The schedule is stored in Settings and travels as a whole object: “weekly with no day” and “cron with no expression” have no next occurrence.
The next run is not configuration
It is computed by the process's timer, and read from /api/backup/schedule, not from Settings.
Restoring: inspect first
- 1Inspect reads the
.zipand answers what a restore *would* do: one block per workspace, with the count of each scope. It writes no byte. - 2Select what comes back, per workspace: only the cards, only the projects, everything.
- 3Import applies it. With no selection, it restores everything, except accounts, which take an explicit ask.
- The file can come from disk (
file) or from the bucket (remote), never both: that is 400. - A remote source loosens no validation: from there down there are only bytes.
- Scopes depend on scopes:
epicsrequiresprojects,commentsrequirescards.