feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp] - Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta - Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов - Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash) - Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений Fixes: - field_label теперь корректно отображает 'Переписка' вместо 'group-2' - documents_meta не накапливает дубликаты при повторных сохранениях - ON CONFLICT (file_hash) теперь работает для document_texts
This commit is contained in:
191
cleanup_disk.php
Normal file
191
cleanup_disk.php
Normal file
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
/**
|
||||
* Скрипт для безопасной очистки диска
|
||||
*
|
||||
* Удаляет:
|
||||
* 1. Старые бэкапы SQL (оставляет последние N)
|
||||
* 2. Большие логи (очищает или удаляет старые)
|
||||
*/
|
||||
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
$dryRun = !isset($argv[1]) || $argv[1] !== '--execute';
|
||||
$keepBackups = isset($argv[2]) ? (int)$argv[2] : (isset($argv[1]) && is_numeric($argv[1]) ? (int)$argv[1] : 5); // Сколько бэкапов оставить
|
||||
|
||||
echo "Очистка диска\n";
|
||||
echo str_repeat("=", 80) . "\n\n";
|
||||
|
||||
if (!$dryRun) {
|
||||
echo "⚠️ РЕЖИМ ПРОВЕРКИ (dry-run)\n";
|
||||
echo " Для реального удаления запустите: php cleanup_disk.php --execute [количество_бэкапов]\n";
|
||||
echo " Пример: php cleanup_disk.php --execute 5\n\n";
|
||||
} else {
|
||||
echo "⚠️ РЕЖИМ УДАЛЕНИЯ - файлы будут удалены!\n\n";
|
||||
}
|
||||
|
||||
$stats = [
|
||||
'backups_found' => 0,
|
||||
'backups_to_delete' => 0,
|
||||
'backups_size' => 0,
|
||||
'logs_found' => 0,
|
||||
'logs_to_clean' => 0,
|
||||
'logs_size' => 0,
|
||||
'total_freed' => 0
|
||||
];
|
||||
|
||||
// 1. Обработка бэкапов SQL
|
||||
echo "1. ОБРАБОТКА БЭКАПОВ SQL\n";
|
||||
echo str_repeat("-", 80) . "\n";
|
||||
|
||||
$backupDir = __DIR__;
|
||||
$backups = glob($backupDir . '/backup_before_migration_*.sql');
|
||||
|
||||
if (empty($backups)) {
|
||||
echo " Бэкапы не найдены\n\n";
|
||||
} else {
|
||||
$stats['backups_found'] = count($backups);
|
||||
|
||||
// Сортируем по дате изменения (новые первыми)
|
||||
usort($backups, function($a, $b) {
|
||||
return filemtime($b) - filemtime($a);
|
||||
});
|
||||
|
||||
echo " Найдено бэкапов: {$stats['backups_found']}\n";
|
||||
echo " Оставим последних: {$keepBackups}\n";
|
||||
echo " Будет удалено: " . max(0, $stats['backups_found'] - $keepBackups) . "\n\n";
|
||||
|
||||
$toDelete = array_slice($backups, $keepBackups);
|
||||
$stats['backups_to_delete'] = count($toDelete);
|
||||
|
||||
if (!empty($toDelete)) {
|
||||
echo " Файлы для удаления:\n";
|
||||
foreach ($toDelete as $backup) {
|
||||
$size = filesize($backup);
|
||||
$stats['backups_size'] += $size;
|
||||
$sizeMB = round($size / 1024 / 1024, 2);
|
||||
$date = date('Y-m-d H:i:s', filemtime($backup));
|
||||
echo " - " . basename($backup) . " ({$sizeMB}MB, {$date})\n";
|
||||
}
|
||||
|
||||
if ($dryRun && !empty($toDelete)) {
|
||||
echo "\n Удаление файлов...\n";
|
||||
foreach ($toDelete as $backup) {
|
||||
if (unlink($backup)) {
|
||||
echo " ✅ " . basename($backup) . " - удален\n";
|
||||
} else {
|
||||
echo " ❌ " . basename($backup) . " - ошибка удаления\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
echo "\n";
|
||||
} else {
|
||||
echo " Нет файлов для удаления\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Обработка больших логов
|
||||
echo "2. ОБРАБОТКА ЛОГОВ\n";
|
||||
echo str_repeat("-", 80) . "\n";
|
||||
|
||||
$largeLogs = [
|
||||
__DIR__ . '/wdall.log',
|
||||
__DIR__ . '/wdall2.log',
|
||||
__DIR__ . '/wa_inbound.log',
|
||||
__DIR__ . '/wa_outbound.log',
|
||||
];
|
||||
|
||||
foreach ($largeLogs as $logFile) {
|
||||
if (file_exists($logFile)) {
|
||||
$size = filesize($logFile);
|
||||
$sizeMB = round($size / 1024 / 1024, 2);
|
||||
|
||||
if ($size > 10 * 1024 * 1024) { // Больше 10MB
|
||||
$stats['logs_found']++;
|
||||
$stats['logs_size'] += $size;
|
||||
|
||||
echo " Найден большой лог: " . basename($logFile) . " ({$sizeMB}MB)\n";
|
||||
|
||||
if ($dryRun) {
|
||||
// Очищаем лог (оставляем последние 1000 строк)
|
||||
$lines = file($logFile);
|
||||
if (count($lines) > 1000) {
|
||||
$keepLines = array_slice($lines, -1000);
|
||||
if (file_put_contents($logFile, implode('', $keepLines))) {
|
||||
$newSize = filesize($logFile);
|
||||
$freedMB = round(($size - $newSize) / 1024 / 1024, 2);
|
||||
echo " ✅ Очищен (освобождено {$freedMB}MB)\n";
|
||||
$stats['logs_to_clean']++;
|
||||
} else {
|
||||
echo " ❌ Ошибка очистки\n";
|
||||
}
|
||||
} else {
|
||||
echo " ℹ️ Лог небольшой, пропущен\n";
|
||||
}
|
||||
} else {
|
||||
echo " ⏸️ Будет очищен (dry-run)\n";
|
||||
$stats['logs_to_clean']++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Обработка логов в папке logs/
|
||||
$logsDir = __DIR__ . '/logs';
|
||||
if (is_dir($logsDir)) {
|
||||
$logFiles = glob($logsDir . '/*.log*');
|
||||
foreach ($logFiles as $logFile) {
|
||||
$size = filesize($logFile);
|
||||
if ($size > 20 * 1024 * 1024) { // Больше 20MB
|
||||
$sizeMB = round($size / 1024 / 1024, 2);
|
||||
$mtime = filemtime($logFile);
|
||||
$daysOld = (time() - $mtime) / 86400;
|
||||
|
||||
if ($daysOld > 7) {
|
||||
$stats['logs_found']++;
|
||||
$stats['logs_size'] += $size;
|
||||
|
||||
echo " Старый большой лог: " . basename($logFile) . " ({$sizeMB}MB, " . round($daysOld) . " дней)\n";
|
||||
|
||||
if ($dryRun) {
|
||||
if (unlink($logFile)) {
|
||||
echo " ✅ Удален\n";
|
||||
$stats['logs_to_clean']++;
|
||||
} else {
|
||||
echo " ❌ Ошибка удаления\n";
|
||||
}
|
||||
} else {
|
||||
echo " ⏸️ Будет удален (dry-run)\n";
|
||||
$stats['logs_to_clean']++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
|
||||
// Итоговая статистика
|
||||
$stats['total_freed'] = $stats['backups_size'] + $stats['logs_size'];
|
||||
$totalFreedMB = round($stats['total_freed'] / 1024 / 1024, 2);
|
||||
$totalFreedGB = round($stats['total_freed'] / 1024 / 1024 / 1024, 2);
|
||||
|
||||
echo str_repeat("=", 80) . "\n";
|
||||
echo "ИТОГОВАЯ СТАТИСТИКА:\n\n";
|
||||
echo "Бэкапы:\n";
|
||||
echo " - Найдено: {$stats['backups_found']}\n";
|
||||
echo " - Будет удалено: {$stats['backups_to_delete']}\n";
|
||||
echo " - Размер: " . round($stats['backups_size'] / 1024 / 1024 / 1024, 2) . "GB\n\n";
|
||||
echo "Логи:\n";
|
||||
echo " - Найдено больших: {$stats['logs_found']}\n";
|
||||
echo " - Будет обработано: {$stats['logs_to_clean']}\n";
|
||||
echo " - Размер: " . round($stats['logs_size'] / 1024 / 1024, 2) . "MB\n\n";
|
||||
echo "ОБЩЕЕ ОСВОБОЖДЕНИЕ: {$totalFreedGB}GB ({$totalFreedMB}MB)\n\n";
|
||||
|
||||
if (!$dryRun) {
|
||||
echo "⚠️ Это был режим проверки. Для реального удаления запустите:\n";
|
||||
echo " php cleanup_disk.php --execute {$keepBackups}\n\n";
|
||||
} else {
|
||||
echo "✅ Очистка завершена!\n\n";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user