migrat backup_maverick.sh a restic
This commit is contained in:
+83
-64
@@ -1,68 +1,86 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
## Contraseña del repositorio restic: maverick-backup-2024
|
||||||
|
## Fichero: /root/.restic-password (chmod 600)
|
||||||
|
|
||||||
## Variables
|
## Variables
|
||||||
NOW=$(date +"%d-%m-%Y %T")
|
readonly RESTIC_REPOSITORY=/sustancia/backup/maverick-restic
|
||||||
readonly NOW
|
readonly RESTIC_PASSWORD_FILE=/root/.restic-password
|
||||||
|
|
||||||
## Destino del backup
|
|
||||||
readonly BACKUP_MOUNT=/sustancia/backup
|
readonly BACKUP_MOUNT=/sustancia/backup
|
||||||
readonly BACKUP_TARGET=${BACKUP_MOUNT}/maverick
|
readonly LOG="${BACKUP_MOUNT}/backup_maverick.log"
|
||||||
readonly LOG="${BACKUP_TARGET}"/backup_maverick.log
|
|
||||||
readonly TARGET_SYSTEM_FILES=${BACKUP_TARGET}/system
|
|
||||||
readonly TARGET_FILES=${BACKUP_TARGET}/files
|
|
||||||
readonly TARGET_DOCKER=${BACKUP_TARGET}/docker
|
|
||||||
readonly TARGET_HOME=${BACKUP_TARGET}/home
|
|
||||||
|
|
||||||
## Backup de la carpeta home
|
|
||||||
readonly BACKUP_HOME=/home/sergio
|
readonly BACKUP_HOME=/home/sergio
|
||||||
|
|
||||||
## Backup de docker
|
|
||||||
readonly BACKUP_DOCKER=/home/sergio/docker
|
readonly BACKUP_DOCKER=/home/sergio/docker
|
||||||
readonly BACKUP_DOCKER_VOLUMES=/var/volumes
|
readonly BACKUP_DOCKER_VOLUMES=/var/volumes
|
||||||
|
|
||||||
## Monta la carpetas del nas
|
export RESTIC_REPOSITORY RESTIC_PASSWORD_FILE
|
||||||
mount $BACKUP_MOUNT
|
|
||||||
|
|
||||||
## Comprueba si se ha montado la carpeta
|
RUNNING_CONTAINERS=""
|
||||||
if [ -f ${BACKUP_MOUNT}/not_mount ]; then
|
|
||||||
printf "No se ha montado la carpeta de destino\n"
|
cleanup() {
|
||||||
exit 0
|
local exit_code=$?
|
||||||
|
if [ -n "$RUNNING_CONTAINERS" ]; then
|
||||||
|
printf "\n\n>> ARRANCANDO CONTENEDORES (cleanup)\n" | tee -a "${LOG}"
|
||||||
|
echo "$RUNNING_CONTAINERS" | xargs docker start | tee -a "${LOG}"
|
||||||
|
fi
|
||||||
|
umount "$BACKUP_MOUNT" 2>/dev/null || true
|
||||||
|
if [ $exit_code -ne 0 ]; then
|
||||||
|
printf "\n\nBACKUP FALLIDO (código: %d)\n" "$exit_code" | tee -a "${LOG}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
log_section() {
|
||||||
|
printf "\n\n>> %s [%s]\n" "$1" "$(date +"%T")" | tee -a "${LOG}"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Monta la carpeta del nas
|
||||||
|
mountpoint -q "$BACKUP_MOUNT" || mount "$BACKUP_MOUNT"
|
||||||
|
|
||||||
|
if ! mountpoint -q "$BACKUP_MOUNT"; then
|
||||||
|
printf "No se ha podido montar %s\n" "$BACKUP_MOUNT" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Rotar log: renombrar el actual con timestamp y conservar los últimos 5
|
||||||
|
if [ -f "${LOG}" ]; then
|
||||||
|
mv "${LOG}" "${LOG}.$(date +%Y%m%d_%H%M%S)"
|
||||||
|
find "${BACKUP_MOUNT}" -maxdepth 1 -name 'backup_maverick.log.*' -printf '%T@ %p\n' \
|
||||||
|
| sort -rn | tail -n +6 | awk '{print $2}' | xargs -r rm --
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Inicializar repo si no existe
|
||||||
|
if ! restic snapshots &>/dev/null; then
|
||||||
|
restic init
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## Empieza el proceso de backup
|
## Empieza el proceso de backup
|
||||||
printf "\n\nCOMIENZA LA COPIA DE SEGURIDAD (%s)\n" "${NOW}" | tee -a "${LOG}"
|
SCRIPT_START=$(date +%s)
|
||||||
|
printf "\n\nCOMIENZA LA COPIA DE SEGURIDAD (%s)\n" "$(date +"%d-%m-%Y %T")" | tee -a "${LOG}"
|
||||||
|
|
||||||
## Backup de ficheros del sistema
|
## Backup de ficheros del sistema
|
||||||
printf "\n\n>> COPIANDO FICHEROS DEL SISTEMA\n" | tee -a "${LOG}"
|
log_section "COPIANDO FICHEROS DEL SISTEMA"
|
||||||
mkdir -p "${TARGET_SYSTEM_FILES}/"
|
SYSTEM_PATHS=()
|
||||||
for i in /etc/cron.*; do
|
for p in /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly \
|
||||||
rsync -avh --delete "$i" "${TARGET_SYSTEM_FILES}"/ | tee -a "${LOG}"
|
/etc/cron.weekly /etc/crontab /etc/fstab; do
|
||||||
|
[ -e "$p" ] && SYSTEM_PATHS+=("$p")
|
||||||
done
|
done
|
||||||
rsync -avh --delete /etc/fstab "${TARGET_SYSTEM_FILES}"/ | tee -a "${LOG}"
|
if [ ${#SYSTEM_PATHS[@]} -gt 0 ]; then
|
||||||
rsync -avh --delete /etc/crontab "${TARGET_SYSTEM_FILES}"/ | tee -a "${LOG}"
|
restic backup "${SYSTEM_PATHS[@]}" --tag sistema | tee -a "${LOG}"
|
||||||
|
fi
|
||||||
|
|
||||||
## Backup de ficheros
|
## Backup de ficheros home
|
||||||
FILES=".gitconfig .git-credentials"
|
log_section "COPIANDO FICHEROS HOME"
|
||||||
for FILE in $FILES; do
|
HOME_FILES=()
|
||||||
printf "\n\n>> COPIANDO FICHEROS\n" | tee -a "${LOG}"
|
for f in ".gitconfig" ".git-credentials" ".ssh"; do
|
||||||
if [ -f "${BACKUP_HOME}"/"${FILE}" ]; then
|
[ -e "${BACKUP_HOME}/${f}" ] && HOME_FILES+=("${BACKUP_HOME}/${f}")
|
||||||
mkdir -p "${TARGET_FILES}/"
|
|
||||||
rsync -avh --delete "${BACKUP_HOME}"/"${FILE}" "${TARGET_FILES}/" | tee -a "${LOG}"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
if [ ${#HOME_FILES[@]} -gt 0 ]; then
|
||||||
|
restic backup "${HOME_FILES[@]}" --tag home | tee -a "${LOG}"
|
||||||
|
fi
|
||||||
|
|
||||||
## Backup de las carpetas del directorio home
|
## Parar contenedores Docker
|
||||||
FOLDERS=".ssh"
|
log_section "DETENIENDO CONTENEDORES"
|
||||||
for FOLDER in $FOLDERS; do
|
|
||||||
if [ -d "${BACKUP_HOME}"/"${FOLDER}" ]; then
|
|
||||||
printf "\n\n>> COPIANDO %s\n" "${FOLDER}" | tee -a "${LOG}"
|
|
||||||
mkdir -p "${TARGET_HOME}"
|
|
||||||
rsync -avh --delete "${BACKUP_HOME}"/"${FOLDER}" "${TARGET_HOME}" | tee -a "${LOG}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
## Backup de docker compose y volumenes
|
|
||||||
printf "\n\n>> DETENIENDO CONTENEDORES\n"
|
|
||||||
RUNNING_CONTAINERS=$(docker ps -q)
|
RUNNING_CONTAINERS=$(docker ps -q)
|
||||||
if [ -n "$RUNNING_CONTAINERS" ]; then
|
if [ -n "$RUNNING_CONTAINERS" ]; then
|
||||||
echo "$RUNNING_CONTAINERS" | xargs docker stop | tee -a "${LOG}"
|
echo "$RUNNING_CONTAINERS" | xargs docker stop | tee -a "${LOG}"
|
||||||
@@ -70,22 +88,23 @@ else
|
|||||||
printf "No hay contenedores en ejecución\n" | tee -a "${LOG}"
|
printf "No hay contenedores en ejecución\n" | tee -a "${LOG}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
FOLDER=DOCKER
|
## Backup de docker compose y volúmenes
|
||||||
if [ -d "${BACKUP_DOCKER}" ]; then
|
log_section "COPIANDO DOCKER"
|
||||||
printf "\n\n>> COPIANDO %s\n" "${FOLDER}" | tee -a "${LOG}"
|
DOCKER_PATHS=()
|
||||||
mkdir -p "${TARGET_DOCKER}/compose/"
|
[ -d "${BACKUP_DOCKER}" ] && DOCKER_PATHS+=("${BACKUP_DOCKER}")
|
||||||
rsync -avh --delete "${BACKUP_DOCKER}/" "${TARGET_DOCKER}/compose/" | tee -a "${LOG}"
|
[ -d "${BACKUP_DOCKER_VOLUMES}" ] && DOCKER_PATHS+=("${BACKUP_DOCKER_VOLUMES}")
|
||||||
fi
|
if [ ${#DOCKER_PATHS[@]} -gt 0 ]; then
|
||||||
FOLDER=DOCKER_VOLUMES
|
restic backup "${DOCKER_PATHS[@]}" --tag docker | tee -a "${LOG}"
|
||||||
if [ -d "${BACKUP_DOCKER_VOLUMES}" ]; then
|
|
||||||
printf "\n\n>> COPIANDO %s\n" "${FOLDER}" | tee -a "${LOG}"
|
|
||||||
mkdir -p "${TARGET_DOCKER}/volumes/"
|
|
||||||
rsync -avh --delete "${BACKUP_DOCKER_VOLUMES}/" "${TARGET_DOCKER}/volumes/" | tee -a "${LOG}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "\n\n>> ARRANCANDO CONTENEDORES\n"
|
## Retención: eliminar snapshots antiguos
|
||||||
if [ -n "$RUNNING_CONTAINERS" ]; then
|
log_section "LIMPIEZA DE SNAPSHOTS ANTIGUOS"
|
||||||
echo "$RUNNING_CONTAINERS" | xargs docker start | tee -a "${LOG}"
|
restic forget \
|
||||||
else
|
--keep-daily 7 \
|
||||||
printf "No hay contenedores para arrancar\n" | tee -a "${LOG}"
|
--keep-weekly 4 \
|
||||||
fi
|
--keep-monthly 6 \
|
||||||
|
--prune | tee -a "${LOG}"
|
||||||
|
|
||||||
|
ELAPSED=$(( $(date +%s) - SCRIPT_START ))
|
||||||
|
printf "\n\nBACKUP COMPLETADO correctamente en %dm %ds\n" \
|
||||||
|
"$((ELAPSED/60))" "$((ELAPSED%60))" | tee -a "${LOG}"
|
||||||
|
|||||||
Reference in New Issue
Block a user