diff --git a/backup.sh b/backup.sh index 8c5eb4e..132494c 100755 --- a/backup.sh +++ b/backup.sh @@ -3,49 +3,123 @@ # backup directory backupDir=./backup + +# current date +currentDate=$(date +"%Y-%m-%d_%H-%M-%S") + +# check for first parameter +if [[ ! ${1} =~ (backup|restore) ]]; then + echo "First parameter needs to be 'backup' or 'restore'" + exit 1 +fi + +if [[ ${1} == "backup" && ! ${2} =~ (db|repos|confs|gist|data|sshkeys|all) ]]; then + echo "Second parameter needs to be 'db', 'repos', 'confs', 'gist', 'data', 'sshkeys' or 'all'" + exit 1 +fi + + +# create backup directories mkdir -p ${backupDir} mkdir -p ${backupDir}/db mkdir -p ${backupDir}/conf +mkdir -p ${backupDir}/repositories if [ -d "data/data" ]; then mkdir -p ${backupDir}/data fi if [ -d "data/gist" ]; then mkdir -p ${backupDir}/gist fi -mkdir -p ${backupDir}/repositories - -# current date -currentDate=$(date +"%Y-%m-%d_%H-%M-%S") -# backup mysql -dbFile="${backupDir}/db/${currentDate}.sql" -docker-compose exec mysql-gitbucket sh -c 'exec mysqldump --lock-tables --default-character-set=utf8mb4 -uroot -p"${MYSQL_ROOT_PASSWORD}" ${MYSQL_DATABASE}' > ${dbFile} -sed -i "/^mysqldump: \\[Warning\\]/d" ${dbFile} -tar -cj ${dbFile} -f "${dbFile}.tbz2" -rm ${dbFile} +function backup() { -# backup repositories -repoFile="${backupDir}/repositories/${currentDate}.tbz2" -tar -cj data/repositories -f ${repoFile} + IDmain=$(docker ps -qf name=main-gitbucket) + IDdb=$(docker ps -qf name=mysql-gitbucket) -# backup config files -tar -cj data/conf -f "${backupDir}/conf/${currentDate}.tbz2" + while (( "$#" )); do + case "$1" in + db|all) -# backup gist repositories if existing -if [ -d "data/gist" ]; then - repoFile="${backupDir}/gist/${currentDate}.tbz2" - tar -cj data/gist -f ${repoFile} + echo "backup database" + dbFile="${backupDir}/db/${currentDate}.sql" + docker exec $IDdb sh -c 'exec mysqldump --lock-tables --default-character-set=utf8mb4 -uroot -p"${MYSQL_ROOT_PASSWORD}" ${MYSQL_DATABASE}' > ${dbFile} + sed -i "/^mysqldump: \\[Warning\\]/d" ${dbFile} + tar -cj ${dbFile} -f "${dbFile}.tbz2" + rm ${dbFile} + + ;;& + repos|all) + + echo "backup repositories" + repoFile="${backupDir}/repositories/${currentDate}.tbz2" + tar -cj data/repositories -f ${repoFile} + + # copy auto backup folder + if [ -d "data/backup" ]; then + cp -R data/backup "${backupDir}/autoBackup" + fi + + ;;& + confs|all) + + echo "backup config files" + tar -cj data/conf gitbucket.conf -f "${backupDir}/conf/${currentDate}.tbz2" + + ;;& + gist|all) + + if [ -d "data/gist" ]; then + echo "backup gist directory" + repoFile="${backupDir}/gist/${currentDate}.tbz2" + tar -cj data/gist -f ${repoFile} + fi + + ;;& + data|all) + + if [ -d "data/data" ]; then + echo "backup data directory" + repoFile="${backupDir}/data/${currentDate}.tbz2" + tar -cj data/data -f ${repoFile} + fi + + ;;& + sshkeys|all) + + echo "try to backup ssh keys if available" + docker cp ${IDmain}:/srv/gitbucket/gitbucket.ser "${backupDir}/gitbucket.ser" 2> /dev/null + + ;; + esac + shift + done + + # delete all files older 10 days + #find ${backupDir} -iname "*.tbz2" -type f -mtime +10 -exec rm {} \; > /dev/null +} + +function restore() { + while (( "$#" )); do + case "$1" in + sshkeys|all) + + echo "restore ssh keys" + + if [ ! -f "${backupDir}/gitbucket.ser" ]; then + echo "${backupDir}/gitbucket.ser does not exist" + exit 1 + fi + + ;; + esac + shift + done +} + +if [[ ${1} == "backup" ]]; then + backup ${@,,} +elif [[ ${1} == "restore" ]]; then + restore ${@,,} fi -# backup data if existing -if [ -d "data/data" ]; then - repoFile="${backupDir}/data/${currentDate}.tbz2" - tar -cj data/data -f ${repoFile} -fi - -# backup ssh serial -docker-compose exec main-gitbucket sh -c 'cat $GITBUCKET_HOME/gitbucket.ser' > "${backupDir}/gitbucket-${currentDate}.ser" - -# delete all files older 10 days -find ${backupDir} -iname "*.tbz2" -type f -mtime +10 -exec rm {} \; > /dev/null