restic — Fast, Encrypted Backups
Practical guide to restic: fast, encrypted backups with deduplication, snapshots and retention for local, SFTP, S3 and B2 repositories.
restic is a modern backup program that stores your data in encrypted repositories and deduplicates automatically – every data chunk is saved only once, no matter how many snapshots or hosts it appears in. You back up locally, over SFTP, or to cloud storage such as S3 and Backblaze B2, and plaintext never leaves your machine. This guide takes you from initializing a repository through backups, snapshots and restores to retention policies and maintenance.
Repository Initialization
restic init --repo <path> — Initialize a new local repository at the given path.
restic init --repo /mnt/backup/myreporestic -r sftp:<user>@<host>:<path> init — Initialize a repository on a remote server via SFTP.
restic -r sftp:user@server.com:/backup/repo initrestic -r s3:s3.amazonaws.com/<bucket> init — Initialize a repository in an S3-compatible bucket. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
restic -r s3:s3.amazonaws.com/my-backup-bucket initrestic -r b2:<bucket>:<path> init — Initialize a repository in Backblaze B2. Set B2_ACCOUNT_ID and B2_ACCOUNT_KEY.
restic -r b2:my-bucket:restic-repo initrestic -r rclone:<remote>:<path> init — Initialize a repository via rclone (uses any rclone-configured backend).
restic -r rclone:gdrive:backups/restic initCreating Backups
restic -r <repo> backup <path> — Back up a file or directory to the repository.
restic -r /mnt/backup/repo backup /home/userrestic -r <repo> backup <path1> <path2> — Back up multiple paths in a single snapshot.
restic -r /mnt/backup/repo backup /home/user /etcrestic -r <repo> backup --tag <tag> <path> — Add one or more tags to the snapshot for easy filtering.
restic -r /mnt/backup/repo backup --tag daily --tag web /var/wwwrestic -r <repo> backup --exclude <pattern> <path> — Exclude files or directories matching the pattern.
restic -r /mnt/backup/repo backup --exclude 'node_modules' /home/user/projectsrestic -r <repo> backup --exclude-file <file> <path> — Read exclude patterns from a file (one pattern per line).
restic -r /mnt/backup/repo backup --exclude-file ~/.resticignore /home/userrestic -r <repo> backup --files-from <listfile> — Read files and directories to back up from a file.
restic -r /mnt/backup/repo backup --files-from /etc/restic/includes.txtrestic -r <repo> backup --verbose <path> — Show detailed output including each file being backed up.
restic -r /mnt/backup/repo backup --verbose /home/userListing Snapshots
restic -r <repo> snapshots — List all snapshots in the repository.
restic -r /mnt/backup/repo snapshotsrestic -r <repo> snapshots --tag <tag> — List snapshots filtered by tag.
restic -r /mnt/backup/repo snapshots --tag dailyrestic -r <repo> snapshots --host <hostname> — List snapshots from a specific host.
restic -r /mnt/backup/repo snapshots --host webserver01restic -r <repo> snapshots --json — Output snapshot list as JSON for scripting.
restic -r /mnt/backup/repo snapshots --json | jq '.[].id'restic -r <repo> ls <snapshot-id> — List files inside a specific snapshot.
restic -r /mnt/backup/repo ls a1b2c3d4restic -r <repo> ls latest — List files inside the most recent snapshot.
restic -r /mnt/backup/repo ls latestRestoring Data
restic -r <repo> restore <snapshot-id> --target <path> — Restore a full snapshot to the given target directory.
restic -r /mnt/backup/repo restore a1b2c3d4 --target /tmp/restorerestic -r <repo> restore latest --target <path> — Restore the latest snapshot.
restic -r /mnt/backup/repo restore latest --target /tmp/restorerestic -r <repo> restore latest --target <path> --include <pattern> — Restore only files matching a pattern from the latest snapshot.
restic -r /mnt/backup/repo restore latest --target /tmp/restore --include '/home/user/Documents'restic -r <repo> restore latest --target <path> --exclude <pattern> — Restore all files except those matching the pattern.
restic -r /mnt/backup/repo restore latest --target /tmp/restore --exclude '*.log'restic -r <repo> dump <snapshot-id> <file> — Print the content of a single file from a snapshot to stdout.
restic -r /mnt/backup/repo dump latest /etc/nginx/nginx.confMount Snapshots (FUSE)
restic -r <repo> mount <mountpoint> — Mount all snapshots as a virtual filesystem (requires FUSE). Browse with a file manager.
restic -r /mnt/backup/repo mount /mnt/resticrestic -r <repo> mount --snapshot-template <tpl> <mountpoint> — Customize the directory name format for each snapshot.
restic -r /mnt/backup/repo mount --snapshot-template '2006-01-02_15-04-05' /mnt/resticForget & Prune (Retention Policies)
restic -r <repo> forget --keep-last <n> — Keep only the n most recent snapshots.
restic -r /mnt/backup/repo forget --keep-last 7restic -r <repo> forget --keep-daily <n> --keep-weekly <n> --keep-monthly <n> — Apply a standard retention policy: keep n daily, weekly, and monthly snapshots.
restic -r /mnt/backup/repo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12restic -r <repo> forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune — Apply retention policy and immediately prune unreferenced data. Destructive: deletes data permanently – preview with --dry-run first.
restic -r /mnt/backup/repo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prunerestic -r <repo> forget --dry-run --keep-daily 7 — Preview which snapshots would be removed without actually deleting them.
restic -r /mnt/backup/repo forget --dry-run --keep-daily 7restic -r <repo> forget --tag <tag> --keep-last 3 — Apply retention policy only to snapshots with a specific tag.
restic -r /mnt/backup/repo forget --tag daily --keep-last 3restic -r <repo> prune — Remove data from the repository that is no longer referenced by any snapshot. Destructive: permanently frees occupied storage and cannot be undone.
restic -r /mnt/backup/repo pruneRepository Maintenance
restic -r <repo> check — Check the repository for errors and verify data integrity.
restic -r /mnt/backup/repo checkrestic -r <repo> check --read-data — Verify all data by reading and decrypting every pack file (slow but thorough).
restic -r /mnt/backup/repo check --read-datarestic -r <repo> check --read-data-subset=<n>/<total> — Read only a fraction of the data during check. Useful for staggered verification.
restic -r /mnt/backup/repo check --read-data-subset=1/10restic -r <repo> stats — Show statistics about the repository (total size, deduplicated size, snapshot count).
restic -r /mnt/backup/repo statsrestic -r <repo> stats --mode raw-data — Show disk size of all data stored in the repository.
restic -r /mnt/backup/repo stats --mode raw-datarestic -r <repo> key list — List all encryption keys stored in the repository.
restic -r /mnt/backup/repo key listrestic -r <repo> key add — Add a new encryption password to the repository.
restic -r /mnt/backup/repo key addrestic -r <repo> rebuild-index — Rebuild the repository index. Use if the index is lost or corrupted.
restic -r /mnt/backup/repo rebuild-indexrestic -r <repo> copy --repo2 <repo2> — Copy all snapshots from repo to a second repository (3-2-1 backup strategy).
restic -r /mnt/local/repo copy --repo2 sftp:user@offsite.com:/backupEnvironment Variables
export RESTIC_REPOSITORY=<path> — Set the default repository path so -r can be omitted.
export RESTIC_REPOSITORY=/mnt/backup/repoexport RESTIC_PASSWORD=<password> — Set the repository password. Useful for unattended/cron backups, but it then sits in the environment in plaintext – prefer RESTIC_PASSWORD_FILE or RESTIC_PASSWORD_COMMAND.
export RESTIC_PASSWORD=mysecretpasswordexport RESTIC_PASSWORD_FILE=<path> — Read the repository password from a file.
export RESTIC_PASSWORD_FILE=/etc/restic/password.txtexport RESTIC_PASSWORD_COMMAND=<cmd> — Run a command and use its stdout as the password.
export RESTIC_PASSWORD_COMMAND='pass show restic/main'Authentication for S3-compatible backends.
export AWS_ACCESS_KEY_ID=<key>
export AWS_SECRET_ACCESS_KEY=<secret>Authentication for Backblaze B2 backend.
export B2_ACCOUNT_ID=<id>
export B2_ACCOUNT_KEY=<key>Common Recipes
restic -r <repo> backup --exclude-file ~/.resticignore --tag daily /home — Daily backup of /home with excludes and a tag for retention policies.
restic -r /mnt/backup/repo backup --exclude-file ~/.resticignore --tag daily /homerestic -r <repo> forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune — Standard retention policy: 7 daily, 4 weekly, 12 monthly snapshots.
restic -r /mnt/backup/repo forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prunerestic -r <repo> snapshots --json | jq '.[-1].id' -r — Get the ID of the latest snapshot as a plain string.
restic -r /mnt/backup/repo snapshots --json | jq '.[-1].id' -rrestic -r <repo> backup <path> && restic -r <repo> forget --keep-daily 7 --prune — Backup and clean up old snapshots in one cron job command.
restic -r /mnt/backup/repo backup /home && restic -r /mnt/backup/repo forget --keep-daily 7 --prune Conclusion
restic takes the hard parts of a backup system off your hands: encryption, deduplication and snapshot management run transparently in the background, while the same commands work for local disks, SFTP and cloud storage. Treat the repository password like a master key – without it your backups are irrecoverably lost, so keep RESTIC_PASSWORD out of plaintext and reach for RESTIC_PASSWORD_FILE or RESTIC_PASSWORD_COMMAND in any serious setup. Use forget --prune and prune deliberately and preview them with --dry-run, because they delete data permanently.
Further Reading
- restic – official documentation – complete manual covering repositories, backends and restores
- restic.net – official project site with overview and downloads
- restic – GitHub project – source code, releases and issue tracker
Related Commands
- borgbackup – deduplicating, compressing backup with encrypted repositories
- duplicity – incremental, GPG-encrypted backups to many storage targets
- rclone – sync files with dozens of cloud storage providers