Changed health check to measure the correct directory: - Before: ./data (entire Docker volume including app code) - After: ./data/data (actual Nextcloud user data) Updated message from "Taille des données" to "Taille des données utilisateurs" for clarity. This provides more accurate metrics for monitoring actual user storage usage. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
284 lines
7.7 KiB
Bash
Executable File
284 lines
7.7 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 .env pour accéder aux variables (Redis password, etc.)
|
|
if [ -f .env ]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source .env
|
|
set +a
|
|
fi
|
|
|
|
# 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 utilisateurs
|
|
if [ -d ./data/data ]; then
|
|
DATA_SIZE=$(du -sh ./data/data 2>/dev/null | cut -f1 || echo "")
|
|
if [ -z "$DATA_SIZE" ]; then
|
|
DATA_SIZE="N/A"
|
|
fi
|
|
check_ok "Taille des données utilisateurs: $DATA_SIZE"
|
|
fi
|
|
|
|
if [ -d ./db ]; then
|
|
DB_SIZE=$(du -sh ./db 2>/dev/null | cut -f1 || echo "")
|
|
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 || echo "")
|
|
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
|