#!/bin/bash # # Script de vérification de santé des backups Borgmatic # Usage: ./healthcheck.sh # set -e # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Charger les variables d'environnement if [ -f /etc/borgmatic/.env ]; then source /etc/borgmatic/.env elif [ -f .env ]; then source .env fi ERRORS=0 WARNINGS=0 echo -e "${BLUE}==================================================${NC}" echo -e "${BLUE}Healthcheck Borgmatic - Agence66${NC}" echo -e "${BLUE}==================================================${NC}" echo "" # 1. Vérifier que Borgmatic est installé echo -e "${YELLOW}🔍 Vérification de l'installation...${NC}" if command -v borgmatic &> /dev/null; then VERSION=$(borgmatic --version 2>&1 | head -1) echo -e "${GREEN}✅ Borgmatic installé: ${VERSION}${NC}" else echo -e "${RED}❌ Borgmatic n'est pas installé${NC}" ((ERRORS++)) fi if command -v borg &> /dev/null; then VERSION=$(borg --version) echo -e "${GREEN}✅ Borg installé: ${VERSION}${NC}" else echo -e "${RED}❌ Borg n'est pas installé${NC}" ((ERRORS++)) fi echo "" # 2. Vérifier la configuration echo -e "${YELLOW}🔍 Vérification de la configuration...${NC}" if [ -f /etc/borgmatic/config.yaml ]; then echo -e "${GREEN}✅ Fichier de configuration trouvé${NC}" if borgmatic config validate > /dev/null 2>&1; then echo -e "${GREEN}✅ Configuration valide${NC}" else echo -e "${YELLOW}⚠️ Utilisez 'borgmatic --dry-run' pour tester${NC}" fi else echo -e "${RED}❌ Fichier de configuration non trouvé${NC}" ((ERRORS++)) fi if [ -f /etc/borgmatic/.env ]; then echo -e "${GREEN}✅ Fichier .env trouvé${NC}" # Vérifier les variables essentielles if [ -z "$BORG_REPO" ]; then echo -e "${RED}❌ BORG_REPO non défini${NC}" ((ERRORS++)) else echo -e "${GREEN}✅ BORG_REPO défini${NC}" fi if [ -z "$NTFY_URL" ]; then echo -e "${YELLOW}⚠️ NTFY_URL non défini (notifications désactivées)${NC}" ((WARNINGS++)) else echo -e "${GREEN}✅ NTFY_URL défini${NC}" fi else echo -e "${RED}❌ Fichier .env non trouvé${NC}" ((ERRORS++)) fi echo "" # 3. Vérifier les services systemd echo -e "${YELLOW}🔍 Vérification des services systemd...${NC}" if systemctl is-enabled borgmatic.timer &> /dev/null; then echo -e "${GREEN}✅ Timer borgmatic activé${NC}" else echo -e "${RED}❌ Timer borgmatic non activé${NC}" ((ERRORS++)) fi if systemctl is-active borgmatic.timer &> /dev/null; then echo -e "${GREEN}✅ Timer borgmatic en cours d'exécution${NC}" # Afficher la prochaine exécution NEXT=$(systemctl list-timers | grep borgmatic | awk '{print $1, $2, $3, $4}') if [ -n "$NEXT" ]; then echo -e "${BLUE} Prochaine exécution: ${NEXT}${NC}" fi else echo -e "${YELLOW}⚠️ Timer borgmatic arrêté${NC}" ((WARNINGS++)) fi echo "" # 4. Vérifier le repository if [ -n "$BORG_REPO" ]; then echo -e "${YELLOW}🔍 Vérification du repository...${NC}" if borg info "$BORG_REPO" &> /dev/null; then echo -e "${GREEN}✅ Repository accessible${NC}" # Informations sur le repository REPO_INFO=$(borg info "$BORG_REPO" 2>&1 || true) # Nombre d'archives ARCHIVE_COUNT=$(borg list "$BORG_REPO" --short 2>/dev/null | wc -l) echo -e "${BLUE} Nombre d'archives: ${ARCHIVE_COUNT}${NC}" if [ "$ARCHIVE_COUNT" -eq 0 ]; then echo -e "${YELLOW}⚠️ Aucune archive trouvée (repository vide)${NC}" ((WARNINGS++)) else # Dernière archive LAST_ARCHIVE=$(borg list "$BORG_REPO" --short 2>/dev/null | tail -1) echo -e "${BLUE} Dernière archive: ${LAST_ARCHIVE}${NC}" # Vérifier l'âge de la dernière archive LAST_DATE=$(echo "$LAST_ARCHIVE" | grep -oP '\d{8}-\d{4}' || echo "") if [ -n "$LAST_DATE" ]; then LAST_TIMESTAMP=$(date -d "${LAST_DATE:0:8} ${LAST_DATE:9:2}:${LAST_DATE:11:2}" +%s 2>/dev/null || echo "0") NOW=$(date +%s) AGE_HOURS=$(( (NOW - LAST_TIMESTAMP) / 3600 )) echo -e "${BLUE} Âge de la dernière archive: ${AGE_HOURS}h${NC}" if [ "$AGE_HOURS" -gt 48 ]; then echo -e "${RED}❌ Dernière archive trop ancienne (>48h)${NC}" ((ERRORS++)) elif [ "$AGE_HOURS" -gt 30 ]; then echo -e "${YELLOW}⚠️ Dernière archive ancienne (>30h)${NC}" ((WARNINGS++)) fi fi fi else echo -e "${RED}❌ Repository inaccessible ou non initialisé${NC}" ((ERRORS++)) fi echo "" fi # 5. Vérifier les hooks echo -e "${YELLOW}🔍 Vérification des hooks...${NC}" if [ -f /etc/borgmatic/hooks/ntfy-success.sh ]; then echo -e "${GREEN}✅ Hook de succès trouvé${NC}" if [ -x /etc/borgmatic/hooks/ntfy-success.sh ]; then echo -e "${GREEN}✅ Hook de succès exécutable${NC}" else echo -e "${RED}❌ Hook de succès non exécutable${NC}" ((ERRORS++)) fi else echo -e "${YELLOW}⚠️ Hook de succès non trouvé${NC}" ((WARNINGS++)) fi if [ -f /etc/borgmatic/hooks/ntfy-error.sh ]; then echo -e "${GREEN}✅ Hook d'erreur trouvé${NC}" if [ -x /etc/borgmatic/hooks/ntfy-error.sh ]; then echo -e "${GREEN}✅ Hook d'erreur exécutable${NC}" else echo -e "${RED}❌ Hook d'erreur non exécutable${NC}" ((ERRORS++)) fi else echo -e "${YELLOW}⚠️ Hook d'erreur non trouvé${NC}" ((WARNINGS++)) fi echo "" # 6. Vérifier les logs récents echo -e "${YELLOW}🔍 Logs récents...${NC}" if journalctl -u borgmatic.service -n 1 &> /dev/null; then LAST_LOG=$(journalctl -u borgmatic.service -n 1 --no-pager 2>/dev/null | tail -1) if [ -n "$LAST_LOG" ]; then echo -e "${BLUE} Dernier log: ${LAST_LOG:0:100}...${NC}" fi # Chercher des erreurs récentes ERROR_COUNT=$(journalctl -u borgmatic.service --since "24 hours ago" -p err --no-pager 2>/dev/null | wc -l) if [ "$ERROR_COUNT" -gt 0 ]; then echo -e "${RED}❌ ${ERROR_COUNT} erreurs dans les dernières 24h${NC}" ((ERRORS++)) else echo -e "${GREEN}✅ Aucune erreur dans les dernières 24h${NC}" fi fi echo "" # Résumé echo -e "${BLUE}==================================================${NC}" echo -e "${BLUE}Résumé${NC}" echo -e "${BLUE}==================================================${NC}" if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then echo -e "${GREEN}✅ Tout est OK !${NC}" exit 0 elif [ $ERRORS -eq 0 ]; then echo -e "${YELLOW}⚠️ ${WARNINGS} avertissement(s)${NC}" exit 0 else echo -e "${RED}❌ ${ERRORS} erreur(s), ${WARNINGS} avertissement(s)${NC}" exit 1 fi