🔧 Исправления: - Исправлены пути к папкам проектов: теперь /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 теперь открывается по правильному пути!
7.1 KiB
✅ NEXTCLOUD - ИТОГОВОЕ РЕШЕНИЕ МЕДЛЕННОЙ РАБОТЫ
Дата: 31 октября 2025
Проблема: Медленное открытие файлов для редактирования (25 секунд)
Решение: Найдено и применено
🔍 НАЙДЕННАЯ ПРОБЛЕМА
Корневая причина:
При запросе одного файла через PROPFIND, Nextcloud с настройкой filesystem_check_changes=1:
- Проверяет кеш для файла
- НЕ находит актуальные данные
- Решает обновить кеш
- СКАНИРУЕТ ВСЮ РОДИТЕЛЬСКУЮ ПАПКУ
Documents/Project/ - Вызывает
getDirectoryContent()для S3 - Делает LIST запрос к S3 для ~700 подпапок проектов
- Каждая подпапка - отдельный HTTP запрос
- 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 секунды
🎯 ДОПОЛНИТЕЛЬНЫЕ ОПТИМИЗАЦИИ
Что уже сделано:
- ✅ Redis Distributed Cache - кеш между запросами
- ✅ PHP Memory 1024MB - больше памяти
- ✅ OPcache оптимизирован - меньше компиляций
- ✅ MySQL max_connections=300 - больше соединений
- ✅ Шифрование отключено - меньше CPU
- ✅ 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? 😊