Files
agence66-nextcloud-docker/scripts/check-health.sh
BeauTroll 51d42c6437 fix: handle passwords with special characters in health check
The health check was failing when MySQL passwords contained special
characters like # because it was sourcing .env as a bash script,
where # is treated as a comment.

Solution: Remove unnecessary .env sourcing and use environment variables
directly from the db container, which Docker Compose has already correctly
parsed from .env.

This fixes the "Impossible de se connecter à MySQL" error when passwords
contain #, $, !, or other special characters.

Benefits:
- Works with any special characters in passwords
- Simpler code (removed 4 lines)
- More reliable (uses container's environment directly)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 02:50:39 +01:00

267 lines
7.4 KiB
Bash
Executable File

#!/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 || echo "N/A")
check_ok "Taille des données: $DATA_SIZE"
fi
if [ -d ./db ]; then
DB_SIZE=$(du -sh ./db 2>/dev/null | cut -f1 || echo "N/A")
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 || echo "N/A")
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