mirror of
https://github.com/lobaro/restic-backup-docker.git
synced 2026-04-04 12:18:50 +00:00
Compare commits
35 Commits
1.2-0.9.4
...
1.3.1-0.9.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5596197a6 | ||
|
|
4713b3f13b | ||
|
|
0c8da5f31e | ||
|
|
5a1bec484a | ||
|
|
0f6a7bd462 | ||
|
|
e81386c51a | ||
|
|
11513a9b20 | ||
|
|
9469bbe7ba | ||
|
|
15012cdab1 | ||
|
|
ec42bdd04c | ||
|
|
88620c3acb | ||
|
|
b0408d66a5 | ||
|
|
d10efe97f5 | ||
|
|
29e46cad2c | ||
|
|
0f2df46b9d | ||
|
|
5f5f75f903 | ||
|
|
5c0dbbc9cc | ||
|
|
7ed9080c68 | ||
|
|
683db322d7 | ||
|
|
f99b15304f | ||
|
|
6613cd39b3 | ||
|
|
71feaad5b4 | ||
|
|
b4ed623bd4 | ||
|
|
31a9e3f328 | ||
|
|
1033900afc | ||
|
|
8aa40aa682 | ||
|
|
4cdfc85445 | ||
|
|
f4275c5aef | ||
|
|
8a49ee9a53 | ||
|
|
6bedee1ab1 | ||
|
|
5e99ccbc9f | ||
|
|
393cc232c1 | ||
|
|
99ad449822 | ||
|
|
fb54cf6906 | ||
|
|
d3c851da27 |
25
Dockerfile
25
Dockerfile
@@ -1,26 +1,28 @@
|
||||
FROM alpine as certs
|
||||
RUN apk add --no-cache ca-certificates
|
||||
FROM alpine:latest as rclone
|
||||
|
||||
# Get rclone executable
|
||||
ADD https://downloads.rclone.org/rclone-current-linux-amd64.zip /
|
||||
RUN unzip rclone-current-linux-amd64.zip && mv rclone-*-linux-amd64/rclone /bin/rclone && chmod +x /bin/rclone
|
||||
|
||||
FROM busybox:glibc
|
||||
FROM restic/restic:0.9.6
|
||||
|
||||
COPY --from=certs /etc/ssl/certs /etc/ssl/certs
|
||||
# install mailx
|
||||
RUN apk add --update --no-cache heirloom-mailx fuse
|
||||
|
||||
# Get restic executable
|
||||
ENV RESTIC_VERSION=0.9.3
|
||||
ADD https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2 /
|
||||
RUN bzip2 -d restic_${RESTIC_VERSION}_linux_amd64.bz2 && mv restic_${RESTIC_VERSION}_linux_amd64 /bin/restic && chmod +x /bin/restic
|
||||
COPY --from=rclone /bin/rclone /bin/rclone
|
||||
|
||||
RUN mkdir -p /mnt/restic /var/spool/cron/crontabs /var/log
|
||||
RUN \
|
||||
mkdir -p /mnt/restic /var/spool/cron/crontabs /var/log; \
|
||||
touch /var/log/cron.log;
|
||||
|
||||
ENV RESTIC_REPOSITORY=/mnt/restic
|
||||
ENV RESTIC_PASSWORD=""
|
||||
ENV RESTIC_TAG=""
|
||||
ENV NFS_TARGET=""
|
||||
# By default backup every 6 hours
|
||||
ENV BACKUP_CRON="0 */6 * * *"
|
||||
ENV RESTIC_FORGET_ARGS=""
|
||||
ENV RESTIC_JOB_ARGS=""
|
||||
ENV MAILX_ARGS=""
|
||||
|
||||
# /data is the dir where you have to put the data to be backed up
|
||||
VOLUME /data
|
||||
@@ -28,9 +30,8 @@ VOLUME /data
|
||||
COPY backup.sh /bin/backup
|
||||
COPY entry.sh /entry.sh
|
||||
|
||||
RUN touch /var/log/cron.log
|
||||
|
||||
WORKDIR "/"
|
||||
|
||||
ENTRYPOINT ["/entry.sh"]
|
||||
|
||||
CMD ["tail","-fn0","/var/log/cron.log"]
|
||||
|
||||
37
README.md
37
README.md
@@ -4,19 +4,19 @@ A docker container to automate [restic backups](https://restic.github.io/)
|
||||
This container runs restic backups in regular intervals.
|
||||
|
||||
* Easy setup and maintanance
|
||||
* Support for different targets (currently: Local, NFS, SFTP)
|
||||
* Support for different targets (tested with: Local, NFS, SFTP, AWS)
|
||||
* Support `restic mount` inside the container to browse the backup files
|
||||
|
||||
**Container**: [lobaro/restic-backup-docker](https://hub.docker.com/r/lobaro/restic-backup-docker/)
|
||||
|
||||
Stable
|
||||
```
|
||||
docker pull lobaro/restic-backup-docker:v1.0
|
||||
docker pull lobaro/restic-backup-docker:1.2-0.9.4
|
||||
```
|
||||
|
||||
Latest (experimental)
|
||||
```
|
||||
docker pull lobaro/restic-backup-docker
|
||||
docker pull lobaro/restic-backup-docker:latest
|
||||
```
|
||||
|
||||
Please don't hesitate to report any issue you find. **Thanks.**
|
||||
@@ -50,7 +50,7 @@ To enter your container execute
|
||||
docker exec -ti backup-test /bin/sh
|
||||
```
|
||||
|
||||
Now you can use restic [as documented](https://restic.readthedocs.io/en/stable/Manual/), e.g. try to run `restic snapshots` to list all your snapshots.
|
||||
Now you can use restic [as documented](https://restic.readthedocs.io/en/stable/), e.g. try to run `restic snapshots` to list all your snapshots.
|
||||
|
||||
## Logfiles
|
||||
Logfiles are inside the container. If needed you can create volumes for them.
|
||||
@@ -60,7 +60,7 @@ docker logs
|
||||
```
|
||||
Shows `/var/log/cron.log`
|
||||
|
||||
Additionally you can see the the full log, including restic output, of the last execution in `/var/log/backup-last.log`. When the backup fails the log is copied to `/var/log/restic-error-last.log`.
|
||||
Additionally you can see the the full log, including restic output, of the last execution in `/var/log/backup-last.log`. When the backup fails the log is copied to `/var/log/restic-error-last.log`. If configured, you can find the full output of the mail notification in `/var/log/mail-last.log`.
|
||||
|
||||
# Customize the Container
|
||||
|
||||
@@ -68,13 +68,16 @@ The container is setup by setting [environment variables](https://docs.docker.co
|
||||
|
||||
## Environment variables
|
||||
|
||||
* `RESTIC_REPOSITORY` - the location of the restic repository. Default `/mnt/restic`
|
||||
* `RESTIC_REPOSITORY` - the location of the restic repository. Default `/mnt/restic`. For S3: `s3:https://s3.amazonaws.com/BUCKET_NAME`
|
||||
* `RESTIC_PASSWORD` - the password for the restic repository. Will also be used for restic init during first start when the repository is not initialized.
|
||||
* `RESTIC_TAG` - Optional. To tag the images created by the container.
|
||||
* `NFS_TARGET` - Optional. If set the given NFS is mounted, i.e. `mount -o nolock -v ${NFS_TARGET} /mnt/restic`. `RESTIC_REPOSITORY` must remain it's default value!
|
||||
* `BACKUP_CRON` - A cron expression to run the backup. Note: cron daemon uses UTC time zone. Default: `0 */6 * * *` aka every 6 hours.
|
||||
* `RESTIC_FORGET_ARGS` - Optional. Only if specified `restic forget` is run with the given arguments after each backup. Example value: `-e "RESTIC_FORGET_ARGS=--prune --keep-last 10 --keep-hourly 24 --keep-daily 7 --keep-weekly 52 --keep-monthly 120 --keep-yearly 100"`
|
||||
* `RESTIC_JOB_ARGS` - Optional. Allows to specify extra arguments to the back up job such as limiting bandwith with `--limit-upload` or excluding file masks with `--exclude`.
|
||||
* `AWS_ACCESS_KEY_ID` - Optional. When using restic with AWS S3 storage.
|
||||
* `AWS_SECRET_ACCESS_KEY` - Optional. When using restic with AWS S3 storage.
|
||||
* `MAILX_ARGS` - Optional. If specified, the content of `/var/log/backup-last.log` is sent via mail after each backup using an *external SMTP*. To have maximum flexibility, you have to specify the mail/smtp parameters by your own. Have a look at the [mailx manpage](https://linux.die.net/man/1/mailx) for further information. Example value: `-e "MAILX_ARGS=-r 'from@example.de' -s 'Result of the last restic backup run' -S smtp='smtp.example.com:587' -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user='username' -S smtp-auth-password='password' 'to@example.com'"`.
|
||||
|
||||
## Volumes
|
||||
|
||||
@@ -82,11 +85,11 @@ The container is setup by setting [environment variables](https://docs.docker.co
|
||||
|
||||
## Set the hostname
|
||||
|
||||
Since restic saves the hostname with each snapshot and the hostname of a docker container is it's id you might want to customize this by setting the hostname of the container to another value.
|
||||
Since restic saves the hostname with each snapshot and the hostname of a docker container is derived from it's id you might want to customize this by setting the hostname of the container to another value.
|
||||
|
||||
Either by setting the [environment variable](https://docs.docker.com/engine/reference/run/#env-environment-variables) `HOSTNAME` or with `--hostname` in the [network settings](https://docs.docker.com/engine/reference/run/#network-settings)
|
||||
Set `--hostname` in the [network settings](https://docs.docker.com/engine/reference/run/#network-settings)
|
||||
|
||||
## Backup to SFTP
|
||||
## Backup via SFTP
|
||||
|
||||
Since restic needs a **password less login** to the SFTP server make sure you can do `sftp user@host` from inside the container. If you can do so from your host system, the easiest way is to just mount your `.ssh` folder conaining the authorized cert into the container by specifying `-v ~/.ssh:/root/.ssh` as argument for `docker run`.
|
||||
|
||||
@@ -96,16 +99,16 @@ Now you can simply specify the restic repository to be an [SFTP repository](http
|
||||
-e "RESTIC_REPOSITORY=sftp:user@host:/tmp/backup"
|
||||
```
|
||||
|
||||
# Changelog
|
||||
## Backup via rclone
|
||||
|
||||
Versioning follows [Semantic versioning](http://semver.org/)
|
||||
To use rclone as a backend for restic, simply add the rclone config file as a volume with `-v /absolute/path/to/rclone.conf:/root/.config/rclone/rclone.conf`.
|
||||
|
||||
! Breaking changes
|
||||
# Versioning & Changelog
|
||||
|
||||
**:latest**
|
||||
* ! `--prune` must be passed to `RESTIC_FORGET_ARGS` to execute prune after forget.
|
||||
* Switch to base Docker container to `golang:1.7-alpine` to support latest restic build.
|
||||
Starting from v1.3.0 versioning follows [Semantic versioning](http://semver.org/)
|
||||
|
||||
Build metadata is used to declare the Restic version.
|
||||
|
||||
**:v1.0**
|
||||
* First stable version
|
||||
**Example:** 1.3.0+0.9.5 (includes Restic 0.9.5)
|
||||
|
||||
For changelog see: https://github.com/lobaro/restic-backup-docker/releases
|
||||
|
||||
15
backup.sh
15
backup.sh
@@ -1,6 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
lastLogfile="/var/log/backup-last.log"
|
||||
lastMailLogfile="/var/log/mail-last.log"
|
||||
|
||||
copyErrorLog() {
|
||||
cp ${lastLogfile} /var/log/backup-error-last.log
|
||||
@@ -11,14 +12,15 @@ logLast() {
|
||||
}
|
||||
|
||||
start=`date +%s`
|
||||
rm -f ${lastLogfile}
|
||||
rm -f ${lastLogfile} ${lastMailLogfile}
|
||||
echo "Starting Backup at $(date +"%Y-%m-%d %H:%M:%S")"
|
||||
echo "Starting Backup at $(date)" >> ${lastLogfile}
|
||||
logLast "BACKUP_CRON: ${BACKUP_CRON}"
|
||||
logLast "RESTIC_TAG: ${RESTIC_TAG}"
|
||||
logLast "RESTIC_FORGET_ARGS: ${RESTIC_FORGET_ARGS}"
|
||||
logLast "RESTIC_JOB_ARGS: ${RESTIC_JOB_ARGS}"
|
||||
|
||||
logLast "RESTIC_REPOSITORY: ${RESTIC_REPOSITORY}"
|
||||
logLast "AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}"
|
||||
|
||||
# Do not save full backup log to logfile but to backup-last.log
|
||||
restic backup /data ${RESTIC_JOB_ARGS} --tag=${RESTIC_TAG?"Missing environment variable RESTIC_TAG"} >> ${lastLogfile} 2>&1
|
||||
@@ -49,3 +51,12 @@ fi
|
||||
|
||||
end=`date +%s`
|
||||
echo "Finished Backup at $(date +"%Y-%m-%d %H:%M:%S") after $((end-start)) seconds"
|
||||
|
||||
if [ -n "${MAILX_ARGS}" ]; then
|
||||
sh -c "mailx -v -S sendwait ${MAILX_ARGS} < ${lastLogfile} > ${lastMailLogfile} 2>&1"
|
||||
if [ $? == 0 ]; then
|
||||
echo "Mail notification successfully sent."
|
||||
else
|
||||
echo "Sending mail notification FAILED. Check ${lastMailLogfile} for further information."
|
||||
fi
|
||||
fi
|
||||
|
||||
21
config-broken.yml
Normal file
21
config-broken.yml
Normal file
@@ -0,0 +1,21 @@
|
||||
schemaVersion: '2.0.0'
|
||||
commandTests:
|
||||
- name: "restic package installation"
|
||||
setup: [["/entry.sh"]]
|
||||
command: "which"
|
||||
args: ["restic"]
|
||||
expectedOutput: ["/bin/restic"]
|
||||
fileExistenceTests:
|
||||
- name: 'log directory exists'
|
||||
path: '/var/log'
|
||||
shouldExist: true
|
||||
- name: 'cron log file exists'
|
||||
path: '/var/log/cron.log'
|
||||
shouldExist: true
|
||||
- name: 'backup script exists'
|
||||
path: '/bin/backup'
|
||||
shouldExist: true
|
||||
metadataTest:
|
||||
volumes: ["/data"]
|
||||
entrypoint: ["/entry.sh"]
|
||||
cmd: ["tail","-fn0", "/var/log/cron.log"]
|
||||
9
docker-compose.test.broken.yml
Normal file
9
docker-compose.test.broken.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
sut:
|
||||
image: gcr.io/gcp-runtimes/container-structure-test
|
||||
command: ["test", "--image", "restic-backup", "--config", "config.yml"]
|
||||
volumes:
|
||||
- ./config.yml:/config.yml
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
21
entry.sh
21
entry.sh
@@ -1,5 +1,4 @@
|
||||
#!bin/sh
|
||||
set -e
|
||||
|
||||
echo "Starting container ..."
|
||||
|
||||
@@ -14,11 +13,25 @@ if [ -n "${NFS_TARGET}" ]; then
|
||||
mount -o nolock -v ${NFS_TARGET} /mnt/restic
|
||||
fi
|
||||
|
||||
if [ ! -f "$RESTIC_REPOSITORY/config" ]; then
|
||||
restic snapshots &>/dev/null
|
||||
status=$?
|
||||
echo "Check Repo status $status"
|
||||
|
||||
if [ $status != 0 ]; then
|
||||
echo "Restic repository '${RESTIC_REPOSITORY}' does not exists. Running restic init."
|
||||
restic init | true
|
||||
restic init
|
||||
|
||||
init_status=$?
|
||||
echo "Repo init status $init_status"
|
||||
|
||||
if [ $init_status != 0 ]; then
|
||||
echo "Failed to init the repository: '${RESTIC_REPOSITORY}'"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo "Setup backup cron job with cron expression BACKUP_CRON: ${BACKUP_CRON}"
|
||||
echo "${BACKUP_CRON} /bin/backup >> /var/log/cron.log 2>&1" > /var/spool/cron/crontabs/root
|
||||
|
||||
@@ -30,4 +43,4 @@ crond
|
||||
|
||||
echo "Container started."
|
||||
|
||||
tail -fn0 /var/log/cron.log
|
||||
exec "$@"
|
||||
2
run.sh
2
run.sh
@@ -7,7 +7,7 @@ echo "Start backup-test container. Backup of ~/test-data/ to repository ~/test-r
|
||||
docker run --privileged --name backup-test \
|
||||
-e "RESTIC_PASSWORD=test" \
|
||||
-e "RESTIC_TAG=test" \
|
||||
-e "BACKUP_CRON=0 0 * * *" \
|
||||
-e "BACKUP_CRON=* * * * *" \
|
||||
-e "RESTIC_FORGET_ARGS=--keep-last 10" \
|
||||
-v ~/test-data:/data \
|
||||
-v ~/test-repo/:/mnt/restic \
|
||||
|
||||
Reference in New Issue
Block a user