Files
crm.clientright.ru/erv_project_tools/monitor_erv.sh

270 lines
10 KiB
Bash
Raw Normal View History

#!/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