- Create Dockerfile extending nextcloud:latest with ffmpeg - Add .dockerignore to optimize build context - Update docker-compose.yml to use custom image build - Modify update.sh to rebuild custom image on updates - Document custom image setup in README - Enable video preview generation for .mov, .mp4 files 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
168 lines
5.8 KiB
Bash
Executable File
168 lines
5.8 KiB
Bash
Executable File
#!/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
|