#!/bin/bash # scripts/update.sh - Mise à jour Nextcloud set -euo pipefail # Variables globales SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Configuration des logs LOG_DIR="./logs" LOG_FILE="$PROJECT_ROOT/logs/update_$(date +%Y%m%d_%H%M%S).log" MAINTENANCE_ENABLED=false COMPOSE_BACKUP="" mkdir -p "$LOG_DIR" # Charger les fonctions communes (log avec couleurs) # shellcheck disable=SC1091 source "$SCRIPT_DIR/common.sh" # Fonction de nettoyage en cas d'erreur cleanup() { local exit_code=$? if [ "$exit_code" -ne 0 ]; then log "ERROR" "Erreur détectée lors de la mise à jour (code: $exit_code)" log "WARN" "IMPORTANT: Vérifiez les logs et considérez une restauration si nécessaire" # Restaurer le docker-compose.yml si backup existe if [ -n "$COMPOSE_BACKUP" ] && [ -f "$COMPOSE_BACKUP" ]; then log "INFO" "Restauration du docker-compose.yml..." cp "$COMPOSE_BACKUP" docker-compose.yml || log "ERROR" "Impossible de restaurer docker-compose.yml" fi fi # Désactiver le mode maintenance si activé if [ "$MAINTENANCE_ENABLED" = true ]; then log "INFO" "Tentative de désactivation du mode maintenance..." docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off 2>>"$LOG_FILE" || true fi # Nettoyer le backup temporaire if [ -n "$COMPOSE_BACKUP" ] && [ -f "$COMPOSE_BACKUP" ]; then rm -f "$COMPOSE_BACKUP" fi if [ "$exit_code" -eq 0 ]; then log "SUCCESS" "Mise à jour terminée avec succès" else log "ERROR" "Mise à jour échouée avec code: $exit_code" fi exit "$exit_code" } trap cleanup EXIT INT TERM log "INFO" "=== Mise à jour de Nextcloud ===" log "INFO" "Log file: $LOG_FILE" # Afficher la version actuelle log "INFO" "Version actuelle:" docker-compose exec -T -u www-data nextcloud php occ status 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Impossible d'obtenir le statut actuel" # Backup avant update log "INFO" "Création du backup de sécurité..." if ! bash scripts/backup.sh 2>&1 | tee -a "$LOG_FILE"; then log "ERROR" "Erreur lors du backup, abandon de la mise à jour" exit 1 fi # Sauvegarder le docker-compose.yml log "INFO" "Sauvegarde de docker-compose.yml..." COMPOSE_BACKUP="/tmp/docker-compose.yml.backup.$$" cp docker-compose.yml "$COMPOSE_BACKUP" || { log "ERROR" "Impossible de sauvegarder docker-compose.yml" exit 1 } log "INFO" "docker-compose.yml sauvegardé: $COMPOSE_BACKUP" # Pull nouvelle image de base et rebuild image custom log "INFO" "Téléchargement de la nouvelle version de base..." if ! docker pull nextcloud:latest 2>&1 | tee -a "$LOG_FILE"; then log "ERROR" "Erreur lors du téléchargement de l'image de base" exit 1 fi log "INFO" "Rebuild de l'image personnalisée (avec ffmpeg)..." if ! docker-compose build --no-cache nextcloud 2>&1 | tee -a "$LOG_FILE"; then log "ERROR" "Erreur lors du rebuild de l'image personnalisée" exit 1 fi # Mode maintenance avant le restart log "INFO" "Activation du mode maintenance..." if docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --on 2>>"$LOG_FILE"; then MAINTENANCE_ENABLED=true log "INFO" "Mode maintenance activé" else log "ERROR" "Impossible d'activer le mode maintenance" exit 1 fi # Restart log "INFO" "Redémarrage des services..." if ! docker-compose up -d --force-recreate nextcloud cron 2>&1 | tee -a "$LOG_FILE"; then log "ERROR" "Erreur lors du redémarrage" exit 1 fi # Attendre que Nextcloud soit prêt log "INFO" "Attente du démarrage de Nextcloud (max 2 minutes)..." for i in {1..120}; do if docker-compose exec -T nextcloud curl -f http://localhost/status.php >/dev/null 2>&1; then log "INFO" "Nextcloud prêt (${i}s)" break fi if [ "$i" -eq 120 ]; then log "ERROR" "Timeout: Nextcloud n'est pas prêt après 2 minutes" log "ERROR" "Vérifiez les logs: docker-compose logs nextcloud" exit 1 fi sleep 1 done # Désactiver temporairement le mode maintenance pour permettre l'upgrade log "INFO" "Préparation de l'upgrade..." docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off 2>>"$LOG_FILE" || true MAINTENANCE_ENABLED=false # Upgrade via OCC log "INFO" "Lancement de l'upgrade..." if ! docker-compose exec -T -u www-data nextcloud php occ upgrade 2>&1 | tee -a "$LOG_FILE"; then log "ERROR" "Erreur lors de l'upgrade" exit 1 fi # Afficher la nouvelle version log "INFO" "Nouvelle version:" docker-compose exec -T -u www-data nextcloud php occ status 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Impossible d'obtenir le nouveau statut" # Opérations de maintenance post-upgrade (non bloquantes) log "INFO" "Scan des fichiers..." docker-compose exec -T -u www-data nextcloud php occ files:scan --all 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Erreur lors du scan" log "INFO" "Ajout des indices manquants..." docker-compose exec -T -u www-data nextcloud php occ db:add-missing-indices 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Erreur lors de l'ajout des indices" log "INFO" "Conversion des colonnes BigInt..." docker-compose exec -T -u www-data nextcloud php occ db:convert-filecache-bigint --no-interaction 2>&1 | tee -a "$LOG_FILE" || log "WARN" "Erreur lors de la conversion" # Désactiver le mode maintenance log "INFO" "Désactivation du mode maintenance..." if docker-compose exec -T -u www-data nextcloud php occ maintenance:mode --off 2>>"$LOG_FILE"; then MAINTENANCE_ENABLED=false log "INFO" "Mode maintenance désactivé" else log "WARN" "Impossible de désactiver le mode maintenance" log "WARN" "Exécutez manuellement: make occ maintenance:mode --off" fi # Statut final log "INFO" "=== Mise à jour terminée ===" log "INFO" "Vérifiez que tout fonctionne: make health" docker-compose exec -T -u www-data nextcloud php occ status 2>&1 | tee -a "$LOG_FILE" || true