Simples Backupskript für Webprojekte

Posted in Bash, 25.08.2017 08:08

UPDATE

Spart Zeit für die schnelle Sicherung zwischendurch (z.B.auf Stick).

  • NEU: Fallback, wenn kein Stick angeschlossen.
  • Formatierung der Ausgaben
  • Logfile (mit Timestamp für jeden Schritt)
  • Möglichkeit exclude-Folder für tar zu definieren
  • Bessere Komprimierung (xz)

Voraussetzungen:

  • es gibt ein Projektverzeichnis unterhalb von /home//Dokumente/ (Linuxstandardverzeichnis)
  • es gibt einen externes Medium (korrekten Pfad angeben) oder ein _Backup-Verzeichnis unterhalb von Dokumente
  • die lokale wwwroot und die Unterverzeichnisse sind für den ausführenden User zumindest lesbar (Gruppe www-data?) 
  • alle Backupmedien sind beschreibbar 
  • Fanurio wird zur Zeiterfassung benutzt ;-)
    (siehe: www.fanuriotimetracking.com/download.html)
  • Sie nutzen Linux B-) 
  • chmod 755
  • im home-Verzeichnis ausführen oder Pfade im Skript anpasssen
  • evtl. in die crontab eintragen

 

 



#!/bin/bash 
# SICHERUNG VON WEBPROJEKTEN
# @author hli 
# Copyright (c) 2016 hli info@lbm-services.de 
# MIT License https://opensource.org/licenses/MIT
# Official Open-Source-Version 0.2


TIMESTAMP=$(date +%Y%m%d)
LOG="backup-$TIMESTAMP.log" #
DRIVE="/media/hli/USB_32G"  # your media here
PROJECT="YOUR-PROJECT" 		# subdir of /home//Documents or change path below
WWWDIR="htdocs" 			# subdir of /var/www or change path below
DB="DBNAME"					# db
TAR="tar cJ"  				# we use xz for best compression ratio 
EXCLUDE_DIRS=(media lib var/cache var/session var/report downloader magmi .git) # excludes for www-dir no trailing slashes!


# -- FUNKTION FORMATIERT AUSGABE --#

function fmsg {
	local MSG=$1
	SIZE=${#MSG}
	echo "$MSG" | tee -a $DRIVE/$PROJECT/$LOG
	v=$(printf "%-${SIZE}s")
	echo "${v// /-}" | tee -a $DRIVE/$PROJECT/$LOG
}

# -- SKRIPT START --#
	echo
	MSG="$(date +'%Y-%m-%d %H:%M:%S') - SICHERUNGSSKRIPT `basename "$0"` GESTARTET..."
	fmsg "$MSG"


# -- SICHERUNGSMEDIUM FINDEN / WENN NICHT ABBRECHEN --#

if [ -w $DRIVE ]; then 
	MSG="$DRIVE vorhanden!"
	fmsg "$MSG"
else
	echo ">>> Kein Backupmedium vorhanden. <<<" | tee -a $DRIVE/$PROJECT/$LOG
	DRIVE='/home/hli/Dokumente/_Backup'
	if [ ! -w $DRIVE ]; then 
	echo ">>> FEHLER: $DRIVE not writeable: no backup medium useable. Exiting."
	exit
	fi
	MSG="Sichere auf $DRIVE"  | tee -a $DRIVE/$PROJECT/$LOG
	fmsg "$MSG"
fi
if [ ! -d "$DRIVE/$PROJECT" -a ! -w "$DRIVE/$PROJECT" ]; then
	MSG="Creating Project-Dir $DRIVE/$PROJECT..." 
	fmsg "$MSG"
	mkdir "$DRIVE/$PROJECT"
fi


# -- TAR BEFEHL UM EXCLUDES ERGÄNZEN  --#
for item in ${EXCLUDE_DIRS[*]}
do
    TAR="$TAR --exclude=*/$item/*"
done


# -- WWW SICHERUNG --- #

	MSG="$(date +'%Y-%m-%d %H:%M:%S') - Erstelle Backup von $WWWDIR..."
	fmsg "$MSG"

	$TAR -f $DRIVE/$PROJECT/$WWWDIR-local-$TIMESTAMP.tar.xz /var/www/$WWWDIR


#-- PROJEKTVERZEICHNIS SICHERUNG --#

	MSG="$(date +'%Y-%m-%d %H:%M:%S') - Erstelle Backup von Projectverzeichnis Dokumente/$PROJECT ..."
    fmsg "$MSG"

	tar cJf $DRIVE/$PROJECT/$PROJECT-docs.tar.xz Documents/$PROJECT


#-- ZEITERFASSUNG SICHERUNG --#
	# If you do not use fanurio for time tracking, comment out the following 4 lines:
	MSG="$(date +'%Y-%m-%d %H:%M:%S') - Erstelle Backup von Zeiterfassung ..." 
  	fmsg "$MSG"

	tar czf $DRIVE/$PROJECT/fanurio-$TIMESTAMP.tgz .fanurio/


#-- DB SICHERUNG --#
	MSG="$(date +'%Y-%m-%d %H:%M:%S') - Erstelle DB-Dump von $DB ..."
	fmsg "$MSG"

	mysqldump -uroot $DB -r $DRIVE/$PROJECT/$DB-dump-$TIMESTAMP.sql

	MSG="$(date +'%Y-%m-%d %H:%M:%S') - Komprimiere DB-Dump $DB-dump-$TIMESTAMP.sql..."
	fmsg "$MSG"

	xz $DRIVE/$PROJECT/$DB-dump-$TIMESTAMP.sql

#-- ZUSAMMENFASSUNG AUSGABE --#

	MSG="Dateien im Backupverzeichnis:"
	fmsg "$MSG"

		ls -thl $DRIVE/$PROJECT | tee -a $DRIVE/$PROJECT/$LOG

	echo 
	du -sh $DRIVE/$PROJECT | tee -a $DRIVE/$PROJECT/$LOG
	echo
	MSG="$(date +'%Y-%m-%d %H:%M:%S') - BACKUP auf $DRIVE/$PROJECT abgeschlossen."
	SIZE=${#MSG}
	v=$(printf "%-${SIZE}s")
	echo "${v// /-}" | tee -a $DRIVE/$PROJECT/$LOG
	fmsg "$MSG"


exit