🔧 Исправления: - Исправлены пути к папкам проектов: теперь /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 теперь открывается по правильному пути!
224 lines
7.1 KiB
Markdown
224 lines
7.1 KiB
Markdown
# ✅ 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?** 😊
|
||
|
||
|