diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 6152760..7d74a7f 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -72,6 +72,7 @@ jobs: uses: docker/build-push-action@v6 with: context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/CHANGELOG.md b/CHANGELOG.md index c0d6c82..db33663 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Added +* Option to set the target folder backup +* Multi-platform image build + ## v1.3.2 (restic 0.16.0) ### Changed diff --git a/Dockerfile b/Dockerfile index b279bb2..55a4b79 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,21 @@ -FROM alpine:latest as rclone +FROM --platform=$TARGETPLATFORM docker.io/alpine:latest as rclone +ARG TARGETPLATFORM + +RUN apk add wget # 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 +RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + wget https://downloads.rclone.org/rclone-current-linux-amd64.zip && unzip rclone-current-linux-amd64.zip && mv rclone-*-linux-amd64/rclone /bin/rclone && chmod +x /bin/rclone; \ + elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ + wget https://downloads.rclone.org/rclone-current-linux-arm64.zip && unzip rclone-current-linux-arm64.zip && mv rclone-*-linux-arm64/rclone /bin/rclone && chmod +x /bin/rclone; \ + elif [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \ + wget https://downloads.rclone.org/rclone-current-linux-arm-v7.zip && unzip rclone-current-linux-arm-v7.zip && mv rclone-*-linux-arm-v7/rclone /bin/rclone && chmod +x /bin/rclone; \ + fi -FROM restic/restic:0.18.0 -RUN apk add --update --no-cache curl mailx +FROM docker.io/restic/restic:0.18.0 + +RUN apk add --update --no-cache curl mailx shadow COPY --from=rclone /bin/rclone /bin/rclone @@ -35,6 +44,7 @@ ENV OS_PASSWORD="" ENV OS_REGION_NAME="" ENV OS_INTERFACE="" ENV OS_IDENTITY_API_VERSION=3 +ENV BACKUP_SOURCES="" # openshift fix RUN mkdir /.cache && \ diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 new file mode 100644 index 0000000..21afc0f --- /dev/null +++ b/Dockerfile.arm64 @@ -0,0 +1,58 @@ +FROM docker.io/alpine:latest as rclone + +# Get rclone executable +ADD https://downloads.rclone.org/rclone-current-linux-arm64.zip / +RUN unzip rclone-current-linux-arm64.zip && mv rclone-*-linux-arm64/rclone /bin/rclone && chmod +x /bin/rclone + +FROM docker.io/restic/restic:0.18.0 + +RUN apk add --update --no-cache curl mailx shadow + +COPY --from=rclone /bin/rclone /bin/rclone + +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="" +ENV BACKUP_CRON="0 */6 * * *" +ENV CHECK_CRON="" +ENV RESTIC_INIT_ARGS="" +ENV RESTIC_FORGET_ARGS="" +ENV RESTIC_JOB_ARGS="" +ENV RESTIC_DATA_SUBSET="" +ENV MAILX_ARGS="" +ENV OS_AUTH_URL="" +ENV OS_PROJECT_ID="" +ENV OS_PROJECT_NAME="" +ENV OS_USER_DOMAIN_NAME="Default" +ENV OS_PROJECT_DOMAIN_ID="default" +ENV OS_USERNAME="" +ENV OS_PASSWORD="" +ENV OS_REGION_NAME="" +ENV OS_INTERFACE="" +ENV OS_IDENTITY_API_VERSION=3 + +# openshift fix +RUN mkdir /.cache && \ + chgrp -R 0 /.cache && \ + chmod -R g=u /.cache && \ + chgrp -R 0 /mnt && \ + chmod -R g=u /mnt && \ + chgrp -R 0 /var/spool/cron/crontabs/root && \ + chmod -R g=u /var/spool/cron/crontabs/root && \ + chgrp -R 0 /var/log/cron.log && \ + chmod -R g=u /var/log/cron.log + +# /data is the dir where you have to put the data to be backed up +VOLUME /data + +COPY backup.sh /bin/backup +COPY check.sh /bin/check +COPY entry.sh /entry.sh + +ENTRYPOINT ["/entry.sh"] +CMD ["tail","-fn0","/var/log/cron.log"] diff --git a/README.md b/README.md index a75fcd6..c5d8aca 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ The container is set up by setting [environment variables](https://docs.docker.c * `OS_REGION_NAME` - Optional. When using restic with OpenStack Swift container. * `OS_INTERFACE` - Optional. When using restic with OpenStack Swift container. * `OS_IDENTITY_API_VERSION` - Optional. When using restic with OpenStack Swift container. +* `BACKUP_SOURCES` - Optional. Set the folder that will be backed up. ## Volumes diff --git a/backup.sh b/backup.sh index 6391ebc..36cadaa 100755 --- a/backup.sh +++ b/backup.sh @@ -4,6 +4,12 @@ lastLogfile="/var/log/backup-last.log" lastMailLogfile="/var/log/mail-last.log" lastMicrosoftTeamsLogfile="/var/log/microsoft-teams-last.log" +if [ -n "$BACKUP_SOURCES" ]; then + backupSources="$BACKUP_SOURCES" +else + backupSources="/data" +fi + copyErrorLog() { cp ${lastLogfile} /var/log/backup-error-last.log } @@ -31,7 +37,7 @@ 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 +restic backup ${backupSources} ${RESTIC_JOB_ARGS} --tag=${RESTIC_TAG?"Missing environment variable RESTIC_TAG"} >> ${lastLogfile} 2>&1 backupRC=$? logLast "Finished backup at $(date)" if [[ $backupRC == 0 ]]; then