#! /bin/bash function init { echo "Backify is starting, looking for configuration file..." >&2 config='backup.cfg' secured_config='sbackup.cfg' if [ ! -f "$config" ]; then echo "Error: Config file not found: $config" >&2 echo "Please create a config file or specify the location of an existing file." >&2 exit 1 fi if grep -E -q -v '^#|^[^ ]*=[^;]*' "$config"; then echo "Config file is unclean, cleaning it..." >&2 grep -E '^#|^[^ ]*=[^;&]*' "$config" >"$secured_config" config="$secured_config" fi source "$config" echo "Configuration file loaded" >&2 if [ "$EUID" -ne 0 ]; then echo "Please run as root" exit fi } function system { if [ -f /etc/redhat-release ]; then echo "Discovered Red Hat-based OS..." system='rhel' elif [ -f /etc/lsb-release ]; then echo "Discovered Debian-based OS..." system='debian' else echo "Error: Unable to detect OS type." exit 1 fi } function makedir { timestamp=$(date +%Y%m%d_%H%M) mkdir -p "$backup_path/backify-$timestamp" tmpdir="$backup_path/backify-$timestamp" } function wwwbackup { if [ "$www_backup" = true ]; then echo "Backing up wwwroot..." >&2 mkdir -p "$tmpdir/wwwdata" cp -r "$www_dir/" "$tmpdir/wwwdata/" echo "Finished" >&2 fi } function vhostbackup { if [ "$vhost_backup" = true ]; then echo "Backing up vhosts..." >&2 mkdir -p "$tmpdir/vhosts" cp -r "$vhost_dir/" "$tmpdir/vhosts/" echo "Finished" >&2 fi } function logbackup { if [ "$log_backup" = true ]; then echo "Backing up system logs..." >&2 mkdir -p "$tmpdir/syslogs" case $system in "rhel") if [[ " ${log_to_backup[*]} " =~ " ${fail2ban} " ]]; then cp /var/log/fail2ban.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${apache} " ]]; then mkdir -p "$tmpdir/apachelogs" cp -r /var/log/httpd "$tmpdir/apachelogs" fi if [[ " ${log_to_backup[*]} " =~ " ${nginx} " ]]; then mkdir -p "$tmpdir/nginxlogs" cp -r /var/log/nginx "$tmpdir/nginxlogs" fi if [[ " ${log_to_backup[*]} " =~ " ${alternatives} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/alternatives.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${pckg_mngr} " ]]; then mkdir -p "$tmpdir/syslogs/" mkdir -p "$tmpdir/syslogs/yum" cp -r /var/log/yum/* "$tmpdir/syslogs/yum/" fi if [[ " ${log_to_backup[*]} " =~ " ${auth} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/auth.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${dmesg} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/dmesg "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${dpkg} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/dpkg.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${letsencrypt} " ]]; then mkdir -p "$tmpdir/syslogs/" mkdir -p "$tmpdir/syslogs/letsencrypt" cp -r /var/log/letsencrypt/* "$tmpdir/syslogs/letsencrypt/" fi if [[ " ${log_to_backup[*]} " =~ " ${php} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/php*.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${syslog} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/syslog "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${purge} " ]]; then echo "Purging logs..." >&2 truncate -s 0 /var/log/syslog truncate -s 0 /var/log/message if [[ " ${log_to_backup[*]} " =~ " ${apache} " ]]; then truncate -s 0 /var/log/httpd/* rm /var/log/httpd/*.gz fi if [[ " ${log_to_backup[*]} " =~ " ${nginx} " ]]; then truncate -s 0 /var/log/nginx/* rm /var/log/nginx/*.gz fi if [[ " ${log_to_backup[*]} " =~ " ${fail2ban} " ]]; then truncate -s 0 /var/log/fail2ban.log fi if [[ " ${log_to_backup[*]} " =~ " ${alternatives} " ]]; then truncate -s 0 /var/log/alternatives.log fi if [[ " ${log_to_backup[*]} " =~ " ${pckg_mngr} " ]]; then truncate -s 0 /var/log/yum/* fi if [[ " ${log_to_backup[*]} " =~ " ${auth} " ]]; then truncate -s 0 /var/log/auth.log fi if [[ " ${log_to_backup[*]} " =~ " ${dmesg} " ]]; then truncate -s 0 /var/log/dmesg fi if [[ " ${log_to_backup[*]} " =~ " ${dpkg} " ]]; then truncate -s 0 /var/log/dpkg.log fi if [[ " ${log_to_backup[*]} " =~ " ${letsencrypt} " ]]; then truncate -s 0 /var/log/letsencrypt/* fi if [[ " ${log_to_backup[*]} " =~ " ${php} " ]]; then truncate -s 0 /var/log/php*.log fi if [[ " ${log_to_backup[*]} " =~ " ${syslog} " ]]; then truncate -s 0 /var/log/syslog fi fi ;; "debian") if [[ " ${log_to_backup[*]} " =~ " ${fail2ban} " ]]; then cp /var/log/fail2ban.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${apache} " ]]; then mkdir -p "$tmpdir/apachelogs" cp -r /var/log/apache2 "$tmpdir/apachelogs" fi if [[ " ${log_to_backup[*]} " =~ " ${nginx} " ]]; then mkdir -p "$tmpdir/nginxlogs" cp -r /var/log/nginx "$tmpdir/nginxlogs" fi if [[ " ${log_to_backup[*]} " =~ " ${alternatives} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/alternatives.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${pckg_mngr} " ]]; then mkdir -p "$tmpdir/syslogs/" mkdir -p "$tmpdir/syslogs/apt" cp -r /var/log/apt/* "$tmpdir/syslogs/apt/" fi if [[ " ${log_to_backup[*]} " =~ " ${auth} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/auth.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${dmesg} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/dmesg "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${dpkg} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/dpkg.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${letsencrypt} " ]]; then mkdir -p "$tmpdir/syslogs/" mkdir -p "$tmpdir/syslogs/letsencrypt" cp -r /var/log/letsencrypt/* "$tmpdir/syslogs/letsencrypt/" fi if [[ " ${log_to_backup[*]} " =~ " ${php} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/php*.log "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${syslog} " ]]; then mkdir -p "$tmpdir/syslogs/" cp -r /var/log/syslog "$tmpdir/syslogs/" fi if [[ " ${log_to_backup[*]} " =~ " ${purge} " ]]; then echo "Purging logs..." >&2 truncate -s 0 /var/log/syslog truncate -s 0 /var/log/message if [[ " ${log_to_backup[*]} " =~ " ${apache} " ]]; then truncate -s 0 /var/log/apache2/* rm /var/log/apache2/*.gz fi if [[ " ${log_to_backup[*]} " =~ " ${nginx} " ]]; then truncate -s 0 /var/log/nginx/* rm /var/log/nginx/*.gz fi if [[ " ${log_to_backup[*]} " =~ " ${fail2ban} " ]]; then truncate -s 0 /var/log/fail2ban.log fi if [[ " ${log_to_backup[*]} " =~ " ${alternatives} " ]]; then truncate -s 0 /var/log/alternatives.log fi if [[ " ${log_to_backup[*]} " =~ " ${pckg_mngr} " ]]; then truncate -s 0 /var/log/apt/* fi if [[ " ${log_to_backup[*]} " =~ " ${auth} " ]]; then truncate -s 0 /var/log/auth.log fi if [[ " ${log_to_backup[*]} " =~ " ${dmesg} " ]]; then truncate -s 0 /var/log/dmesg fi if [[ " ${log_to_backup[*]} " =~ " ${dpkg} " ]]; then truncate -s 0 /var/log/dpkg.log fi if [[ " ${log_to_backup[*]} " =~ " ${letsencrypt} " ]]; then truncate -s 0 /var/log/letsencrypt/* fi if [[ " ${log_to_backup[*]} " =~ " ${php} " ]]; then truncate -s 0 /var/log/php*.log fi if [[ " ${log_to_backup[*]} " =~ " ${syslog} " ]]; then truncate -s 0 /var/log/syslog fi fi ;; esac fi } function push { if [ "$rsync_push" = true ]; then echo "Pushing the backup package to $target_host..." >&2 rsync -avz -e "ssh -i $target_key" $backup_path/backify-$timestamp.tar.gz $target_user@$target_host:$target_dir if [ "$push_clean" = true ]; then echo "Removing archive..." >&2 rm "$backup_path/backify-$timestamp.tar.gz" fi fi } function dockerbackup { if [ "$docker_enabled" = true ]; then if [ "$docker_images" = true ]; then echo "Backing up Docker images..." >&2 for i in $(docker inspect --format='{{.Name}}' $(docker ps -q) | cut -f2 -d\/); do container_name=$i echo -n "$container_name - " container_image=$(docker inspect --format='{{.Config.Image}}' $container_name) mkdir -p $tmpdir/containers/$container_name save_dir="$tmpdir/containers/$container_name/$container_name-image.tar" docker save -o $save_dir $container_image echo "Finished" >&2 done fi if [ "$docker_volumes" = true ]; then echo "Backing up Docker volumes..." >&2 #Thanks piscue :) for i in $(docker inspect --format='{{.Name}}' $(docker ps -q) | cut -f2 -d\/); do container_name=$i mkdir -p $tmpdir/containers/$container_name echo -n "$container_name - " docker run --rm --userns=host \ --volumes-from $container_name \ -v $backup_path:/backup \ -e TAR_OPTS="$tar_opts" \ piscue/docker-backup \ backup "$tmpdir/containers/$container_name/$container_name-volume.tar.xz" echo "Finished" >&2 done fi if [ "$docker_data" = true ]; then echo "Backing up container information..." >&2 for i in $(docker inspect --format='{{.Name}}' $(docker ps -q) | cut -f2 -d\/); do container_name=$i echo -n "$container_name - " container_data=$(docker inspect $container_name) mkdir -p $tmpdir/containers/$container_name echo $container_data >$tmpdir/containers/$container_name/$container_name-data.txt echo "Finished" >&2 done fi fi } function backup_db { if [ "$db_all" = true ]; then if [ "$database_type" = "mysql" ]; then mysqldump -u "$db_username" -p"$db_password" --all-databases >$tmpdir/db/db_all.sql elif [ "$database_type" = "postgresql" ]; then pg_dumpall -U "$db_username" -f $tmpdir/db/db_all.sql fi else if [ "$database_type" = "mysql" ]; then mysqldump -u "$db_username" -p"$db_password" "$db_name" >$tmpdir/db/$db_name.sql elif [ "$database_type" = "postgresql" ]; then pg_dump -U "$db_username" "$db_name" -f $tmpdir/db/$db_name.sql fi fi } function runbackup { # init, config check init # run system detection system if [ "$enabled" = true ]; then # step 1 : create directory makedir # step 2 : www backup wwwbackup # step 3 : vhost backup vhostbackup # step 4: log backup logbackup # step 5: docker backup dockerbackup # step 6: db backup if [ "$db_backup" = true ]; then backup_db fi # archive data echo "Creating backup archive..." >&2 tar -czvf $backup_path/backify-$timestamp.tar.gz $tmpdir # push data to server push # remove temp files rm -r $tmpdir echo "Voila, enjoy the rest of the day" >&2 else echo "Backup is disabled in the configuration" >&2 fi } runbackup