#!/usr/bin/env bash # check script curently running and exit or continue me="$(basename "$0")"; result=$(ps aux | grep -i "$me" | grep -v "grep" | wc -l) echo "running: $result" if [ "$result" -gt 3 ] then exit fi # declarations DIR_VOLUMES=/mnt/NASbarracuda1TB/keese/seafile-arm/volumes # path to seafile docker volumes dir DIR_BACKUP=/mnt/NASbarracuda1TB/backup/keese/seafile # where to store the backup # mysql credentials to access databases inside seafile-mysql docker MYSQL_USER=root MYSQL_PASSWORD='BV$9V#5Bq!enW&ez' # specify seafile-mysql docker name and temporary backup location inside the docker DOCKER_SEAFILE=seafile DOCKER_SEAFILE_MYSQL=seafile-mysql #------------------------------------------------------------ # warning: only change below if you know what you are doing! # build dependend dir paths DIR_BACKUP_DB=${DIR_BACKUP}/db TIMESTAMP=$(date +"%Y-%m-%d-%H-%M-%S") DOCKER_BACKUP_DIR=/home/backup DOCKER_BACKUP_DIR_TIMESTAMP="${DOCKER_BACKUP_DIR}/${TIMESTAMP}" DIR_BACKUP_LOGS=${DIR_BACKUP}/logs LOGFILE_STATUS="${TIMESTAMP}_rsync_status.log" LOGFILE_PATH="${DIR_BACKUP_LOGS}/${LOGFILE_STATUS}" # create dirs that are not created automatically mkdir -p ${DIR_BACKUP_LOGS} ${DIR_BACKUP_DB} # 1) backup seafile databases if [ "$( docker container inspect -f '{{.State.Status}}' ${DOCKER_SEAFILE} )" == "running" ]; then echo "docker ${DOCKER_SEAFILE} running" docker exec -i ${DOCKER_SEAFILE_MYSQL} sh -c "mkdir -p ${DOCKER_BACKUP_DIR_TIMESTAMP}" # create remporary backup dir inside docker IFS=$'\n\r' # set the IFS to a newline character, so that a whole line can be assigned to an array element DATABASES=( $(docker exec -i ${DOCKER_SEAFILE_MYSQL} sh -c "mysql -e 'show databases' -s --skip-column-names -u ${MYSQL_USER} -p'${MYSQL_PASSWORD}'") ) # parse database names into array # loop databases and dump tables to sql files inside temporary docker backup folder for i in "${DATABASES[@]:1}" do : docker exec -i ${DOCKER_SEAFILE_MYSQL} sh -c "mysqldump --single-transaction -h localhost -u ${MYSQL_USER} -p'${MYSQL_PASSWORD}' --opt ${i} > ${DOCKER_BACKUP_DIR_TIMESTAMP}/${i}.sql" done # 2) copy backup database files to host and cleanup docker cp ${DOCKER_SEAFILE_MYSQL}:${DOCKER_BACKUP_DIR_TIMESTAMP} ${DIR_BACKUP_DB} docker exec -i ${DOCKER_SEAFILE_MYSQL} sh -c "rm -r ${DOCKER_BACKUP_DIR}" else echo "docker ${DOCKER_SEAFILE} NOT running" fi # 3) backup seafile docker volumes folder rsync -azh --log-file "${LOGFILE_PATH}" ${DIR_VOLUMES} ${DIR_BACKUP} echo "backup ${TIMESTAMP} done"