# ✅ 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+ секунда** ### **Почему так происходило:** ```php // AmazonS3.php line 648 function getDirectoryMetaData($path) { // Сканирует ВСЮ папку, а не только запрошенный файл! return $this->getDirectoryContent($path); } ``` При `filesystem_check_changes=1` Nextcloud хотел убедиться что файл актуален, но вместо проверки одного файла - сканировал всю папку с сотнями проектов! --- ## ✅ РЕШЕНИЕ ### **Отключить filesystem_check для S3 External Storage:** ```bash 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: ```bash # Каждые 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 с кешем метаданных** ```nginx # Кешировать 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 для метаданных)** ```php // Collabora запрашивает метаданные напрямую из CRM // CRM отдаёт из своей БД (мгновенно!) // Collabora читает файл через presigned S3 URL WOPISrc = https://crm.clientright.ru/wopi/files/{recordId} ``` **Эффект:** 0.1-0.2 секунды полное открытие --- #### **#3: Кеш в CRM Redis** ```php // Кешировать 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 секунды --- ## 🎯 ИТОГОВЫЕ РЕКОМЕНДАЦИИ ### **ДЛЯ ПРОДАКШЕНА (СЕЙЧАС):** ```bash # 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%) - ✅ **Стабильность:** отлично ### Настройки: ```php 'memcache.distributed' => '\OC\Memcache\Redis', // ✅ 'filesystem_check_changes' => 1, // глобально ``` ```json // External Storage ID 1 (/crm) { "filesystem_check_changes": 0, // ✅ ОТКЛЮЧЕНО "encrypt": false, // ✅ ОТКЛЮЧЕНО "previews": true } ``` --- ## 🎉 РЕЗУЛЬТАТ **Редактирование документов теперь открывается в 18 раз быстрее!** - Было: 25 секунд ❌ - Стало: 1.5 секунды ✅ **Это приемлемая скорость для редактирования!** 🚀 --- **Следующий шаг:** Настроить cron для периодического сканирования новых файлов **Хочешь настрою cron?** 😊