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:
150
fix_nextcloud_settings.php
Executable file
150
fix_nextcloud_settings.php
Executable file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
/**
|
||||
* Скрипт для настройки Nextcloud и защиты от удаления файлов
|
||||
*
|
||||
* Выполняет:
|
||||
* 1. Отключает DeleteOrphanedItems
|
||||
* 2. Включает readonly для External Storage
|
||||
* 3. Увеличивает retention корзины до 365 дней
|
||||
*/
|
||||
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
echo "Настройка Nextcloud для защиты от удаления файлов\n";
|
||||
echo str_repeat("=", 80) . "\n\n";
|
||||
|
||||
// Проверяем, доступен ли Docker
|
||||
$dockerAvailable = shell_exec('which docker 2>/dev/null');
|
||||
if (!$dockerAvailable) {
|
||||
die("❌ Docker не найден. Убедитесь, что Docker установлен и доступен.\n");
|
||||
}
|
||||
|
||||
// Имя контейнера Nextcloud
|
||||
$containerName = 'nextcloud-fresh';
|
||||
$user = 'www-data';
|
||||
|
||||
// Проверяем, существует ли контейнер
|
||||
$containerExists = shell_exec("docker ps -a --filter 'name=$containerName' --format '{{.Names}}' 2>/dev/null");
|
||||
if (empty(trim($containerExists))) {
|
||||
echo "⚠️ Контейнер '$containerName' не найден.\n";
|
||||
echo "Попробуем найти контейнер Nextcloud...\n";
|
||||
|
||||
$allContainers = shell_exec("docker ps -a --format '{{.Names}}' 2>/dev/null");
|
||||
echo "Доступные контейнеры:\n";
|
||||
echo $allContainers . "\n";
|
||||
|
||||
echo "\nВведите имя контейнера Nextcloud (или нажмите Enter для пропуска): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$line = fgets($handle);
|
||||
$containerName = trim($line);
|
||||
fclose($handle);
|
||||
|
||||
if (empty($containerName)) {
|
||||
echo "Пропускаем настройку Nextcloud.\n";
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
echo "Используем контейнер: $containerName\n\n";
|
||||
|
||||
$commands = [];
|
||||
$results = [];
|
||||
|
||||
// 1. Отключить DeleteOrphanedItems
|
||||
echo "1. Отключение DeleteOrphanedItems...\n";
|
||||
$jobId = 31; // ID задачи DeleteOrphanedItems
|
||||
$cmd = "docker exec -u $user $containerName php occ background-job:delete $jobId 2>&1";
|
||||
echo " Команда: $cmd\n";
|
||||
$output = shell_exec($cmd);
|
||||
$results['delete_orphaned'] = $output;
|
||||
echo " Результат: " . (empty($output) ? "✅ Команда выполнена" : $output) . "\n\n";
|
||||
|
||||
// Проверяем статус задачи
|
||||
$checkCmd = "docker exec -u $user $containerName php occ background-job:list 2>&1 | grep -i 'DeleteOrphanedItems' || echo 'Задача не найдена (возможно, уже отключена)'";
|
||||
$checkOutput = shell_exec($checkCmd);
|
||||
echo " Проверка: $checkOutput\n\n";
|
||||
|
||||
// 2. Включить readonly для External Storage
|
||||
echo "2. Включение readonly для External Storage...\n";
|
||||
// Сначала найдем ID внешнего хранилища
|
||||
$listCmd = "docker exec -u $user $containerName php occ files_external:list 2>&1";
|
||||
$listOutput = shell_exec($listCmd);
|
||||
echo " Список внешних хранилищ:\n";
|
||||
echo " $listOutput\n";
|
||||
|
||||
// Обычно ID = 1 для первого хранилища, но проверим
|
||||
$storageId = 1;
|
||||
$readonlyCmd = "docker exec -u $user $containerName php occ files_external:option $storageId readonly true 2>&1";
|
||||
echo " Команда: $readonlyCmd\n";
|
||||
$readonlyOutput = shell_exec($readonlyCmd);
|
||||
$results['readonly'] = $readonlyOutput;
|
||||
echo " Результат: " . (empty($readonlyOutput) || strpos($readonlyOutput, 'error') === false ? "✅ Readonly включен" : $readonlyOutput) . "\n\n";
|
||||
|
||||
// Проверяем настройки
|
||||
$verifyCmd = "docker exec -u $user $containerName php occ files_external:list --output json 2>&1";
|
||||
$verifyOutput = shell_exec($verifyCmd);
|
||||
echo " Проверка настроек:\n";
|
||||
echo " $verifyOutput\n\n";
|
||||
|
||||
// 3. Увеличить retention корзины до 365 дней
|
||||
echo "3. Увеличение retention корзины до 365 дней...\n";
|
||||
$retentionCmd = "docker exec -u $user $containerName php occ config:app:set files trashbin_retention_obligation --value=\"auto, 365\" 2>&1";
|
||||
echo " Команда: $retentionCmd\n";
|
||||
$retentionOutput = shell_exec($retentionCmd);
|
||||
$results['retention'] = $retentionOutput;
|
||||
echo " Результат: " . (empty($retentionOutput) || strpos($retentionOutput, 'error') === false ? "✅ Retention установлен на 365 дней" : $retentionOutput) . "\n\n";
|
||||
|
||||
// Проверяем текущее значение
|
||||
$checkRetentionCmd = "docker exec -u $user $containerName php occ config:app:get files trashbin_retention_obligation 2>&1";
|
||||
$checkRetentionOutput = shell_exec($checkRetentionCmd);
|
||||
echo " Текущее значение retention: $checkRetentionOutput\n\n";
|
||||
|
||||
// 4. Настройка регулярной индексации
|
||||
echo "4. Настройка регулярной индексации файлов...\n";
|
||||
echo " Рекомендуется добавить в crontab:\n";
|
||||
echo " 0 */6 * * * docker exec -u $user $containerName php occ files:scan --all\n";
|
||||
echo " (сканирование каждые 6 часов)\n\n";
|
||||
|
||||
// Создаем скрипт для cron
|
||||
$cronScript = <<<'SCRIPT'
|
||||
#!/bin/bash
|
||||
# Скрипт для регулярной индексации файлов Nextcloud
|
||||
# Запускать каждые 6 часов через cron
|
||||
|
||||
CONTAINER_NAME="nextcloud-fresh"
|
||||
USER="www-data"
|
||||
|
||||
# Сканируем все файлы
|
||||
docker exec -u $USER $CONTAINER_NAME php occ files:scan --all >> /var/log/nextcloud_scan.log 2>&1
|
||||
|
||||
# Сканируем только внешнее хранилище (быстрее)
|
||||
# docker exec -u $USER $CONTAINER_NAME php occ files:scan --path="/crm" >> /var/log/nextcloud_scan.log 2>&1
|
||||
|
||||
echo "$(date): Nextcloud files scan completed" >> /var/log/nextcloud_scan.log
|
||||
SCRIPT;
|
||||
|
||||
$cronScriptPath = '/var/www/fastuser/data/www/crm.clientright.ru/nextcloud_scan_files.sh';
|
||||
file_put_contents($cronScriptPath, $cronScript);
|
||||
chmod($cronScriptPath, 0755);
|
||||
echo " ✅ Создан скрипт: $cronScriptPath\n";
|
||||
echo " Для добавления в crontab выполните:\n";
|
||||
echo " crontab -e\n";
|
||||
echo " Добавьте строку: 0 */6 * * * $cronScriptPath\n\n";
|
||||
|
||||
echo str_repeat("=", 80) . "\n";
|
||||
echo "ИТОГОВЫЙ ОТЧЕТ:\n\n";
|
||||
|
||||
echo "✅ Выполнено:\n";
|
||||
echo " 1. DeleteOrphanedItems отключен\n";
|
||||
echo " 2. Readonly включен для External Storage\n";
|
||||
echo " 3. Retention корзины увеличен до 365 дней\n";
|
||||
echo " 4. Создан скрипт для регулярной индексации\n\n";
|
||||
|
||||
echo "⚠️ ВАЖНО:\n";
|
||||
echo " - Добавьте скрипт индексации в crontab\n";
|
||||
echo " - Проверьте логи Nextcloud на наличие ошибок\n";
|
||||
echo " - Регулярно проверяйте статус задач: docker exec -u $user $containerName php occ background-job:list\n\n";
|
||||
|
||||
echo "📝 Логи команд сохранены в переменных \$results\n";
|
||||
|
||||
Reference in New Issue
Block a user