Files
crm.clientright.ru/fix_nextcloud_settings.php

151 lines
6.9 KiB
PHP
Raw Normal View History

<?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";