2024-06-10 21:00:59 +02:00
#!/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
2024-06-25 17:04:18 +02:00
TODAY_DATE = $( date '+%F' )
2024-06-10 21:00:59 +02:00
LOGFILE = ${ TARGET } /$TODAY_DATE .$$ .log
2024-06-25 17:11:55 +02:00
DATEFMT = "+%d.%m.%y %H:%M:%S"
2024-06-10 21:00:59 +02:00
ERR = 0
NUMRETAINBACKUPS = 10
2024-06-25 17:11:55 +02:00
echo " yunohost backup begin $( date " ${ DATEFMT } " ) : " >$LOGFILE
2024-06-25 17:04:18 +02:00
#date >>$LOGFILE
2024-06-11 13:06:06 +02:00
# delete max. 3 old backups per run
2024-06-10 21:00:59 +02:00
for i in 1 2 3
do
2024-06-25 17:11:55 +02:00
NUMBACKUPS = $( ssh ${ HOST } sudo yunohost backup list | grep -- '-' | wc -l) || { echo yunohost could not list backups $( date " ${ DATEFMT } " ) >>$LOGFILE ; exit 1; }
2024-06-25 17:04:18 +02:00
# ERR=$?
# if [ ${ERR} -ne 0 ]
# then
# echo yunohost could not list backups >>$LOGFILE
# date >>$LOGFILE
# exit 1
# fi
2024-06-10 21:00:59 +02:00
if [ ${ NUMBACKUPS } -gt ${ NUMRETAINBACKUPS } ]
then
2024-06-25 17:04:18 +02:00
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
2024-06-10 21:00:59 +02:00
fi
done
2024-06-25 17:04:18 +02:00
# 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
2024-06-10 21:00:59 +02:00
ERR = $?
if [ ${ ERR } = = 0 ]
then
echo yunohost backup successfully created >>$LOGFILE
else
echo yunohost backup did NOT complete >>$LOGFILE
fi
2024-06-25 17:04:18 +02:00
echo " starting gitea service on ${ HOST } " & >>$LOGFILE
ssh ${ HOST } sudo systemctl start gitea.service & >>$LOGFILE
2024-06-10 21:00:59 +02:00
echo "yunohost backup ended:" >>$LOGFILE
2024-06-25 17:11:55 +02:00
date " ${ DATEFMT } " >>$LOGFILE
2024-06-25 17:04:18 +02:00
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
2024-06-10 21:00:59 +02:00
ls -lisah ${ TARGET } /` basename ${ BACKUPFILE } ` >>$LOGFILE
2024-06-25 17:04:18 +02:00
gzip -9 ${ TARGET } /` basename ${ BACKUPFILE } ` & >>$LOGFILE
ls -lisah ${ TARGET } /` basename ${ BACKUPFILE } ` .gz & >>$LOGFILE
source /root/.bashrc
2024-06-25 17:11:55 +02:00
echo restic backup on ${ HOST } at $( date " ${ DATEFMT } " ) & >>${ LOGFILE }
2024-06-25 17:04:18 +02:00
#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
2024-06-10 21:00:59 +02:00
# 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 }
2024-06-11 13:06:06 +02:00
# 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
2024-06-10 21:00:59 +02:00
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[@]}
2024-06-25 17:04:18 +02:00
echo space in filesys of ${ TARGET } before pruning backups & >>$LOGFILE
df -h ${ TARGET } & >>$LOGFILE
2024-06-10 21:08:52 +02:00
for i in *.tar.gz
2024-06-10 21:00:59 +02:00
do
DATE = ` echo $i | cut -c1-8`
echo ${ !keep[@] } | grep $DATE >/dev/null
if [ $? -ne 0 ]
then
2024-06-10 21:08:52 +02:00
echo pwd ` pwd `
2024-06-25 17:04:18 +02:00
echo deleting $DATE & >>$LOGFILE
rm ${ DATE } *.tar.* & >>$LOGFILE
rm ${ DATE } *.log.* & >>$LOGFILE
2024-06-10 21:00:59 +02:00
fi
done
2024-06-25 17:04:18 +02:00
echo space in filesys of ${ TARGET } after pruning backups & >>$LOGFILE
df -h ${ TARGET } & >>$LOGFILE
2024-06-10 21:00:59 +02:00
echo " $0 on `hostname` ended: " >>$LOGFILE
2024-06-25 17:11:55 +02:00
date " ${ DATEFMT } " >>$LOGFILE
2024-06-10 21:00:59 +02:00
# 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