diff --git a/README.md b/README.md index 9acfce4..7af68e1 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,85 @@ Backup Docker volumes to any S3 compatible storage. -The `offen/docker-volume-backup` Docker image can be used as a sidecar container to an existing Docker setup. It handles recurring backups of Docker volumes to any S3 compatible storage and rotates away old backups if configured. +The [offen/docker-volume-backup](https://hub.docker.com/r/offen/docker-volume-backup) Docker image can be used as a sidecar container to an existing Docker setup. It handles recurring backups of Docker volumes to any S3 compatible storage and rotates away old backups if configured. + +## Configuration + +Backup targets, schedule and retention are configured in environment variables: + +```ini +########### BACKUP SCHEDULE + +# Backups run on the given cron schedule and use the filename defined in the +# template expression. + +BACKUP_CRON_EXPRESSION="0 2 * * *" +BACKUP_FILENAME="offen-db-%Y-%m-%dT%H-%M-%S.tar.gz" + +########### BACKUP STORAGE + +# Define credentials for authenticating against the backup storage and a bucket +# name. Although all of these values are `AWS`-prefixed, the setup can be used +# with any S3 compatible storage. + +AWS_ACCESS_KEY_ID="" +AWS_SECRET_ACCESS_KEY="" +AWS_S3_BUCKET_NAME="" + +# This is the FQDN of your storage server, e.g. `storage.example.com`. +# You can leave it blank when working against AWS S3. +# AWS_ENDPOINT="" + +########### BACKUP PRUNING + +# Define this value to enable automatic pruning of old backups. The value +# declares the number of days for which a backup is kept. + +# BACKUP_RETENTION_DAYS="7" + +########### BACKUP ENCRYPTION + +# Backups can be encrypted using gpg in case a passphrase is given + +# GPG_PASSPHRASE="" +``` + +## Example in a docker-compose setup + +Most likely, you will use this image as a sidecar container in an existing docker-compose setup like this: + +```yml +version: '3' + +services: + volume-consumer: + build: + context: ./my-app + volumes: + - data:/var/my-app + labels: + # This means the container will be stopped during backup to ensure + # backup integrity. You can omit this label if stopping during backup + # not required. + - docker-volume-backup.stop-during-backup=true + + backup: + image: offen/docker-volume-backup:latest + restart: always + env_file: ./backup.env + volumes: + # Mounting the Docker socket allows the script to stop and restart + # the container during backup. You can omit this if you don't want + # to stop the container + - /var/run/docker.sock:/var/run/docker.sock:ro + - data:/backup/my-app-backup:ro +volumes: + data: +``` + +## Differences to `futurice/docker-volume-backup` + +This image is heavily inspired by the `futurice/docker-volume-backup`. We decided to publish this image because of the following requirements: + +- The original image is based on `ubuntu`, making it very heavy. This version is roughly 500MB smaller in size. +- The original image proposed to handle backup rotation through AWS S3 lifecycle policies. This image adds the option to rotate old backups through the same script so this functionality can also be offered for non-AWS storage backends like MinIO. diff --git a/src/backup.sh b/src/backup.sh index 83d319e..33358be 100644 --- a/src/backup.sh +++ b/src/backup.sh @@ -19,7 +19,7 @@ if [ -S "$DOCKER_SOCK" ]; then TEMPFILE="$(mktemp)" docker ps \ --format "{{.ID}}" \ - --filter "label=offen.stop-during-backup=true" \ + --filter "label=docker-volume-backup.stop-during-backup=true" \ > "$TEMPFILE" CONTAINERS_TO_STOP="$(cat $TEMPFILE | tr '\n' ' ')" CONTAINERS_TO_STOP_TOTAL="$(cat $TEMPFILE | wc -l)"