initial commit
This commit is contained in:
221
scripts/healthcheck.sh
Executable file
221
scripts/healthcheck.sh
Executable file
@@ -0,0 +1,221 @@
|
||||
#!/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 "${RED}❌ Configuration invalide${NC}"
|
||||
((ERRORS++))
|
||||
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
|
||||
138
scripts/restore.sh
Executable file
138
scripts/restore.sh
Executable file
@@ -0,0 +1,138 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script de restauration interactive Borgmatic
|
||||
# Usage: ./restore.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
|
||||
else
|
||||
echo -e "${RED}❌ Fichier .env non trouvé${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$BORG_REPO" ]; then
|
||||
echo -e "${RED}❌ BORG_REPO non défini${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}==================================================${NC}"
|
||||
echo -e "${BLUE}Script de restauration Borgmatic${NC}"
|
||||
echo -e "${BLUE}==================================================${NC}"
|
||||
echo ""
|
||||
|
||||
# 1. Lister les archives disponibles
|
||||
echo -e "${YELLOW}📦 Archives disponibles:${NC}"
|
||||
echo ""
|
||||
borg list "$BORG_REPO" --short
|
||||
echo ""
|
||||
|
||||
# 2. Demander quelle archive restaurer
|
||||
read -p "Nom de l'archive à restaurer (ou 'latest' pour la plus récente): " ARCHIVE_NAME
|
||||
|
||||
if [ "$ARCHIVE_NAME" == "latest" ]; then
|
||||
ARCHIVE_NAME=$(borg list "$BORG_REPO" --short | tail -1)
|
||||
echo -e "${GREEN}Archive sélectionnée: ${ARCHIVE_NAME}${NC}"
|
||||
fi
|
||||
|
||||
# 3. Vérifier que l'archive existe
|
||||
if ! borg list "$BORG_REPO::$ARCHIVE_NAME" > /dev/null 2>&1; then
|
||||
echo -e "${RED}❌ Archive non trouvée: $ARCHIVE_NAME${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4. Afficher le contenu de l'archive
|
||||
echo ""
|
||||
echo -e "${YELLOW}📂 Contenu de l'archive (répertoires principaux):${NC}"
|
||||
borg list "$BORG_REPO::$ARCHIVE_NAME" | head -50
|
||||
echo ""
|
||||
|
||||
# 5. Options de restauration
|
||||
echo -e "${YELLOW}Options de restauration:${NC}"
|
||||
echo "1. Monter l'archive pour exploration"
|
||||
echo "2. Extraire des fichiers/dossiers spécifiques"
|
||||
echo "3. Extraire l'archive complète (ATTENTION!)"
|
||||
echo "4. Annuler"
|
||||
echo ""
|
||||
read -p "Choix [1-4]: " CHOICE
|
||||
|
||||
case $CHOICE in
|
||||
1)
|
||||
# Monter l'archive
|
||||
MOUNT_POINT="/tmp/borg-restore-${ARCHIVE_NAME}"
|
||||
mkdir -p "$MOUNT_POINT"
|
||||
|
||||
echo -e "${YELLOW}📌 Montage de l'archive dans: ${MOUNT_POINT}${NC}"
|
||||
borg mount "$BORG_REPO::$ARCHIVE_NAME" "$MOUNT_POINT"
|
||||
|
||||
echo -e "${GREEN}✅ Archive montée avec succès${NC}"
|
||||
echo ""
|
||||
echo "Vous pouvez maintenant explorer et copier les fichiers depuis:"
|
||||
echo -e "${BLUE}${MOUNT_POINT}${NC}"
|
||||
echo ""
|
||||
echo "Pour démonter quand vous avez terminé:"
|
||||
echo -e "${YELLOW}borg umount ${MOUNT_POINT}${NC}"
|
||||
;;
|
||||
|
||||
2)
|
||||
# Extraction sélective
|
||||
read -p "Chemin du fichier/dossier à extraire (ex: /etc/nginx): " PATH_TO_RESTORE
|
||||
read -p "Destination (défaut: ./restore): " RESTORE_DEST
|
||||
RESTORE_DEST=${RESTORE_DEST:-./restore}
|
||||
|
||||
mkdir -p "$RESTORE_DEST"
|
||||
|
||||
echo -e "${YELLOW}🔄 Extraction en cours...${NC}"
|
||||
borg extract --progress "$BORG_REPO::$ARCHIVE_NAME" "$PATH_TO_RESTORE" --destination "$RESTORE_DEST"
|
||||
|
||||
echo -e "${GREEN}✅ Extraction terminée dans: ${RESTORE_DEST}${NC}"
|
||||
;;
|
||||
|
||||
3)
|
||||
# Extraction complète
|
||||
echo -e "${RED}⚠️ ATTENTION: Cette opération va extraire TOUTE l'archive${NC}"
|
||||
read -p "Êtes-vous sûr? (tapez 'OUI' en majuscules): " CONFIRM
|
||||
|
||||
if [ "$CONFIRM" != "OUI" ]; then
|
||||
echo -e "${YELLOW}Annulé${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
read -p "Destination (défaut: ./restore-full): " RESTORE_DEST
|
||||
RESTORE_DEST=${RESTORE_DEST:-./restore-full}
|
||||
|
||||
mkdir -p "$RESTORE_DEST"
|
||||
|
||||
echo -e "${YELLOW}🔄 Extraction complète en cours (peut prendre du temps)...${NC}"
|
||||
borg extract --progress "$BORG_REPO::$ARCHIVE_NAME" --destination "$RESTORE_DEST"
|
||||
|
||||
echo -e "${GREEN}✅ Extraction complète terminée dans: ${RESTORE_DEST}${NC}"
|
||||
;;
|
||||
|
||||
4)
|
||||
echo -e "${YELLOW}Annulé${NC}"
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
echo -e "${RED}❌ Choix invalide${NC}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}==================================================${NC}"
|
||||
echo -e "${GREEN}✅ Opération terminée${NC}"
|
||||
echo -e "${GREEN}==================================================${NC}"
|
||||
110
scripts/test-notifications.sh
Executable file
110
scripts/test-notifications.sh
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script de test des notifications ntfy
|
||||
# Usage: ./test-notifications.sh
|
||||
#
|
||||
|
||||
# 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
|
||||
else
|
||||
echo -e "${RED}❌ Fichier .env non trouvé${NC}"
|
||||
echo "Créez un fichier .env avec NTFY_URL et NTFY_USER"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$NTFY_URL" ]; then
|
||||
echo -e "${RED}❌ NTFY_URL non défini dans .env${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}==================================================${NC}"
|
||||
echo -e "${BLUE}Test des notifications ntfy${NC}"
|
||||
echo -e "${BLUE}==================================================${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Configuration:${NC}"
|
||||
echo " URL: $NTFY_URL"
|
||||
echo " Auth: $([ -n "$NTFY_USER" ] && echo "✅ Configurée" || echo "❌ Non configurée")"
|
||||
echo ""
|
||||
|
||||
# Test 1: Notification simple
|
||||
echo -e "${YELLOW}📤 Test 1: Notification simple...${NC}"
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -u "$NTFY_USER" \
|
||||
-H "Title: Test Borgmatic" \
|
||||
-H "Priority: default" \
|
||||
-H "Tags: test" \
|
||||
-d "Ceci est un test de notification depuis le script de configuration Borgmatic" \
|
||||
"$NTFY_URL")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||
if [ "$HTTP_CODE" -eq 200 ]; then
|
||||
echo -e "${GREEN}✅ Notification simple envoyée avec succès${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Échec (HTTP $HTTP_CODE)${NC}"
|
||||
echo "$RESPONSE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
|
||||
# Test 2: Notification de succès (simule un backup réussi)
|
||||
echo -e "${YELLOW}📤 Test 2: Notification de succès de backup...${NC}"
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -u "$NTFY_USER" \
|
||||
-H "Title: ✅ Backup réussi" \
|
||||
-H "Priority: default" \
|
||||
-H "Tags: white_check_mark,backup" \
|
||||
-d "Test de notification de succès
|
||||
Archive: test-backup-$(date +%Y%m%d-%H%M)
|
||||
Date: $(date '+%Y-%m-%d %H:%M:%S')
|
||||
Taille: 15.2 GB" \
|
||||
"$NTFY_URL")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||
if [ "$HTTP_CODE" -eq 200 ]; then
|
||||
echo -e "${GREEN}✅ Notification de succès envoyée avec succès${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Échec (HTTP $HTTP_CODE)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sleep 2
|
||||
|
||||
# Test 3: Notification d'erreur (simule un backup échoué)
|
||||
echo -e "${YELLOW}📤 Test 3: Notification d'erreur de backup...${NC}"
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -u "$NTFY_USER" \
|
||||
-H "Title: ❌ Backup échoué" \
|
||||
-H "Priority: high" \
|
||||
-H "Tags: x,backup,alert" \
|
||||
-d "Test de notification d'erreur
|
||||
Erreur: Ceci est un test - pas de vraie erreur !
|
||||
Date: $(date '+%Y-%m-%d %H:%M:%S')
|
||||
Vérifiez les logs: journalctl -u borgmatic.service -n 50" \
|
||||
"$NTFY_URL")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||
if [ "$HTTP_CODE" -eq 200 ]; then
|
||||
echo -e "${GREEN}✅ Notification d'erreur envoyée avec succès${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Échec (HTTP $HTTP_CODE)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}==================================================${NC}"
|
||||
echo -e "${GREEN}✅ Tous les tests de notification ont réussi !${NC}"
|
||||
echo -e "${GREEN}==================================================${NC}"
|
||||
echo ""
|
||||
echo "Vérifiez que vous avez reçu 3 notifications sur votre appareil:"
|
||||
echo " 1. Notification de test simple"
|
||||
echo " 2. Notification de succès de backup"
|
||||
echo " 3. Notification d'erreur de backup"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user