# 🔥 РЕШЕНИЕ: Почему 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 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 ускорение!** 🚀