Compare commits
19 Commits
d2b4bcf48a
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 681089b3fa | |||
| ff5651b752 | |||
| c93d108948 | |||
| a8fd363ba4 | |||
| 2682cb0d47 | |||
| 1266720a8d | |||
| 8f2c2e6ae1 | |||
| a9f642dd18 | |||
| eeefac9c61 | |||
| 3b65c5660b | |||
| 39d78b3944 | |||
| 51a3371d99 | |||
| 117af2e508 | |||
| f2b4b2ad7b | |||
| 68db36b8ec | |||
| 0e298937c8 | |||
| 1181ace61c | |||
| 5cf49f6064 | |||
| 6ce1a0ae86 |
+17
-3
@@ -1,8 +1,22 @@
|
|||||||
FROM ubuntu:18.04
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
MAINTAINER Vitali Graf <info@vitaligraf.de>
|
LABEL maintainer="Vitali Graf <info@vitaligraf.de>"
|
||||||
|
|
||||||
RUN apt-get update && apt-get install openssh-client rdiff-backup python-pyxattr python-pylibacl --no-install-recommends -y && apt-get clean && rm -rf /var/lib/apt/lists/*
|
ARG GIT_BRANCH=unspecified
|
||||||
|
ARG GIT_COMMIT=unspecified
|
||||||
|
ARG GIT_AUTHOR=unspecified
|
||||||
|
ARG GIT_DATE=unspecified
|
||||||
|
|
||||||
|
LABEL git.commit="$GIT_COMMIT"
|
||||||
|
LABEL git.branch="$GIT_BRANCH"
|
||||||
|
LABEL git.author="$GIT_AUTHOR"
|
||||||
|
LABEL git.date="$GIT_DATE"
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install openssh-client python3-pip python3-setuptools python3-pylibacl python3-pyxattr --no-install-recommends -y \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& pip3 install rdiff-backup==2.2.4
|
||||||
|
|
||||||
COPY *.sh /
|
COPY *.sh /
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -4,9 +4,12 @@ REMOTE_HOST='example.com'
|
|||||||
# Mit welchem User soll backup gemacht werden. root ist empfohlen
|
# Mit welchem User soll backup gemacht werden. root ist empfohlen
|
||||||
REMOTE_USER='root'
|
REMOTE_USER='root'
|
||||||
|
|
||||||
# Wechle Ordner sollen gesichert werden als BASH-Array z.B. ("/home" "/var/www")
|
# Welche Ordner sollen gesichert werden als BASH-Array z.B. ("/home" "/var/www")
|
||||||
FOLDERS=()
|
FOLDERS=()
|
||||||
|
|
||||||
|
# Welche Docker volumes sollen gesichert werden als BASH-Array z.B. ("vol-1" "redis-vol-1")
|
||||||
|
DOCKER_VOLUME=()
|
||||||
|
|
||||||
# Wie lange sollen Backups gesichert bleiben z.B. 8W
|
# Wie lange sollen Backups gesichert bleiben z.B. 8W
|
||||||
# ==================================================
|
# ==================================================
|
||||||
# Remove the incremental backup information in the destination
|
# Remove the incremental backup information in the destination
|
||||||
@@ -39,6 +42,5 @@ MYSQL_PASS='secret'
|
|||||||
# Dieser Ordner wird zusammen mit $FOLDERS gesichert
|
# Dieser Ordner wird zusammen mit $FOLDERS gesichert
|
||||||
MYSQL_DUMP_DIR='/var/backups/sqldump'
|
MYSQL_DUMP_DIR='/var/backups/sqldump'
|
||||||
|
|
||||||
|
|
||||||
# Die Optionen die beim Backup eingesetzt werden
|
# Die Optionen die beim Backup eingesetzt werden
|
||||||
RDIFF_BACKUP_OPTS="--exclude-sockets --exclude-device-files --exclude-fifos --exclude-other-filesystems"
|
RDIFF_BACKUP_OPTS="--exclude-sockets --exclude-device-files --exclude-fifos --exclude-other-filesystems"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
REMOTE_HOST=''
|
REMOTE_HOST=''
|
||||||
REMOTE_USER='root'
|
REMOTE_USER='root'
|
||||||
FOLDERS=()
|
FOLDERS=()
|
||||||
|
DOCKER_VOLUME=()
|
||||||
DELETE_OLD_FILES='8W'
|
DELETE_OLD_FILES='8W'
|
||||||
|
|
||||||
MYSQL_DB=()
|
MYSQL_DB=()
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ gen_config(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
move_to_ROOT(){
|
move_to_ROOT(){
|
||||||
read_config $1
|
|
||||||
# prüfen ob Ordner ROOT, VOL, CONT existieren
|
# prüfen ob Ordner ROOT, VOL, CONT existieren
|
||||||
# wenn nicht ROOT anlegen und alle bisher vorhandene Ordner dorthin verschieben
|
# wenn nicht ROOT anlegen und alle bisher vorhandene Ordner dorthin verschieben
|
||||||
[ ! -d "$BACKUP_DIR_FILES" ] && mkdir -p "$BACKUP_DIR_FILES" || return
|
[ ! -d "$BACKUP_DIR_FILES" ] && mkdir -p "$BACKUP_DIR_FILES" || return
|
||||||
@@ -69,10 +68,10 @@ b_files(){
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# die eigentliche Sicherung ...
|
# die eigentliche Sicherung ...
|
||||||
echo backup file[s]: "$1"
|
|
||||||
rdiff-backup $RDIFF_BACKUP_OPTS "$1" "$2"
|
rdiff-backup $RDIFF_BACKUP_OPTS "$1" "$2"
|
||||||
|
|
||||||
# alle Sicherungen die älter als $DELETE_OLD_FILES löschen
|
# alle Sicherungen die älter als $DELETE_OLD_FILES löschen
|
||||||
|
echo remove backup increments older than: $DELETE_OLD_FILES
|
||||||
rdiff-backup --remove-older-than $DELETE_OLD_FILES --force "$2"
|
rdiff-backup --remove-older-than $DELETE_OLD_FILES --force "$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,11 +88,6 @@ export_sql(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
b_vol(){
|
|
||||||
## Docker volume mit rdiff-backup sichern
|
|
||||||
sleep 1
|
|
||||||
}
|
|
||||||
|
|
||||||
backup(){
|
backup(){
|
||||||
read_config "$1"
|
read_config "$1"
|
||||||
|
|
||||||
@@ -101,10 +95,7 @@ backup(){
|
|||||||
echo ==================================================
|
echo ==================================================
|
||||||
|
|
||||||
# Backupverzeichnisse einrichten
|
# Backupverzeichnisse einrichten
|
||||||
move_to_ROOT $1
|
move_to_ROOT
|
||||||
|
|
||||||
# neue Konfiguration lesen
|
|
||||||
#source "$CONFIG_DIR/$1"
|
|
||||||
|
|
||||||
# SCHRITT 1:
|
# SCHRITT 1:
|
||||||
# sichern der MySQL-Datenbanken auf dem remote host
|
# sichern der MySQL-Datenbanken auf dem remote host
|
||||||
@@ -130,6 +121,7 @@ backup(){
|
|||||||
|
|
||||||
# die SQL-Dateien vom remote host wieder löschen
|
# die SQL-Dateien vom remote host wieder löschen
|
||||||
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/\"*.sql"
|
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/\"*.sql"
|
||||||
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# SCHRITT 2:
|
# SCHRITT 2:
|
||||||
@@ -137,12 +129,31 @@ backup(){
|
|||||||
for dir in "${FOLDERS[@]}"
|
for dir in "${FOLDERS[@]}"
|
||||||
do
|
do
|
||||||
# die eigentliche Sicherung ...
|
# die eigentliche Sicherung ...
|
||||||
b_files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "${BACKUP_DIR_FILES}/${dir}"
|
echo backup file[s]: "$dir"
|
||||||
|
[ "$dir" != "" ] && b_files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "${BACKUP_DIR_FILES}/${dir}"
|
||||||
|
|
||||||
# Liste der Sicherungen anzeigen
|
# Liste der Sicherungen anzeigen
|
||||||
if [ "$2" == "--list" ]; then
|
if [ "$2" == "--list" ]; then
|
||||||
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
|
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
|
||||||
fi
|
fi
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
# SCHRIT 3:
|
||||||
|
# die Sicherung der Docker volumes
|
||||||
|
for vol in "${DOCKER_VOLUME[@]}"
|
||||||
|
do
|
||||||
|
echo backup Docker volume: "$vol"
|
||||||
|
# herausfinden wo die volume gespeicher ist
|
||||||
|
dir=$(ssh ${REMOTE_USER}@${REMOTE_HOST} docker volume inspect -f "{{.Mountpoint}}" "$vol")
|
||||||
|
|
||||||
|
# und die eigentliche Sicherung ...
|
||||||
|
[ "$dir" != "" ] && b_files "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "${BACKUP_DIR_VOLS}/${vol}"
|
||||||
|
|
||||||
|
# Liste der Sicherungen anzeigen
|
||||||
|
if [ "$2" == "--list" ]; then
|
||||||
|
rdiff-backup -l "${BACKUP_DIR_VOLS}/${vol}"
|
||||||
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
done
|
done
|
||||||
@@ -155,8 +166,6 @@ backup(){
|
|||||||
|
|
||||||
r_files(){
|
r_files(){
|
||||||
## einzelne Dateien und Ordner mit rdiff-backup wiederherstellen
|
## einzelne Dateien und Ordner mit rdiff-backup wiederherstellen
|
||||||
echo restore file[s]: "$1" "$3"
|
|
||||||
|
|
||||||
if [ "$3" != "" ]; then
|
if [ "$3" != "" ]; then
|
||||||
rdiff-backup --force -r "$3" "$1" "$2"
|
rdiff-backup --force -r "$3" "$1" "$2"
|
||||||
else
|
else
|
||||||
@@ -164,60 +173,95 @@ r_files(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
r_mysql(){
|
import_sql(){
|
||||||
## Import einer MySQL-DB von einem SQL-Script aus einem vorher (!) wiederherstellen Ordner
|
## Import einer MySQL-DB von einem SQL-Script aus einem vorher (!) wiederherstellen Ordner
|
||||||
sleep 1
|
|
||||||
}
|
if [ "$MYSQL_CONTAINER" != '' ]
|
||||||
|
then
|
||||||
r_vol(){
|
FROM_FILE="${BACKUP_DIR_CONTAINERS}/${MYSQL_CONTAINER}/${1}.sql"
|
||||||
## Docker volume mit rdiff-backup wiederherstellen
|
else
|
||||||
sleep 1
|
FROM_FILE="${BACKUP_DIR_FILES}/${MYSQL_DUMP_DIR}/${1}.sql"
|
||||||
}
|
fi
|
||||||
|
|
||||||
r_mysql_cont(){
|
r_files "$FROM_FILE" "${REMOTE_USER}@${REMOTE_HOST}::${MYSQL_DUMP_DIR}/${1}.sql" "$2"
|
||||||
## Import einer MySQL-DB von einem SQL-Script aus einem vorher (!) wiederherstellen Ordner in ein Container
|
|
||||||
sleep 1
|
if [ "$MYSQL_CONTAINER" != '' ]
|
||||||
|
then
|
||||||
|
ssh ${REMOTE_USER}@${REMOTE_HOST} "docker exec -i \"$MYSQL_CONTAINER\" mysql -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" < \"$MYSQL_DUMP_DIR/${1}.sql\""
|
||||||
|
else
|
||||||
|
ssh ${REMOTE_USER}@${REMOTE_HOST} "mysql -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" < \"$MYSQL_DUMP_DIR/${1}.sql\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO: was davon muss noch sein?
|
||||||
|
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/${1}.sql\""
|
||||||
}
|
}
|
||||||
|
|
||||||
restore(){
|
restore(){
|
||||||
read_config "$1"
|
read_config "$1"
|
||||||
|
|
||||||
echo Start restore $1 -> $2
|
echo Start restore $1 from $2
|
||||||
echo ==================================================
|
echo ==================================================
|
||||||
|
|
||||||
# neue Konfiguration lesen
|
|
||||||
#source "$CONFIG_DIR/$1"
|
|
||||||
# SCHRITT 1:
|
# SCHRITT 1:
|
||||||
# Alle Dateien und Ordner aus dem letzten Backup wiederherstellen
|
# Alle Dateien und Ordner aus dem letzten Backup wiederherstellen
|
||||||
|
|
||||||
if [ ${#MYSQL_DB[@]} -gt 0 ]
|
if [ ${#MYSQL_DB[@]} -gt 0 ]
|
||||||
then
|
then
|
||||||
FOLDERS+=("$MYSQL_DUMP_DIR")
|
#FOLDERS+=("$MYSQL_DUMP_DIR")
|
||||||
|
|
||||||
|
## jede SQL-Datei einzeln hochladen
|
||||||
|
|
||||||
|
for db in "${MYSQL_DB[@]}"
|
||||||
|
do
|
||||||
|
echo restore database: "$db" from "$2"
|
||||||
|
import_sql "$db" "$2"
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for dir in "${FOLDERS[@]}"
|
for dir in "${FOLDERS[@]}"
|
||||||
do
|
do
|
||||||
# die eigentliche Wiederherstellung ...
|
# die eigentliche Wiederherstellung ...
|
||||||
|
echo restore file[s]: "${dir}" from "$2"
|
||||||
|
|
||||||
r_files "${BACKUP_DIR_FILES}/${dir}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "$2"
|
r_files "${BACKUP_DIR_FILES}/${dir}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "$2"
|
||||||
done
|
echo
|
||||||
# SCHRITT 2:
|
|
||||||
# Datenbanken wiederherstellen
|
|
||||||
|
|
||||||
for db in "${MYSQL_DB[@]}"
|
|
||||||
do
|
|
||||||
echo restore database: "$db"
|
|
||||||
ssh ${REMOTE_USER}@${REMOTE_HOST} "mysql -u \"$MYSQL_USER\" \"-p$MYSQL_PASS\" < \"$MYSQL_DUMP_DIR/$db.sql\""
|
|
||||||
[ "$MYSQL_DUMP_DIR" != "" ] && [ "$MYSQL_DUMP_DIR" != "/" ] && ssh ${REMOTE_USER}@${REMOTE_HOST} "rm -rf \"$MYSQL_DUMP_DIR/$db.sql\""
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
for vol in "${DOCKER_VOLUME[@]}"
|
||||||
|
do
|
||||||
|
# die eigentliche Wiederherstellung ...
|
||||||
|
echo restore Docker volume: "${vol}" from "$2"
|
||||||
|
|
||||||
|
# herausfinden wo das volume gespeicher ist
|
||||||
|
if [ dir=$(ssh ${REMOTE_USER}@${REMOTE_HOST} docker volume inspect -f "{{.Mountpoint}}" "$vol") ]
|
||||||
|
then
|
||||||
|
echo Volume don\'t exist.
|
||||||
|
echo Create one: docker volume create "${vol}"
|
||||||
|
|
||||||
|
ssh ${REMOTE_USER}@${REMOTE_HOST} docker volume create "${vol}"
|
||||||
|
dir=$(ssh ${REMOTE_USER}@${REMOTE_HOST} docker volume inspect -f "{{.Mountpoint}}" "$vol")
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ "$dir" != "" ] && r_files "${BACKUP_DIR_VOLS}/${vol}" "${REMOTE_USER}@${REMOTE_HOST}::${dir}" "$2"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
echo Done restore $1
|
echo Done restore $1
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
test_function(){
|
show_config(){
|
||||||
read_config "$1"
|
read_config "$1"
|
||||||
echo $REMOTE_HOST
|
echo REMOTE_HOST="$REMOTE_HOST"
|
||||||
|
echo REMOTE_USER="$REMOTE_USER"
|
||||||
|
echo FOLDERS="${FOLDERS[@]}"
|
||||||
|
echo DOCKER_VOLUME="${DOCKER_VOLUME[@]}"
|
||||||
|
echo DELETE_OLD_FILES="$DELETE_OLD_FILES"
|
||||||
|
echo MYSQL_DB="${MYSQL_DB[@]}"
|
||||||
|
echo MYSQL_USER="$MYSQL_USER"
|
||||||
|
echo MYSQL_PASS='################'
|
||||||
|
echo MYSQL_DUMP_DIR="$MYSQL_DUMP_DIR"
|
||||||
|
echo RDIFF_BACKUP_OPTS="$RDIFF_BACKUP_OPTS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -227,26 +271,80 @@ list(){
|
|||||||
echo Show backups of $1
|
echo Show backups of $1
|
||||||
echo ==================================================
|
echo ==================================================
|
||||||
|
|
||||||
# neue Konfiguration lesen
|
if [ ${#MYSQL_DB[@]} -gt 0 ]
|
||||||
#source "$CONFIG_DIR/$1"
|
|
||||||
|
|
||||||
if [ ${#MYSQL_DB[@]} -gt 0 ]
|
|
||||||
then
|
then
|
||||||
FOLDERS+=("$MYSQL_DUMP_DIR")
|
echo show backups 'for' MySQL databases:
|
||||||
|
|
||||||
|
if [ "$MYSQL_CONTAINER" != '' ]
|
||||||
|
then
|
||||||
|
rdiff-backup -l "$BACKUP_DIR_CONTAINERS/${MYSQL_CONTAINER}"
|
||||||
|
else
|
||||||
|
rdiff-backup -l "${BACKUP_DIR_FILES}/${MYSQL_DUMP_DIR}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for dir in "${FOLDERS[@]}"
|
for dir in "${FOLDERS[@]}"
|
||||||
do
|
do
|
||||||
echo show backups for file[s]: "$dir"
|
echo show backups 'for' file[s]: "$dir"
|
||||||
|
|
||||||
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
|
rdiff-backup -l "${BACKUP_DIR_FILES}/${dir}"
|
||||||
echo
|
echo
|
||||||
done
|
done
|
||||||
|
|
||||||
|
for vol in "${DOCKER_VOLUME[@]}"
|
||||||
|
do
|
||||||
|
echo show backups 'for' volume: "${vol}"
|
||||||
|
|
||||||
|
rdiff-backup -l "${BACKUP_DIR_VOLS}/${vol}"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
echo Done show $1
|
echo Done show $1
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_destination_dir(){
|
||||||
|
read_config "$1"
|
||||||
|
|
||||||
|
echo Check backups of $1
|
||||||
|
echo ==================================================
|
||||||
|
|
||||||
|
if [ ${#MYSQL_DB[@]} -gt 0 ]
|
||||||
|
then
|
||||||
|
echo check backups 'for' MySQL databases:
|
||||||
|
|
||||||
|
if [ "$MYSQL_CONTAINER" != '' ]
|
||||||
|
then
|
||||||
|
rdiff-backup --check-destination-dir "$BACKUP_DIR_CONTAINERS/${MYSQL_CONTAINER}"
|
||||||
|
else
|
||||||
|
rdiff-backup --check-destination-dir "${BACKUP_DIR_FILES}/${MYSQL_DUMP_DIR}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
for dir in "${FOLDERS[@]}"
|
||||||
|
do
|
||||||
|
echo check backups 'for' file[s]: "$dir"
|
||||||
|
|
||||||
|
rdiff-backup --check-destination-dir "${BACKUP_DIR_FILES}/${dir}"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
for vol in "${DOCKER_VOLUME[@]}"
|
||||||
|
do
|
||||||
|
echo check backups 'for' volume: "${vol}"
|
||||||
|
|
||||||
|
rdiff-backup --check-destination-dir "${BACKUP_DIR_VOLS}/${vol}"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
echo Done check $1
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
if [ "$1" == "--gen-config" ]; then
|
if [ "$1" == "--gen-config" ]; then
|
||||||
gen_config
|
gen_config
|
||||||
|
|
||||||
@@ -266,11 +364,14 @@ elif [ "$1" == "--bash" ]; then
|
|||||||
shift
|
shift
|
||||||
/bin/bash "$@"
|
/bin/bash "$@"
|
||||||
|
|
||||||
elif [ "$1" == "--testit" ]; then
|
elif [ "$1" == "--check-destination-dir" ]; then
|
||||||
shift
|
shift
|
||||||
test_function "$@"
|
check_destination_dir "$@"
|
||||||
|
|
||||||
|
elif [ "$1" == "--show-config" ]; then
|
||||||
|
shift
|
||||||
|
show_config "$@"
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "usage ?"
|
echo "usage ?"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
Reference in New Issue
Block a user