kopia lustrzana https://github.com/modem7/docker-borgmatic
Customisation
Updated readme Created guide Updated to latest dependencies Added dependabot Created drone multiarch pipeline Added hadolint file Added additional builds for docker-cli both as liveinstall and baked inpull/1/head
rodzic
5d4314ebcb
commit
6b1adbc92d
|
@ -0,0 +1,212 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: FullBuild
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Lint Dockerfile
|
||||||
|
image: hadolint/hadolint:latest-alpine
|
||||||
|
pull: if-not-exists
|
||||||
|
commands:
|
||||||
|
- hadolint --version
|
||||||
|
- hadolint base-fullbuild/Dockerfile*
|
||||||
|
|
||||||
|
- name: FullBuild
|
||||||
|
image: thegeeklab/drone-docker-buildx
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
repo: modem7/borgmatic-docker
|
||||||
|
purge: true
|
||||||
|
compress: true
|
||||||
|
use_cache: true
|
||||||
|
cache_from: "modem7/borgmatic-docker:latest"
|
||||||
|
Dockerfile: base-fullbuild/Dockerfile
|
||||||
|
context: base-fullbuild/
|
||||||
|
platforms: # if it doesn't work run docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm/v6
|
||||||
|
- linux/arm/v7
|
||||||
|
- linux/arm64/v8
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- 1.5.18
|
||||||
|
|
||||||
|
- name: slack
|
||||||
|
image: themaz/drone-slack
|
||||||
|
settings:
|
||||||
|
webhook:
|
||||||
|
from_secret: slack_hook
|
||||||
|
when:
|
||||||
|
status: [ success, failure ]
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: dockercli
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Lint Dockerfile
|
||||||
|
image: hadolint/hadolint:latest-alpine
|
||||||
|
pull: if-not-exists
|
||||||
|
commands:
|
||||||
|
- hadolint --version
|
||||||
|
- hadolint base-dockercli/Dockerfile*
|
||||||
|
|
||||||
|
- name: Docker-CLI
|
||||||
|
image: thegeeklab/drone-docker-buildx
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
repo: modem7/borgmatic-docker
|
||||||
|
purge: true
|
||||||
|
compress: true
|
||||||
|
use_cache: true
|
||||||
|
cache_from: "modem7/borgmatic-docker:dockercli"
|
||||||
|
Dockerfile: base-dockercli/Dockerfile
|
||||||
|
context: base-dockercli/
|
||||||
|
platforms: # if it doesn't work run docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm/v6
|
||||||
|
- linux/arm/v7
|
||||||
|
- linux/arm64/v8
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
tags:
|
||||||
|
- dockercli
|
||||||
|
|
||||||
|
- name: slack
|
||||||
|
image: themaz/drone-slack
|
||||||
|
settings:
|
||||||
|
webhook:
|
||||||
|
from_secret: slack_hook
|
||||||
|
when:
|
||||||
|
status: [ success, failure ]
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- custom
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: LiveInstall
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Lint Dockerfile
|
||||||
|
image: hadolint/hadolint:latest-alpine
|
||||||
|
pull: if-not-exists
|
||||||
|
commands:
|
||||||
|
- hadolint --version
|
||||||
|
- hadolint base-liveinstall/Dockerfile*
|
||||||
|
|
||||||
|
- name: LiveInstall
|
||||||
|
image: thegeeklab/drone-docker-buildx
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
repo: modem7/borgmatic-docker
|
||||||
|
purge: true
|
||||||
|
compress: true
|
||||||
|
use_cache: true
|
||||||
|
cache_from: "modem7/borgmatic-docker:liveinstall"
|
||||||
|
Dockerfile: base-liveinstall/Dockerfile
|
||||||
|
context: base-liveinstall/
|
||||||
|
platforms: # if it doesn't work run docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm/v6
|
||||||
|
- linux/arm/v7
|
||||||
|
- linux/arm64/v8
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
tags:
|
||||||
|
- liveinstall
|
||||||
|
|
||||||
|
- name: slack
|
||||||
|
image: themaz/drone-slack
|
||||||
|
settings:
|
||||||
|
webhook:
|
||||||
|
from_secret: slack_hook
|
||||||
|
when:
|
||||||
|
status: [ success, failure ]
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- custom
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: v1.5.14
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Lint Dockerfile
|
||||||
|
image: hadolint/hadolint:latest-alpine
|
||||||
|
pull: if-not-exists
|
||||||
|
commands:
|
||||||
|
- hadolint --version
|
||||||
|
- hadolint base-fullbuild-1.5.14/Dockerfile*
|
||||||
|
|
||||||
|
- name: FullBuild
|
||||||
|
image: thegeeklab/drone-docker-buildx
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
repo: modem7/borgmatic-docker
|
||||||
|
purge: true
|
||||||
|
compress: true
|
||||||
|
use_cache: true
|
||||||
|
cache_from: "modem7/borgmatic-docker:1.5.14"
|
||||||
|
Dockerfile: base-fullbuild-1.5.14/Dockerfile
|
||||||
|
context: base-fullbuild-1.5.14/
|
||||||
|
platforms: # if it doesn't work run docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm/v6
|
||||||
|
- linux/arm/v7
|
||||||
|
- linux/arm64/v8
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
tags:
|
||||||
|
- 1.5.14
|
||||||
|
|
||||||
|
- name: slack
|
||||||
|
image: themaz/drone-slack
|
||||||
|
settings:
|
||||||
|
webhook:
|
||||||
|
from_secret: slack_hook
|
||||||
|
when:
|
||||||
|
status: [ success, failure ]
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- promote
|
|
@ -0,0 +1,18 @@
|
||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
# Maintain dependencies for Docker
|
||||||
|
- package-ecosystem: "docker" # See documentation for possible values
|
||||||
|
directory: "/base-fullbuild" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
|
# Maintain dependencies for PIP
|
||||||
|
- package-ecosystem: "pip"
|
||||||
|
directory: "/base-fullbuild"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
|
@ -0,0 +1,7 @@
|
||||||
|
override:
|
||||||
|
style:
|
||||||
|
- DL3007
|
||||||
|
- DL3013
|
||||||
|
- DL3018
|
||||||
|
- DL3042
|
||||||
|
- DL3006
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Alex Lane
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
29
README.md
29
README.md
|
@ -1,17 +1,34 @@
|
||||||
# Borgmatic Container
|
# Borgmatic Container
|
||||||
<img src="https://github.com/witten/borgmatic/raw/master/docs/static/borgmatic.png" />
|
![Docker Pulls](https://img.shields.io/docker/pulls/modem7/borgmatic-docker)
|
||||||
|
![Docker Image Size (tag)](https://img.shields.io/docker/image-size/modem7/borgmatic-docker/latest)
|
||||||
[![](https://images.microbadger.com/badges/image/b3vis/borgmatic.svg)](https://microbadger.com/images/b3vis/borgmatic "Get your own image badge on microbadger.com") <img src="https://img.shields.io/docker/pulls/b3vis/borgmatic.svg" />
|
[![Build Status](https://drone.modem7.com/api/badges/modem7/docker-borgmatic/status.svg)](https://drone.modem7.com/modem7/docker-borgmatic)
|
||||||
|
![GitHub last commit](https://img.shields.io/github/last-commit/modem7/docker-borgmatic)
|
||||||
|
[![User Guide](https://img.shields.io/badge/User_Guide-OmegaWiki-informational?style=flat&logo=bookstack)](https://www.modem7.com/books/docker-backup/page/backup-docker-using-borgmatic)
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
Multiarch fork of b3vis/borgmatic with latest versions so you can run Docker commands.
|
||||||
|
|
||||||
A little container I wrote to automate my [Borgbackup](https://github.com/borgbackup)'s using the excellent [Borgmatic](https://github.com/witten/borgmatic).
|
There are also tags with Docker-CLI installed. Useful for container stop/start scripts.
|
||||||
|
|
||||||
|
### Readme
|
||||||
|
|
||||||
|
A little container based on b3vis's work to automate my [Borgbackups](https://github.com/borgbackup) using the excellent [Borgmatic](https://github.com/witten/borgmatic).
|
||||||
|
|
||||||
It uses cron to run the backups at a time you can configure in `data/borgmatic.d/crontab.txt`.
|
It uses cron to run the backups at a time you can configure in `data/borgmatic.d/crontab.txt`.
|
||||||
|
|
||||||
|
# Tags
|
||||||
|
| Tag | Description |
|
||||||
|
| :----: | --- |
|
||||||
|
| Latest | Latest version of Borgmatic|
|
||||||
|
| dockercli | Borgmatic with Docker-CLI baked in. |
|
||||||
|
| liveinstall | Borgmatic, with Docker-CLI downloaded and installed on container startup. |
|
||||||
|
| 1.5.xx | Specific versions of Borgmatic |
|
||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
To set your backup timing and configuration, you will need to create [crontab.txt](data/borgmatic.d/crontab.txt) and your borgmatic [config.yaml](data/borgmatic.d/config.yaml) and mount these files into the `/etc/borgmatic.d/` directory. When the container starts it creates the crontab from `crontab.txt` and starts crond. By cloning this repo in `/opt/docker/`, you will have a working setup to get started.
|
Please look at this [guide](https://www.modem7.com/books/docker-backup/page/backup-docker-using-borgmatic) to help you run this container.
|
||||||
|
|
||||||
|
To set your backup timing and configuration, you will need to create [crontab.txt](https://github.com/modem7/docker-borgmatic/blob/master/base-fullbuild/data/borgmatic.d/crontab.txt) and your borgmatic [config.yaml](https://github.com/modem7/docker-borgmatic/blob/master/base-fullbuild/data/borgmatic.d/config.yaml) and mount these files into the `/etc/borgmatic.d/` directory. When the container starts it creates the crontab from `crontab.txt` and starts crond. By cloning this repo in `/opt/docker/`, you will have a working setup to get started.
|
||||||
|
|
||||||
If using remote repositories mount your .ssh to /root/.ssh within the container.
|
If using remote repositories mount your .ssh to /root/.ssh within the container.
|
||||||
|
|
||||||
|
@ -85,4 +102,4 @@ A non-volatile place to store the borg chunk cache.
|
||||||
3. Fuse-mount the backup: `borg mount /mnt/borg-repository <mount_point>`
|
3. Fuse-mount the backup: `borg mount /mnt/borg-repository <mount_point>`
|
||||||
4. Restore your files
|
4. Restore your files
|
||||||
5. Finally unmount and exit: `borg umount <mount_point> && exit`.
|
5. Finally unmount and exit: `borg umount <mount_point> && exit`.
|
||||||
- In case Borg fails to create/acquire a lock: `borg break-lock /mnt/repository`
|
- In case Borg fails to create/acquire a lock: `borg break-lock /mnt/repository`
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
FROM modem7/borgmatic-docker
|
||||||
|
COPY entry.sh /entry.sh
|
||||||
|
RUN apk update \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
docker-cli \
|
||||||
|
&& rm -rf /var/cache/apk/* \
|
||||||
|
/.cache \
|
||||||
|
&& chmod 755 /entry.sh
|
||||||
|
CMD ["/entry.sh"]
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Import your cron file
|
||||||
|
/usr/bin/crontab /etc/borgmatic.d/crontab.txt
|
||||||
|
#Variables
|
||||||
|
borgver=$(borg --version)
|
||||||
|
borgmaticver=$(borgmatic --version)
|
||||||
|
#Software versions
|
||||||
|
docker --version
|
||||||
|
echo borgmatic $borgmaticver
|
||||||
|
echo $borgver
|
||||||
|
# Start cron
|
||||||
|
/usr/sbin/crond -f -L /dev/stdout
|
|
@ -1,9 +1,7 @@
|
||||||
FROM alpine:3.13 as builder
|
FROM alpine:3.13 as builder
|
||||||
LABEL mainainer='b3vis'
|
COPY requirements.txt /requirements.txt
|
||||||
ARG BORG_VERSION=1.1.17
|
RUN apk update --no-cache \
|
||||||
ARG BORGMATIC_VERSION=1.5.18
|
&& apk upgrade --no-cache \
|
||||||
ARG LLFUSE_VERSION=1.4.1
|
|
||||||
RUN apk upgrade --no-cache \
|
|
||||||
&& apk add --no-cache \
|
&& apk add --no-cache \
|
||||||
alpine-sdk \
|
alpine-sdk \
|
||||||
python3-dev \
|
python3-dev \
|
||||||
|
@ -15,15 +13,14 @@ RUN apk upgrade --no-cache \
|
||||||
fuse-dev \
|
fuse-dev \
|
||||||
attr-dev \
|
attr-dev \
|
||||||
py3-wheel \
|
py3-wheel \
|
||||||
&& pip3 install --upgrade pip \
|
&& pip3 install -U -r requirements.txt
|
||||||
&& pip3 install --upgrade borgbackup==${BORG_VERSION} \
|
|
||||||
&& pip3 install --upgrade borgmatic==${BORGMATIC_VERSION} \
|
|
||||||
&& pip3 install --upgrade llfuse==${LLFUSE_VERSION}
|
|
||||||
|
|
||||||
FROM alpine:3.13
|
FROM alpine:3.13
|
||||||
LABEL mainainer='b3vis'
|
LABEL mainainer='modem7'
|
||||||
|
ARG PYTHON_VERSION=3.8
|
||||||
COPY entry.sh /entry.sh
|
COPY entry.sh /entry.sh
|
||||||
RUN apk upgrade --no-cache \
|
RUN apk update --no-cache \
|
||||||
|
&& apk upgrade --no-cache \
|
||||||
&& apk add --no-cache \
|
&& apk add --no-cache \
|
||||||
tzdata \
|
tzdata \
|
||||||
sshfs \
|
sshfs \
|
||||||
|
@ -44,7 +41,7 @@ VOLUME /etc/borgmatic.d
|
||||||
VOLUME /root/.config/borg
|
VOLUME /root/.config/borg
|
||||||
VOLUME /root/.ssh
|
VOLUME /root/.ssh
|
||||||
VOLUME /root/.cache/borg
|
VOLUME /root/.cache/borg
|
||||||
COPY --from=builder /usr/lib/python3.8/site-packages /usr/lib/python3.8/
|
COPY --from=builder /usr/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/
|
||||||
COPY --from=builder /usr/bin/borg /usr/bin/
|
COPY --from=builder /usr/bin/borg /usr/bin/
|
||||||
COPY --from=builder /usr/bin/borgfs /usr/bin/
|
COPY --from=builder /usr/bin/borgfs /usr/bin/
|
||||||
COPY --from=builder /usr/bin/borgmatic /usr/bin/
|
COPY --from=builder /usr/bin/borgmatic /usr/bin/
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Import your cron file
|
||||||
|
/usr/bin/crontab /etc/borgmatic.d/crontab.txt
|
||||||
|
#Variables
|
||||||
|
borgver=$(borg --version)
|
||||||
|
borgmaticver=$(borgmatic --version)
|
||||||
|
#Software versions
|
||||||
|
echo borgmatic $borgmaticver
|
||||||
|
echo $borgver
|
||||||
|
# Start cron
|
||||||
|
/usr/sbin/crond -f -L /dev/stdout
|
|
@ -0,0 +1,4 @@
|
||||||
|
pip==20.2.4
|
||||||
|
borgbackup==1.1.16
|
||||||
|
borgmatic==1.5.14
|
||||||
|
llfuse==1.3.8
|
|
@ -0,0 +1,11 @@
|
||||||
|
TZ=Europe/Berlin
|
||||||
|
BORG_PASSPHRASE=ReplaceWithYourSecretPassPhrase
|
||||||
|
VOLUME_SOURCE=/home
|
||||||
|
VOLUME_TARGET=./data/repository
|
||||||
|
VOLUME_ETC_BORGMATIC=./data/borgmatic.d
|
||||||
|
VOLUME_DOT_BORGMATIC=./data/.borgmatic
|
||||||
|
VOLUME_BORG_CONFIG=./data/.config/borg
|
||||||
|
VOLUME_SSH=./data/.ssh
|
||||||
|
VOLUME_BORG_CACHE=./data/.cache/borg
|
||||||
|
# for NTFY flavour only
|
||||||
|
#VOLUME_NTFY=./data/ntfy
|
|
@ -0,0 +1,5 @@
|
||||||
|
data/.cache/
|
||||||
|
data/.config/
|
||||||
|
data/.ssh/
|
||||||
|
data/repository/
|
||||||
|
.env
|
|
@ -0,0 +1,51 @@
|
||||||
|
FROM alpine:3.14 as builder
|
||||||
|
COPY requirements.txt /requirements.txt
|
||||||
|
RUN apk update --no-cache \
|
||||||
|
&& apk upgrade --no-cache \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
alpine-sdk \
|
||||||
|
python3-dev \
|
||||||
|
py3-pip \
|
||||||
|
openssl-dev \
|
||||||
|
lz4-dev \
|
||||||
|
acl-dev \
|
||||||
|
linux-headers \
|
||||||
|
fuse-dev \
|
||||||
|
attr-dev \
|
||||||
|
py3-wheel \
|
||||||
|
&& pip3 install -U -r requirements.txt
|
||||||
|
|
||||||
|
FROM alpine:3.14
|
||||||
|
LABEL mainainer='modem7'
|
||||||
|
ARG PYTHON_VERSION=3.9
|
||||||
|
COPY entry.sh /entry.sh
|
||||||
|
RUN apk update --no-cache \
|
||||||
|
&& apk upgrade --no-cache \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
tzdata \
|
||||||
|
sshfs \
|
||||||
|
python3 \
|
||||||
|
openssl \
|
||||||
|
fuse \
|
||||||
|
ca-certificates \
|
||||||
|
lz4-libs \
|
||||||
|
libacl \
|
||||||
|
postgresql-client \
|
||||||
|
mariadb-client \
|
||||||
|
curl \
|
||||||
|
&& rm -rf /var/cache/apk/* \
|
||||||
|
&& chmod 755 /entry.sh
|
||||||
|
VOLUME /mnt/source
|
||||||
|
VOLUME /mnt/borg-repository
|
||||||
|
VOLUME /etc/borgmatic.d
|
||||||
|
VOLUME /root/.config/borg
|
||||||
|
VOLUME /root/.ssh
|
||||||
|
VOLUME /root/.cache/borg
|
||||||
|
COPY --from=builder /usr/lib/python${PYTHON_VERSION}/site-packages /usr/lib/python${PYTHON_VERSION}/
|
||||||
|
COPY --from=builder /usr/bin/borg /usr/bin/
|
||||||
|
COPY --from=builder /usr/bin/borgfs /usr/bin/
|
||||||
|
COPY --from=builder /usr/bin/borgmatic /usr/bin/
|
||||||
|
COPY --from=builder /usr/bin/generate-borgmatic-config /usr/bin/
|
||||||
|
COPY --from=builder /usr/bin/upgrade-borgmatic-config /usr/bin/
|
||||||
|
COPY --from=builder /usr/bin/validate-borgmatic-config /usr/bin/
|
||||||
|
CMD ["/entry.sh"]
|
|
@ -0,0 +1,35 @@
|
||||||
|
location:
|
||||||
|
source_directories:
|
||||||
|
- /mnt/source
|
||||||
|
repositories:
|
||||||
|
- /mnt/borg-repository
|
||||||
|
one_file_system: true
|
||||||
|
|
||||||
|
storage:
|
||||||
|
# Passphase is set in varibable $BORG_PASSPHRASE
|
||||||
|
# encryption_passphrase: "DonNotMissToChangeYourPassphrase"
|
||||||
|
compression: lz4
|
||||||
|
archive_name_format: 'backup-{now}'
|
||||||
|
|
||||||
|
retention:
|
||||||
|
keep_hourly: 2
|
||||||
|
keep_daily: 7
|
||||||
|
keep_weekly: 4
|
||||||
|
keep_monthly: 12
|
||||||
|
keep_yearly: 10
|
||||||
|
prefix: 'backup-'
|
||||||
|
|
||||||
|
consistency:
|
||||||
|
checks:
|
||||||
|
- repository
|
||||||
|
- archives
|
||||||
|
check_last: 3
|
||||||
|
prefix: 'backup-'
|
||||||
|
|
||||||
|
hooks:
|
||||||
|
before_backup:
|
||||||
|
- echo "Starting a backup job."
|
||||||
|
after_backup:
|
||||||
|
- echo "Backup created."
|
||||||
|
on_error:
|
||||||
|
- echo "Error while creating a backup."
|
|
@ -0,0 +1 @@
|
||||||
|
0 1 * * * PATH=$PATH:/usr/bin /usr/bin/borgmatic --stats -v 0 2>&1
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Import your cron file
|
||||||
|
/usr/bin/crontab /etc/borgmatic.d/crontab.txt
|
||||||
|
#Variables
|
||||||
|
borgver=$(borg --version)
|
||||||
|
borgmaticver=$(borgmatic --version)
|
||||||
|
#Software versions
|
||||||
|
echo borgmatic $borgmaticver
|
||||||
|
echo $borgver
|
||||||
|
# Start cron
|
||||||
|
/usr/sbin/crond -f -L /dev/stdout
|
|
@ -0,0 +1,4 @@
|
||||||
|
pip>=21.2.4
|
||||||
|
borgbackup>=1.1.17
|
||||||
|
borgmatic>=1.5.18
|
||||||
|
llfuse>=1.4.1
|
|
@ -0,0 +1,7 @@
|
||||||
|
FROM modem7/borgmatic-docker
|
||||||
|
COPY entry.sh /entry.sh
|
||||||
|
COPY wtfc.sh /wtfc.sh
|
||||||
|
RUN rm -rf /var/cache/apk/* \
|
||||||
|
/.cache \
|
||||||
|
&& chmod 755 /entry.sh /wtfc.sh
|
||||||
|
CMD ["/entry.sh"]
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
borgver=$(borg --version)
|
||||||
|
borgmaticver=$(borgmatic --version)
|
||||||
|
|
||||||
|
# Wait for internet connection
|
||||||
|
echo "Waiting for Internet connection...."
|
||||||
|
./wtfc.sh -Q -T 5 ping -c 4 www.google.com
|
||||||
|
echo "Internet connection established"
|
||||||
|
|
||||||
|
# Check variable to see if present, echo result
|
||||||
|
if [ -z "$LIVEINSTALL" ]
|
||||||
|
then
|
||||||
|
echo "Installing Docker-CLI"
|
||||||
|
else
|
||||||
|
echo "Installing $LIVEINSTALL"
|
||||||
|
fi
|
||||||
|
# Installing packages
|
||||||
|
apk update -q && apk add --no-cache -q ${LIVEINSTALL:-docker-cli}
|
||||||
|
|
||||||
|
# Import your cron file
|
||||||
|
/usr/bin/crontab /etc/borgmatic.d/crontab.txt
|
||||||
|
|
||||||
|
# Software versions
|
||||||
|
docker --version
|
||||||
|
echo borgmatic $borgmaticver
|
||||||
|
echo $borgver
|
||||||
|
|
||||||
|
# Start cron
|
||||||
|
/usr/sbin/crond -f -L /dev/stdout
|
|
@ -0,0 +1,254 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cmdname="${0##*/}"
|
||||||
|
|
||||||
|
VERSION=0.0.3
|
||||||
|
|
||||||
|
echoto() {
|
||||||
|
# print to stderr or to stdout
|
||||||
|
out=$1
|
||||||
|
shift 1
|
||||||
|
|
||||||
|
if ([ "${out}" -eq 2 ]); then
|
||||||
|
printf "$@" >&2
|
||||||
|
else
|
||||||
|
# stdout can be silenced only
|
||||||
|
if [ "${QUIET}" -eq 0 ]; then
|
||||||
|
printf "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
progress() {
|
||||||
|
if ([ "${PROGRESS}" -eq 1 ]); then
|
||||||
|
echoto 1 "."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
# (TODO) -F, --format-progress=FORMAT set FORMAT for progress, available: DOTS, PROGRESSBAR (default is DOTS)
|
||||||
|
OUTPUT=`cat <<EOF
|
||||||
|
Usage: $cmdname [OPTION]... [COMMAND]
|
||||||
|
wtfc (WaiT For The Command) waits for the COMMAND provided as the last argument or via standard input to return within timeout with expected exit status.
|
||||||
|
|
||||||
|
Functional arguments:
|
||||||
|
-I, --interval=SECONDS set the check interval to SECONDS (default is 1)
|
||||||
|
-S, --status=NUMBER set the expected COMMAND exit status to NUMBER (default is 0)
|
||||||
|
-T, --timeout=SECONDS set the timeout to SECONDS (0 for no timeout, default is 1)
|
||||||
|
|
||||||
|
Logging and info arguments:
|
||||||
|
-P, --progress show progress (default is 0)
|
||||||
|
-H, --help print this help and exit
|
||||||
|
-Q, --quiet be quiet
|
||||||
|
-V, --version display the version of wtfc and exit.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
./wtfc.sh -T 1 -S 0 ls /tmp Waits for 1 second for 'ls /tmp' to execute with exit status 0
|
||||||
|
echo "ls /foo/bar" | ./wtfc.sh -T 2 -S 2 Waits for 2 seconds for 'ls /foo/bar' to execute with exit status 2
|
||||||
|
EOF
|
||||||
|
`
|
||||||
|
|
||||||
|
# print to stderr (for exit status > 0), otherwise to stdout
|
||||||
|
if ([ "$1" -gt 0 ]); then
|
||||||
|
echo "${OUTPUT}" >&2
|
||||||
|
else
|
||||||
|
echo "${OUTPUT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
version() {
|
||||||
|
echo "wtfc (WaiT For the Command) version: ${VERSION}"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for(){
|
||||||
|
if [ "${TIMEOUT}" -gt 0 ]; then
|
||||||
|
echoto 1 "$cmdname: waiting $TIMEOUT seconds for $CMD\n"
|
||||||
|
else
|
||||||
|
echoto 1 "$cmdname: waiting without a timeout for $CMD\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
eval $CMD >/dev/null 2>&1
|
||||||
|
result=$?
|
||||||
|
|
||||||
|
if ([ "${result}" -eq "${STATUS}" ]); then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep $INTERVAL
|
||||||
|
|
||||||
|
progress
|
||||||
|
done
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_wrapper() {
|
||||||
|
TIME_START=$(date +%s)
|
||||||
|
|
||||||
|
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
|
||||||
|
if ([ "${QUIET}" -eq 1 ]); then
|
||||||
|
eval $TIMEOUT_CMD $TIMEOUT_FLAG $TIMEOUT $0 --quiet --child --status=$STATUS --timeout=$TIMEOUT $CMD &
|
||||||
|
else
|
||||||
|
eval $TIMEOUT_CMD $TIMEOUT_FLAG $TIMEOUT $0 --child --status=$STATUS --timeout=$TIMEOUT $CMD &
|
||||||
|
fi
|
||||||
|
PID=$!
|
||||||
|
trap "kill -INT -$PID" INT
|
||||||
|
|
||||||
|
while [ $(($(date +%s)-TIME_START)) -lt "${TIMEOUT}" ]; do
|
||||||
|
|
||||||
|
eval $CMD >/dev/null 2>&1
|
||||||
|
result=$?
|
||||||
|
|
||||||
|
if ([ "${result}" -eq "${STATUS}" ]); then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep $INTERVAL
|
||||||
|
|
||||||
|
progress
|
||||||
|
done
|
||||||
|
wait $PID
|
||||||
|
RESULT=$?
|
||||||
|
return $RESULT
|
||||||
|
}
|
||||||
|
|
||||||
|
# process arguments
|
||||||
|
while [ $# -gt 0 ]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
--child)
|
||||||
|
CHILD=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-H | --help)
|
||||||
|
usage 0
|
||||||
|
;;
|
||||||
|
-I)
|
||||||
|
INTERVAL="$2"
|
||||||
|
if [ -z "${INTERVAL}" ]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--interval=*)
|
||||||
|
INTERVAL="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-P | --progress)
|
||||||
|
PROGRESS=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-Q | --quiet)
|
||||||
|
QUIET=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-S)
|
||||||
|
STATUS="$2"
|
||||||
|
if [ -z "${STATUS}" ]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--status=*)
|
||||||
|
STATUS="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-T)
|
||||||
|
TIMEOUT="$2"
|
||||||
|
if [ -z "${TIMEOUT}" ]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--timeout=*)
|
||||||
|
TIMEOUT="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-V | --version)
|
||||||
|
version
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echoto 2 "Unknown argument: $1"
|
||||||
|
usage 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
CMD="$@"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# read from stdin, if no cmd provided
|
||||||
|
if [ -z "${CMD}" ]; then
|
||||||
|
read CMD
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${CMD}" ]; then
|
||||||
|
echoto 2 "Error: you need to provide a COMMAND to test as the last argument or via standard input.\n"
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CHILD=${CHILD:-0}
|
||||||
|
INTERVAL=${INTERVAL:-1}
|
||||||
|
PROGRESS=${PROGRESS:-0}
|
||||||
|
QUIET=${QUIET:-0}
|
||||||
|
STATUS=${STATUS:-0}
|
||||||
|
TIMEOUT=${TIMEOUT:-1}
|
||||||
|
|
||||||
|
# check to see if timeout is from busybox/alpine => '-t' switch is required or not
|
||||||
|
TIMEOUT_TEST="$(timeout 1 sleep 0 2>&1)"
|
||||||
|
case "${TIMEOUT_TEST}" in
|
||||||
|
timeout:\ can\'t\ execute\ \'1\':*) TIMEOUT_FLAG="-t" ;;
|
||||||
|
*) TIMEOUT_FLAG="" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
TIMEOUT_TEST="$(timeout ${TIMEOUT_FLAG} 1 sleep 0 2>&1)"
|
||||||
|
TIMEOUT_TEST_STATUS="$?"
|
||||||
|
|
||||||
|
# fallback for osx (uses gtimeout)
|
||||||
|
if [ "${TIMEOUT_TEST_STATUS}" -eq 127 ]; then
|
||||||
|
TIMEOUT_TEST="$(gtimeout ${TIMEOUT_FLAG} 1 sleep 0 2>&1)"
|
||||||
|
TIMEOUT_TEST_STATUS="$?"
|
||||||
|
|
||||||
|
if [ "${TIMEOUT_TEST_STATUS}" -eq 127 ]; then
|
||||||
|
TIMEOUT_TEST="$(gnu-timeout ${TIMEOUT_FLAG} 1 sleep 0 2>&1)"
|
||||||
|
TIMEOUT_TEST_STATUS="$?"
|
||||||
|
|
||||||
|
if [ "${TIMEOUT_TEST_STATUS}" -eq 127 ]; then
|
||||||
|
echoto 2 "timeout|gtimeout|gnu-timeout is required by the script, but not found!\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
TIMEOUT_CMD="gnu-timeout"
|
||||||
|
else
|
||||||
|
TIMEOUT_CMD="gtimeout"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
TIMEOUT_CMD="timeout"
|
||||||
|
fi
|
||||||
|
|
||||||
|
start_ts=$(date +%s)
|
||||||
|
|
||||||
|
if [ "${CHILD}" -eq 1 ]; then
|
||||||
|
wait_for
|
||||||
|
RESULT=$?
|
||||||
|
exit $RESULT
|
||||||
|
else
|
||||||
|
if [ "${TIMEOUT}" -gt 0 ]; then
|
||||||
|
wait_for_wrapper
|
||||||
|
RESULT=$?
|
||||||
|
else
|
||||||
|
wait_for
|
||||||
|
RESULT=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${RESULT}" -ne "${STATUS}" ]; then
|
||||||
|
echoto 2 "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $CMD to return status: $STATUS (was status: $RESULT)\n"
|
||||||
|
if [ "${RESULT}" -eq 0 ]; then
|
||||||
|
# exit with 1, inspite the fact original ended with 0 (as we expected non-0)
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
exit $RESULT
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
end_ts=$(date +%s)
|
||||||
|
echoto 1 "$cmdname: $CMD finished with expected status $RESULT after $((end_ts - start_ts)) seconds\n"
|
||||||
|
exit 0
|
||||||
|
fi
|
|
@ -1,16 +1,25 @@
|
||||||
version: '3'
|
version: "2.4"
|
||||||
services:
|
|
||||||
borgmatic:
|
|
||||||
container_name: borg-restore
|
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
borgmaticrestore:
|
||||||
|
container_name: Borg-restore
|
||||||
|
volumes:
|
||||||
|
- /mnt/samba/OldHD/ServerBackup/Borgmatic/:/mnt/borg-repository
|
||||||
|
- /home/alex/DockerApps/Borgmatic/borgmatic.d/:/etc/borgmatic.d/
|
||||||
|
- /home/alex/DockerApps/Borgmatic/.config/borg/:/root/.config/borg
|
||||||
|
- /home/alex/DockerApps/Borgmatic/.ssh/:/root/.ssh
|
||||||
|
- /home/alex/DockerApps/Borgmatic/.cache/borg/:/root/.cache/borg
|
||||||
|
- /dev/shm/Borgrestore:/RestoreMount
|
||||||
|
- /var/hda/files/drives/drive14/Test/Restore:/Restore
|
||||||
cap_add:
|
cap_add:
|
||||||
- SYS_ADMIN
|
- SYS_ADMIN
|
||||||
|
|
||||||
security_opt:
|
security_opt:
|
||||||
- apparmor:unconfined
|
- apparmor:unconfined
|
||||||
- label:disable
|
- label:disable
|
||||||
|
environment:
|
||||||
|
- TZ=$TZ
|
||||||
devices:
|
devices:
|
||||||
- /dev/fuse:/dev/fuse
|
- /dev/fuse:/dev/fuse
|
||||||
|
|
||||||
command: /bin/sh
|
command: /bin/sh
|
||||||
|
image: modem7/borgmatic-docker
|
|
@ -1,8 +1,8 @@
|
||||||
version: '3'
|
version: '2.4'
|
||||||
services:
|
services:
|
||||||
borgmatic:
|
borgmatic:
|
||||||
image: b3vis/borgmatic
|
image: modem7/borgmatic-docker
|
||||||
container_name: borgmatic
|
container_name: Borgmatic
|
||||||
volumes:
|
volumes:
|
||||||
- ${VOLUME_SOURCE}:/mnt/source:ro # backup source
|
- ${VOLUME_SOURCE}:/mnt/source:ro # backup source
|
||||||
- ${VOLUME_TARGET}:/mnt/borg-repository # backup target
|
- ${VOLUME_TARGET}:/mnt/borg-repository # backup target
|
||||||
|
|
5
entry.sh
5
entry.sh
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# Import your cron file
|
|
||||||
/usr/bin/crontab /etc/borgmatic.d/crontab.txt
|
|
||||||
# Start cron
|
|
||||||
/usr/sbin/crond -f -L /dev/stdout
|
|
Ładowanie…
Reference in New Issue