feat: OnlyOffice Standalone integration with S3 direct URLs
✅ ЧТО СДЕЛАНО: - Поднят новый standalone OnlyOffice Document Server (порт 8083) - Настроен Nginx для доступа через office.clientright.ru:9443 - Создан open_file_v3_standalone.php для работы с новым OnlyOffice - Реализована поддержка прямых S3 URL (bucket публичный) - Добавлен s3_proxy.php с поддержкой Range requests - Создан onlyoffice_callback.php для сохранения (базовая версия) - Файлы успешно открываются и загружаются! ⚠️ TODO (на завтра): - Доработать onlyoffice_callback.php для сохранения обратно в ОРИГИНАЛЬНЫЙ путь в S3 - Добавить Redis маппинг documentKey → S3 path - Обновить CRM JS для использования open_file_v3_standalone.php - Протестировать сохранение файлов - Удалить тестовые файлы 📊 РЕЗУЛЬТАТ: - OnlyOffice Standalone РАБОТАЕТ! ✅ - Файлы открываются напрямую из S3 ✅ - Редактор загружается БЫСТРО ✅ - Автосохранение настроено ✅ (но нужна доработка callback)
This commit is contained in:
233
РЕШЕНИЕ_МЕДЛЕННОГО_NEXTCLOUD.md
Normal file
233
РЕШЕНИЕ_МЕДЛЕННОГО_NEXTCLOUD.md
Normal file
@@ -0,0 +1,233 @@
|
||||
# 🔥 РЕШЕНИЕ: Почему 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 ускорение!** 🚀
|
||||
Reference in New Issue
Block a user