bash-scripts/backup-yunohost.sh

115 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/env bash
#set -euo pipefail
#trap 's=$?; echo >&2 "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR
TARGET=/yunohost-backups
HOST=yunohost
TODAY_DATE=$(date '+%F')
LOGFILE=${TARGET}/$TODAY_DATE.$$.log
ERR=0
NUMRETAINBACKUPS=10
echo "yunohost backup begin $(date):" >$LOGFILE
#date >>$LOGFILE
# delete max. 3 old backups per run
for i in 1 2 3
do
NUMBACKUPS=$(ssh ${HOST} sudo yunohost backup list | grep -- '-' | wc -l) || { echo yunohost could not list backups $(date) >>$LOGFILE ; exit 1; }
# ERR=$?
# if [ ${ERR} -ne 0 ]
# then
# echo yunohost could not list backups >>$LOGFILE
# date >>$LOGFILE
# exit 1
# fi
if [ ${NUMBACKUPS} -gt ${NUMRETAINBACKUPS} ]
then
BACKTODEL=$(ssh ${HOST} sudo yunohost backup list | grep -- '-' | head -1 | cut -d" " -f4)
echo 'the following backup will be deleted on ${HOST}:' &>>$LOGFILE
ssh ${HOST} sudo yunohost backup info ${BACKTODEL} &>>$LOGFILE
ssh ${HOST} "sudo yunohost backup delete ${BACKTODEL}" &>>$LOGFILE
fi
done
# It's hightly recommended to make your backup when the service is stopped. Please stop gitea service with this command before to run the backup 'systemctl stop gitea.service'
echo "stopping gitea service on ${HOST}" &>>$LOGFILE
ssh ${HOST} sudo systemctl stop gitea.service &>>$LOGFILE
ssh ${HOST} sudo yunohost backup create &>>$LOGFILE
ERR=$?
if [ ${ERR} == 0 ]
then
echo yunohost backup successfully created >>$LOGFILE
else
echo yunohost backup did NOT complete >>$LOGFILE
fi
echo "starting gitea service on ${HOST}" &>>$LOGFILE
ssh ${HOST} sudo systemctl start gitea.service &>>$LOGFILE
echo "yunohost backup ended:" >>$LOGFILE
date >>$LOGFILE
BACKUPFILE=$(ssh ${HOST} sudo yunohost backup list --with-info -H | grep -A 3 $TODAY_DATE | grep 'path:' | cut -d":" -f2 | tr -d " " | tail -1)
scp ${HOST}:${BACKUPFILE} ${TARGET} && echo "${BACKUPFILE} successfully copied to ${TARGET}!" &>>$LOGFILE || echo "error when trying to scp ${BACKUPFILE} to ${TARGET}!" &>>$LOGFILE
ls -lisah ${TARGET}/`basename ${BACKUPFILE}` >>$LOGFILE
gzip -9 ${TARGET}/`basename ${BACKUPFILE}` &>>$LOGFILE
ls -lisah ${TARGET}/`basename ${BACKUPFILE}`.gz &>>$LOGFILE
source /root/.bashrc
echo restic backup on ${HOST} at $(date) &>>${LOGFILE}
#ssh ${HOST} sudo { source /root/.bashrc ; /usr/bin/restic backup /home/yunohost.backup/archives ; } &>>$LOGFILE
ssh ${HOST} "sudo /root/bin/restic.sh" &>>$LOGFILE
restic check --read-data-subset 20% &>>$LOGFILE
restic stats &>>$LOGFILE
rclone about onedrive_b2: &>>$LOGFILE
# algo to create the "keep"-array copied from https://serverfault.com/questions/575163/how-to-keep-daily-backups-for-a-week-weekly-for-a-month-monthly-for-a-year-a
# it keeps 8 daily backups and 5 weekly (every sunday) backups
# in addition 13 monthly backups (first sunday of every month) and 6 yearly backups (first sunday of every year)
cd ${TARGET}
# keep 6 daily backups
for i in {0..5}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
# keep 3 weekly backups
for i in {0..2}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
# keep 11 monthly backups
for i in {0..10}; do
DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
# keep 6 yearly backups
for i in {0..5}; do
DW=$(date +%-W)
for (( AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
#echo ${!keep[@]}
echo space in filesys of ${TARGET} before pruning backups &>>$LOGFILE
df -h ${TARGET} &>>$LOGFILE
for i in *.tar.gz
do
DATE=`echo $i | cut -c1-8`
echo ${!keep[@]} | grep $DATE >/dev/null
if [ $? -ne 0 ]
then
echo pwd `pwd`
echo deleting $DATE &>>$LOGFILE
rm ${DATE}*.tar.* &>>$LOGFILE
rm ${DATE}*.log.* &>>$LOGFILE
fi
done
echo space in filesys of ${TARGET} after pruning backups &>>$LOGFILE
df -h ${TARGET} &>>$LOGFILE
echo "$0 on `hostname` ended:" >>$LOGFILE
date >>$LOGFILE
# Achtung, hier wird es kompliziert :) nach diesem Kommando keine Umleitung in $LOGFILE mehr
mv ${LOGFILE} ${TARGET}/`basename ${BACKUPFILE} .tar`.log
gzip -9 ${TARGET}/`basename ${BACKUPFILE} .tar`.log