Files
borg/README.md
2025-09-21 20:20:57 +01:00

4.6 KiB

borg-backup

https://www.borgbackup.org/

container image

environment variables

https://borgbackup.readthedocs.io/en/stable/usage/general.html#environment-variables

borg init repo

services:
   borg-backup:
    image: git.limbosolutions.com/kb/borg-backup:latest
    restart: no
    environment:
      - BORG_REPO=${BORG_REPO}
      - BORG_RSH=ssh -o StrictHostKeyChecking=no -p 2222
      - BORG_PASSPHRASE="${BORG_PASSPHRASE}"
      - MODE=SHELL # Valid modes are: BORG, SCRIPT, SHELL, default is BORG
    configs:

      - source: id_ed25519
        target: /root/.ssh/id_ed25519
        mode: 0400

    command:
      - |
        borg init --encryption=keyfile-blake2 $BORG_REPO
        cat /root/.config/borg/keys/*

configs:

  id_ed25519:
      file: ~/.ssh/id_ed25519

creating a backup

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_REPO}
      - BORG_RSH=ssh -o StrictHostKeyChecking=no -p 2222
      - BORG_PASSPHRASE="${BORG_PASSPHRASE}"

    configs:
      - source: id_ed25519 # required for ssh client
        mode: 0400
        target: /root/.ssh/id_ed25519     
      - source: borg_key # required for borg client
        target: /app/borg/key
        mode: 0400
        
configs:

  id_ed25519:
      file: ~/.ssh/id_ed25519

  borg_key:
    content: |
      ${BORG_KEY}

using a bash script

services:
  borg:
    image: git.limbosolutions.com/kb/borg-backup:alpha

    environment:
      - BORG_REPO=${BORG_REPO}
      - BORG_RSH=${BORG_RSH}
      - OFFSITE_TARGET_FOLDER=${OFFSITE_TARGET_FOLDER}
      - BORG_PASSPHRASE="${BORG_PASSPHRASE}"
      - REPO_SYNC_MAX_SIZE=10737418240 #10GB
      - MODE=SCRIPT
    volumes:
        - "/home/mf/repos:/backup/repos"

    configs:
      - source: backup_script
        target: /app/backup-scripts/backup
        mode: 0400

      - source: id_ed25519
        target: /root/.ssh/id_ed25519
        mode: 0400
      - source: borg_key
        target: /app/borg/key
        mode: 0400      
configs:
  backup_script:
    content: |

      #!/bin/bash
      set -e
      SCRIPT_START_TIME=$$(date +%s)

      borg create $${BORG_REPO}::backup-$$(date +%Y%m%d%H%M%S) /backup
      borg prune -v --list --keep-daily=10 --keep-weekly=7 --keep-monthly=-1 $${BORG_REPO} --glob-archives='backup-*'
               
      # check repo size
      REPO_SIZE_IN_BYTES="$$(remote-get-folder-size)"
      echo "Repository size: $$((REPO_SIZE_IN_BYTES / 1024 / 1024)) MB"

      if [ $$REPO_SIZE_IN_BYTES -gt $$REPO_SYNC_MAX_SIZE ]; then \
          echo "ERROR: Repository size exceeds $$REPO_SYNC_MAX_SIZE";
          exit 1;
      else 
          # Repository size is within limits for offsite sync
          # ssh to backup server and enforce rclone to offsite
          remote-connect "rclone sync $$SSH_FOLDER $$OFFSITE_TARGET_FOLDER --progress" && \
          echo "INFO: Backup offsite sync Finished.($$(date -u -d "@$$(($$(date +%s) - SCRIPT_START_TIME))" +%H:%M:%S))"
      fi
      exit 0

  id_ed25519:
    file: ~/.ssh/id_ed25519

  borg_key:
    content: |
      ${BORG_KEY}

Using binding volumes

Creates folder ./backup-scripts And file ./backup-scripts/backup.

services:
  borg:
    image: git.limbosolutions.com/kb/borg-backup:latest

    environment:
      - BORG_REPO=${BORG_REPO}
      - BORG_RSH=${BORG_RSH}
      - BORG_PASSPHRASE="${BORG_PASSPHRASE}"
      - MODE=SCRIPT
    volumes:
        - "./backup-scripts:/app/backup-scripts"
        - "/home/mf/repos:/backup/repos"

    configs:
      - source: id_ed25519
        target: /root/.ssh/id_ed25519
        mode: 0400
      - source: borg_key
        target: /app/borg/key
        mode: 0400      
configs:
   
  id_ed25519:
    file: ~/.ssh/id_ed25519

  borg_key:
    content: |
      ${BORG_KEY}

dev

For development environment and testing this docker compose files.

BUILD=""

# uncomment do force build
BUILD="--build"

if [ ! -f ./docker-compose.dev.local.yaml ]; then
  touch ./docker-compose.dev.local.yaml
EOF
fi

docker compose \
--project-name borg-backup-dev \
-f docker-compose.dev.yaml \
-f docker-compose.dev.local.yaml \
up $BUILD