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

224 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ✅ 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?** 😊