#!/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