Moving blobs to a larger disk
Point the agent at a bigger volume for backup ciphertext and
restore-test scratch without moving the rest of the state
directory. Useful when /var/lib sits on a small
boot volume and your database dumps do not.
Three directories under /var/lib/restorable/ can
grow. Only blobs/ grows with dump size; the others
are small enough to stay put:
-
blobs/: staged ciphertext, one file per backup. Sized proportionally to the compressed dump. Deleted after upload succeeds. -
receipts/: DSSE receipts. Kilobytes each; one per restore test. -
events/: append-only local event log. Kilobytes.
In managed mode, blobs upload to the orchestrator's object storage almost immediately and disk usage stays flat. The peak you need to size for is one concurrent dump. A 200 GB dump means 200 GB of ciphertext sitting on disk for however long the upload takes.
Override blobs_dir in config.yaml
Each directory is overridable independently under
storage:. Missing fields fall back to the
<root>/<name> default, so you can
set just the one that matters:
storage:
blobs_dir: /mnt/big-disk/restorable/blobs
Leave receipts_dir and events_dir
unset unless you also want them on the big disk. Keys,
api_token, and the config itself are not
affected.
Create the directory
The agent runs as the restorable user and needs
ownership + 0700 to match the rest of the state
dir's posture:
sudo install -d -o restorable -g restorable -m 0700 /mnt/big-disk/restorable/blobs Widen the systemd sandbox
The unit has
ProtectSystem=strict and
ReadWritePaths=/var/lib/restorable. Any path
outside that list is read-only to the agent, so a fresh
blobs_dir on
/mnt/big-disk/ would fail with a read-only
filesystem error. Add the new path via a drop-in override so
the vendored unit stays untouched:
sudo mkdir -p /etc/systemd/system/restorable.service.d
sudo tee /etc/systemd/system/restorable.service.d/storage.conf >/dev/null <<'EOF'
[Service]
ReadWritePaths=/mnt/big-disk/restorable
EOF
sudo systemctl daemon-reload
sudo systemctl restart restorable
One ReadWritePaths entry covers every subpath
beneath it; one line is enough for the blobs dir and any future
subdir under the same mount.
Restore-test scratch
Restoring a 200 GB backup needs 200 GB of scratch somewhere to
hold the decompressed target database during the test. With the
default restore_scratch.kind: auto the scratch
container's storage lands under whichever runtime the agent
detected: Podman's per-user storage at
~restorable/.local/share/containers/, or Docker's
storage driver at /var/lib/docker/. If that path is
also on the small boot volume, move it the usual way for that
runtime (Podman: relocate ~restorable/.local/share
via storage.conf; Docker: set
"data-root": "/mnt/big-disk/docker" in
/etc/docker/daemon.json). Nothing
Restorable-specific.
Alternatively, switch to an external scratch endpoint on a host with the disk you want:
restore_scratch:
kind: uri
uri: env:RESTORABLE_SCRATCH_URI
The agent drops and recreates a scratch database on that
endpoint between sessions. Nothing persists. The credentials
need permission to create and drop databases. See
agent.yaml
reference for the full restore_scratch shape.
Verify
Trigger a backup from the dashboard (or wait for the next
scheduled one) and watch /mnt/big-disk/restorable/blobs/
grow then drop to empty after upload completes. If the write
is blocked you will see mkdir blobs: ... read-only file
system in journalctl -u restorable,
which means the ReadWritePaths drop-in is not
applied yet. Confirm with:
systemctl cat restorable | grep ReadWritePaths Both the vendored path and your override should appear.