From ad22ef40cfe4e70435d62a846bfb6a8a29aab62c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20=E2=80=9CFrogeye=E2=80=9D=20Preud=27homme?= Date: Thu, 1 Aug 2019 21:29:20 +0200 Subject: [PATCH] Import of backup script from various sources --- backup.sh | 105 +++++++++++++++++++++++++++++++++++++++++++++++ config.sample.sh | 65 +++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100755 backup.sh create mode 100755 config.sample.sh diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..9f0a1fd --- /dev/null +++ b/backup.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +# Backup script v3 +# Uses restic + +cd `dirname ${BASH_SOURCE-$0}` + +RUNFILE=/var/run/bkp +if [ -e $RUNFILE ] && ps -p $(cat $RUNFILE) > /dev/null +then + >&2 echo "Another backup instance is running. Skipping" + exit 1 +fi + +echo $$ > $RUNFILE +echo → Backup started + +source config.sh + +if [ ! -z ${ETCKEEPER_COMMIT_MESSAGE+x} ] +then + etckeeper commit "$ETCKEEPER_COMMIT_MESSAGE" &> /dev/null & +fi + +# Dumping acl +ACLFILE=~/bkp/acl.gz +function bkpACL() { + touch "$ACLFILE" + chmod 700 "$ACLFILE" + sudo getfacl -R "$SRC" 2> /dev/null | gzip > "$ACLFILE" +} + +# Dumping database +DBFILE=/var/bkp/psql.sql.gz +function bkpPgsql() { + touch "$DBFILE" + chmod 700 "$DBFILE" + pg_dumpall | gzip > "$DBFILE" +} + +# Dumping database +DBFILE=./mysql.sql.gz +function bkpMysql() { + touch "$DBFILE" + chmod 700 "$DBFILE" + mysqldump --defaults-extra-file=mysql.cnf --all-databases --flush-privileges | gzip > "$DBFILE" +} + +# Dumping package list +PACFILE=/var/bkp/pacman.list.gz +function bkpPacman() { + touch "$PACFILE" + chmod 700 "$PACFILE" + comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort) | gzip > "$PACFILE" +} + +# Dumping package list +APTFILE=./apt.list.gz +function bkpApt() { + touch "$APTFILE" + chmod 700 "$APTFILE" + apt list --installed 2> /dev/null | gzip > "$APTFILE" +} + +echo → Creating snapshots of databases + +bkpPgsql & +bkpPacman & + +wait + +# echo "→ Restic: Transfering files" +# +# $RESTIC_CMD $RESTIC_OPTIONS backup $BACKUP_OPTIONS --cleanup-cache +# +# if [ ! -z ${FORGET_OPTIONS+x} ] +# then +# +# echo "→ Restic: Cleaning up" +# +# $RESTIC_CMD $RESTIC_OPTIONS forget $FORGET_OPTIONS +# +# fi + +echo "→ Borg: Transfering files" + +TAG="$(date -Isec)" +$BORG_CMD $BORG_OPTIONS create --stats $CREATE_OPTIONS "${BORG_REPO}::${TAG}" $FILES 2>&1 + +if [ ! -z ${PRUNE_OPTIONS+x} ] +then + + echo "→ Borg: Cleaning up" + + $BORG_CMD $BORG_OPTIONS prune --stats $PRUNE_OPTIONS $BORG_REPO 2>&1 + +fi + + +echo → Remove temporary files +rm "$PACFILE" "$DBFILE" + +echo → Backup ended +rm $RUNFILE + diff --git a/config.sample.sh b/config.sample.sh new file mode 100755 index 0000000..07c3bbd --- /dev/null +++ b/config.sample.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + + + +# Configuration options for the backup.sh script v4 +# TODO Do the v4 + +cd `dirname ${BASH_SOURCE-$0}` + +# Connection options + +# Type of connection to the backup server +TYPE="sftp" +# Hostname/IP of the backup server +HOST="bkpuser@backup.example.com" +# Location of the backup directory on the backup server +DEST="/srv/bkp/host" +BDEST="/srv/bkp/host" + +# You will need to create a `resticpass` file in this directory + +# Exported variable for extra restic manipulation if needed +export RESTIC_REPOSITORY="$TYPE:$HOST:$DEST" +export BORG_REPO="ssh://$HOST$BDEST" +export RESTIC_PASSWORD_FILE="$PWD/resticpass" +export BORG_PASSPHRASE="$(cat $PWD/borgpass)" + +# Export options + +# Where the various exports will be saved +# The file will be deleted afterwards, so it is only to locate it in the backup +WORKING_DIR="/var/bkp" + +# Create a etckeeper commit (make sure /etc is in $FILES for it to be saved) (unset if uneeded) +ETCKEEPER_COMMIT_MESSAGE="Sauvegarde automatique du $(date)" + + +# Backup options + +# Directories to backup +FILES="/" +# Pattern to exclude +EXCLUDE=$(echo --exclude={"/var/cache","**.lock","**/.cache/"}) +# Tags to add to the backups +TAGS=$(echo --tag={"auto","v3"}) +# Options for the backup command +export BACKUP_OPTIONS="--one-file-system --cleanup-cache $FILES $EXCLUDE $TAGS" +export CREATE_OPTIONS="--one-file-system --compression auto,zstd $EXCLUDE" + +# Forget options + +# Which snapshots to keep (inclusive) +KEEP="--keep-hourly 24 --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 10" +# Options for the restic forget command (unset if uneeded) +export FORGET_OPTIONS="$KEEP --prune" +export PRUNE_OPTIONS="$KEEP" + +# Executable options + +# Location of the restic command (you might want to add sudo in there) +# RESTIC_CMD="$(which restic)" +RESTIC_OPTIONS="--cache-dir /var/cache/restic" + +BORG_CMD="$(which borg)" +BORG_OPTIONS=""