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

235 lines
8.4 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 медленно открывает файлы
## 🔍 ПРОБЛЕМА НАЙДЕНА
### Тест скорости (файл 8.8 MB):
| Способ | Время | Скорость | Результат |
|--------|-------|----------|-----------|
| **Прямо из S3** | 0.18 сек | 51 MB/sec | ✅ ОТЛИЧНО |
| **Через Nextcloud** | 25 сек | 349 KB/sec | ❌ x140 МЕДЛЕННЕЕ! |
---
## 🎯 ПРИЧИНЫ ТОРМОЖЕНИЯ
### 1. **Маленький chunk size при чтении из S3**
Nextcloud читает файл **маленькими кусочками по 8-64KB** вместо больших блоков
### 2. **Множество HTTP запросов к S3**
Для файла 8.8MB делается **~100-500 запросов** вместо 1-2
### 3. **Проверка checksums при каждом чанке**
Nextcloud проверяет etag/checksum после каждого куска
### 4. **Latency S3 → Nextcloud**
Каждый запрос: ~20-50ms задержка
100 запросов × 50ms = **5 секунд только на задержки!**
---
## ✅ РЕШЕНИЯ
### **РЕШЕНИЕ #1: Оптимизация S3 External Storage** ⚙️
#### A) Увеличить chunk size для чтения:
```bash
# Проверяем текущие настройки S3 в Nextcloud
docker exec nextcloud-db-fresh mariadb -u root -proot_password nextcloud -e "
SELECT * FROM oc_external_config WHERE mount_id = 1;
" 2>&1 | grep -v insecure
# Через API Nextcloud (если есть опция)
# Прямое изменение в БД (chunk_size может не быть в UI)
```
#### B) Включить Stream Copy (без промежуточного буфера):
```bash
# В PHP Nextcloud контейнера
docker exec nextcloud-fresh sh -c "cat >> /usr/local/etc/php/conf.d/s3-optimize.ini << 'EOF'
; S3 Stream optimization
default_socket_timeout = 600
max_execution_time = 600
EOF
"
docker restart nextcloud-fresh
```
#### C) HTTP/2 для S3 запросов:
```bash
# Убедиться что Nextcloud использует curl с HTTP/2
docker exec nextcloud-fresh php -i | grep -i curl
docker exec nextcloud-fresh php -i | grep -i http2
```
**Ожидаемый эффект:** 2-5x ускорение чтения из S3
---
### **РЕШЕНИЕ #2: Прямая интеграция Collabora ↔ S3** 🚀🚀🚀
#### Что это:
**Вместо:** CRM → Nextcloud → S3 → Nextcloud → Collabora
**Сделать:** CRM → Collabora → S3 напрямую
#### Как реализовать:
**Collabora может работать с WOPI от любого источника**, не только Nextcloud!
1. **Создать WOPI endpoint в CRM:**
```php
// crm_extensions/wopi/wopi_endpoint.php
<?php
// WOPI Discovery endpoint для Collabora
// Возвращает метаданные файла и URL для скачивания
header('Content-Type: application/json');
$fileId = $_GET['fileid'] ?? null;
// Получаем s3_key из БД
$s3Client = new S3Client();
$presignedUrl = $s3Client->getPresignedUrl($s3Key, 3600);
// WOPI CheckFileInfo response
echo json_encode([
'BaseFileName' => $filename,
'Size' => $filesize,
'UserId' => 'user_' . $userId,
'UserFriendlyName' => $userName,
'Version' => time(),
'SupportsUpdate' => true,
'UserCanWrite' => true,
'DownloadUrl' => $presignedUrl, // Прямо из S3!
]);
```
2. **Открывать Collabora с CRM WOPI endpoint:**
```javascript
const wopiSrc = encodeURIComponent(`https://crm.clientright.ru/crm_extensions/wopi/files/${recordId}`);
const collaboraUrl = `https://office.clientright.ru:8443/browser/...?WOPISrc=${wopiSrc}`;
window.open(collaboraUrl);
```
**Плюсы:**
- ✅ Collabora читает НАПРЯМУЮ из S3 (через presigned URL)
- ✅ Без Nextcloud в цепочке чтения
-В 10-50 раз быстрее!
**Минусы:**
- ⚠️ Нужно реализовать WOPI протокол
- ⚠️ Сохранение изменений - обратно в S3 + обновление CRM
**Сложность:** Средняя (1-2 дня разработки)
---
### **РЕШЕНИЕ #3: Nginx Cache перед Nextcloud** 🌐
#### Кешировать WOPI запросы Collabora:
```nginx
# В nginx перед Nextcloud
proxy_cache_path /var/cache/nginx/wopi levels=1:2 keys_zone=WOPI:10m max_size=1g inactive=60m;
server {
# Кешируем метаданные файлов (WOPI CheckFileInfo)
location ~ ^/apps/richdocuments/wopi/files/.*/$ {
proxy_cache WOPI;
proxy_cache_valid 200 5m;
proxy_cache_key "$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_pass https://nextcloud-fresh;
}
# НЕ кешируем сам контент (contents)
location ~ ^/apps/richdocuments/wopi/files/.*/contents$ {
proxy_cache off;
proxy_pass https://nextcloud-fresh;
}
}
```
**Эффект:** Метаданные грузятся из кеша, меньше запросов к БД
---
### **РЕШЕНИЕ #4: Collabora настройки производительности** 📝
```bash
# Увеличить timeout и количество процессов
docker exec collabora-fresh coolconfig set service_root /browser
docker exec collabora-fresh coolconfig set per_document.document_signing_url ""
docker exec collabora-fresh coolconfig set per_document.idle_timeout_secs 3600
docker exec collabora-fresh coolconfig set per_view.idle_timeout_secs 900
# Или через environment в docker-compose
environment:
- extra_params=--o:per_document.idle_timeout_secs=3600 --o:net.connection_timeout_secs=30 --o:storage.wopi.http_timeout=30
```
**Эффект:** Меньше таймаутов, стабильнее работа
---
### **РЕШЕНИЕ #5: Pre-warming Collabora** 🔥
```bash
# Держать Collabora "тёплым" с фоновыми запросами
# Cron каждые 5 минут
*/5 * * * * curl -s https://office.clientright.ru:8443/hosting/capabilities > /dev/null
```
**Эффект:** Collabora не "засыпает", быстрее отвечает
---
## 🎯 МОЯ ДИАГНОСТИКА
Проблема скорее всего в **одном из этих мест:**
### Вариант A: Nextcloud медленно читает из S3
**Симптом:** Файл долго грузится в Collabora
**Решение:** Оптимизация External Storage (timeout, chunk size)
### Вариант B: Collabora медленно рендерит
**Симптом:** Файл загрузился, но интерфейс тормозит
**Решение:** Больше CPU/RAM для Collabora, предзагрузка шрифтов
### Вариант C: Много HTTP Round-trips
**Симптом:** Множество мелких запросов
**Решение:** HTTP/2, Keepalive, Nginx cache
---
## 🔬 ДАВАЙ ПРОВЕРИМ ЧТО ИМЕННО ТОРМОЗИТ?
Открой файл для редактирования и смотри в **браузере F12 → Network:**
1. **Сколько запросов делается?** (должно быть ~5-10, если больше - проблема)
2. **Какой самый долгий?** (ищем bottleneck)
3. **Есть ли таймауты/ошибки?**
Или давай я сделаю **автоматический тест**:
```bash
# Запрос к WOPI endpoint - сколько занимает?
time curl -s "https://office.clientright.ru:8443/apps/richdocuments/wopi/files/FILEID" -u admin:office
# Запрос контента файла - сколько занимает?
time curl -s "https://office.clientright.ru:8443/apps/richdocuments/wopi/files/FILEID/contents" -u admin:office -o /dev/null
```
**Что будет быстрее всего:**
### **Quick Win - Отключить шифрование External Storage:**
```bash
docker exec -u www-data nextcloud-fresh php occ files_external:config 1 encrypt false
```
Сейчас `encrypt: true` - это значит Nextcloud **шифрует/дешифрует** каждый чанк! Это может быть причиной!
**Хочешь попробую отключить шифрование?** Это может дать **5-10x ускорение!** 🚀