Snapshot Patterns with Rclone
Rclone does not create deduplicated snapshots by itself, but you can build snapshot-like behavior with time-stamped destination paths.
Learning Focus
Design a snapshot layout that supports real restores: clear naming, verification, and retention boundaries.
Concept Overview
A "snapshot" in this context means: a point-in-time copy stored under a date/time prefix.
Two common patterns:
current/mirror for "latest" restore.snapshots/YYYY-MM-DD/for point-in-time restore.
Pattern
daily-snapshot.sh
SNAPSHOT_DATE="$(date +%F)"
rclone sync /srv/data remote-prod:snapshots/${SNAPSHOT_DATE}/data --progress
Mirror + Snapshots (Recommended)
mirror-and-snapshot.sh
SNAPSHOT_DATE="$(date +%F)"
# latest mirror
rclone sync /srv/data remote-prod:backups/current/data --progress
# point-in-time snapshot
rclone sync /srv/data remote-prod:backups/snapshots/${SNAPSHOT_DATE}/data --progress
flowchart LR
SRC[/srv/data] --> CUR[remote:backups/current/data]
SRC --> SNAP[remote:backups/snapshots/YYYY-MM-DD/data]
Structure Recommendation
| Level | Example |
|---|---|
| Snapshot root | remote-prod:snapshots/ |
| Daily point | remote-prod:snapshots/2026-02-11/ |
| Dataset namespace | .../mysql/, .../media/, .../configs/ |
Dataset Namespacing
Split by recovery domain so you can restore partial data quickly:
.../db/(dumps, exports).../media/(uploads).../configs/(compose/nginx)
Validation Step
rclone check /srv/data remote-prod:snapshots/${SNAPSHOT_DATE}/data --one-way
Restore Commands
restore-latest.sh
rclone sync remote-prod:backups/current/data /restore/latest/data --progress
restore-snapshot.sh
SNAPSHOT_DATE="2026-02-10"
rclone sync remote-prod:backups/snapshots/${SNAPSHOT_DATE}/data /restore/snapshots/${SNAPSHOT_DATE}/data --progress
tip
Pair daily snapshots with a current/ mirror path so restores can be either "latest" or "point-in-time".
Common Pitfalls
| Pitfall | Consequence | Prevention |
|---|---|---|
| No naming standard | Hard restore navigation | Use ISO date folders |
| Snapshot only, no check | Corrupt backup sets undetected | Verify after each run |
| Unlimited snapshots | Rapid cost growth | Enforce lifecycle policy |
Hands-On Practice
- Run a snapshot sync to a lab prefix.
- Restore it to a local directory.
- Run a
checkto prove it.
practice-snapshots.sh
SNAPSHOT_DATE="$(date +%F)"
rclone sync /srv/data remote-prod:labs/snapshots/${SNAPSHOT_DATE}/data --progress
rclone sync remote-prod:labs/snapshots/${SNAPSHOT_DATE}/data /tmp/restore-snapshot --progress
rclone check remote-prod:labs/snapshots/${SNAPSHOT_DATE}/data /tmp/restore-snapshot --one-way