Skip to main content

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:

  1. current/ mirror for "latest" restore.
  2. 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-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

LevelExample
Snapshot rootremote-prod:snapshots/
Daily pointremote-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

PitfallConsequencePrevention
No naming standardHard restore navigationUse ISO date folders
Snapshot only, no checkCorrupt backup sets undetectedVerify after each run
Unlimited snapshotsRapid cost growthEnforce lifecycle policy

Hands-On Practice

  1. Run a snapshot sync to a lab prefix.
  2. Restore it to a local directory.
  3. Run a check to 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

What's Next