Backup using restic for a docker-compose setup. Currently tested with docker-ce 17, 18 and 19.
- restic-compose-backup Documentation
- restic-compose-backup on Github
- restic-compose-backup on Docker Hub
Features:
- Backs up docker volumes or host binds
- Backs up postgres, mariadb and mysql databases
- Notifications over mail/smtp or Discord webhooks
Please report issus on github.
docker pull zettaio/restic-compose-backupMinimum configuration
RESTIC_REPOSITORY RESTIC_PASSWORDMore config options can be found in the documentation.
Restic backend specific env vars : https://restic.readthedocs.io/en/stable/040_backup.html#environment-variables
We simply control what should be backed up by adding labels to our containers. More details are covered in the documentation.
restic-backup.env
RESTIC_REPOSITORY=<whatever backend restic supports> RESTIC_PASSWORD=hopefullyasecturepw # snapshot prune rules RESTIC_KEEP_DAILY=7 RESTIC_KEEP_WEEKLY=4 RESTIC_KEEP_MONTHLY=12 RESTIC_KEEP_YEARLY=3 # Cron schedule. Run every day at 1am CRON_SCHEDULE="0 1 * * *"docker-compose.yaml
version: '3' services: # The backup service backup: image: zettaio/restic-compose-backup:<version> env_file: - restic-backup.env volumes: # We need to communicate with docker - /var/run/docker.sock:/tmp/docker.sock:ro # Persistent storage of restic cache (greatly speeds up all restic operations) - cache:/cache web: image: some_image labels: # Enables backup of the volumes below restic-compose-backup.volumes: true volumes: - media:/srv/media - /srv/files:/srv/files mariadb: image: mariadb:10 labels: # Enables backup of this database restic-compose-backup.mariadb: true env_file: mariadb-credentials.env volumes: - mysqldata:/var/lib/mysql mysql: image: mysql:5 labels: # Enables backup of this database restic-compose-backup.mysql: true env_file: mysql-credentials.env volumes: - mysqldata:/var/lib/mysql postgres: image: postgres labels: # Enables backup of this database restic-compose-backup.postgres: true env_file: postgres-credentials.env volumes: - pgdata:/var/lib/postgresql/data volumes: media: mysqldata: mariadbdata: pgdata: cache:Everything is controlled using the rcb command. After configuring backup with labels and restarted the affected services we can quickly view the result using the status subcommand.
$ docker-compose run --rm backup rcb status INFO: Status for compose project 'myproject' INFO: Repository: '<restic repository>' INFO: Backup currently running?: False INFO: --------------- Detected Config --------------- INFO: service: mysql INFO: - mysql (is_ready=True) INFO: service: mariadb INFO: - mariadb (is_ready=True) INFO: service: postgres INFO: - postgres (is_ready=True) INFO: service: web INFO: - volume: media INFO: - volume: /srv/filesThe status subcommand lists what will be backed up and even pings the database services checking their availability. The restic command can also be used directly in the container.
More rcb commands can be found in the documentation.
pip install -e ./src/ pip install -r src/tests/requirements.txt toxpip install -r docs/requirements.txt python src/setup.py build_sphinxThe git repository contains a simple local setup for development
# Create an overlay network to link the compose project and stack docker network create --driver overlay --attachable global # Start the compose project docker-compose up -d # Deploy the stack docker stack deploy -c swarm-stack.yml testIn dev we should ideally start the backup container manually
docker-compose run --rm backup sh # pip install the package in the container in editable mode to auto sync changes from host source pip3 install -e .Remember to enable swarm mode with docker swarm init/join and disable swarm mode with docker swarm leave --force when needed in development (single node setup).
Contributions are welcome regardless of experience level. Don't hesitate submitting issues, opening partial or completed pull requests.
This project is sponsored by zetta.io
