#!/bin/bash # scripts/check-health.sh - Vérification complète de la santé du système set -euo pipefail # Variables globales SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Charger les couleurs depuis common.sh # shellcheck disable=SC1091 source "$SCRIPT_DIR/common.sh" # Compteurs CHECKS_PASSED=0 CHECKS_FAILED=0 CHECKS_WARNING=0 # Fonction de logging check_ok() { echo -e "${GREEN}✓${NC} $*" CHECKS_PASSED=$((CHECKS_PASSED + 1)) } check_fail() { echo -e "${RED}✗${NC} $*" CHECKS_FAILED=$((CHECKS_FAILED + 1)) } check_warn() { echo -e "${YELLOW}⚠${NC} $*" CHECKS_WARNING=$((CHECKS_WARNING + 1)) } echo "=== Health Check Nextcloud ===" echo "" # 1. Vérifier que Docker est disponible echo "▶ Vérifications système:" if command -v docker >/dev/null 2>&1; then check_ok "Docker installé: $(docker --version | head -1)" else check_fail "Docker non installé" fi # Vérifier Docker Compose if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then check_ok "Docker Compose v2 installé: $(docker compose version --short)" elif command -v docker-compose >/dev/null 2>&1; then check_warn "Docker Compose v1 installé (obsolète): $(docker-compose --version)" else check_fail "Docker Compose non installé" fi echo "" # 2. Vérifier les fichiers de configuration echo "▶ Fichiers de configuration:" if [ -f .env ]; then check_ok "Fichier .env présent" # Vérifier les mots de passe faibles if grep -qE "(userpassword|rootpassword|redispassword)" .env 2>/dev/null; then check_warn "Mots de passe faibles détectés dans .env - Changez-les!" else check_ok "Pas de mots de passe faibles détectés" fi else check_fail "Fichier .env manquant" fi if [ -f docker-compose.yml ]; then check_ok "Fichier docker-compose.yml présent" else check_fail "Fichier docker-compose.yml manquant" fi echo "" # 3. Vérifier l'état des containers echo "▶ État des containers:" CONTAINERS=("nextcloud" "db" "redis" "cron") for container in "${CONTAINERS[@]}"; do if docker-compose ps "$container" 2>/dev/null | grep -q "Up"; then check_ok "Container $container: actif" else check_fail "Container $container: inactif ou manquant" fi done echo "" # 4. Vérifier Nextcloud echo "▶ Application Nextcloud:" if docker-compose exec -T nextcloud curl -f http://localhost/status.php >/dev/null 2>&1; then check_ok "Nextcloud répond aux requêtes HTTP" # Vérifier le statut via OCC if STATUS=$(docker-compose exec -T -u www-data nextcloud php occ status 2>/dev/null); then check_ok "Commande OCC accessible" if echo "$STATUS" | grep -q "installed: true"; then check_ok "Nextcloud installé" else check_fail "Nextcloud non installé" fi if echo "$STATUS" | grep -q "maintenance: false"; then check_ok "Mode maintenance: désactivé" else check_warn "Mode maintenance: activé" fi # Afficher la version VERSION=$(echo "$STATUS" | grep "versionstring:" | awk '{print $3}') if [ -n "$VERSION" ]; then check_ok "Version: $VERSION" fi else check_fail "Impossible d'accéder aux commandes OCC" fi else check_fail "Nextcloud ne répond pas" fi echo "" # 5. Vérifier la base de données echo "▶ Base de données:" if docker-compose exec -T db mysqladmin ping -h localhost --silent 2>/dev/null; then check_ok "MariaDB répond" # Tester la connexion MySQL (utilise les variables d'environnement du container) if docker-compose exec -T db sh -c 'MYSQL_PWD="$MYSQL_PASSWORD" mysql -u"$MYSQL_USER" "$MYSQL_DATABASE" -e "SELECT 1"' >/dev/null 2>&1; then check_ok "Connexion MySQL fonctionnelle" else check_fail "Impossible de se connecter à MySQL" fi else check_fail "MariaDB ne répond pas" fi echo "" # 6. Vérifier Redis echo "▶ Cache Redis:" if [ -n "${REDIS_HOST_PASSWORD:-}" ]; then if docker-compose exec -T redis redis-cli -a "$REDIS_HOST_PASSWORD" ping 2>/dev/null | grep -q "PONG"; then check_ok "Redis répond (avec authentification)" else check_fail "Redis ne répond pas ou mot de passe incorrect" fi else if docker-compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG"; then check_ok "Redis répond (sans authentification)" else check_fail "Redis ne répond pas" fi fi echo "" # 7. Vérifier l'espace disque echo "▶ Espace disque:" DISK_USAGE=$(df -h . | awk 'NR==2 {print $5}' | sed 's/%//') DISK_AVAIL=$(df -h . | awk 'NR==2 {print $4}') if [ "$DISK_USAGE" -lt 80 ]; then check_ok "Utilisation disque: ${DISK_USAGE}% (${DISK_AVAIL} disponible)" elif [ "$DISK_USAGE" -lt 90 ]; then check_warn "Utilisation disque: ${DISK_USAGE}% (${DISK_AVAIL} disponible) - Attention" else check_fail "Utilisation disque: ${DISK_USAGE}% (${DISK_AVAIL} disponible) - CRITIQUE" fi # Vérifier la taille des données if [ -d ./data ]; then DATA_SIZE=$(du -sh ./data 2>/dev/null | cut -f1) if [ -z "$DATA_SIZE" ]; then DATA_SIZE="N/A" fi check_ok "Taille des données: $DATA_SIZE" fi if [ -d ./db ]; then DB_SIZE=$(du -sh ./db 2>/dev/null | cut -f1) if [ -z "$DB_SIZE" ]; then DB_SIZE="N/A" fi check_ok "Taille de la base: $DB_SIZE" fi echo "" # 8. Vérifier les backups echo "▶ Backups:" BACKUP_DIR="${BACKUP_DESTINATION:-./backups}" if [ -d "$BACKUP_DIR" ]; then BACKUP_COUNT=$(find "$BACKUP_DIR" -name "nextcloud_backup_*.tar.gz" -type f 2>/dev/null | wc -l) if [ "$BACKUP_COUNT" -gt 0 ]; then check_ok "$BACKUP_COUNT backup(s) disponible(s)" # Trouver le backup le plus récent LATEST_BACKUP=$(find "$BACKUP_DIR" -name "nextcloud_backup_*.tar.gz" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-) if [ -n "$LATEST_BACKUP" ]; then BACKUP_AGE=$(find "$LATEST_BACKUP" -mtime +1 2>/dev/null) if [ -z "$BACKUP_AGE" ]; then check_ok "Dernier backup: < 24h" else BACKUP_DAYS=$(find "$LATEST_BACKUP" -mtime +0 -printf '%Td' 2>/dev/null || echo "?") if [ "$BACKUP_DAYS" -lt 7 ]; then check_warn "Dernier backup: il y a ${BACKUP_DAYS} jour(s)" else check_fail "Dernier backup: il y a ${BACKUP_DAYS} jour(s) - Trop ancien!" fi fi # Vérifier le checksum if [ -f "${LATEST_BACKUP}.sha256" ]; then check_ok "Checksum présent pour le dernier backup" else check_warn "Pas de checksum pour le dernier backup" fi fi else check_warn "Aucun backup trouvé dans $BACKUP_DIR" fi else check_warn "Dossier de backup introuvable: $BACKUP_DIR" fi echo "" # 9. Vérifier les logs echo "▶ Logs:" if [ -d ./logs ]; then LOG_COUNT=$(find ./logs -type f 2>/dev/null | wc -l) check_ok "$LOG_COUNT fichier(s) de log" LOGS_SIZE=$(du -sh ./logs 2>/dev/null | cut -f1) if [ -z "$LOGS_SIZE" ]; then LOGS_SIZE="N/A" fi check_ok "Taille des logs: $LOGS_SIZE" else check_warn "Dossier de logs introuvable" fi echo "" # Résumé final echo "=== Résumé ===" echo -e "${GREEN}Réussi:${NC} $CHECKS_PASSED" if [ "$CHECKS_WARNING" -gt 0 ]; then echo -e "${YELLOW}Avertissements:${NC} $CHECKS_WARNING" fi if [ "$CHECKS_FAILED" -gt 0 ]; then echo -e "${RED}Échecs:${NC} $CHECKS_FAILED" fi echo "" # Code de sortie if [ "$CHECKS_FAILED" -gt 0 ]; then echo -e "${RED}❌ Système non sain - Des problèmes nécessitent votre attention${NC}" exit 1 elif [ "$CHECKS_WARNING" -gt 0 ]; then echo -e "${YELLOW}⚠ Système fonctionnel avec avertissements${NC}" exit 0 else echo -e "${GREEN}✓ Système en bonne santé${NC}" exit 0 fi