'latest', 'region' => $config['s3']['region'], 'endpoint' => $config['s3']['endpoint'], 'use_path_style_endpoint' => true, 'credentials' => [ 'key' => $config['s3']['key'], 'secret' => $config['s3']['secret'], ], 'suppress_php_deprecation_warning' => true ]); // Анализируем паттерны удалений echo "1. Анализ паттернов удалений по датам...\n"; $deletionsByDate = []; $deletionsByProject = []; $totalChecked = 0; $maxToCheck = 5000; // Ограничиваем для скорости try { $isTruncated = true; $continuationToken = null; $pageCount = 0; $maxPages = 10; while ($isTruncated && $pageCount < $maxPages && $totalChecked < $maxToCheck) { $params = [ 'Bucket' => $s3Bucket, 'Prefix' => 'crm2/CRM_Active_Files/Documents/Project/', 'MaxKeys' => 1000 ]; if ($continuationToken) { $params['ContinuationToken'] = $continuationToken; } $versions = $s3Client->listObjectVersions($params); $pageCount++; if (isset($versions['DeleteMarkers'])) { foreach ($versions['DeleteMarkers'] as $marker) { $totalChecked++; $key = $marker['Key']; $deleteDate = isset($marker['LastModified']) ? $marker['LastModified'] : null; if ($deleteDate) { $dateKey = substr($deleteDate, 0, 10); // YYYY-MM-DD if (!isset($deletionsByDate[$dateKey])) { $deletionsByDate[$dateKey] = 0; } $deletionsByDate[$dateKey]++; } // Извлекаем ID проекта из пути if (preg_match('/Project\/([^\/]+)_(\d+)\//', $key, $matches)) { $projectId = $matches[2]; if (!isset($deletionsByProject[$projectId])) { $deletionsByProject[$projectId] = 0; } $deletionsByProject[$projectId]++; } } } $isTruncated = isset($versions['IsTruncated']) && $versions['IsTruncated']; $continuationToken = isset($versions['NextContinuationToken']) ? $versions['NextContinuationToken'] : null; if (!$isTruncated) { break; } } echo " Проверено delete markers: $totalChecked\n\n"; // Сортируем по датам krsort($deletionsByDate); echo " Удаления по датам (топ 20):\n"; $count = 0; foreach ($deletionsByDate as $date => $count) { if ($count > 0) { echo " $date: $count удалений\n"; if (++$count >= 20) break; } } echo "\n"; // Сортируем проекты по количеству удалений arsort($deletionsByProject); echo " Проекты с наибольшим количеством удалений (топ 10):\n"; $count = 0; foreach ($deletionsByProject as $projectId => $deleteCount) { echo " Проект $projectId: $deleteCount удалений\n"; if (++$count >= 10) break; } echo "\n"; } catch (\Aws\Exception\AwsException $e) { echo " Ошибка: " . $e->getMessage() . "\n"; } // Проверяем логи системы echo "2. Проверка логов на наличие записей об удалениях...\n"; $logFiles = [ '/var/log/nginx/error.log', '/var/log/apache2/error.log', '/var/www/fastuser/data/www/crm.clientright.ru/logs/debug.log', '/var/www/fastuser/data/www/crm.clientright.ru/logs/s3_debug.log', ]; foreach ($logFiles as $logFile) { if (file_exists($logFile)) { echo " Проверка: $logFile\n"; $lines = file($logFile); if ($lines) { $deleteLines = array_filter($lines, function($line) { return stripos($line, 'delete') !== false && (stripos($line, 's3') !== false || stripos($line, 'file') !== false); }); if (!empty($deleteLines)) { echo " Найдено строк с упоминанием удалений: " . count($deleteLines) . "\n"; echo " Последние 5 записей:\n"; foreach (array_slice($deleteLines, -5) as $line) { echo " " . substr(trim($line), 0, 150) . "\n"; } } else { echo " Записей об удалениях не найдено\n"; } } echo "\n"; } } // Проверяем, есть ли скрипты крона, которые могут удалять файлы echo "3. Поиск скриптов, которые могут удалять файлы...\n"; $cronFiles = [ '/var/spool/cron/crontabs/root', '/etc/cron.d/', '/var/www/fastuser/data/www/crm.clientright.ru/cron/', ]; foreach ($cronFiles as $cronPath) { if (file_exists($cronPath)) { echo " Проверка: $cronPath\n"; if (is_dir($cronPath)) { $files = glob($cronPath . '*'); foreach ($files as $file) { if (is_file($file)) { $content = file_get_contents($file); if (stripos($content, 'delete') !== false || stripos($content, 'remove') !== false) { echo " Найден файл: $file\n"; echo " Содержит упоминания удаления\n"; } } } } else { $content = file_get_contents($cronPath); if (stripos($content, 'delete') !== false || stripos($content, 'remove') !== false) { echo " Файл содержит упоминания удаления\n"; } } } } echo "\n"; // Проверяем, может быть это связано с синхронизацией Nextcloud echo "4. Проверка связи с Nextcloud синхронизацией...\n"; $nextcloudFiles = glob('/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/*sync*.php'); if (!empty($nextcloudFiles)) { echo " Найдено файлов синхронизации: " . count($nextcloudFiles) . "\n"; foreach ($nextcloudFiles as $file) { $content = file_get_contents($file); if (stripos($content, 'delete') !== false) { echo " $file содержит код удаления\n"; } } } else { echo " Файлы синхронизации не найдены\n"; } echo "\n"; } catch (Exception $e) { echo "ОШИБКА: " . $e->getMessage() . "\n"; echo "Trace: " . $e->getTraceAsString() . "\n"; }