-
Brandon Rodriguez authored54b7e26c
backup_gitlab.sh 4.63 KiB
#!/usr/bin/env bash
###
# Creates a compressed backup of the GitLab server instance.
#
# As per GitLab documentation, this does not include the "gitlab.rb" or "gitlab-secrets.json" files.
# Those should be manually backed up and stored in a secure location.
#
#
# Required Args:
# * Folder path to save backup data to.
#
# Optional Kwargs:
# * Backup User - Linux user to set as owner of backed up files. Assumes corresponding group of same name exists.
# * Accepted Kwargs: backup_user
#
# Optional Flags:
# * Delete Previous Backups - Clear existing files from backup folders prior to creating new backups.
# * Accepted Flags: d / delete_previous_backups / delete_prev_backups / delete_prev
#
#
# https://git.brandon-rodriguez.com/scripts/bash/server_management
# Version 1.0
##
# Define possible flag values for script.
possible_flags=("-d" "-delete_previous_backups" "-delete_prev_backups" "-delete_prev")
# Import utils script.
. $(dirname ${0})/../utils.sh
# Stop on error.
set -e
# Global Variables.
backup_location=""
current_date=`date +%Y-%m-%d`
gitlab_backup_location="/var/opt/gitlab/backups"
backup_user="backups"
###
# Script entry point.
##
function main () {
# Verify running as root user.
check_is_user "root"
# Check for provided args.
validate_args
# Attempt backup.
backup_gitlab
}
###
# Validate provided script args.
##
function validate_args () {
# Check for minimum number of args.
if [[ ${#args[@]} < 1 ]]
then
echo -e "${text_red}Missing arg. Requires location to backup gitlab to.${text_reset}"
exit 0
elif [[ ${#args[@]} > 1 ]]
then
echo -e "${text_red}Too many args provided. Requires location to backup gitlab to.${text_reset}"
exit 0
fi
# Grab args.
get_absolute_path "${args[0]}"
backup_location="${return_value}"
# Check up for backup location arg.
if [[ ${backup_location} == "" || ! -d ${backup_location} ]]
then
echo -e "${text_red}Must provide valid directory as first argument for \"backup_location\".${text_reset}"
echo -e "${text_red}Please verify the location exists, and that the location points to a folder, not a file.${text_reset}"
exit 0
fi
# Check for backup user kwarg.
if [[ "${!kwargs[@]}" =~ "backup_user" ]]
then
backup_user="${kwargs[backup_user]}"
fi
}
###
# Logic to backup gitlab instance.
##
function backup_gitlab () {
echo -e "${text_blue}Attempting to backup GitLab data.${text_reset}"
echo ""
# Check for "delete previous backups" flags.
if [[ ${flags[@]} =~ "d" || ${flags[@]} =~ "delete_previous_backups" || ${flags[@]} =~ "delete_prev_backups" || ${flags[@]} =~ "delete_prev" ]]
then
echo "Clearing out old gitlab backups."
# Clear any old backup files from gitlab backup folder.
for file in "${gitlab_backup_location}/"*
do
# Verify is file.
if [[ -f "${file}" ]]
then
rm "${file}"
fi
done
# Clear any old backup files from indicated backup folder.
for file in "${backup_location}/"*
do
# Verify is file.
if [[ -f "${file}" ]]
then
rm "${file}"
fi
done
echo "Old backups removed."
echo ""
fi
# Tell gitlab server to create backups.
echo "Creating server backup. This may take a bit."
gitlab-backup create
# Attempt to move backup files to more accessible location.
for file in "${gitlab_backup_location}/"*
do
# Verify if file.
if [[ -f "${file}" ]]
then
# Get gitlab version of backup.
# Start by getting full file name of file, minus directory info.
file_name=${file##*/}
# Remove extension info. We know it will be ".tar".
file_name=${file_name%.*}
# Remove extra file info on right side of file name.
ver_num=${file_name%_*}
ver_num=${ver_num%_*}
# Remove extra file info on left side of file name.
ver_num=${ver_num#*_}
ver_num=${ver_num#*_}
ver_num=${ver_num#*_}
ver_num=${ver_num#*_}
# Update file permissions.
chown "${backup_user}":"${backup_user}" ${file}
chmod o-rwx ${file}
# Move file to backup location.
mv "${file}" "${backup_location}/${ver_num}__${current_date}.tar"
fi
done
echo ""
echo -e "${text_blue}Gitlab Instance backed up to \"${backup_location}/${ver_num}__${current_date}.tar\".${text_reset}"
}
main