Skip to content

Instantly share code, notes, and snippets.

@itishermann
Created July 18, 2025 12:20
Show Gist options
  • Select an option

  • Save itishermann/f072eca0e29f63199454b42312d6dcf7 to your computer and use it in GitHub Desktop.

Select an option

Save itishermann/f072eca0e29f63199454b42312d6dcf7 to your computer and use it in GitHub Desktop.
Script d'installation du système de backup Passbolt
#!/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/"
@itishermann

Copy link
Copy Markdown
Author

Script tout-en-un qui :

  • Installe tous les scripts aux bons emplacements
  • Configure les permissions appropriées
  • Active le service systemd
  • Lance un premier backup de test

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.sh

Configuration

  • Modifier la rétention : Éditez /etc/default/passbolt-backup et modifiez PASSBOLT_BACKUP_RETENTION_DAYS
  • Modifier la fréquence : Éditez /etc/systemd/system/passbolt-backup.timer et modifiez OnCalendar

Utilisation

  • Backup manuel : systemctl start passbolt-backup.service
  • Voir les logs : journalctl -u passbolt-backup.service -f
  • Restaurer : /usr/local/bin/passbolt-restore.sh (dernier backup) ou /usr/local/bin/passbolt-restore.sh /srv/backup/passbolt/passbolt_backup_20240118_120000.tar.gz
  • Vérifier les prochains backups : systemctl list-timers passbolt-backup.timer

Testé avec passbolt installé avec apt sur un serveur ubuntu 24.04 avec mysql et nginx comme serveur http.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment