diff --git a/.dockerignore b/.dockerignore index 4f53685..9d357d4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,5 @@ .directory +.git */.directory */*/.directory -.project -vitaligraf.de.sh \ No newline at end of file +.project \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 158fce8..65a2365 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,17 @@ FROM python:2 -WORKDIR /root +MAINTAINER Vitali Graf -RUN apt-get update && apt-get install rdiff-backup --no-install-recommends -y && apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install rdiff-backup python-pyxattr python-pylibacl --no-install-recommends -y && apt-get clean && rm -rf /var/lib/apt/lists/* -COPY ./backup.sh /root/backup.sh +COPY *.sh / -VOLUME ["/root/job.conf", "/root/.ssh", "/var/backups"] +VOLUME /backups /config /root/.ssh + +WORKDIR / + +ENV SSH_KEY_MARKER "hier X belibigen wert setzen" + +ENTRYPOINT ["/start.sh"] + +CMD ["--gen-config"] \ No newline at end of file diff --git a/example_conf.sh b/example_conf.sh new file mode 100644 index 0000000..0a84e5c --- /dev/null +++ b/example_conf.sh @@ -0,0 +1,36 @@ +# Von welchem Server soll ein Backup gemacht werden, Domain oder IP-Adresse +REMOTE_HOST='example.com' + +# Mit welchem User soll backup gemacht werden. root ist empfohlen +REMOTE_USER='root' + +# Wechle Ordner sollen gesichert werden als BASH-Array z.B. ("/home" "/var/www") +FOLDERS=() + +# Wie lange sollen Backups gesichert bleiben z.B. 8W +# ================================================== +# Remove the incremental backup information in the destination +# directory that has been around longer than the given time. +# time_spec can be either an absolute time, like "2002-01-04", or +# a time interval. The time interval is an integer followed by +# the character s, m, h, D, W, M, or Y, indicating seconds, minutes, +# hours, days, weeks, months, or years respectively, or a +# number of these concatenated. For example, 32m means 32 minutes, +# and 3W2D10h7s means 3 weeks, 2 days, 10 hours, and 7 seconds. +# In this context, a month means 30 days, a year is 365 +# days, and a day is always 86400 seconds. +DELETE_OLD_FILES='8W' + +# Zu sichernde MySQL-Datenbanken als BASH-Array z.B. ("mail" "piwik" "mybb") +# Leere Array () => es werden keine MySQL-Datenbanken gesichert +MYSQL_DB=() + +# MySQL User +MYSQL_USER='root' + +# MySQL Passwort +MYSQL_PASS='secret' + +# Wo auf dem Remote Server soll SQL_Dump abgelegt werden. +# Dieser Ordner wird zusammen mit $FOLDERS gesichert +MYSQL_DUMP_DIR='/var/backups/sqldump' \ No newline at end of file diff --git a/reset-conf.sh b/reset-conf.sh new file mode 100644 index 0000000..3dca586 --- /dev/null +++ b/reset-conf.sh @@ -0,0 +1,9 @@ +REMOTE_HOST='' +REMOTE_USER='root' +FOLDERS=() +DELETE_OLD_FILES='8W' + +MYSQL_DB=() +MYSQL_USER='root' +MYSQL_PASS='secret' +MYSQL_DUMP_DIR='/var/backups/sqldump' \ No newline at end of file diff --git a/backup.sh b/start.sh similarity index 51% rename from backup.sh rename to start.sh index 9a99ea1..db9dbbf 100755 --- a/backup.sh +++ b/start.sh @@ -2,12 +2,39 @@ # set -e -source job.conf +# source job.conf +BACKUP_DIR=/backups +CONFIG_DIR=/config +SSH_CF_DIR=/root/.ssh + +gen_config(){ + [ ! -f "$SSH_CF_DIR/id_rsa" ] && ssh-keygen -t rsa -b 4096 -f "$SSH_CF_DIR/id_rsa" -q -C "rdiff-backup-dockerized @ ${SSH_KEY_MARKER}" + + if [ ! -f "$SSH_CF_DIR/config" ]; then + echo 'Host *' > "$SSH_CF_DIR/config" + echo ' StrictHostKeyChecking no' >> "$SSH_CF_DIR/config" + # echo ' UserKnownHostsFile=/dev/null' >> "$SSH_CF_DIR/config" + + chmod go-rwx $SSH_CF_DIR/config + fi + + [ ! -f "$CONFIG_DIR/example_conf.sh" ] && cp /example_conf.sh "$CONFIG_DIR/example_conf.sh" +} backup(){ + #Konfiguration resetten + source "/reset-conf.sh" + + echo Start backup $1 + echo ================================================== + + # neue Konfiguration lesen + source "$CONFIG_DIR/$1" + # SCHRITT 1: # sichern der MySQL-Datenbanken auf dem remote host - # es muss auf dem remote host genug Platz auf der Festplatte geben damit Dump erfolgen kann! + # es muss auf dem remote host genug Platz auf der Festplatte geben damit Dump erfolgen kann! + if [ ${#MYSQL_DB[@]} -gt 0 ] then [ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "[ ! -d \"$MYSQL_DUMP_DIR\" ] && mkdir -p \"$MYSQL_DUMP_DIR\"" @@ -26,17 +53,17 @@ backup(){ for dir in "${FOLDERS[@]}" do # prüfen ob das backup-ordner existiert ... - if [ ! -d "/var/backups/${REMOTE_HOST}${dir}" ]; + if [ ! -d "$BACKUP_DIR/${REMOTE_HOST}${dir}" ]; then # ... und gegebenfals anlegen - mkdir -p "/var/backups/${REMOTE_HOST}${dir}" + mkdir -p "$BACKUP_DIR/${REMOTE_HOST}${dir}" fi # die eigentliche Sicherung ... - rdiff-backup --exclude-special-files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "/var/backups/${REMOTE_HOST}${dir}" + rdiff-backup --exclude-special-files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "$BACKUP_DIR/${REMOTE_HOST}${dir}" # alle Sicherungen die älter als $DELETE_OLD_FILES löschen - rdiff-backup --remove-older-than $DELETE_OLD_FILES --force "/var/backups/${REMOTE_HOST}${dir}" + rdiff-backup --remove-older-than $DELETE_OLD_FILES --force "$BACKUP_DIR/${REMOTE_HOST}${dir}" done # SCHRITT 3: @@ -45,6 +72,8 @@ backup(){ then [ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/\"*.sql" fi + echo " " + echo " " } @@ -52,10 +81,15 @@ backup(){ restore(){ for dir in "${FOLDERS[@]}" do - rdiff-backup -r now "/var/backups/${REMOTE_HOST}${dir}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" + rdiff-backup -r now "$BACKUP_DIR/${REMOTE_HOST}${dir}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" done } +if [ "$1" == "--gen-config" ]; then + gen_config +elif [ "$1" == "--backup" ]; then + backup "$2" +else + echo "nichts zu tun?" +fi -# Tue das da -backup