Files
crm.clientright.ru/NEXTCLOUD_ИТОГОВОЕ_РЕШЕНИЕ.md

224 lines
7.1 KiB
Markdown
Raw Normal View 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+ секунда**
### **Почему так происходило:**
```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?** 😊
2025-11-01 12:22:12 +03:00