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

8.4 KiB
Raw Permalink Blame History

🔥 РЕШЕНИЕ: Почему 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 для чтения:

# Проверяем текущие настройки 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 (без промежуточного буфера):

# В 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 запросов:

# Убедиться что 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:
// 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!
]);
  1. Открывать Collabora с CRM WOPI endpoint:
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 перед 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 настройки производительности 📝

# Увеличить 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 🔥

# Держать 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. Есть ли таймауты/ошибки?

Или давай я сделаю автоматический тест:

# Запрос к 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:

docker exec -u www-data nextcloud-fresh php occ files_external:config 1 encrypt false

Сейчас encrypt: true - это значит Nextcloud шифрует/дешифрует каждый чанк! Это может быть причиной!

Хочешь попробую отключить шифрование? Это может дать 5-10x ускорение! 🚀