Zálohování souborů nastavení VestaCP serveru

Návod nastavení automatického zálohování VestaCP na Ubuntu směrem na FreeNas. Tento návod přímo navazuje na návod Propojení VestaCP a FreeNas (přesuny souborů a skriptů).

Odkud kam a co budeme zálohovat

Výčet nastavení z manuálu VestaCP je vyčerpávající. Tučníme věci o kterých víme, že je zálohovat chceme a musíme.

ServiceConfigLog
Apache /etc/apache2/apache2.conf
/etc/apache2/conf.d/*
/home/$user/conf/web/apache2.conf
/home/$user/conf/web/sapache2.conf
(ssl)
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/apache2/domains/$domain.log
/var/log/apache2/domains/$domain.error.log
PHP /etc/php/*/apache2/php.ini
/etc/php5/conf.d/*
/var/log/apache2/domains/$domain.error.log
Nginx /etc/nginx/nginx.conf
/etc/nginx/conf.d/*
/home/
$user/conf/web/nginx.conf
/home/$user/conf/web/snginx.conf (ssl)
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/apache2/domains/$domain.log
/var/log/apache2/domains/$domain.error.log
Named /etc/bind/named.conf
/home/$user/conf/dns/$domain.db
/var/log/syslog
Exim /etc/exim4/exim4.conf.template
/home/$user/conf/mail/$domain/*
/var/log/exim4/mainlog
/var/log/exim/rejectlog
/var/log/exim/paniclog
Dovecot /etc/dovecot/dovecot.conf
/etc/dovecot/conf.d/*
/home/$user/conf/mail/$domain/passwd
/var/log/dovecot.log
ClamAV /etc/clamav/clamd.conf
/etc/clamav/freshclam.conf
/var/log/clamav/clamav.log
/var/log/clamav/freshclam.log
/var/log/exim4/mainlog
SpamAssassin /etc/spamassassin/local.cf /var/log/exim4/mainlog
Roundcube /etc/roundcube/main.inc.php
/etc/roundcube/db.inc.php
/etc/apache2/conf.d/roundcube
/var/log/roundcube/*
/var/log/apache2/domains/$domain.log
/var/log/apache2/domains/$domain.error.log
MySQL /etc/mysql/my.cnf
/root/.my.cnf
/usr/local/vesta/conf/mysql.conf
/var/log/mysql.log
/var/log/mysql/error.log
phpMyAdmin /etc/phpmyadmin/config.inc.php
/etc/apache2/conf.d/phpmyadmin.conf
/var/log/apache2/domains/$domain.log
/var/log/apache2/domains/$domain.error.log
PostgreSQL /etc/postgresql/*/main/postgresql.conf
/etc/postgresql/*/main//pg_hba.conf
/usr/local/vesta/conf/pgsql.conf
/var/log/postgresql/postgresql-*-main.log
phpPgAdmin /etc/phppgadmin/config.inc.php
/etc/apache2/conf.d/phppgadmin
/var/log/apache2/domains/$domain.log
/var/log/apache2/domains/$domain.error.log
Vsftpd /etc/vsftpd.conf /var/log/xferlog
/var/log/syslog
Cron /etc/crontab /var/log/syslog
Vesta /usr/local/vesta/conf/vesta.conf
/usr/local/vesta/conf/mysql.conf
/usr/local/vesta/conf/pgsql.conf
/usr/local/vesta/conf/ftp.backup.conf
/usr/local/vesta/conf/dns-cluster.conf
/usr/local/vesta/nginx/conf/nginx.conf
/usr/local/vesta/php/lib/php.ini
/usr/local/vesta/php/etc/php-fpm.conf
/var/log/vesta/system.log
/var/log/vesta/backup.log
/var/log/vesta/auth.log
/var/log/vesta/nginx-error.log
/usr/local/vesta/php/var/log/php-fpm.log

Dočasné řešení

Aktuálně zálohujeme celý server každé dvě hodiny (drží se jedna kopie) a každých 24 hodiny (drží se 30 kopií). Nicméně toto není ideální řešení z pohledu obnov dílčích částí nástavení.

Rozpracované řešení

Je rozpracován skript ve fázi konceptu. Aktuálně nemáme dost dat na VestaCP serveru pro ověření funkčnosti dílčích obnov z těchto záloh.

#!/bin/bash

# zalohuj-vestacp-nastaveni.bash
#
#   Sublime Text nastaveni
#     Tabsize: 2
#     Viev -> Line endings -> UNIX
#   Nastaveni prav pro spusteni
#     chmod u+x /d2a-sdilene-skripty/zalohuj-vestacp-nastaveni.bash
#   Pouziti skriptu
#     /d2a-sdilene-skripty/zalohuj-vestacp-nastaveni.bash
#
#		Odkazy na pouzite zdroje:
#			Formatovani v konzoli: https://misc.flogisoft.com/bash/tip_colors_and_formatting

#######################################################################
#
#
# Nastavovaci promenne
#
#
#######################################################################

# vystup - urcuje kam se ma zapisovat prubeh skriptu (kriticke chyby se zapisuji vzdy)
#		na-sklo
#		do-logu
#		vsude
#		nikde
vystup="vsude"

# koren_logu - urcuje zakladni koren pro ukladani logu skriptu (nesmi obsahovat lomitko na konci)
# 	default: /d2a-sdilene-skripty/log 
koren_logu="/d2a-sdilene-skripty/log"

#######################################################################
#
#
# Staticke promenne - neupravovat
#
#
#######################################################################

# nazev skriptu (udava se bez .bash)
nazev_skriptu="zalohuj-vestacp-nastaveni"

# systemova nastaveni barev výstupu na sklo
c="\033[31m"
z="\033[32m"
tr="\033[0m"

# razitko datumu a casu
cas_raz=$(date '+%Y%m%d_%H%M%S_%N')
rok=$(date '+%Y')
mesic=$(date '+%m')
den=$(date '+%d')
hodina=$(date '+%H')

# jmeno a ip adresa masiny na ktere je spusteno
jmeno_host=$(hostname)
ip_host=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')

# cesta logu (nesmi obsahovat lomitko na konci)
adresar_logu="${koren_logu}/zalohuj-vestacp-nastaveni/${rok}"
soubor_logu="${adresar_logu}/${jmeno_host}_T${cas_raz}_IP${ip_host//./_}.log"

# docasny adresar pro odkladani souboru (nesmi obsahovat lomitko na konci)
docasny_adresar="/tmp/${nazev_skriptu}"

# vychozi nastaveni pro ziskavane promenne (nesmi obsahovat lomitko na konci)
prefix_zalohy="nor"
koren_zaloh="/d2a-zalohy-nas01/vestacp-nastaveni-v01"

# ziskani vstupu
for ARGUMENT in "$@"
do
  KEY=$(echo $ARGUMENT | cut -f1 -d=)
  VALUE=$(echo $ARGUMENT | cut -f2 -d=)   
  case "$KEY" in
		prefix_zalohy)				prefix_zalohy=${VALUE} ;;
		koren_zaloh)					koren_zaloh=${VALUE} ;;
    *)   
  esac    
done

#######################################################################
#
#
# funkce vypisu na sklo / do logu / oboje
#
#
#######################################################################

function _ {
	cas="$(date '+%H:%M:%S')\t"
	if [ "${vystup}" == "na-sklo" ] || [ "${vystup}" == "vsude" ]; then
		printf "${cas}$* \n";
	fi
	if [ "${vystup}" == "do-logu" ] || [ "${vystup}" == "vsude" ]; then
		echo -e "${cas}$*" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" >> "${soubor_logu}"
	fi	
}

#######################################################################
#
#
# funkce vytvoreni adresare pro logovani souboru
#
#
#######################################################################

function priprav_log_dir {
	max_pocet_pokusu=5
	prodleva_mezi_pokusy="1m"
	pocet_selhani=0
	for (( _i=1; _i<=max_pocet_pokusu; _i++ ))
	do
		printf "Overuji adresar logu ${1} (pokus ${_i} z ${max_pocet_pokusu}).\n"
		if [ -d "${1}" ]; then
			printf "${z}Ok:${tr} Adresar pro logovani existuje.\n"
			break
		else
			printf "${c}Er:${tr} Adresar pro logovani neexistuje.\n"
			printf "Cekam ${prodleva_mezi_pokusy}.\n"
			sleep "${prodleva_mezi_pokusy}"
			printf "Zahajuji pokus o vytvoreni adresare.\n"
			mkdir -p "${1}"
			pocet_selhani=${_i}
		fi
	done
	if [ ${pocet_selhani} = ${max_pocet_pokusu}  ]; then
		printf "${c}Er:${tr} Nepodarilo se vytvorit adresar logu. Lze ocekavat dalsi chyby. Koncim skript.\n"
		exit 1
	fi
}

#######################################################################
#
#
# pripravne prace
#
#
#######################################################################

# doinstalace baliku, ktere mohou chybet
if ! dpkg-query -W -f='${Status}' pigz | grep "ok installed"; then apt-get install pigz -y; fi

# pokus o vytvoreni adresare pro log
priprav_log_dir ${adresar_logu}

#######################################################################
#
#
# zahajeni skriptu
#
#
#######################################################################

_ "${z}Spoustim skript ${nazev_skriptu}.bash.${tr}"
_ "  Jmeno host: ${jmeno_host}."
_ "  IP: ${ip_host}."
_ "  Casove razitko: ${cas_raz}."
_ "${z}Pracuji s timto nastavenim:${tr}"
_ "  docasny_adresar:  ${docasny_adresar}"
_ "  prefix_zalohy:  ${prefix_zalohy}"
_ "  koren_zaloh:  ${koren_zaloh}"

_ "${z}Mazu predchozi docasny adresar${tr}"
_ "  Bezchybny prubeh znaci volne radky."
_ "$(rm -r /tmp/zalohuj-vestacp-nastaveni/ 2>&amp;1)"

_ "${z}Zahajuji kopirovani souboru urcenych ke sbaleni.${tr}"
_ "  Bezchybny prubeh znaci volne radky."
cd /
_ "${z}Apache${tr}"
cil="/etc/apache2"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="apache2.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="conf.d/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/home"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="apache2.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="sapache2.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}PHP${tr}"
cil="/etc/php"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="php.ini" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="conf.d/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="mods-available/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Nginx${tr}"
cil="/etc/nginx"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="nginx.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="conf.d/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/home"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="nginx.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="snginx.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Named${tr}"
cil="/etc/bind"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="*.*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/home"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="*.db" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Exim${tr}"
cil="/etc/exim4"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="*.*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/home"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="mail/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Dovecot${tr}"
cil="/etc/dovecot"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="dovecot.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="conf.d/" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/home"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="passwd" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}ClamAV${tr}"
cil="/etc/clamav"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="clamd.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="freshclam.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}SpamAssassin${tr}"
cil="/etc/spamassassin"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="local.cf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Roundcube${tr}"
cil="/etc/roundcube"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="main.inc.php" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="db.inc.php" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/etc/apache2"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="roundcube/*" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}MySQL${tr}"
cil="/etc/mysql"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="my.cnf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/root"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include=".my.cnf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/usr/local/vesta/conf"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="mysql.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}phpMyAdmin${tr}"
cil="/etc/phpmyadmin"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="config.inc.php" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/etc/apache2"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="phpmyadmin.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

# _ "${z}PostgreSQL${tr}"
# cil="/etc/postgresql"
# _ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
# _ "$(rsync -arv --include "*/" --include="postgresql.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
# _ "$(rsync -arv --include "*/" --include="pg_hba.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
# cil="/usr/local/vesta/conf"
# _ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
# _ "$(rsync -arv --include "*/" --include="pgsql.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

# _ "${z}phpPgAdmin${tr}"
# cil="/etc/phppgadmin"
# _ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
# _ "$(rsync -arv --include "*/" --include="config.inc.php" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
# cil="/etc/apache2"
# _ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
# _ "$(rsync -arv --include "*/" --include="phppgadmin" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Vsftpd${tr}"
cil="/etc"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="vsftpd.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Cron${tr}"
cil="/etc"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="crontab" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Vesta${tr}"
cil="/usr/local/vesta/conf"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="vesta.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="mysql.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="pgsql.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="ftp.backup.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="dns-cluster.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/usr/local/vesta/nginx"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="nginx.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
cil="/usr/local/vesta/php"
_ "$(mkdir -p "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="php.ini" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"
_ "$(rsync -arv --include "*/" --include="php-fpm.conf" --exclude="*" --prune-empty-dirs "${cil}/" "${docasny_adresar}${cil}/" 2>&amp;1)"

_ "${z}Vytvarim adresar zalohy${tr}"
_ "$(mkdir -p "${koren_zaloh}" 2>&amp;1)"


_ "${z}Balim docasny adresar.${tr}"
cd "${docasny_adresar}" 
_ "$(tar cpf - "${docasny_adresar}/" | pigz -c | split --bytes=1G - "${koren_zaloh}/${prefix_zalohy}_${jmeno_host}_${cas_raz}.tar.gz." 2>&amp;1)"

_ "${z}Kontroly velikosti.${tr}"
_ "   Docasny adresar: $(du -hs ${docasny_adresar})"
_ "   Odeslany tar (prvni cast): $(du -hs ${koren_zaloh}/${prefix_zalohy}_${jmeno_host}_${cas_raz}.tar.gz.aa)"

_ "${z}Mazu docasny adresar${tr}"
_ "  Bezchybny prubeh znaci volne radky."
_ "$(rm -r /tmp/zalohuj-vestacp-nastaveni/ 2>&amp;1)"


#######################################################################
#
#
# exit
#
#
#######################################################################

_ "${z}Koncim skript${tr}"
exit 0
;;

Martin Horák

Martin Horák má na svědomí 29 příspěvků

Již nějakou chvíli se věnuji tvorbě webů, copywritingu a všem těm drobným a nepodstatným věcem okolo toho.

Najmout si mě můžete přes horní lištu a klikátko kontakty.

Diskuze

Vaše emailová adresa nebude publikována. Povinné údaje jsou označeny *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>