diff --git a/README.md b/README.md index 0fd7180..343cafd 100644 --- a/README.md +++ b/README.md @@ -1 +1,77 @@ -git.limbosolutions.com/kb/borg-backup \ No newline at end of file +# borg-backup + + + +## container image + +## environment variables + + + +``` bash +docker run git.limbosolutions.com/kb/borg-backup:latest +``` + +### docker compose + +Example of simple usage for creating a backup + +```yaml +services: + borg-backup: + image: git.limbosolutions.com/kb/borg-backup:latest + command: create ${BORG_REPO}::repos-$(date +%Y%m%d%H%M%S) /mnt/user + restart: no + + volumes: + - ./home/user:/mnt/user # Mount local folder to container + + environment: + - BORG_REPO=????? + - BORG_RSH="ssh -o StrictHostKeyChecking=no" + - BORG_PASSPHRASE=???? + + configs: + - source: id_ed25519 # required for ssh client + target: /home/borg/.ssh/id_ed25519 + - source: borg_key # required for borg client + target: /app/borg/key + + +configs: + + id_ed25519: + content: | + -----BEGIN OPENSSH PRIVATE KEY----- + ************** + ************** + -----END OPENSSH PRIVATE KEY----- + + borg_key: + content: | + BORG_KEY ??????? + ???????????????? + ???????????????? + + +``` + +### dev + +``` bash +docker compose \ +--project-name borg-backup-dev \ +-f docker-compose.dev.yaml \ +-f docker-compose.dev.local.yaml \ +up +``` + +Force Build: + +``` bash +docker compose \ +--project-name borg-backup-dev \ +-f docker-compose.dev.yaml \ +-f docker-compose.dev.local.yaml \ +up --build +``` diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 0000000..529bd33 --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,35 @@ +services: + borg: + tty: true + stdin_open: true + # entrypoint: ["bash"] + build: + dockerfile: docker/Dockerfile + context: . + environment: + - BORG_REPO=??????? + - BORG_RSH="ssh -o StrictHostKeyChecking=no" + - BORG_PASSPHRASE=???? + + configs: + - source: id_ed25519 + target: /home/borg/.ssh/id_ed25519 + - source: borg_key + target: /app/borg/key + + volumes: + - ./docker/app/scripts:/app/scripts +configs: + + id_ed25519: + content: | + -----BEGIN OPENSSH PRIVATE KEY----- + ??????? + ??????? + -----END OPENSSH PRIVATE KEY----- + + borg_key: + content: | + BORG_KEY ??????? + ???????????????? + ???????????????? \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index 44a282f..0000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -services: - borg: - build: - dockerfile: /docker/dockerfile - context: . - environment: - - BORG_REPO=${BORG_REPO} - - BORG_RSH=${BORG_RSH} - - BORG_PASSPHRASE=${BORG_PASSPHRASE} - - SSH_ID=${SSH_ID} - - BORG_KEY=${BORG_KEY} diff --git a/docker/Dockerfile b/docker/Dockerfile index 3ffa98d..0783da2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,16 +1,25 @@ -FROM ubuntu:latest +FROM alpine:latest -RUN apt-get update - -RUN apt-get install -y \ - python3 \ - python3-pip \ - borgbackup \ - fuse \ - python3-pyfuse3 \ - openssh-client +# Install BorgBackup and OpenSSH client +RUN apk update && apk add --no-cache \ + borgbackup \ + openssh \ + bash \ + tzdata COPY ./docker/app /app -RUN chmod +x /app/scripts/ffenv -RUN ln -s /app/scripts/ffenv /usr/local/bin/ffenv +RUN chmod +x /app/scripts -R +RUN ln -s /app/scripts/loadenv /usr/local/bin/loadenv +RUN ln -s /app/scripts/remote-connect /usr/local/bin/remote-connect +RUN ln -s /app/scripts/remote-connect /usr/local/bin/remote-get-folder-size +RUN addgroup -S borg && adduser -S borg -G borg +USER borg +WORKDIR /home/borg + +RUN echo "source /usr/local/bin/loadenv" > ~/.bash_profile +RUN echo "source /usr/local/bin/loadenv" > ~/.bashrc + +ENTRYPOINT ["bash" , "-c", "borg $0"] + +CMD ["--help"] \ No newline at end of file diff --git a/docker/app/scripts/ffenv b/docker/app/scripts/ffenv deleted file mode 100644 index 2eaab7e..0000000 --- a/docker/app/scripts/ffenv +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -echo "checking SSH_ID..." -if [[ "${SSH_ID}" ]]; then - echo "found SSH_ID..." - mkdir -p /root/.ssh - echo "${SSH_ID}" > /root/.ssh/id_rsa - chmod 700 /root/.ssh/id_rsa -fi -echo "checking BORG_KEY..." -if [[ "${BORG_KEY}" ]]; then - echo "found BORG_KEY..." - mkdir -p /root/.config/borg/keys - echo "${BORG_KEY}" > /root/.config/borg/keys/key -fi - - - - - diff --git a/docker/app/scripts/loadenv b/docker/app/scripts/loadenv new file mode 100755 index 0000000..1fa1e68 --- /dev/null +++ b/docker/app/scripts/loadenv @@ -0,0 +1,32 @@ +#!/bin/bash + + +(return 0 2>/dev/null) || { + echo "Please source this script: source $0" + exit 1 +} + + +if [ -f "/app/borg/key" ]; then + export BORG_KEY_FILE="/app/borg/key" +fi + + +# extracts ssh connection from borg-repo +export SSH_CONNECTION="${BORG_REPO#ssh://}" +export SSH_CONNECTION="${SSH_CONNECTION%%/*}" + +#extract folder from ssh connection +export SSH_FOLDER="/${BORG_REPO#ssh://*/}" + + +export SSH_COMMAND="ssh" +if [ "${BORG_RSH}" ]; then + export SSH_COMMAND=${BORG_RSH} +fi + +export SSH_COMMAND="$SSH_COMMAND $SSH_CONNECTION" + + + + diff --git a/docker/app/scripts/remote-connect b/docker/app/scripts/remote-connect new file mode 100755 index 0000000..300c045 --- /dev/null +++ b/docker/app/scripts/remote-connect @@ -0,0 +1,11 @@ +#/bin/bash +source /app/scripts/loadenv +#echo "Received: $@" +#echo "Trace: Connecting with: ${SSH_COMMAND[@]}" "$@" + +# converts command to array +read -r -a SSH_COMMAND_ARRAY <<< "$SSH_COMMAND" + +#echo "Running: ${SSH_COMMAND_ARRAY[@]} $@" +# executes ssh command with all arguments received from caller +"${SSH_COMMAND_ARRAY[@]}" "$@" diff --git a/docker/app/scripts/remote-get-folder-size b/docker/app/scripts/remote-get-folder-size new file mode 100755 index 0000000..d02b5c6 --- /dev/null +++ b/docker/app/scripts/remote-get-folder-size @@ -0,0 +1,5 @@ +#/bin/bash +source loadenv +repo_size_bytes=$(remote-connect du -b "$SSH_FOLDER" -d 0) +repo_size_bytes=$(echo "$repo_size_bytes" | awk '{print $1}') +echo "$repo_size_bytes" \ No newline at end of file