Ubuntu Server Backup auf FTP

U3mi

Semiprofi
Thread Starter
Mitglied seit
15.12.2006
Beiträge
1.281
Ort
München
Hallo liebe Community,

ich stehe vor einem Problem, aber Ihr könnt mir sicherlich helfen =)
ZU dem Problem, ich habe zwei Ubuntu 8.04 LTS auf ESXi Basis und diese muss ich sichern. Auf den zwei Ubuntu Servern läuft auch MySQL, diese Datenbanken müssen auch seperat gesichert werden. Das Ziel ist es, die Maschinen an sich komplett auf einen FTP zu sichern und die Datenbanken noch mal extra sichern und das alle 7 Tage automatisch.
Dies soll alles mit der Kommandozeile zu schaffen sein. Kennt einer von Euch nen Programm oder Script mit dem das alles zu realisieren ist?

Mit freundlichen Grüßen,

U3mi
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
1. nimms sftp -> 1. verschluesselt, 2. login per private/public key
2. ein einfaches script selber schreiben

hast du zugriff auf den server auf den gebackupt wird?
 
jap habe ich,

und script schreiben, habe ich noch nie gemacht xD
 
z.b.
- du hast auf dem server AUF den gebackup wird einen user namens "backupid" - mit dem laufen die backup scripte
- dieser user muss per privat/public key auth auf den zu backupenden servern eingetragen sein
- machst unterm backupid home ein verzeichnis in das du dieses script legst

backup-dirs.sh
Code:
#!/bin/bash
HOSTNAME=$1
CONFIGDIR=`echo $(dirname $0)`
BACKUPDIR_LOCAL=/home/backupid/backupdir
DATE=`date +%d-%m-%Y`

if [ "$HOSTNAME" == "" ] 
then 
	echo error: please enter a hostname
	exit 1
else
	echo hostname ok > /dev/null
fi

PORTACCESSIBLE=`nmap -p 22 $HOSTNAME | grep "22/tcp open  ssh" | wc -l`

if [ "$PORTACCESSIBLE" -eq 0 ]
then
        echo "error: ssh port not accessible on $HOSTNAME"
        exit 1
else
        echo "ssh port is reachable on $HOSTNAME" > /dev/null
fi

if [ -e "$CONFIGDIR"/"$HOSTNAME".cfg ]
then
	echo "config file for $HOSTNAME found" > /dev/null
else
	echo "error: no config file for $HOSTNAME found"
	exit 1
fi

CONFIGLINES=`cat "$CONFIGDIR"/"$HOSTNAME".cfg | wc -l`

if [ "$CONFIGLINES" -eq 0 ]
then
        echo "error: config file is empty for $HOSTNAME"
        exit 1
else
        echo "config file is ok for $HOSTNAME" >/dev/null
fi

mkdir -p "$BACKUPDIR_LOCAL"/$HOSTNAME

rm -rf /tmp/"$HOSTNAME"-ssh-script.sh 1>/dev/null 2>&1
rm -rf /tmp/"$HOSTNAME"-filelist  1>/dev/null 2>&1
echo "#!/bin/bash" > /tmp/"$HOSTNAME"-ssh-script.sh
touch /tmp/"$HOSTNAME"-filelist

if [ -e /tmp/"$HOSTNAME"-ssh-script.sh ]
then
        echo "temporary ssh backup script for $HOSTNAME successfully created" > /dev/null
else
        echo "error: creation of temporary ssh backup script for $HOSTNAME failed"
        exit 1
fi

while read line 
do
	LINE2=`echo $line | sed 's/\//-/g'`
	echo "ssh root@"$HOSTNAME" "tar -cz \"$line\"" | dd of="$BACKUPDIR_LOCAL"/"$HOSTNAME"/"$HOSTNAME"-"$DATE""$LINE2".tar.gz" >> /tmp/"$HOSTNAME"-ssh-script.sh
	echo "$BACKUPDIR_LOCAL"/"$HOSTNAME"/"$HOSTNAME"-"$DATE""$LINE2".tar.gz >> /tmp/"$HOSTNAME"-filelist
done < "$CONFIGDIR"/"$HOSTNAME".cfg

chmod 750 /tmp/"$HOSTNAME"-ssh-script.sh

/tmp/"$HOSTNAME"-ssh-script.sh 1>/dev/null 2>/dev/null

while read line
do
	TARLINECOUNT=0
	TARLINECOUNT=`tar -tf $line | wc -l`

	if [ "$TARLINECOUNT" -eq 0 ]
	then
	        echo "error: $line seems to be empty"
	else
	        echo "$line is ok" > /dev/null
		LINE_TO_DEL=`echo $line | sed 's/..-..-....-/*/' | sed 's/backupdir/backupdir.backupsrv/'`
		rm $LINE_TO_DEL
		cp $line /home/backupid/backupdir.backupsrv/$HOSTNAME
	fi

done < /tmp/"$HOSTNAME"-filelist


exit 0

(habs ein bisl umschreiben muessen vorm posten, ich hoffe es funzt noch)

wenn du nun einen server namens HANSI backupen willst dann legst ne config datei im selben verzeichnis an wo das script liegt. da schreibst die zu sichernden verzeichnisse rein

hansi.cfg
Code:
/home
/etc
/root

und im crontab des users backupid rufst es dann so auf:

0 5 * * * /home/backupid/bin/backup-dirs.sh hansi

und er macht jeden tag ein backup mit timestamps im namen

wenn dir das gefaellt dann kann ichs script fuer mysql dbs auch noch posten
 
Zuletzt bearbeitet:
dann bekommst das mysql script auch noch :fresse:

backup-mysql.sh
Code:
#!/bin/bash
HOSTNAME=$1
CONFIGDIR=`echo $(dirname $0)`
BACKUPDIR_LOCAL=/home/backupid/backupdir
DATE=`date +%d-%m-%Y`


if [ "$HOSTNAME" == "" ] 
then 
	echo error: please enter a hostname
	exit 1
else
	echo hostname ok > /dev/null
fi

PORTACCESSIBLE=`nmap -p 22 $HOSTNAME | grep "22/tcp open  ssh" | wc -l`

if [ "$PORTACCESSIBLE" -eq 0 ]
then
        echo "error: ssh port not accessible on $HOSTNAME"
        exit 1
else
        echo "ssh port is reachable on $HOSTNAME" > /dev/null
fi

if [ -e "$CONFIGDIR"/"$HOSTNAME"-mysql.cfg ]
then
	echo "config file for $HOSTNAME found" > /dev/null
else
	echo "error: no config file for $HOSTNAME found"
	exit 1
fi

CONFIGLINES=`cat "$CONFIGDIR"/"$HOSTNAME"-mysql.cfg | wc -l`

if [ "$CONFIGLINES" -eq 0 ]
then
        echo "error: config file is empty for $HOSTNAME"
        exit 1
else
        echo "config file is ok for $HOSTNAME" >/dev/null
fi

mkdir -p "$BACKUPDIR_LOCAL"/$HOSTNAME/database-mysql

rm -rf /tmp/"$HOSTNAME"-ssh-script-mysql.sh 1>/dev/null 2>&1
rm -rf /tmp/"$HOSTNAME"-filelist-mysql  1>/dev/null 2>&1
echo "#!/bin/bash" > /tmp/"$HOSTNAME"-ssh-script-mysql.sh
touch /tmp/"$HOSTNAME"-filelist-mysql

if [ -e /tmp/"$HOSTNAME"-ssh-script-mysql.sh ]
then
        echo "temporary ssh mysql backup script for $HOSTNAME successfully created" > /dev/null
else
        echo "error: creation of temporary ssh mysql backup script for $HOSTNAME failed"
        exit 1
fi

USERNAME=`sed -n 's/^mysqllogin\ //;s/:.*$//p' "$CONFIGDIR"/"$HOSTNAME"-mysql.cfg`
PASSWORD=`sed -n 's/^mysqllogin\ //;s/^.*://p' "$CONFIGDIR"/"$HOSTNAME"-mysql.cfg`

grep -v "mysqllogin" "$CONFIGDIR"/"$HOSTNAME"-mysql.cfg > /tmp/"$HOSTNAME"-mysql.cfg

while read line 
do
	echo "ssh root@"$HOSTNAME" "mysqldump -u"$USERNAME" -p"$PASSWORD" -hlocalhost --opt $line" | dd of="$BACKUPDIR_LOCAL"/"$HOSTNAME"/database-mysql/"$HOSTNAME"-"$DATE"-"$line".sql" >> /tmp/"$HOSTNAME"-ssh-script-mysql.sh
	echo "gzip --fast "$BACKUPDIR_LOCAL"/"$HOSTNAME"/database-mysql/"$HOSTNAME"-"$DATE"-"$line".sql" >> /tmp/"$HOSTNAME"-ssh-script-mysql.sh
	echo "$BACKUPDIR_LOCAL"/"$HOSTNAME"/database-mysql/"$HOSTNAME"-"$DATE"-"$line".sql.gz >> /tmp/"$HOSTNAME"-filelist-mysql

done < /tmp/"$HOSTNAME"-mysql.cfg

chmod 750 /tmp/"$HOSTNAME"-ssh-script-mysql.sh

/tmp/"$HOSTNAME"-ssh-script-mysql.sh 1>/dev/null 2>/dev/null

exit 0

die config dazu muss so heisen:

hansi-mysql.cfg
Code:
mysqllogin root:password465475643
mysql
bayes
information_schema

da steht in der ersten zeile mysqllogin und dann der mysql user root und mit : abgetrennt das passwort vom mysql user (waer gut wenns passwort nur aus buchstaben und ziffern besteht :fresse: )

ausfuehren per

0 5 * * * /home/backupid/bin/backup-mysql.sh hansi


edit: loesch aus dem anderen script noch die 3 zeilen raus, die hab ich uebersehen

LINE_TO_DEL=`echo $line | sed 's/..-..-....-/*/' | sed 's/backupdir/backupdir.backupsrv/'`
rm $LINE_TO_DEL
cp $line /home/backupid/backupdir.backupsrv/$HOSTNAME
 
Zuletzt bearbeitet:
@ulukay, hast du auch eine Möglichkeit alle datenbanken in einzelne Datein zu packen? Mein Script will nicht so wie ich
Code:
#!/bin/sh
##
## I hope that this version will work :)
## Script made by bastelfreak, with help from KISI, einballimwasser and hetznerwiki
##
# got do directory for backups
cd /home/backup
# create directory for temporary mysqldumps
mkdir mysqldump
#go to directory for temporary mysqldumps
cd mysqldump
# set a variable
DBASELIST=`mktemp`
# put the names of every db in the variable
mysqlshow -p$(cat /root/.mysqlsecret) | awk '{print $2}' | grep -v Databases | sort >$DBASELIST
#create a .sql for every db in a loop
for x in `cat $DBASELIST`; do
    echo "Datenbank: $x sichern";
#    mysqldump --opt -p$(cat /root/.mysqlsecret) $x >$x.sql;
  mysqldump -h 127.0.0.1 --user=root --password=$(cat /root/.mysqlsecret) $x > $x.sql
        echo "Backup von $x wurde erstellt";
done;
# back to basics...
cd ..
# make a tar of everything and cleanup
tar -cfvz $(date +%Y-%m-%d_%Hh%Mm)_full_backup.tar.gz /var/www  mysqldump
rm -r mysqldump
#nice output if all worked fine
echo "Backup wurde erfolgreich erstellt";
 
fuer /etc wuerd ich zu etckeeper raten. das ganze dann mit git. kann man dann auch wunderbar pushen/pullen. und es kann leben retten. :teufel:
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh