From 6ddfa344c8a916dd21297fc203669f99f5729ede Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Sun, 5 Aug 2018 12:27:38 +0000 Subject: [PATCH] regular backup with restic --- .gitignore | 1 + README.md | 21 +++++++++++++++++++++ backup/Dockerfile | 12 +++++++++++- backup/crondwrapper.sh | 16 ++++++++++++++++ backup/resticbackup.sh | 14 ++++++++++++++ docker-compose.yml | 14 ++++++++++++++ 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100755 backup/crondwrapper.sh create mode 100755 backup/resticbackup.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8438213 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +backup.env diff --git a/README.md b/README.md index 0787169..a7e78ec 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,24 @@ compatible, the image needs to be rebuilt on arm. Corresponding issue on GitHub: [Support for ARM64v8 #195](https://github.com/odoo/docker/issues/195). +## Backup configuration + +Example contents of `backup.env`: + +``` +RESTIC_REPOSITORY=rclone:myremote:posbackup +RESTIC_PASSWORD=extremelysecurepassword +RCLONE_CONFIG_FWUCLOUD_TYPE=webdav +RCLONE_CONFIG_FWUCLOUD_URL=https://nextcloud.example.com/remote.php/webdav/ +RCLONE_CONFIG_FWUCLOUD_VENDOR=nextcloud +RCLONE_CONFIG_FWUCLOUD_USER=backupuser +RCLONE_CONFIG_FWUCLOUD_PASS=encryptedpassword +PGDATABASE=odoodbname +``` + +Restore of DB: + +``` +createdb -T template0 restoretest +pg_restore -d restoretest /data/odoo_data.dump +``` diff --git a/backup/Dockerfile b/backup/Dockerfile index fc8ee53..9ce20c5 100644 --- a/backup/Dockerfile +++ b/backup/Dockerfile @@ -12,4 +12,14 @@ RUN set -x; wget -O /tmp/rclone.zip https://downloads.rclone.org/v${RCLONE_VERSI unzip /tmp/rclone.zip && \ mv rclone-v${RCLONE_VERSION}-linux-arm/rclone /usr/local/bin/rclone && \ chmod +x /usr/local/bin/rclone && \ - rm -rf rclone-* /tmp/rclone.zip + rm -rf rclone-* /tmp/rclone.zip && \ + mkdir -p /root/.config/rclone && \ + touch /root/.config/rclone/rclone.conf + +RUN apk add --no-cache bash ca-certificates postgresql && \ + mkfifo -m 0666 /var/log/cron.log && \ + ln -s /var/log/cron.log /var/log/crond.log + +ADD crondwrapper.sh resticbackup.sh /usr/local/bin/ + +ENTRYPOINT ["crondwrapper.sh"] diff --git a/backup/crondwrapper.sh b/backup/crondwrapper.sh new file mode 100755 index 0000000..a2079e8 --- /dev/null +++ b/backup/crondwrapper.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +echo "${BACKUP_SCHEDULE} resticbackup.sh >> /var/log/cron.log 2>&1" > /etc/crontabs/root + +# start cron +default_crontabs_dir=/etc/crontabs +crond -L /var/log/cron.log -c ${CRONTABS_DIR:-$default_crontabs_dir} + +# trap SIGINT and SIGTERM signals and gracefully exit +trap "echo \"stopping cron\"; kill \$!; exit" SIGINT SIGTERM + +# start "daemon" +while true +do + cat /var/log/cron.log & wait $! +done diff --git a/backup/resticbackup.sh b/backup/resticbackup.sh new file mode 100755 index 0000000..3116f1d --- /dev/null +++ b/backup/resticbackup.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -x + +echo "[$(date)] Starting backup" + +# Dump Postgres DB - parameters are read from env vars +pg_dump -Fc > /data/odoo_data.dump + +# Backup data with restic +restic backup --hostname posbox /data +restic forget --prune --keep-last 10 + +echo "[$(date)] Backup ended" diff --git a/docker-compose.yml b/docker-compose.yml index 311c01d..ff985ee 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,20 @@ services: networks: localnet: ipv4_address: 10.5.0.4 + backup: + build: ./backup + environment: + - PGHOST=db + - PGUSER=odoo + - PGPASSWORD=odoo + - BACKUP_SCHEDULE=0 19 * * * + env_file: backup.env + volumes: + - odoo-db-data:/data/pg_raw:ro + - /home/pi:/data/home-pi:ro + networks: + localnet: + ipv4_address: 10.5.0.5 volumes: odoo-web-data: odoo-db-data: