Backing up a Linux cloud server with Restic
To save on cloud costs, I want to decommission some old cloud servers. But before I do that, just to be safe, I wanted to back up the data on the it. Unfortunately, many cloud providers doesn’t let you download the snapshot of the VM.
Restic is a modern backup tool (“Backups done right!”)1. It is shipped as a static binary, so it can run on an old Linux cloud server2.
Downloading the binary
The latest release can be found at https://github.com/restic/restic/releases.
# Make sure to replace the version number and CPU architecture in the URL.
wget https://github.com/restic/restic/releases/download/v0.17.1/restic_0.17.1_linux_amd64.bz2 -O restic.bz2
bzip2 -d restic.bz2
chmod +x restic
mv restic /usr/local/bin/restic
Creating a repository
A repository holds the backup data. It can be stored in a local directory, or in a cloud storage. I will use Linode’s Object Storage (my referral link).
You can create a repository for each server, but you can also create a single repository for all servers, which leads to a better de-duplication..
# Set the repository
export RESTIC_REPOSITORY="s3:https://<region>.linodeobjects.com/<bucket-name>/<subdirectory>"
# Set the password for accessing the repository
export RESTIC_PASSWORD=
# Set the access keys for S3-compatible storage
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
# If you are on a very old machine like me (Ubuntu 14.04), HTTPS may
# no longer work due to outdated CA certificate store. On a system this
# old, `apt update` no longer works. As a workaround, you can download
# the latest cacert.pem from https://curl.se/docs/caextract.html and set
# the environment variable SSL_CERT_FILE to point to the downloaded file.
# export SSL_CERT_FILE=cacert.pem
# Initialize the repository
restic init
Backing up
Thankfully, buried in the documentation is a command for backing up a Linux server:
# Based on the command from the docs
restic --exclude={/dev,/media,/mnt,/proc,/run,/sys,/tmp,/var/tmp} backup /
# My version
# - It excludes /swapfile, which is a file used for swap space.
# - It incudes /mnt, which is usually used for volumes.
restic --exclude={/dev,/media,/proc,/run,/sys,/tmp,/var/tmp,/swapfile} backup /
Listing snapshots
restic snapshots