commit 2b048a09e133699fc78d242bc6ae47d32e21156f Author: BeauTroll <-> Date: Tue Dec 16 04:41:26 2025 +0100 initial commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bd0d329 --- /dev/null +++ b/.env.example @@ -0,0 +1,40 @@ +# Configuration Borgmatic - Variables d'environnement +# Copier ce fichier vers .env et remplir avec vos valeurs réelles + +# ============================================ +# CONFIGURATION BORG +# ============================================ + +# Passphrase de chiffrement Borg (si utilisé) +BORG_PASSPHRASE=your-secure-passphrase-here + +# Repository Borg +# Exemples: +# - Local: /mnt/backup/borg-repo +# - Remote SSH: ssh://user@backup.example.com:22/path/to/repo +# - BorgBase: ssh://xxxxx@xxxxx.repo.borgbase.com/./repo +BORG_REPO=/path/to/borg/repository + +# Clé SSH pour connexion au serveur de backup distant (si applicable) +# BORG_RSH="ssh -i /root/.ssh/borg_backup_key" + +# ============================================ +# NOTIFICATIONS NTFY +# ============================================ + +# URL du serveur ntfy +NTFY_URL=https://ntfy.sh/your-topic-name + +# Authentification ntfy (format: username:password) +# Laisser vide si pas d'authentification +NTFY_USER=username:password + +# ============================================ +# OPTIONS AVANCÉES +# ============================================ + +# Niveau de log (0=minimal, 1=normal, 2=debug) +BORGMATIC_LOG_LEVEL=1 + +# Désactiver les vérifications d'intégrité si nécessaire +# BORGMATIC_SKIP_CHECKS=yes diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bf07f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Fichiers sensibles - NE JAMAIS COMMITER +.env +*.key +*.pem +*.ppk +*_rsa +*_ed25519 +passphrase.txt +borg-key-*.txt + +# Logs +*.log +logs/ + +# Backups et dumps temporaires +*.sql +*.dump +backup-*.tar.gz + +# OS +.DS_Store +Thumbs.db +*~ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Cache Python +__pycache__/ +*.pyc +*.pyo + +# Fichiers de test +test-backup/ +.test/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8172cdf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,54 @@ +# Changelog + +Toutes les modifications notables de ce projet seront documentées dans ce fichier. + +## [1.0.0] - 2025-12-16 + +### Ajouté + +- Configuration Borgmatic complète compatible avec les backups Borg existants +- Service et timer systemd pour exécution quotidienne à 3h du matin +- Scripts de hooks pour notifications ntfy (succès et échec) +- Script d'installation automatisé (`install.sh`) +- Scripts utilitaires : + - `scripts/restore.sh` : restauration interactive + - `scripts/healthcheck.sh` : vérification de santé du système + - `scripts/test-notifications.sh` : test des notifications ntfy +- Documentation complète : + - `README.md` : documentation principale + - `QUICKSTART.md` : guide de démarrage rapide + - `TODO.md` : améliorations futures +- Configuration des exclusions (logs, cache, tmp) +- Politique de rétention : 7 daily, 4 weekly, 6 monthly +- Compression zstd +- Template `.env.example` pour variables d'environnement +- `.gitignore` pour éviter de commiter les secrets + +### Chemins sauvegardés + +- `/var/www` - Sites web +- `/srv/minecraftserver` - Serveur Minecraft +- `/srv/reddiscordbot` - Bot Discord +- `/srv/waltercoiffure` - Application Walter Coiffure +- `/etc` - Configurations système +- `/opt/nextcloud` - Nextcloud +- `/opt/traefik` - Reverse proxy Traefik +- `/opt/n8n` - Automation n8n +- `/opt/portainer` - Gestion Docker +- `/opt/uptime-kuma` - Monitoring +- `/opt/vaultwarden` - Gestionnaire de mots de passe +- `/opt/mailcow-dockerized` - Serveur mail +- `/opt/netdata` - Monitoring système +- `/opt/gitea` - Forge Git +- `/home` - Répertoires utilisateurs + +### Compatibilité + +- Compatible avec les archives Borg existantes +- Même format de nommage : `backup-YYYYMMDD-HHMM` +- Même politique de rétention que l'ancien script +- Migration transparente depuis l'ancien script Bash + +## [À venir] + +Voir [TODO.md](TODO.md) pour la liste complète des améliorations prévues. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2adc09f --- /dev/null +++ b/Makefile @@ -0,0 +1,135 @@ +# Makefile pour Borgmatic - Agence66 +# Usage: make [commande] + +.PHONY: help install test backup list restore healthcheck logs status clean + +# Couleurs pour l'affichage +BLUE := \033[0;34m +GREEN := \033[0;32m +YELLOW := \033[1;33m +NC := \033[0m + +help: ## Affiche cette aide + @echo "$(BLUE)Borgmatic - Agence66$(NC)" + @echo "" + @echo "$(YELLOW)Commandes disponibles:$(NC)" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " $(GREEN)%-20s$(NC) %s\n", $$1, $$2}' + +install: ## Installe Borgmatic et configure le système + @echo "$(BLUE)Installation de Borgmatic...$(NC)" + sudo ./install.sh + +test-config: ## Valide la configuration Borgmatic + @echo "$(BLUE)Validation de la configuration...$(NC)" + borgmatic config validate + +test-notifications: ## Teste les notifications ntfy + @echo "$(BLUE)Test des notifications ntfy...$(NC)" + ./scripts/test-notifications.sh + +healthcheck: ## Vérifie la santé du système de backup + @echo "$(BLUE)Vérification de la santé du système...$(NC)" + sudo ./scripts/healthcheck.sh + +dry-run: ## Simule un backup sans l'exécuter + @echo "$(BLUE)Simulation du backup (dry-run)...$(NC)" + sudo borgmatic --dry-run --verbosity 2 + +backup: ## Exécute un backup manuel + @echo "$(BLUE)Exécution du backup...$(NC)" + sudo borgmatic --verbosity 1 --stats + +backup-verbose: ## Exécute un backup manuel avec détails + @echo "$(BLUE)Exécution du backup (mode verbeux)...$(NC)" + sudo borgmatic --verbosity 2 --stats --list + +list: ## Liste toutes les archives de backup + @echo "$(BLUE)Archives disponibles:$(NC)" + @borgmatic list + +list-files: ## Liste les fichiers de la dernière archive + @echo "$(BLUE)Fichiers de la dernière archive:$(NC)" + @borgmatic list --archive latest + +info: ## Affiche les informations sur le repository + @echo "$(BLUE)Informations sur le repository:$(NC)" + @borgmatic info + +restore: ## Lance le script de restauration interactive + @echo "$(BLUE)Restauration interactive...$(NC)" + sudo ./scripts/restore.sh + +check: ## Vérifie l'intégrité du repository et des archives + @echo "$(BLUE)Vérification de l'intégrité...$(NC)" + sudo borgmatic check --verbosity 1 + +prune: ## Nettoie les anciennes archives selon la politique de rétention + @echo "$(YELLOW)Nettoyage des anciennes archives...$(NC)" + sudo borgmatic prune --verbosity 1 + +compact: ## Compacte le repository pour libérer de l'espace + @echo "$(YELLOW)Compactage du repository...$(NC)" + sudo borg compact $(BORG_REPO) + +status: ## Affiche le statut du timer systemd + @echo "$(BLUE)Statut du timer Borgmatic:$(NC)" + @systemctl status borgmatic.timer --no-pager + @echo "" + @echo "$(BLUE)Prochaines exécutions:$(NC)" + @systemctl list-timers | grep borgmatic + +logs: ## Affiche les logs du service + @echo "$(BLUE)Logs du service Borgmatic:$(NC)" + journalctl -u borgmatic.service -n 50 --no-pager + +logs-follow: ## Suit les logs en temps réel + @echo "$(BLUE)Logs en temps réel (Ctrl+C pour arrêter):$(NC)" + journalctl -u borgmatic.service -f + +enable: ## Active et démarre le timer systemd + @echo "$(GREEN)Activation du timer...$(NC)" + sudo systemctl enable borgmatic.timer + sudo systemctl start borgmatic.timer + @echo "$(GREEN)Timer activé !$(NC)" + +disable: ## Désactive le timer systemd + @echo "$(YELLOW)Désactivation du timer...$(NC)" + sudo systemctl disable borgmatic.timer + sudo systemctl stop borgmatic.timer + @echo "$(YELLOW)Timer désactivé$(NC)" + +restart-timer: ## Redémarre le timer systemd + @echo "$(BLUE)Redémarrage du timer...$(NC)" + sudo systemctl restart borgmatic.timer + @systemctl status borgmatic.timer --no-pager + +env-example: ## Affiche un exemple de fichier .env + @cat .env.example + +edit-config: ## Édite la configuration Borgmatic + @sudo nano /etc/borgmatic/config.yaml + +edit-env: ## Édite les variables d'environnement + @sudo nano /etc/borgmatic/.env + +clean: ## Nettoie les fichiers temporaires + @echo "$(YELLOW)Nettoyage...$(NC)" + @rm -f *.log + @rm -rf restore/ restore-*/ + @echo "$(GREEN)Nettoyage terminé$(NC)" + +quick-setup: ## Configuration rapide (copie .env.example vers .env) + @if [ ! -f .env ]; then \ + echo "$(BLUE)Création du fichier .env...$(NC)"; \ + cp .env.example .env; \ + echo "$(GREEN)Fichier .env créé !$(NC)"; \ + echo "$(YELLOW)Éditez maintenant .env avec vos vraies valeurs:$(NC)"; \ + echo " nano .env"; \ + else \ + echo "$(YELLOW)Le fichier .env existe déjà$(NC)"; \ + fi + +# Alias pratiques +backup-now: backup ## Alias pour 'backup' +ls: list ## Alias pour 'list' +check-health: healthcheck ## Alias pour 'healthcheck' diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..82c5e19 --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,148 @@ +# Guide de démarrage rapide - Borgmatic + +Installation et configuration en 5 minutes. + +## Installation rapide + +```bash +# 1. Cloner le dépôt (si pas déjà fait) +git clone +cd agence66-borgmatic + +# 2. Configurer les variables d'environnement +cp .env.example .env +nano .env # Éditer avec vos valeurs (voir ci-dessous) + +# 3. Installer +sudo ./install.sh +``` + +## Configuration .env + +Éditez `.env` avec vos valeurs : + +```bash +# Repository Borg +BORG_REPO=/chemin/vers/votre/repo +# ou pour un repo distant: +# BORG_REPO=ssh://user@backup-server.com/path/to/repo + +# Passphrase de chiffrement +BORG_PASSPHRASE=votre-passphrase-securisee + +# Notifications ntfy +NTFY_URL=https://ntfy.sh/votre-topic +NTFY_USER=username:password +``` + +## Initialiser le repository (si nouveau) + +```bash +# Repository local +borg init --encryption=repokey-blake2 /path/to/repo + +# Repository distant +borg init --encryption=repokey-blake2 ssh://user@server/path/to/repo + +# IMPORTANT: Sauvegarder la clé ! +borg key export /path/to/repo backup-key.txt +``` + +## Tests + +```bash +# 1. Tester les notifications +./scripts/test-notifications.sh + +# 2. Vérifier la santé du système +sudo ./scripts/healthcheck.sh + +# 3. Test à vide (dry-run) +sudo borgmatic --dry-run --verbosity 2 + +# 4. Premier backup réel +sudo borgmatic --verbosity 1 +``` + +## Vérifier le timer + +```bash +# Vérifier que le timer est actif +systemctl status borgmatic.timer + +# Voir quand le prochain backup aura lieu +systemctl list-timers | grep borgmatic +``` + +## Commandes utiles + +```bash +# Lister les backups +borgmatic list + +# Voir les logs +journalctl -u borgmatic.service -f + +# Exécuter un backup manuel +sudo borgmatic + +# Restaurer des fichiers +./scripts/restore.sh + +# Vérifier l'intégrité +sudo borgmatic check +``` + +## Compatibilité avec ancien script + +Si vous migriez depuis l'ancien script Borg : + +1. Votre repository existant **est compatible** +2. Les archives existantes **restent accessibles** +3. Le format de nommage **est identique** +4. Aucune migration n'est nécessaire + +Pour vérifier : + +```bash +# Lister les anciennes archives +borg list $BORG_REPO + +# Tester avec borgmatic +borgmatic list +``` + +## Migration depuis ancien repository + +Si vous avez un repository Borg existant, il suffit de : + +```bash +# 1. Pointer BORG_REPO vers votre repository existant dans .env +BORG_REPO=/path/to/existing/repo + +# 2. Utiliser la même passphrase +BORG_PASSPHRASE=votre-ancienne-passphrase + +# 3. Tester +borgmatic list # Devrait afficher vos anciennes archives +``` + +## En cas de problème + +```bash +# Vérifier la santé +sudo ./scripts/healthcheck.sh + +# Voir les logs +journalctl -u borgmatic.service -n 50 + +# Tester la configuration +borgmatic config validate + +# Mode verbeux +sudo borgmatic --verbosity 2 +``` + +## Support + +Consultez le [README.md](README.md) pour plus de détails. diff --git a/README.md b/README.md new file mode 100644 index 0000000..92e3add --- /dev/null +++ b/README.md @@ -0,0 +1,354 @@ +# Borgmatic Backup - Agence66 + +Configuration Borgmatic pour le backup automatique du serveur Agence66. + +## Vue d'ensemble + +Ce dépôt contient la configuration complète pour effectuer des backups automatiques quotidiens à 3h du matin via Borgmatic et BorgBackup. + +### Caractéristiques + +- **Backup quotidien automatique** à 3h du matin via systemd timer +- **Compression** zstd pour un bon ratio performance/compression +- **Rétention intelligente** : 7 daily, 4 weekly, 6 monthly +- **Notifications** via ntfy pour succès/échec +- **Compatible** avec les backups Borg existants +- **Sécurisé** : chiffrement, exclusions de fichiers sensibles + +## Dossiers sauvegardés + +- `/var/www` - Sites web +- `/srv/minecraftserver` - Serveur Minecraft +- `/srv/reddiscordbot` - Bot Discord +- `/srv/waltercoiffure` - Walter Coiffure +- `/etc` - Configurations système +- `/opt/nextcloud` - Nextcloud +- `/opt/traefik` - Reverse proxy Traefik +- `/opt/n8n` - Automation n8n +- `/opt/portainer` - Gestion Docker +- `/opt/uptime-kuma` - Monitoring +- `/opt/vaultwarden` - Gestionnaire de mots de passe +- `/opt/mailcow-dockerized` - Serveur mail +- `/opt/netdata` - Monitoring système +- `/opt/gitea` - Forge Git +- `/home` - Répertoires utilisateurs + +## Installation + +### Prérequis + +- Système Linux (Debian/Ubuntu/Arch/Fedora) +- Accès root +- Git installé + +### Installation rapide + +```bash +# Cloner le dépôt +git clone +cd agence66-borgmatic + +# Copier et configurer les variables d'environnement +cp .env.example .env +nano .env # Éditer avec vos valeurs + +# Éditer la configuration si nécessaire +nano config.yaml # Ajuster le repository Borg + +# Exécuter l'installation +sudo ./install.sh +``` + +### Configuration manuelle + +Si vous préférez installer manuellement : + +```bash +# Installer Borgmatic +sudo apt install borgbackup borgmatic # Debian/Ubuntu +# ou +sudo pacman -S borgmatic borg # Arch Linux + +# Copier les fichiers +sudo mkdir -p /etc/borgmatic/hooks +sudo cp config.yaml /etc/borgmatic/ +sudo cp hooks/*.sh /etc/borgmatic/hooks/ +sudo chmod +x /etc/borgmatic/hooks/*.sh + +# Copier les variables d'environnement +sudo cp .env /etc/borgmatic/ +sudo chmod 600 /etc/borgmatic/.env + +# Installer les services systemd +sudo cp systemd/borgmatic.service /etc/systemd/system/ +sudo cp systemd/borgmatic.timer /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable borgmatic.timer +sudo systemctl start borgmatic.timer +``` + +## Configuration + +### Variables d'environnement (.env) + +Éditez `/etc/borgmatic/.env` avec vos valeurs : + +```bash +# Repository Borg +BORG_REPO=/path/to/your/repository +# ou pour un repo distant: +BORG_REPO=ssh://user@backup.server.com/path/to/repo + +# Passphrase de chiffrement +BORG_PASSPHRASE=your-secure-passphrase + +# Configuration ntfy +NTFY_URL=https://ntfy.sh/your-topic +NTFY_USER=username:password +``` + +### Configuration Borgmatic (config.yaml) + +Le fichier `/etc/borgmatic/config.yaml` contient la configuration principale. + +Points importants à vérifier : + +1. **Repository** : Décommentez et configurez votre repository dans la section `location.repositories` +2. **Chemins** : Ajustez `source_directories` si nécessaire +3. **Exclusions** : Personnalisez `exclude_patterns` selon vos besoins + +### Initialisation du repository Borg + +Si vous utilisez un nouveau repository : + +```bash +# Repository local +borg init --encryption=repokey-blake2 /path/to/repo + +# Repository distant +borg init --encryption=repokey-blake2 ssh://user@server/path/to/repo +``` + +**IMPORTANT** : Sauvegardez la clé de chiffrement ! + +```bash +borg key export /path/to/repo backup-key.txt +# Conservez ce fichier en lieu sûr ! +``` + +## Utilisation + +### Tester la configuration + +```bash +# Valider la configuration +borgmatic config validate + +# Dry-run (simulation) +borgmatic --dry-run --verbosity 2 + +# Lister les fichiers qui seront sauvegardés +borgmatic list --json +``` + +### Exécuter un backup manuel + +```bash +# Backup avec verbosité normale +sudo borgmatic --verbosity 1 + +# Backup avec verbosité détaillée +sudo borgmatic --verbosity 2 +``` + +### Vérifier le timer systemd + +```bash +# Statut du timer +systemctl status borgmatic.timer + +# Voir quand le prochain backup aura lieu +systemctl list-timers | grep borgmatic + +# Logs du dernier backup +journalctl -u borgmatic.service -n 100 +``` + +### Lister les backups + +```bash +# Lister toutes les archives +borgmatic list + +# Informations détaillées +borg list /path/to/repo +``` + +### Restaurer des fichiers + +```bash +# Monter une archive pour explorer +mkdir /tmp/restore +borg mount /path/to/repo::backup-20250116-0300 /tmp/restore +cd /tmp/restore +# ... copier les fichiers nécessaires ... +cd / +borg umount /tmp/restore + +# Extraire directement +borg extract /path/to/repo::backup-20250116-0300 path/to/file + +# Avec borgmatic +borgmatic extract --archive backup-20250116-0300 --path path/to/file +``` + +## Maintenance + +### Vérifier l'intégrité + +```bash +# Vérification complète du repository +borgmatic check --verbosity 2 + +# Vérification rapide +borg check /path/to/repo +``` + +### Nettoyer l'espace disque + +Le nettoyage automatique (prune) est déjà configuré avec : + +- 7 backups quotidiens +- 4 backups hebdomadaires +- 6 backups mensuels + +Pour forcer un nettoyage manuel : + +```bash +borgmatic prune --verbosity 1 +``` + +### Compacter le repository + +Pour libérer réellement l'espace disque après prune : + +```bash +borg compact /path/to/repo +``` + +## Notifications + +Les notifications sont envoyées via ntfy : + +- ✅ **Succès** : notification normale avec le nom de l'archive +- ❌ **Échec** : notification haute priorité avec le message d'erreur + +Testez manuellement les notifications : + +```bash +# Test notification de succès +/etc/borgmatic/hooks/ntfy-success.sh "test-archive" "" + +# Test notification d'erreur +/etc/borgmatic/hooks/ntfy-error.sh "Erreur de test" +``` + +## Sécurité + +- Les fichiers `.env` et les clés ne sont **jamais** commités (voir `.gitignore`) +- Les permissions des fichiers sensibles sont restrictives (600) +- Le service systemd utilise `ProtectSystem=strict` +- Les logs sont dans le journal systemd, accessible uniquement en root + +## Troubleshooting + +### Le backup ne démarre pas + +```bash +# Vérifier le timer +systemctl status borgmatic.timer + +# Vérifier le service +systemctl status borgmatic.service + +# Voir les logs +journalctl -u borgmatic.service -f +``` + +### Erreur de connexion au repository + +```bash +# Tester la connexion SSH (si distant) +ssh user@backup-server + +# Vérifier les variables d'environnement +sudo cat /etc/borgmatic/.env + +# Tester Borg directement +sudo borg list $BORG_REPO +``` + +### Problème de permissions + +```bash +# Vérifier les permissions des fichiers +ls -la /etc/borgmatic/ +ls -la /etc/borgmatic/hooks/ + +# Corriger si nécessaire +sudo chmod 600 /etc/borgmatic/.env +sudo chmod 600 /etc/borgmatic/config.yaml +sudo chmod +x /etc/borgmatic/hooks/*.sh +``` + +### Notifications ntfy ne fonctionnent pas + +```bash +# Tester manuellement +curl -u "$NTFY_USER" \ + -H "Title: Test" \ + -d "Message de test" \ + "$NTFY_URL" + +# Vérifier les variables +source /etc/borgmatic/.env +echo $NTFY_URL +echo $NTFY_USER +``` + +## Migration depuis l'ancien script + +Si vous migrez depuis l'ancien script Borg : + +1. **Le repository existant est compatible** - pas besoin de réinitialiser +2. **Les archives existantes restent accessibles** +3. **Le format de nommage est identique** : `backup-YYYYMMDD-HHMM` +4. **La rétention est la même** : 7/4/6 + +Pour vérifier la compatibilité : + +```bash +# Lister les anciennes archives +borg list /path/to/existing/repo + +# Tester avec borgmatic +borgmatic list +``` + +## Ressources + +- [Documentation Borgmatic](https://torsion.org/borgmatic/) +- [Documentation BorgBackup](https://borgbackup.readthedocs.io/) +- [ntfy.sh](https://ntfy.sh/) + +## Support + +Pour tout problème : + +1. Consultez la section Troubleshooting +2. Vérifiez les logs : `journalctl -u borgmatic.service -n 100` +3. Testez en mode verbeux : `borgmatic --verbosity 2` + +## Licence + +Configuration personnalisée pour Agence66. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..e69b723 --- /dev/null +++ b/TODO.md @@ -0,0 +1,109 @@ +# TODO - Améliorations futures + +## Priorité haute + +- [ ] Configurer le repository Borg réel (local ou distant) +- [ ] Renseigner les vraies valeurs dans `/etc/borgmatic/.env` +- [ ] Tester le premier backup complet +- [ ] Vérifier que les notifications ntfy fonctionnent +- [ ] Documenter la passphrase et sauvegarder la clé Borg + +## Priorité moyenne + +- [ ] Configurer un backup du repository Borg lui-même (offsite) +- [ ] Mettre en place un monitoring externe (healthchecks.io ou similaire) +- [ ] Ajouter des hooks PostgreSQL/MySQL si nécessaire +- [ ] Configurer des alertes en cas d'échec de backup +- [ ] Tester une restauration complète sur un système de test + +## Améliorations possibles + +### Monitoring et alertes + +- [ ] Intégration avec healthchecks.io pour monitoring externe +- [ ] Dashboard Grafana pour visualiser l'historique des backups +- [ ] Alertes par email en plus de ntfy +- [ ] Métriques Prometheus pour le monitoring + +### Sécurité + +- [ ] Rotation automatique des clés de chiffrement +- [ ] Audit des permissions des fichiers de configuration +- [ ] Backup de la clé Borg dans un gestionnaire de secrets (Vaultwarden) +- [ ] Authentification SSH avec clés dédiées + +### Performance + +- [ ] Optimiser les patterns d'exclusion +- [ ] Ajouter des exclusions pour les caches Docker +- [ ] Tester différents algorithmes de compression +- [ ] Parallélisation des backups si plusieurs destinations + +### Backups de bases de données + +- [ ] Hook pre-backup pour PostgreSQL (si Gitea/autres utilisent PG) +- [ ] Hook pre-backup pour MySQL/MariaDB (si utilisé) +- [ ] Hook pre-backup pour dump des conteneurs Docker +- [ ] Backup des volumes Docker critiques + +### Restauration + +- [ ] Documenter la procédure de disaster recovery complète +- [ ] Script de restauration automatisée sur nouveau serveur +- [ ] Tester régulièrement la restauration (tous les 3 mois) +- [ ] Documenter la restauration sélective par service + +### Documentation + +- [ ] Vidéo tutoriel pour la restauration +- [ ] Runbook pour les situations d'urgence +- [ ] Documentation de l'architecture de backup +- [ ] Guide de migration vers nouveau serveur + +### Testing + +- [ ] Tests automatisés de la configuration +- [ ] Simulation d'échec et vérification des alertes +- [ ] Test de restauration automatisé +- [ ] CI/CD pour valider les modifications de config + +## Notes + +### Services à considérer pour backup séparé + +Certains services pourraient nécessiter des stratégies de backup spécifiques : + +- **Nextcloud** : dump de la base de données avant backup +- **Mailcow** : backup des emails et configuration +- **Gitea** : dump de la base de données Git +- **Vaultwarden** : backup critique à vérifier régulièrement + +### Optimisations d'exclusion + +Ajouter ces exclusions si nécessaire : +```yaml +- '*/venv/*' +- '*/env/*' +- '*/.git/objects/*' # Si backup de repos Git +- '*/docker/overlay2/*' +- '*/docker/volumes/*' # Déjà géré par les apps +``` + +### Backup offsite + +Considérer : +- BorgBase (service cloud spécialisé Borg) +- Serveur distant dédié +- Stockage cloud chiffré (S3, Backblaze B2) +- Rclone pour copier vers le cloud après backup Borg + +### Rotation et rétention + +Configuration actuelle : +- 7 daily (1 semaine) +- 4 weekly (1 mois) +- 6 monthly (6 mois) + +Considérer : +- Ajouter `keep_yearly: 2` pour archives annuelles +- Ajuster selon l'espace disque disponible diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..89095f2 --- /dev/null +++ b/config.yaml @@ -0,0 +1,108 @@ +# Configuration Borgmatic pour backup serveur Agence66 +# Compatible avec les backups Borg existants + +location: + # Chemins sources à sauvegarder + source_directories: + - /var/www + - /srv/minecraftserver + - /srv/reddiscordbot + - /srv/waltercoiffure + - /etc + - /opt/nextcloud + - /opt/traefik + - /opt/n8n + - /opt/portainer + - /opt/uptime-kuma + - /opt/vaultwarden + - /opt/mailcow-dockerized + - /opt/netdata + - /opt/gitea + - /home + + # Repository Borg (à définir selon votre configuration) + # Décommentez et adaptez selon votre setup : + # repositories: + # - /path/to/local/repo + # - ssh://user@backup-server/path/to/repo + + # Patterns d'exclusion + exclude_patterns: + - '*.log' + - '*/cache/*' + - '*/tmp/*' + - '**/__pycache__' + - '*/node_modules/*' + + # Un seul fichier de config + one_file_system: false + +storage: + # Format du nom d'archive (compatible avec votre format actuel) + archive_name_format: 'backup-{now:%Y%m%d-%H%M}' + + # Compression (identique à votre config) + compression: zstd + + # Chiffrement - décommentez et configurez si nécessaire + # encryption_passphrase: sera lu depuis la variable d'environnement BORG_PASSPHRASE + + # Vérification de l'intégrité du repo + check_last: 3 + + # Options supplémentaires + ssh_command: ssh -o StrictHostKeyChecking=accept-new + +retention: + # Politique de rétention (identique à votre config) + keep_daily: 7 + keep_weekly: 4 + keep_monthly: 6 + + # Préfixe des archives à considérer + prefix: 'backup-' + +consistency: + # Vérifications d'intégrité + checks: + - name: repository + frequency: 2 weeks + - name: archives + frequency: 1 month + + # Vérifier uniquement les dernières archives pour économiser du temps + check_last: 3 + +hooks: + # Hooks pour notifications ntfy + before_backup: + - echo "Backup démarré: $(date)" + + after_backup: + - /etc/borgmatic/hooks/ntfy-success.sh "{archive_name}" "{stats}" + + on_error: + - /etc/borgmatic/hooks/ntfy-error.sh "{error}" + + # Actions avant/après + before_actions: + - systemctl is-active docker || systemctl start docker + + # Commandes PostgreSQL/MySQL si nécessaire + # postgresql_databases: + # - name: all + # format: custom + + # mysql_databases: + # - name: all + # format: sql + +output: + # Niveau de verbosité (0 = minimal, 1 = normal, 2 = verbeux) + verbosity: 1 + + # Afficher les statistiques + stats: true + + # Envoyer les logs vers syslog + syslog_facility: LOG_USER diff --git a/hooks/ntfy-error.sh b/hooks/ntfy-error.sh new file mode 100755 index 0000000..3b3504f --- /dev/null +++ b/hooks/ntfy-error.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# +# Hook Borgmatic - Notification d'erreur via ntfy +# Arguments: $1 = error message +# + +# Charger les variables d'environnement +if [ -f /etc/borgmatic/.env ]; then + source /etc/borgmatic/.env +fi + +ERROR_MSG="${1:-Erreur inconnue}" + +# Envoyer notification d'erreur +curl -s -u "$NTFY_USER" \ + -H "Title: ❌ Backup échoué" \ + -H "Priority: high" \ + -H "Tags: x,backup,alert" \ + -d "Le backup a échoué ! +Erreur: ${ERROR_MSG} +Date: $(date '+%Y-%m-%d %H:%M:%S') +Vérifiez les logs: journalctl -u borgmatic.service -n 50" \ + "$NTFY_URL" + +echo "Notification d'erreur envoyée à ntfy" +exit 0 diff --git a/hooks/ntfy-success.sh b/hooks/ntfy-success.sh new file mode 100755 index 0000000..d1d17f1 --- /dev/null +++ b/hooks/ntfy-success.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# +# Hook Borgmatic - Notification de succès via ntfy +# Arguments: $1 = archive_name, $2 = stats +# + +# Charger les variables d'environnement +if [ -f /etc/borgmatic/.env ]; then + source /etc/borgmatic/.env +fi + +ARCHIVE_NAME="${1:-inconnu}" +STATS="${2:-}" + +# Extraire la taille depuis les stats si disponible +# Borgmatic passe les stats en JSON, on peut parser ou utiliser directement +SIZE="voir logs pour détails" + +# Envoyer notification de succès +curl -s -u "$NTFY_USER" \ + -H "Title: ✅ Backup réussi" \ + -H "Priority: default" \ + -H "Tags: white_check_mark,backup" \ + -d "Backup terminé avec succès. +Archive: ${ARCHIVE_NAME} +Date: $(date '+%Y-%m-%d %H:%M:%S')" \ + "$NTFY_URL" + +echo "Notification de succès envoyée à ntfy" +exit 0 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..253cfd0 --- /dev/null +++ b/install.sh @@ -0,0 +1,153 @@ +#!/bin/bash +# +# Script d'installation de Borgmatic pour Agence66 +# Usage: sudo ./install.sh +# + +set -e + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}==================================================${NC}" +echo -e "${GREEN}Installation de Borgmatic - Agence66${NC}" +echo -e "${GREEN}==================================================${NC}" +echo "" + +# Vérifier que le script est exécuté en root +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}❌ Ce script doit être exécuté en root (sudo)${NC}" + exit 1 +fi + +# Détecter la distribution +if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID +else + echo -e "${RED}❌ Impossible de détecter la distribution${NC}" + exit 1 +fi + +# 1. Installation de Borgmatic et Borg +echo -e "${YELLOW}📦 Installation de Borgmatic et Borg...${NC}" + +case $OS in + ubuntu|debian) + apt-get update + apt-get install -y borgbackup borgmatic curl + ;; + arch|manjaro) + pacman -Syu --noconfirm borgmatic borg curl + ;; + fedora|rhel|centos) + dnf install -y borgbackup borgmatic curl + ;; + *) + echo -e "${RED}❌ Distribution non supportée: $OS${NC}" + exit 1 + ;; +esac + +echo -e "${GREEN}✅ Borgmatic et Borg installés${NC}" + +# 2. Créer les répertoires nécessaires +echo -e "${YELLOW}📁 Création des répertoires...${NC}" +mkdir -p /etc/borgmatic +mkdir -p /etc/borgmatic/hooks +mkdir -p /var/log/borgmatic + +echo -e "${GREEN}✅ Répertoires créés${NC}" + +# 3. Copier les fichiers de configuration +echo -e "${YELLOW}📋 Copie des fichiers de configuration...${NC}" + +# Config principale +cp config.yaml /etc/borgmatic/config.yaml +chmod 600 /etc/borgmatic/config.yaml + +# Scripts de hooks +cp hooks/ntfy-success.sh /etc/borgmatic/hooks/ +cp hooks/ntfy-error.sh /etc/borgmatic/hooks/ +chmod +x /etc/borgmatic/hooks/*.sh + +echo -e "${GREEN}✅ Fichiers de configuration copiés${NC}" + +# 4. Configuration des variables d'environnement +echo -e "${YELLOW}🔐 Configuration des variables d'environnement...${NC}" + +if [ -f .env ]; then + cp .env /etc/borgmatic/.env + chmod 600 /etc/borgmatic/.env + echo -e "${GREEN}✅ Fichier .env copié${NC}" +else + echo -e "${YELLOW}⚠️ Fichier .env non trouvé${NC}" + echo -e "${YELLOW} Copie du template .env.example...${NC}" + cp .env.example /etc/borgmatic/.env + chmod 600 /etc/borgmatic/.env + echo -e "${RED}⚠️ IMPORTANT: Éditez /etc/borgmatic/.env avec vos vraies valeurs !${NC}" +fi + +# 5. Installation des services systemd +echo -e "${YELLOW}⚙️ Installation des services systemd...${NC}" + +cp systemd/borgmatic.service /etc/systemd/system/ +cp systemd/borgmatic.timer /etc/systemd/system/ + +systemctl daemon-reload +systemctl enable borgmatic.timer + +echo -e "${GREEN}✅ Services systemd installés et activés${NC}" + +# 6. Vérification de la configuration +echo -e "${YELLOW}🔍 Validation de la configuration...${NC}" + +if borgmatic --version > /dev/null 2>&1; then + echo -e "${GREEN}✅ Borgmatic est installé correctement${NC}" + borgmatic --version +else + echo -e "${RED}❌ Erreur: Borgmatic n'est pas installé correctement${NC}" + exit 1 +fi + +# Test de la configuration (sans exécuter de backup) +if borgmatic config validate > /dev/null 2>&1; then + echo -e "${GREEN}✅ Configuration valide${NC}" +else + echo -e "${YELLOW}⚠️ La configuration nécessite des ajustements${NC}" + echo -e "${YELLOW} Vérifiez /etc/borgmatic/config.yaml${NC}" +fi + +# 7. Affichage des prochaines étapes +echo "" +echo -e "${GREEN}==================================================${NC}" +echo -e "${GREEN}✅ Installation terminée !${NC}" +echo -e "${GREEN}==================================================${NC}" +echo "" +echo -e "${YELLOW}📝 Prochaines étapes:${NC}" +echo "" +echo "1. Éditez les configurations:" +echo " - ${YELLOW}/etc/borgmatic/.env${NC} (variables d'environnement)" +echo " - ${YELLOW}/etc/borgmatic/config.yaml${NC} (configuration Borg)" +echo "" +echo "2. Initialisez votre repository Borg (si nouveau):" +echo " ${YELLOW}borg init --encryption=repokey-blake2 /path/to/repo${NC}" +echo "" +echo "3. Testez votre configuration:" +echo " ${YELLOW}borgmatic --dry-run --verbosity 2${NC}" +echo "" +echo "4. Exécutez un premier backup manuel:" +echo " ${YELLOW}borgmatic --verbosity 1${NC}" +echo "" +echo "5. Vérifiez le timer systemd:" +echo " ${YELLOW}systemctl status borgmatic.timer${NC}" +echo " ${YELLOW}systemctl list-timers | grep borgmatic${NC}" +echo "" +echo "6. Démarrez le timer:" +echo " ${YELLOW}systemctl start borgmatic.timer${NC}" +echo "" +echo -e "${GREEN}Le backup s'exécutera automatiquement tous les jours à 3h du matin${NC}" +echo "" diff --git a/scripts/healthcheck.sh b/scripts/healthcheck.sh new file mode 100755 index 0000000..3cc8a33 --- /dev/null +++ b/scripts/healthcheck.sh @@ -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 diff --git a/scripts/restore.sh b/scripts/restore.sh new file mode 100755 index 0000000..16d8001 --- /dev/null +++ b/scripts/restore.sh @@ -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}" diff --git a/scripts/test-notifications.sh b/scripts/test-notifications.sh new file mode 100755 index 0000000..db12607 --- /dev/null +++ b/scripts/test-notifications.sh @@ -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 "" diff --git a/systemd/borgmatic.service b/systemd/borgmatic.service new file mode 100644 index 0000000..e35cef1 --- /dev/null +++ b/systemd/borgmatic.service @@ -0,0 +1,39 @@ +[Unit] +Description=Borgmatic backup +Documentation=https://torsion.org/borgmatic/ +Wants=network-online.target +After=network-online.target +ConditionACPower=true + +[Service] +Type=oneshot + +# Sécurité +ProtectSystem=strict +PrivateTmp=yes +ReadWritePaths=/var/log/borgmatic + +# Variables d'environnement +EnvironmentFile=/etc/borgmatic/.env + +# Nice et IONice pour ne pas surcharger le système +Nice=19 +IOSchedulingClass=2 +IOSchedulingPriority=7 + +# Délai avant timeout (2 heures) +TimeoutStartSec=7200 + +# Exécuter borgmatic +ExecStart=/usr/bin/borgmatic --verbosity 1 --syslog-verbosity 1 + +# En cas d'échec, continuer (le hook d'erreur gère la notification) +SuccessExitStatus=0 1 + +# Logging +StandardOutput=journal +StandardError=journal +SyslogIdentifier=borgmatic + +[Install] +WantedBy=multi-user.target diff --git a/systemd/borgmatic.timer b/systemd/borgmatic.timer new file mode 100644 index 0000000..262cd1c --- /dev/null +++ b/systemd/borgmatic.timer @@ -0,0 +1,16 @@ +[Unit] +Description=Run borgmatic backup daily at 3 AM +Documentation=https://torsion.org/borgmatic/ + +[Timer] +# Exécuter tous les jours à 3h du matin +OnCalendar=*-*-* 03:00:00 + +# Si le système était éteint, exécuter au démarrage +Persistent=true + +# Randomisation pour éviter la surcharge (± 15 minutes) +RandomizedDelaySec=15min + +[Install] +WantedBy=timers.target