- Исправлен 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
151 lines
6.9 KiB
PHP
Executable File
151 lines
6.9 KiB
PHP
Executable File
<?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";
|
|
|