#!/bin/bash # Скрипт мониторинга проекта ERV # Автор: Фёдор # Дата: $(date +%Y-%m-%d) # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Настройки PROJECT_PATH="/var/www/fastuser/data/www/erv.clientright.ru" LOG_FILE="/var/www/fastuser/data/www/crm.clientright.ru/erv_project_tools/monitor.log" ALERT_EMAIL="admin@clientright.ru" # Функции для логирования log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } error() { echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ОШИБКА:${NC} $1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ОШИБКА: $1" >> "$LOG_FILE" } warning() { echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] ПРЕДУПРЕЖДЕНИЕ:${NC} $1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ПРЕДУПРЕЖДЕНИЕ: $1" >> "$LOG_FILE" } info() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] ИНФО:${NC} $1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ИНФО: $1" >> "$LOG_FILE" } # Создаем директорию для логов если её нет mkdir -p "$(dirname "$LOG_FILE")" echo -e "${GREEN}=== МОНИТОРИНГ ПРОЕКТА ERV ===${NC}" echo "Дата: $(date)" echo "Проект: $PROJECT_PATH" echo "Лог файл: $LOG_FILE" echo "" log "Начинаем мониторинг системы..." # 1. Проверка доступности проекта log "Проверяем доступность проекта..." if curl -s --connect-timeout 10 https://erv.clientright.ru/ > /dev/null; then log "Проект ERV доступен" else error "Проект ERV недоступен!" # Отправляем уведомление echo "Проект ERV недоступен! Проверьте сервер." | mail -s "ERV DOWN ALERT" "$ALERT_EMAIL" 2>/dev/null fi # 2. Проверка размера папки uploads log "Проверяем размер папки uploads..." if [ -d "$PROJECT_PATH/uploads" ]; then UPLOADS_SIZE=$(du -sh "$PROJECT_PATH/uploads" | cut -f1) UPLOADS_SIZE_MB=$(du -sm "$PROJECT_PATH/uploads" | cut -f1) info "Размер папки uploads: $UPLOADS_SIZE" # Предупреждение если размер больше 1GB if [ "$UPLOADS_SIZE_MB" -gt 1024 ]; then warning "Папка uploads превышает 1GB ($UPLOADS_SIZE)" fi else warning "Папка uploads не найдена" fi # 3. Проверка критически важной папки cache log "Проверяем папку cache..." if [ -d "$PROJECT_PATH/cache" ]; then CACHE_SIZE=$(du -sh "$PROJECT_PATH/cache" | cut -f1) info "Размер папки cache: $CACHE_SIZE" # Проверяем права доступа if [ ! -r "$PROJECT_PATH/cache" ]; then error "Нет прав на чтение папки cache!" fi if [ ! -w "$PROJECT_PATH/cache" ]; then error "Нет прав на запись в папку cache!" fi else error "Критически важная папка cache не найдена!" fi # 4. Проверка подключения к базе данных log "Проверяем подключение к базе данных..." DB_NAME="ci20465_erv" DB_USER="ci20465_erv" DB_PASS="c7vOXbmG" if mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" "$DB_NAME" > /dev/null 2>&1; then log "Подключение к базе данных успешно" # Проверяем количество записей в таблице полисов POLIS_COUNT=$(mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT COUNT(*) FROM lexrpiority;" "$DB_NAME" 2>/dev/null | tail -1) info "Количество полисов в базе: $POLIS_COUNT" else error "Не удалось подключиться к базе данных!" fi # 5. Проверка внешних API log "Проверяем доступность внешних API..." # SMS API (SigmaSMS) if curl -s --connect-timeout 5 https://online.sigmasms.ru/api/ > /dev/null; then log "SMS API (SigmaSMS) доступен" else warning "SMS API (SigmaSMS) недоступен" fi # DaData API if curl -s --connect-timeout 5 https://suggestions.dadata.ru/ > /dev/null; then log "DaData API доступен" else warning "DaData API недоступен" fi # CRM API (ClientRight) if curl -s --connect-timeout 5 https://form.clientright.ru/ > /dev/null; then log "CRM API (ClientRight) доступен" else warning "CRM API (ClientRight) недоступен" fi # 6. Проверка системных ресурсов log "Проверяем системные ресурсы..." # Использование диска DISK_USAGE=$(df -h "$PROJECT_PATH" | tail -1 | awk '{print $5}' | sed 's/%//') info "Использование диска: ${DISK_USAGE}%" if [ "$DISK_USAGE" -gt 90 ]; then error "Критически мало места на диске: ${DISK_USAGE}%" elif [ "$DISK_USAGE" -gt 80 ]; then warning "Мало места на диске: ${DISK_USAGE}%" fi # Использование памяти MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100.0}') info "Использование памяти: ${MEMORY_USAGE}%" if [ "$MEMORY_USAGE" -gt 90 ]; then error "Критически высокое использование памяти: ${MEMORY_USAGE}%" elif [ "$MEMORY_USAGE" -gt 80 ]; then warning "Высокое использование памяти: ${MEMORY_USAGE}%" fi # Загрузка CPU CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//') info "Загрузка CPU: $CPU_LOAD" # 7. Проверка логов на ошибки log "Проверяем логи на ошибки..." if [ -f "/var/log/apache2/error.log" ]; then ERROR_COUNT=$(grep -c "erv.clientright.ru" /var/log/apache2/error.log 2>/dev/null || echo "0") if [ "$ERROR_COUNT" -gt 0 ]; then warning "Найдено $ERROR_COUNT ошибок в логах Apache для ERV" fi fi # 8. Проверка процессов PHP log "Проверяем процессы PHP..." PHP_PROCESSES=$(ps aux | grep php | grep -v grep | wc -l) info "Количество процессов PHP: $PHP_PROCESSES" # 9. Проверка SSL сертификата log "Проверяем SSL сертификат..." SSL_EXPIRY=$(echo | openssl s_client -servername erv.clientright.ru -connect erv.clientright.ru:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2) if [ ! -z "$SSL_EXPIRY" ]; then SSL_DAYS=$(( ($(date -d "$SSL_EXPIRY" +%s) - $(date +%s)) / 86400 )) info "SSL сертификат истекает через $SSL_DAYS дней" if [ "$SSL_DAYS" -lt 30 ]; then warning "SSL сертификат истекает менее чем через 30 дней!" fi else warning "Не удалось проверить SSL сертификат" fi # 10. Проверка целостности критических файлов log "Проверяем целостность критических файлов..." CRITICAL_FILES=( "$PROJECT_PATH/ervws/index.php" "$PROJECT_PATH/database.php" "$PROJECT_PATH/sms-test.php" "$PROJECT_PATH/file-server.php" ) for file in "${CRITICAL_FILES[@]}"; do if [ -f "$file" ]; then if [ -r "$file" ]; then log "Файл $file доступен для чтения" else error "Файл $file недоступен для чтения!" fi else error "Критический файл $file не найден!" fi done # 11. Проверка последних изменений log "Проверяем последние изменения в проекте..." RECENT_CHANGES=$(find "$PROJECT_PATH" -type f -name "*.php" -mtime -1 2>/dev/null | wc -l) if [ "$RECENT_CHANGES" -gt 0 ]; then info "Найдено $RECENT_CHANGES файлов, измененных за последние 24 часа" find "$PROJECT_PATH" -type f -name "*.php" -mtime -1 2>/dev/null | head -5 | while read file; do info "Изменен: $file ($(stat -c %y "$file" 2>/dev/null | cut -d' ' -f1,2))" done fi # 12. Генерация отчета REPORT_FILE="/var/www/fastuser/data/www/crm.clientright.ru/erv_project_tools/monitor_report_$(date +%Y%m%d_%H%M%S).txt" cat > "$REPORT_FILE" << EOF ОТЧЕТ МОНИТОРИНГА ПРОЕКТА ERV ============================= Дата: $(date) Сервер: $(hostname) IP: $(curl -s ifconfig.me 2>/dev/null || echo "Не определен") СТАТУС СИСТЕМЫ: - Проект доступен: $(curl -s --connect-timeout 5 https://erv.clientright.ru/ > /dev/null && echo "ДА" || echo "НЕТ") - База данных: $(mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" "$DB_NAME" > /dev/null 2>&1 && echo "ДОСТУПНА" || echo "НЕДОСТУПНА") - SMS API: $(curl -s --connect-timeout 5 https://online.sigmasms.ru/api/ > /dev/null && echo "ДОСТУПЕН" || echo "НЕДОСТУПЕН") - DaData API: $(curl -s --connect-timeout 5 https://suggestions.dadata.ru/ > /dev/null && echo "ДОСТУПЕН" || echo "НЕДОСТУПЕН") - CRM API: $(curl -s --connect-timeout 5 https://form.clientright.ru/ > /dev/null && echo "ДОСТУПЕН" || echo "НЕДОСТУПЕН") РЕСУРСЫ: - Использование диска: ${DISK_USAGE}% - Использование памяти: ${MEMORY_USAGE}% - Загрузка CPU: $CPU_LOAD - Процессы PHP: $PHP_PROCESSES ФАЙЛЫ: - Размер uploads: $UPLOADS_SIZE - Размер cache: $CACHE_SIZE - Изменения за 24ч: $RECENT_CHANGES файлов SSL: - Дней до истечения: $SSL_DAYS EOF log "Отчет сохранен: $REPORT_FILE" echo "" log "=== МОНИТОРИНГ ЗАВЕРШЕН ===" echo "" # Отправляем отчет по email если есть ошибки if grep -q "ОШИБКА" "$LOG_FILE"; then warning "Обнаружены ошибки в системе!" if [ -f "/usr/bin/mail" ]; then echo "Обнаружены ошибки в системе ERV. Проверьте логи." | mail -s "ERV MONITORING ALERT" "$ALERT_EMAIL" 2>/dev/null fi fi exit 0