#!/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/maintenance.log" # Функции для логирования 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 "" # Функция для подтверждения действий confirm() { read -p "Продолжить? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then return 0 else return 1 fi } # 1. Очистка временных файлов cleanup_temp_files() { log "Очищаем временные файлы..." # Очистка PHP сессий старше 24 часов if [ -d "/tmp" ]; then find /tmp -name "sess_*" -type f -mtime +1 -delete 2>/dev/null log "Очищены старые PHP сессии" fi # Очистка временных файлов в проекте find "$PROJECT_PATH" -name "*.tmp" -type f -delete 2>/dev/null find "$PROJECT_PATH" -name "*.log" -type f -mtime +7 -delete 2>/dev/null log "Очищены временные файлы проекта" # Очистка кеша браузера (если есть) if [ -d "$PROJECT_PATH/cache" ]; then find "$PROJECT_PATH/cache" -name "*.cache" -type f -mtime +30 -delete 2>/dev/null log "Очищен кеш браузера" fi } # 2. Оптимизация базы данных optimize_database() { log "Оптимизируем базу данных..." DB_NAME="ci20465_erv" DB_USER="ci20465_erv" DB_PASS="c7vOXbmG" if mysql -u"$DB_USER" -p"$DB_PASS" -e "OPTIMIZE TABLE lexrpiority;" "$DB_NAME" > /dev/null 2>&1; then log "Таблица lexrpiority оптимизирована" else error "Не удалось оптимизировать таблицу lexrpiority" fi # Проверяем размер базы данных DB_SIZE=$(mysql -u"$DB_USER" -p"$DB_PASS" -e "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'DB Size in MB' FROM information_schema.tables WHERE table_schema='$DB_NAME';" 2>/dev/null | tail -1) info "Размер базы данных: ${DB_SIZE} MB" } # 3. Проверка и исправление прав доступа fix_permissions() { log "Проверяем и исправляем права доступа..." # Устанавливаем правильные права для папок find "$PROJECT_PATH" -type d -exec chmod 755 {} \; 2>/dev/null log "Установлены права 755 для папок" # Устанавливаем правильные права для файлов find "$PROJECT_PATH" -type f -exec chmod 644 {} \; 2>/dev/null log "Установлены права 644 для файлов" # Особые права для исполняемых файлов find "$PROJECT_PATH" -name "*.sh" -exec chmod 755 {} \; 2>/dev/null log "Установлены права 755 для скриптов" # Права для папки uploads if [ -d "$PROJECT_PATH/uploads" ]; then chmod 755 "$PROJECT_PATH/uploads" chown -R www-data:www-data "$PROJECT_PATH/uploads" 2>/dev/null log "Установлены права для папки uploads" fi # Права для папки cache (критически важно!) if [ -d "$PROJECT_PATH/cache" ]; then chmod 755 "$PROJECT_PATH/cache" chown -R www-data:www-data "$PROJECT_PATH/cache" 2>/dev/null log "Установлены права для папки cache" fi } # 4. Проверка целостности файлов check_file_integrity() { log "Проверяем целостность файлов..." CRITICAL_FILES=( "$PROJECT_PATH/ervws/index.php" "$PROJECT_PATH/database.php" "$PROJECT_PATH/sms-test.php" "$PROJECT_PATH/file-server.php" "$PROJECT_PATH/common.js" ) for file in "${CRITICAL_FILES[@]}"; do if [ -f "$file" ]; then if [ -r "$file" ] && [ -w "$file" ]; then log "Файл $file в порядке" else warning "Проблемы с правами доступа к файлу $file" chmod 644 "$file" 2>/dev/null fi else error "Критический файл $file не найден!" fi done } # 5. Очистка логов cleanup_logs() { log "Очищаем старые логи..." # Очистка логов Apache старше 30 дней if [ -f "/var/log/apache2/error.log" ]; then # Создаем архив старого лога cp /var/log/apache2/error.log /var/log/apache2/error.log.$(date +%Y%m%d) 2>/dev/null > /var/log/apache2/error.log 2>/dev/null log "Очищен лог Apache" fi # Очистка системных логов find /var/log -name "*.log" -type f -mtime +30 -delete 2>/dev/null log "Очищены старые системные логи" } # 6. Проверка и обновление зависимостей check_dependencies() { log "Проверяем зависимости..." # Проверяем версию PHP PHP_VERSION=$(php -v | head -1 | cut -d' ' -f2) info "Версия PHP: $PHP_VERSION" # Проверяем расширения PHP REQUIRED_EXTENSIONS=("mysqli" "curl" "json" "mbstring" "openssl") for ext in "${REQUIRED_EXTENSIONS[@]}"; do if php -m | grep -q "$ext"; then log "Расширение PHP $ext установлено" else warning "Расширение PHP $ext не установлено" fi done # Проверяем версию MySQL MYSQL_VERSION=$(mysql --version | cut -d' ' -f3) info "Версия MySQL: $MYSQL_VERSION" } # 7. Мониторинг производительности performance_check() { log "Проверяем производительность..." # Время отклика сайта RESPONSE_TIME=$(curl -o /dev/null -s -w '%{time_total}' https://erv.clientright.ru/ 2>/dev/null) if [ ! -z "$RESPONSE_TIME" ]; then info "Время отклика сайта: ${RESPONSE_TIME}s" # Предупреждение если время отклика больше 5 секунд if (( $(echo "$RESPONSE_TIME > 5" | bc -l) )); then warning "Медленный отклик сайта: ${RESPONSE_TIME}s" fi fi # Проверяем количество активных соединений ACTIVE_CONNECTIONS=$(netstat -an | grep :80 | grep ESTABLISHED | wc -l) info "Активных соединений на порту 80: $ACTIVE_CONNECTIONS" # Проверяем использование памяти PHP процессами PHP_MEMORY=$(ps aux | grep php | grep -v grep | awk '{sum+=$6} END {print sum/1024 " MB"}') info "Использование памяти PHP процессами: $PHP_MEMORY" } # 8. Безопасность security_check() { log "Проверяем безопасность..." # Проверяем наличие подозрительных файлов SUSPICIOUS_FILES=$(find "$PROJECT_PATH" -name "*.php" -exec grep -l "eval\|base64_decode\|system\|exec" {} \; 2>/dev/null) if [ ! -z "$SUSPICIOUS_FILES" ]; then warning "Найдены подозрительные файлы:" echo "$SUSPICIOUS_FILES" else log "Подозрительные файлы не найдены" fi # Проверяем права доступа к конфиденциальным файлам SENSITIVE_FILES=("database.php" "sms-test.php") for file in "${SENSITIVE_FILES[@]}"; do if [ -f "$PROJECT_PATH/$file" ]; then PERMS=$(stat -c %a "$PROJECT_PATH/$file") if [ "$PERMS" != "644" ]; then warning "Неправильные права доступа к файлу $file: $PERMS" chmod 644 "$PROJECT_PATH/$file" 2>/dev/null fi fi done # Проверяем наличие .htaccess файлов if [ -f "$PROJECT_PATH/.htaccess" ]; then log "Файл .htaccess найден" # Проверяем содержимое на предмет подозрительных правил if grep -q "RewriteRule.*php" "$PROJECT_PATH/.htaccess"; then warning "Найдены подозрительные правила в .htaccess" fi fi } # 9. Резервное копирование перед обслуживанием backup_before_maintenance() { log "Создаем резервную копию перед обслуживанием..." BACKUP_DIR="/var/www/fastuser/data/www/crm.clientright.ru/erv_project_tools/pre_maintenance_backup" mkdir -p "$BACKUP_DIR" # Копируем критические файлы cp "$PROJECT_PATH/database.php" "$BACKUP_DIR/" 2>/dev/null cp "$PROJECT_PATH/sms-test.php" "$BACKUP_DIR/" 2>/dev/null cp "$PROJECT_PATH/file-server.php" "$BACKUP_DIR/" 2>/dev/null log "Резервная копия создана в $BACKUP_DIR" } # 10. Восстановление после обслуживания restore_after_maintenance() { log "Проверяем восстановление после обслуживания..." # Проверяем доступность сайта if curl -s --connect-timeout 10 https://erv.clientright.ru/ > /dev/null; then log "Сайт доступен после обслуживания" else error "Сайт недоступен после обслуживания!" return 1 fi # Проверяем подключение к БД 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 "База данных доступна после обслуживания" else error "База данных недоступна после обслуживания!" return 1 fi } # Главное меню show_menu() { echo "" echo -e "${BLUE}=== МЕНЮ ОБСЛУЖИВАНИЯ ===${NC}" echo "1. Полное обслуживание (все операции)" echo "2. Очистка временных файлов" echo "3. Оптимизация базы данных" echo "4. Исправление прав доступа" echo "5. Проверка целостности файлов" echo "6. Очистка логов" echo "7. Проверка зависимостей" echo "8. Проверка производительности" echo "9. Проверка безопасности" echo "0. Выход" echo "" } # Выполнение полного обслуживания full_maintenance() { log "Начинаем полное обслуживание системы..." backup_before_maintenance cleanup_temp_files optimize_database fix_permissions check_file_integrity cleanup_logs check_dependencies performance_check security_check if restore_after_maintenance; then log "Полное обслуживание завершено успешно!" else error "Обнаружены проблемы после обслуживания!" fi } # Основной цикл while true; do show_menu read -p "Выберите опцию (0-9): " choice case $choice in 1) echo "Выполнить полное обслуживание?" if confirm; then full_maintenance fi ;; 2) cleanup_temp_files ;; 3) optimize_database ;; 4) fix_permissions ;; 5) check_file_integrity ;; 6) cleanup_logs ;; 7) check_dependencies ;; 8) performance_check ;; 9) security_check ;; 0) log "Выход из программы обслуживания" break ;; *) echo "Неверный выбор. Попробуйте снова." ;; esac echo "" read -p "Нажмите Enter для продолжения..." done echo "" log "Обслуживание завершено. Лог сохранен в: $LOG_FILE" exit 0