Created
July 18, 2025 12:20
-
-
Save itishermann/f072eca0e29f63199454b42312d6dcf7 to your computer and use it in GitHub Desktop.
Script d'installation du système de backup Passbolt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Script d'installation du système de backup Passbolt | |
| # /root/setup-passbolt-backup.sh | |
| set -euo pipefail | |
| echo "Installation du système de backup Passbolt..." | |
| # 1. Créer le répertoire de backup | |
| echo "Création du répertoire de backup..." | |
| mkdir -p /srv/backup/passbolt | |
| chmod 700 /srv/backup/passbolt | |
| # 2. Installer les scripts | |
| echo "Installation des scripts..." | |
| # Script de backup | |
| cat > /usr/local/bin/passbolt-backup.sh << 'EOF' | |
| #!/bin/bash | |
| # Script de sauvegarde Passbolt | |
| # /usr/local/bin/passbolt-backup.sh | |
| set -euo pipefail | |
| # Configuration | |
| BACKUP_DIR="/srv/backup/passbolt" | |
| RETENTION_DAYS="${PASSBOLT_BACKUP_RETENTION_DAYS:-30}" | |
| DATE=$(date +"%Y%m%d_%H%M%S") | |
| BACKUP_NAME="passbolt_backup_${DATE}" | |
| TEMP_DIR="/tmp/${BACKUP_NAME}" | |
| # Fonction de logging | |
| log() { | |
| echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | |
| } | |
| # Fonction de nettoyage en cas d'erreur | |
| cleanup() { | |
| if [ -d "$TEMP_DIR" ]; then | |
| rm -rf "$TEMP_DIR" | |
| fi | |
| } | |
| trap cleanup EXIT | |
| # Vérifier que le script est exécuté en tant que root | |
| if [ "$EUID" -ne 0 ]; then | |
| log "ERREUR: Ce script doit être exécuté en tant que root" | |
| exit 1 | |
| fi | |
| # Créer le répertoire de sauvegarde s'il n'existe pas | |
| mkdir -p "$BACKUP_DIR" | |
| # Créer le répertoire temporaire | |
| log "Création du répertoire temporaire..." | |
| mkdir -p "$TEMP_DIR" | |
| # 1. Sauvegarde de la base de données | |
| log "Sauvegarde de la base de données MySQL..." | |
| # Récupérer le nom de la base de données depuis la configuration Passbolt | |
| DB_NAME=$(grep -oP "(?<=database' => ')[^']*" /etc/passbolt/passbolt.php 2>/dev/null || echo "passbolt") | |
| mysqldump --single-transaction --routines --triggers "$DB_NAME" > "$TEMP_DIR/database.sql" | |
| # 2. Sauvegarde de la configuration Passbolt | |
| log "Sauvegarde de la configuration Passbolt..." | |
| cp -a /etc/passbolt "$TEMP_DIR/etc_passbolt" | |
| # 3. Sauvegarde des clés GPG et autres données | |
| log "Sauvegarde des données Passbolt..." | |
| if [ -d "/var/lib/passbolt" ]; then | |
| cp -a /var/lib/passbolt "$TEMP_DIR/var_lib_passbolt" | |
| fi | |
| # 4. Sauvegarde des avatars et autres fichiers uploadés | |
| log "Sauvegarde des fichiers uploadés..." | |
| if [ -d "/usr/share/php/passbolt/webroot/img/public" ]; then | |
| mkdir -p "$TEMP_DIR/uploads" | |
| cp -a /usr/share/php/passbolt/webroot/img/public "$TEMP_DIR/uploads/" | |
| fi | |
| # 5. Informations sur la version | |
| log "Sauvegarde des informations de version..." | |
| echo "Backup Date: $(date)" > "$TEMP_DIR/backup_info.txt" | |
| echo "Passbolt Version: $(dpkg -l | grep passbolt | awk '{print $3}')" >> "$TEMP_DIR/backup_info.txt" | |
| echo "MySQL Version: $(mysql --version)" >> "$TEMP_DIR/backup_info.txt" | |
| echo "Ubuntu Version: $(lsb_release -a 2>/dev/null)" >> "$TEMP_DIR/backup_info.txt" | |
| # 6. Créer l'archive compressée | |
| log "Création de l'archive compressée..." | |
| cd /tmp | |
| tar -czf "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" "$BACKUP_NAME" | |
| # 7. Nettoyer le répertoire temporaire | |
| log "Nettoyage..." | |
| rm -rf "$TEMP_DIR" | |
| # 8. Définir les permissions appropriées | |
| chmod 600 "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | |
| # 9. Nettoyer les anciennes sauvegardes | |
| log "Suppression des sauvegardes de plus de $RETENTION_DAYS jours..." | |
| find "$BACKUP_DIR" -name "passbolt_backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete | |
| # 10. Vérifier l'intégrité de l'archive | |
| log "Vérification de l'intégrité de l'archive..." | |
| if tar -tzf "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" > /dev/null 2>&1; then | |
| log "Sauvegarde réussie: $BACKUP_DIR/${BACKUP_NAME}.tar.gz" | |
| log "Taille: $(du -h "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | cut -f1)" | |
| else | |
| log "ERREUR: L'archive de sauvegarde est corrompue!" | |
| rm -f "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | |
| exit 1 | |
| fi | |
| log "Sauvegarde terminée avec succès!" | |
| EOF | |
| chmod +x /usr/local/bin/passbolt-backup.sh | |
| # Script de restauration | |
| cat > /usr/local/bin/passbolt-restore.sh << 'EOF' | |
| #!/bin/bash | |
| # Script de restauration Passbolt | |
| # /usr/local/bin/passbolt-restore.sh | |
| set -euo pipefail | |
| # Configuration | |
| BACKUP_DIR="/srv/backup/passbolt" | |
| TEMP_DIR="/tmp/passbolt_restore_$$" | |
| # Fonction de logging | |
| log() { | |
| echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | |
| } | |
| # Fonction de nettoyage | |
| cleanup() { | |
| if [ -d "$TEMP_DIR" ]; then | |
| rm -rf "$TEMP_DIR" | |
| fi | |
| } | |
| trap cleanup EXIT | |
| # Fonction d'aide | |
| usage() { | |
| echo "Usage: $0 [fichier_backup.tar.gz]" | |
| echo "Si aucun fichier n'est spécifié, la dernière sauvegarde sera utilisée." | |
| exit 1 | |
| } | |
| # Vérifier que le script est exécuté en tant que root | |
| if [ "$EUID" -ne 0 ]; then | |
| log "ERREUR: Ce script doit être exécuté en tant que root" | |
| exit 1 | |
| fi | |
| # Déterminer quel fichier de sauvegarde utiliser | |
| if [ $# -eq 0 ]; then | |
| # Utiliser la dernière sauvegarde | |
| BACKUP_FILE=$(ls -t "$BACKUP_DIR"/passbolt_backup_*.tar.gz 2>/dev/null | head -n1) | |
| if [ -z "$BACKUP_FILE" ]; then | |
| log "ERREUR: Aucune sauvegarde trouvée dans $BACKUP_DIR" | |
| exit 1 | |
| fi | |
| log "Utilisation de la dernière sauvegarde: $BACKUP_FILE" | |
| elif [ $# -eq 1 ]; then | |
| BACKUP_FILE="$1" | |
| if [ ! -f "$BACKUP_FILE" ]; then | |
| log "ERREUR: Le fichier $BACKUP_FILE n'existe pas" | |
| exit 1 | |
| fi | |
| else | |
| usage | |
| fi | |
| # Confirmation | |
| echo "ATTENTION: Cette opération va restaurer Passbolt depuis la sauvegarde:" | |
| echo " $BACKUP_FILE" | |
| echo "" | |
| echo "Cela va REMPLACER toutes les données actuelles!" | |
| read -p "Êtes-vous sûr de vouloir continuer? (oui/non): " confirmation | |
| if [ "$confirmation" != "oui" ]; then | |
| log "Restauration annulée." | |
| exit 0 | |
| fi | |
| # Créer le répertoire temporaire | |
| log "Extraction de l'archive de sauvegarde..." | |
| mkdir -p "$TEMP_DIR" | |
| tar -xzf "$BACKUP_FILE" -C "$TEMP_DIR" | |
| # Trouver le répertoire extrait | |
| EXTRACTED_DIR=$(find "$TEMP_DIR" -maxdepth 1 -name "passbolt_backup_*" -type d | head -n1) | |
| if [ -z "$EXTRACTED_DIR" ]; then | |
| log "ERREUR: Impossible de trouver le répertoire extrait" | |
| exit 1 | |
| fi | |
| # Arrêter les services | |
| log "Arrêt des services..." | |
| systemctl stop nginx || true | |
| systemctl stop php8.3-fpm || systemctl stop php8.2-fpm || systemctl stop php8.1-fpm || true | |
| # 1. Restaurer la base de données | |
| log "Restauration de la base de données..." | |
| if [ -f "$EXTRACTED_DIR/database.sql" ]; then | |
| # Récupérer le nom de la base de données | |
| DB_NAME=$(grep -oP "(?<=database' => ')[^']*" /etc/passbolt/passbolt.php 2>/dev/null || echo "passbolt") | |
| # Supprimer et recréer la base de données | |
| mysql -e "DROP DATABASE IF EXISTS $DB_NAME;" | |
| mysql -e "CREATE DATABASE $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" | |
| # Importer les données | |
| mysql "$DB_NAME" < "$EXTRACTED_DIR/database.sql" | |
| else | |
| log "AVERTISSEMENT: Aucun fichier de base de données trouvé dans la sauvegarde" | |
| fi | |
| # 2. Restaurer la configuration | |
| log "Restauration de la configuration..." | |
| if [ -d "$EXTRACTED_DIR/etc_passbolt" ]; then | |
| # Sauvegarder la configuration actuelle | |
| if [ -d "/etc/passbolt" ]; then | |
| mv /etc/passbolt "/etc/passbolt.bak.$(date +%s)" | |
| fi | |
| cp -a "$EXTRACTED_DIR/etc_passbolt" /etc/passbolt | |
| # Restaurer les permissions | |
| chown -R root:www-data /etc/passbolt | |
| chmod 750 /etc/passbolt | |
| find /etc/passbolt -type f -exec chmod 640 {} \; | |
| fi | |
| # 3. Restaurer les données Passbolt | |
| log "Restauration des données Passbolt..." | |
| if [ -d "$EXTRACTED_DIR/var_lib_passbolt" ]; then | |
| # Sauvegarder les données actuelles | |
| if [ -d "/var/lib/passbolt" ]; then | |
| mv /var/lib/passbolt "/var/lib/passbolt.bak.$(date +%s)" | |
| fi | |
| cp -a "$EXTRACTED_DIR/var_lib_passbolt" /var/lib/passbolt | |
| # Restaurer les permissions | |
| chown -R www-data:www-data /var/lib/passbolt | |
| fi | |
| # 4. Restaurer les fichiers uploadés | |
| log "Restauration des fichiers uploadés..." | |
| if [ -d "$EXTRACTED_DIR/uploads/public" ]; then | |
| # Sauvegarder les uploads actuels | |
| if [ -d "/usr/share/php/passbolt/webroot/img/public" ]; then | |
| mv /usr/share/php/passbolt/webroot/img/public "/usr/share/php/passbolt/webroot/img/public.bak.$(date +%s)" | |
| fi | |
| cp -a "$EXTRACTED_DIR/uploads/public" /usr/share/php/passbolt/webroot/img/ | |
| # Restaurer les permissions | |
| chown -R www-data:www-data /usr/share/php/passbolt/webroot/img/public | |
| fi | |
| # 5. Nettoyer le cache | |
| log "Nettoyage du cache..." | |
| if [ -d "/usr/share/php/passbolt/tmp/cache" ]; then | |
| rm -rf /usr/share/php/passbolt/tmp/cache/* | |
| fi | |
| # 6. Exécuter les migrations si nécessaire | |
| log "Vérification des migrations..." | |
| cd /usr/share/php/passbolt | |
| sudo -u www-data bin/cake passbolt migrate || true | |
| # 7. Vérifier la santé de l'installation | |
| log "Vérification de l'installation..." | |
| sudo -u www-data bin/cake passbolt healthcheck || true | |
| # 8. Redémarrer les services | |
| log "Redémarrage des services..." | |
| systemctl start php8.3-fpm || systemctl start php8.2-fpm || systemctl start php8.1-fpm || true | |
| systemctl start nginx | |
| # Nettoyage | |
| log "Nettoyage..." | |
| rm -rf "$TEMP_DIR" | |
| log "Restauration terminée avec succès!" | |
| log "" | |
| log "IMPORTANT:" | |
| log "- Vérifiez que Passbolt fonctionne correctement" | |
| log "- Les anciennes données ont été sauvegardées avec le suffixe .bak.[timestamp]" | |
| log "- Vous pouvez les supprimer une fois la restauration vérifiée" | |
| EOF | |
| chmod +x /usr/local/bin/passbolt-restore.sh | |
| # 3. Créer le fichier de configuration | |
| echo "Création du fichier de configuration..." | |
| cat > /etc/default/passbolt-backup << 'EOF' | |
| # Durée de rétention des sauvegardes en jours (défaut: 30) | |
| PASSBOLT_BACKUP_RETENTION_DAYS=30 | |
| # Répertoire de sauvegarde (ne pas modifier sauf si nécessaire) | |
| # BACKUP_DIR=/srv/backup/passbolt | |
| EOF | |
| # 4. Créer le service systemd | |
| echo "Installation du service systemd..." | |
| cat > /etc/systemd/system/passbolt-backup.service << 'EOF' | |
| [Unit] | |
| Description=Passbolt Backup Service | |
| After=network.target mysql.service | |
| [Service] | |
| Type=oneshot | |
| ExecStart=/usr/local/bin/passbolt-backup.sh | |
| User=root | |
| StandardOutput=journal | |
| StandardError=journal | |
| # Charger les variables depuis le fichier de configuration | |
| EnvironmentFile=/etc/default/passbolt-backup | |
| # Sécurité | |
| PrivateTmp=yes | |
| ProtectSystem=strict | |
| ProtectHome=yes | |
| ReadWritePaths=/srv/backup/passbolt /tmp | |
| NoNewPrivileges=yes | |
| [Install] | |
| WantedBy=multi-user.target | |
| EOF | |
| # 5. Créer le timer systemd | |
| echo "Installation du timer systemd..." | |
| cat > /etc/systemd/system/passbolt-backup.timer << 'EOF' | |
| [Unit] | |
| Description=Passbolt Backup Timer | |
| Requires=passbolt-backup.service | |
| [Timer] | |
| # Exécuter toutes les 6 heures | |
| OnCalendar=0/6:00:00 | |
| # Exécuter 5 minutes après le démarrage si manqué | |
| Persistent=true | |
| # Randomiser jusqu'à 5 minutes pour éviter les pics de charge | |
| RandomizedDelaySec=5min | |
| [Install] | |
| WantedBy=timers.target | |
| EOF | |
| # 6. Recharger systemd | |
| echo "Rechargement de systemd..." | |
| systemctl daemon-reload | |
| # 7. Activer et démarrer le timer | |
| echo "Activation du timer de backup..." | |
| systemctl enable passbolt-backup.timer | |
| systemctl start passbolt-backup.timer | |
| # 8. Exécuter un premier backup | |
| echo "" | |
| echo "Exécution d'un premier backup de test..." | |
| systemctl start passbolt-backup.service | |
| # 9. Afficher le statut | |
| echo "" | |
| echo "=== Installation terminée ===" | |
| echo "" | |
| echo "Statut du timer:" | |
| systemctl status passbolt-backup.timer --no-pager | |
| echo "" | |
| echo "Prochaines exécutions:" | |
| systemctl list-timers passbolt-backup.timer --no-pager | |
| echo "" | |
| echo "Pour voir les logs du dernier backup:" | |
| echo " journalctl -u passbolt-backup.service -n 50" | |
| echo "" | |
| echo "Pour modifier la rétention des backups:" | |
| echo " nano /etc/default/passbolt-backup" | |
| echo " (puis rechargez avec: systemctl daemon-reload)" | |
| echo "" | |
| echo "Pour lancer un backup manuel:" | |
| echo " systemctl start passbolt-backup.service" | |
| echo "" | |
| echo "Pour restaurer un backup:" | |
| echo " /usr/local/bin/passbolt-restore.sh [fichier.tar.gz]" | |
| echo " (sans argument, utilise le dernier backup)" | |
| echo "" | |
| echo "Les backups sont stockés dans: /srv/backup/passbolt/" |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Script tout-en-un qui :
Installation
Pour installer le système de backup, exécutez simplement :
# Téléchargez et exécutez le script d'installation chmod +x setup-passbolt-backup.sh ./setup-passbolt-backup.shConfiguration
/etc/default/passbolt-backupet modifiezPASSBOLT_BACKUP_RETENTION_DAYS/etc/systemd/system/passbolt-backup.timeret modifiezOnCalendarUtilisation
systemctl start passbolt-backup.servicejournalctl -u passbolt-backup.service -f/usr/local/bin/passbolt-restore.sh(dernier backup) ou/usr/local/bin/passbolt-restore.sh /srv/backup/passbolt/passbolt_backup_20240118_120000.tar.gzsystemctl list-timers passbolt-backup.timerTesté avec passbolt installé avec apt sur un serveur ubuntu 24.04 avec mysql et nginx comme serveur http.