Parcourir la source

ajoute fcn-backup

Guillaume il y a 7 ans
Parent
commit
4382d3d15c
4 fichiers modifiés avec 112 ajouts et 3 suppressions
  1. 17 3
      README.md
  2. 7 0
      backup.cfg.example
  3. 4 0
      backup.exclude.example
  4. 84 0
      fcn-backup

+ 17 - 3
README.md

@@ -1,17 +1,31 @@
 fcn-toolbox
 ===========
 
-Un dépôt pour les outils codés sur un coin de table mais qu'on ne veut pas perdre.
+Un dépôt pour les outils créés par et pour franciliens.net.
 
 ## Outils
 
 ### ccoop-resplit
 
-Une moulinette en python3 pour générer des relevés de compte mensuels
-en CSV à partir de fichiers CSV désorganisés exportés depuis l'interface
+Une moulinette pour générer des relevés de compte mensuels au format CSV
+à partir de fichiers CSV désorganisés exportés depuis l'interface
 Web du Crédit Coopératif. Il n'est pas impossible que ça fonctionne
 également pour d'autres banques.
 
+Dépendances: python3
+
+### fcn-backup
+
+Effectue une sauvegarde incrémentale locale et distance contenant : 
+* Le répertoire /etc
+* Un export ou 'dump' des bases de données PostgreSQL
+* Un export ou 'dump' de la base de donnée ejabberd
+
+Les archives maintenues sont: 7 journalières, 4 hebdomadaires, 3 mensuelles
+
+Dépendances: borgbackup
+Dépendances optionelles: postgresql, ejabberd
+
 ### fcn-dolibarr
 
 Intéragit avec Dolibarr.

+ 7 - 0
backup.cfg.example

@@ -0,0 +1,7 @@
+# Local backup destination
+LOCAL_DIR=/path/to/backups
+
+# Remote backup destination
+REMOTE_USER=backupuser
+REMOTE_HOSTNAME=backupotron5000.example.net
+

+ 4 - 0
backup.exclude.example

@@ -0,0 +1,4 @@
+# List of paths to exclude from backup
+
+# Example: uncommend the following line to exclude the etckeeper repository
+#/etc/.git

+ 84 - 0
fcn-backup

@@ -0,0 +1,84 @@
+#!/bin/sh
+# Requirements : borgbackup
+
+# Read configuration
+. /etc/fcn-toolbox/backup.cfg
+
+if [ -z "${LOCAL_DIR}" ]; then
+  echo >&2 "LOCAL_DIR is not set.  Aborting.";
+  exit 1;
+fi
+
+if [ -z "${REMOTE_USER}" ]; then
+  echo >&2 "REMOTE_USER is not set.  Aborting.";
+  exit 1;
+fi
+
+if [ -z "${REMOTE_HOSTNAME}" ]; then
+  echo >&2 "REMOTE_HOSTNAME is not set.  Aborting.";
+  exit 1;
+fi
+
+HOSTNAME=`hostname`
+BACKUP_DEST=${LOCAL_DIR}/${HOSTNAME}.borg
+
+DATE=`date +%Y-%m-%d`
+BACKUP_NAME="${HOSTNAME}_${DATE}"
+
+# Temporary directory for backup
+BACKUP_TEMP="${LOCAL_DIR}/output-daily"
+
+if ! type "borg" > /dev/null; then
+  echo >&2 "borgbackup is not installed.  Aborting.";
+  exit 1;
+fi
+
+if [ -d "${BACKUP_TEMP}" ]; then
+  echo >&2 "Directory ${BACKUP_TEMP} already exists.  Aborting.";
+  exit 1;
+else
+  mkdir "${BACKUP_TEMP}"
+fi
+
+# Backup ejabberd data if ejabberd_ctl is available
+if type "ejabberdctl" > /dev/null; then
+  EJABBERD_BACKUP=`mktemp -p ~ejabberd/`
+  ejabberdctl backup "$EJABBERD_BACKUP"
+  mv "$EJABBERD_BACKUP" $BACKUP_TEMP/ejabberd.backup
+fi
+
+# Backup PostgreSQL data if pg_dump is available
+if type "pg_dump" > /dev/null; then
+  PG_DBS=`sudo -i -u postgres psql template1 -t -c "SELECT datname FROM pg_database WHERE datname NOT LIKE 'template_'"`
+  for PG_DB in $PG_DBS
+  do
+    PG_BACKUP=`sudo -u postgres mktemp -t pg_dump_XXXX`
+    sudo -u postgres -i pg_dump -Z3 -Fc "${PG_DB}" > "${PG_BACKUP}"
+    mv "${PG_BACKUP}" "${BACKUP_TEMP}/pgsql_${PG_DB}_Fc.dump"
+  done
+fi
+
+if [ ! -d "${BACKUP_DEST}" ]; then
+  # Initialize local borg repository
+  borg init --encryption=none "${BACKUP_DEST}"
+fi
+
+# Do local backup
+borg create --exclude-from /etc/fcn-toolbox/backup.exclude ${BACKUP_DEST}::${BACKUP_NAME} "/etc" "${BACKUP_TEMP}"
+
+# Prune local archives to keep only 7 daily, and 4 weekly, and 3 monthly ones
+borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=3 ${BACKUP_DEST}
+
+# Quick check of the remote repository before doing a remote backup
+if borg check --repository-only ${REMOTE_USER}@${REMOTE_HOSTNAME}:${BACKUP_DEST}; then
+  # Do remote backup
+  borg create --exclude-from /etc/fcn-toolbox/backup.exclude ${REMOTE_USER}@${REMOTE_HOSTNAME}:${BACKUP_DEST}::${BACKUP_NAME} "/etc" "${BACKUP_TEMP}"
+  # Prune remote archives to keep only 7 daily, and 4 weekly, and 3 monthly ones
+  borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=3 ${REMOTE_USER}@${REMOTE_HOSTNAME}:${BACKUP_DEST}
+else
+  echo >&2 "Remote repository is missing of corrupted. Try running: "
+  echo >&2 "borg init --encryption=none ${REMOTE_USER}@${REMOTE_HOSTNAME}:${BACKUP_DEST}"
+fi
+
+# Delete temporary directory
+rm -rf "${BACKUP_TEMP}"