Files
crm.clientright.ru/NEXTCLOUD_ИТОГОВОЕ_РЕШЕНИЕ.md
Fedor 7e3f0dcede Исправление путей к папкам проектов в Nextcloud + создание файлов из CRM
🔧 Исправления:
- Исправлены пути к папкам проектов: теперь /Documents/Project/{Name}_{Id}
- Исправлена функция openProjectFolder() во всех JS файлах
- Добавлены кнопки создания Word/Excel/PowerPoint из CRM (10 модулей)
- Создание файлов напрямую в S3 с автоиндексацией через Redis
- Исправлена ошибка 'Class Redis not found' (использован Predis)

📁 Изменённые файлы:
- layouts/v7/lib/nextcloud-editor.js
- crm_extensions/nextcloud_editor/js/nextcloud-editor.js
- layouts/v7/lib/nextcloud-editor-v3.js
- crm_extensions/file_storage/api/create_nextcloud_file.php
- layouts/v7/modules/*/DetailViewHeaderTitle.tpl (10 модулей)
- layouts/v7/modules/Documents/*.tpl (кнопки редактирования)

🎯 Результат:
- Кнопка 'Папка в Nextcloud' открывает правильную папку
- Создание файлов работает молниеносно (прямо в S3)
- Redis события публикуются корректно
- OnlyOffice открывается для редактирования

Проект 391552 теперь открывается по правильному пути!
2025-11-01 12:22:12 +03:00

7.1 KiB
Raw Blame History

NEXTCLOUD - ИТОГОВОЕ РЕШЕНИЕ МЕДЛЕННОЙ РАБОТЫ

Дата: 31 октября 2025
Проблема: Медленное открытие файлов для редактирования (25 секунд)
Решение: Найдено и применено


🔍 НАЙДЕННАЯ ПРОБЛЕМА

Корневая причина:

При запросе одного файла через PROPFIND, Nextcloud с настройкой filesystem_check_changes=1:

  1. Проверяет кеш для файла
  2. НЕ находит актуальные данные
  3. Решает обновить кеш
  4. СКАНИРУЕТ ВСЮ РОДИТЕЛЬСКУЮ ПАПКУ Documents/Project/
  5. Вызывает getDirectoryContent() для S3
  6. Делает LIST запрос к S3 для ~700 подпапок проектов
  7. Каждая подпапка - отдельный HTTP запрос
  8. 700 запросов × 30ms latency = 21+ секунда

Почему так происходило:

// AmazonS3.php line 648
function getDirectoryMetaData($path) {
    // Сканирует ВСЮ папку, а не только запрошенный файл!
    return $this->getDirectoryContent($path);
}

При filesystem_check_changes=1 Nextcloud хотел убедиться что файл актуален, но вместо проверки одного файла - сканировал всю папку с сотнями проектов!


РЕШЕНИЕ

Отключить filesystem_check для S3 External Storage:

docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 0

Результаты:

Показатель До После Улучшение
PROPFIND время 24-26 сек 1.3-1.7 сек -94% 🚀
Ускорение - - x18
Стабильность Скачет Стабильно

Побочные эффекты:

⚠️ Новые файлы НЕ видны автоматически

Решение: Периодическое сканирование через cron:

# Каждые 30 минут - сканируем только новые файлы
*/30 * * * * docker exec -u www-data nextcloud-fresh php occ files:scan --path=/admin/files/crm/crm2/CRM_Active_Files/Documents/Project --shallow

📊 ТЕСТЫ ПРОИЗВОДИТЕЛЬНОСТИ

Серия из 5 тестов:

Тест 1: 1.722s
Тест 2: 1.496s
Тест 3: 1.339s  ← лучший
Тест 4: 1.447s
Тест 5: 1.452s

Среднее: 1.49 секунды

Стабильная скорость: ~1.5 секунды


🎯 ДОПОЛНИТЕЛЬНЫЕ ОПТИМИЗАЦИИ

Что уже сделано:

  1. Redis Distributed Cache - кеш между запросами
  2. PHP Memory 1024MB - больше памяти
  3. OPcache оптимизирован - меньше компиляций
  4. MySQL max_connections=300 - больше соединений
  5. Шифрование отключено - меньше CPU
  6. filesystem_check_changes=0 - без сканирования S3

CPU/Memory после всех оптимизаций:

Nextcloud: 0.05-5% CPU  (было 50%)
Memory: 643-746 MB      (было 1005 MB)
Deadlocks: минимум      (было много)

💡 ДАЛЬНЕЙШИЕ УЛУЧШЕНИЯ (опционально)

Если нужно ещё быстрее (< 1 секунды):

#1: Nginx Reverse Proxy с кешем метаданных

# Кешировать PROPFIND ответы
location ~ ^/remote.php/dav/files/ {
    proxy_cache_path /var/cache/nginx/propfind levels=1:2 keys_zone=PROPFIND:10m;
    proxy_cache PROPFIND;
    proxy_cache_valid 200 5m;
    proxy_cache_methods GET HEAD PROPFIND;
    proxy_cache_key "$request_method$request_uri";
    
    proxy_pass http://nextcloud-fresh;
}

Эффект: Метаданные из Nginx кеша → 0.01-0.05 секунды


#2: Прямой WOPI endpoint в CRM (обход Nextcloud для метаданных)

// Collabora запрашивает метаданные напрямую из CRM
// CRM отдаёт из своей БД (мгновенно!)
// Collabora читает файл через presigned S3 URL

WOPISrc = https://crm.clientright.ru/wopi/files/{recordId}

Эффект: 0.1-0.2 секунды полное открытие


#3: Кеш в CRM Redis

// Кешировать fileId в CRM Redis
$redis->set("nc_fileid:$recordId", $fileId, 3600);

// При открытии - сразу из кеша
$fileId = $redis->get("nc_fileid:$recordId");
if ($fileId) {
    // Сразу открываем без PROPFIND
    return "https://office.clientright.ru:8443/apps/richdocuments/index?fileId=$fileId";
}

Эффект: Без PROPFIND вообще → 0.05-0.1 секунды


🎯 ИТОГОВЫЕ РЕКОМЕНДАЦИИ

ДЛЯ ПРОДАКШЕНА (СЕЙЧАС):

# 1. filesystem_check_changes=0 для S3 (УЖЕ ПРИМЕНЕНО)
docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 0

# 2. Cron сканирование каждые 30 минут
crontab -e
*/30 * * * * docker exec -u www-data nextcloud-fresh php occ files:scan --path=/admin/files/crm --shallow > /dev/null 2>&1

# 3. Мониторинг
docker stats nextcloud-fresh --no-stream

ЕСЛИ НУЖНО ЕЩЁ БЫСТРЕЕ:

  • Nginx cache для PROPFIND (→ 0.05s)
  • Кеш fileId в CRM Redis (→ без PROPFIND)
  • Прямой WOPI от CRM (→ полный обход Nextcloud для метаданных)

ТЕКУЩИЙ СТАТУС

Производительность:

  • Открытие для редактирования: ~1.5 секунды (было 25с)
  • Просмотр: ~0.2 секунды (прямые ссылки S3)
  • CPU Nextcloud: 0.05-5% (было 50%)
  • Стабильность: отлично

Настройки:

'memcache.distributed' => '\OC\Memcache\Redis',    // ✅
'filesystem_check_changes' => 1,                   // глобально
// External Storage ID 1 (/crm)
{
  "filesystem_check_changes": 0,  // ✅ ОТКЛЮЧЕНО
  "encrypt": false,                // ✅ ОТКЛЮЧЕНО  
  "previews": true
}

🎉 РЕЗУЛЬТАТ

Редактирование документов теперь открывается в 18 раз быстрее!

  • Было: 25 секунд
  • Стало: 1.5 секунды

Это приемлемая скорость для редактирования! 🚀


Следующий шаг: Настроить cron для периодического сканирования новых файлов

Хочешь настрою cron? 😊