Borg Backup for Container Config
Install latest release of https://www.borgbackup.org/ from https://github.com/borgbackup/borg/releases
-
custom backup scripts to backup container configs from
/etc/svc/config/${APPNAME}
1. Initialization of backups
- create a new borg repository locally in /dev/shm/${APPNAME}
- Create a new github repository under pknw1-config/borg-${APPNAME}
- Push the base files as the initial commit
export APPNAME=bookstack
export CONF_FOLDER=/etc/svc/config/${APPNAME}
borg repo-create --encryption repokey-aes-ocb -r /dev/shm/${APPNAME}
gh repo create pknw1-config/borg-${APPNAME} --private
cd /dev/shm/${APPNAME}
git init && git add . && git commit -m "init" && git branch -M main && git remote add origin git@github.com:pknw1-config/borg-${APPNAME}.git && git push -u origin main
- create an initial backup
borg -p -r /dev/shm/${APPNAME} create ${APPNAME} -e '*MediaCover*' -e '*Logs*' -e '*logs*' -e '*Backups*' -e '*cache*' -e 'metadata' --stats "init" ${CONF_FOLDER}
2. Regular Backups
borg-docker-auto.sh
#!/bin/bash
BRANCH=$(date +%s)
COMMIT=$BRANCH
export BORG_PASSPHRASE=****secret****
if [[ $# -eq 0 ]]
then
echo "no application specified - trying to guess"
GUESS=$(pwd | awk -F/ '{print $NF}')
if [[ -d /etc/svc/config/${GUESS} ]] || [[ -d /etc/pknw1/config/${GUESS} ]]
then
echo " ${GUESS}"
read -N 1 -p "Guessed App ${GUESS} found : Proceed? [Y/N] : " PROCEED
PROCEEDU=$(echo ${PROCEED} | tr '[:lower:]' '[:upper:]')
if [[ ${PROCEEDU} == "Y" ]]
then
echo "Y"
APPNAME=${GUESS}
else
echo "N"
exit 0
fi
else
echo "could not guess"
fi
else
echo "appname ${1} supplied"
APPNAME=$1
fi
REMOTE_REPO=$(git ls-remote git@github.com:pknw1-config/borg-${APPNAME}.git)
if ! [[ -z ${REMOTE_REPO} ]]
then
echo "repo found"
else
echo "no repo"
exit 128
fi
[[ -d /etc/svc/config/${APPNAME} ]] && read -p "Using config folder /etc/svc/config/${APPNAME} - or enter alternative locatioon: " CONF_FOLDER_OVERRIDE
if [[ -z ${CONF_FOLDER_OVERRIDE} ]]
then
echo "using default"
CONF_FOLDER=/etc/svc/config/${APPNAME}
else
while ! [[ -d ${CONF_FOLDER_OVERRIDE} ]]
do
read -p " Error ${CONF_FOLDER_OVERRIDE} folder not found - enter a new location : " CONF_FOLDER_OVERRIDE
if [[ -z ${CONF_FOLDER_OVERRIDE} ]]
then
echo "no location"
exit 127
fi
done
echo "using ${CONF_FOLDER_OVERRIDE}"
CONF_FOLDER=${CONF_FOLDER_OVERRIDE}
fi
echo $CONF_FOLDER
MATCHED_CONTAINERS=$(docker ps | grep $APPNAME | awk '{print $2}' )
MATCHED_CONTAINERS_COUNT=$(docker ps | grep $APPNAME | awk '{print $2}'|wc -l )
case $MATCHED_CONTAINERS_COUNT in
"0") echo "Error zero"
exit 128
;;
"1") VALID_LIST=[]
VALID_LIST+=(${MATCHED_CONTAINERS})
;;
*) echo $MATCHED_CONTAINERS_COUNT
VALID_LIST=[]
FIRST_CONTAINER=$(docker ps | grep $APPNAME | awk '{print $2}'|head -n1)
PROJECT=$(docker inspect ${FIRST_CONTAINER}| grep '"com.docker.compose.project"' | awk -F\" '{print $4}')
for TEST_CONTAINER in $(docker ps | grep $APPNAME | awk '{print $2}')
do
PROJECT_TEST=$(docker inspect ${TEST_CONTAINER}| grep '"com.docker.compose.project"' | awk -F\" '{print $4}')
if [[ ${PROJECT_TEST} == ${PROJECT} ]]
then
#echo "add"
VALID_LIST+=(${TEST_CONTAINER})
fi
done
;;
esac
for CONTAINER in "${VALID_LIST[@]}" # or you can use “${stringPhrases[*]}”
do
echo "Stopping $CONTAINER";
docker stop ${CONTAINER}
done
[[ -d /dev/shm/${APPNAME} ]] || git clone git@github.com:pknw1-config/borg-${APPNAME}.git /dev/shm/${APPNAME}
cd /dev/shm/${APPNAME} && git checkout -b ${BRANCH}
borg -p -r /dev/shm/${APPNAME} create ${APPNAME} -e '*MediaCover*' -e '*Logs*' -e '*logs*' -e '*Backups*' -e '*cache*' -e 'metadata' --stats $COMMIT ${CONF_FOLDER}
git add . && git commit -m ${COMMIT} && git push -u origin ${BRANCH}
for CONTAINER in "${VALID_LIST[@]}" # or you can use “${stringPhrases[*]}”
do
echo "Starting $CONTAINER";
docker start ${CONTAINER}
done
Using the backup script borg-docker-auto.sh ${APPNAME}
will
- find all running containers under the app project and
docker stop
each container - if
/dev/shm/${APPNAME}
doesnt exist, it will clone the remote repopknw1-config/borg-${APPNAME}
is cloned locally - a nw git branch is created
- borg backup from
/etc/svc/config/${APPNAME}
is done to the folder - all files are
git add
,git commit
andgit push
to the new branch - each of the stopped containers are re-restarted with docker start