docs: Добавлена документация по OnlyOffice Standalone setup

This commit is contained in:
Fedor
2025-11-01 01:04:08 +03:00
parent 269c7ea216
commit 3e8c3968a0

View File

@@ -0,0 +1,271 @@
# OnlyOffice Standalone — Настройка и Интеграция с S3
**Дата:** 31 октября 2025
**Статус:****РАБОТАЕТ! Файлы открываются!**
⚠️ **TODO:** Доработать сохранение обратно в оригинальный путь S3
---
## 🎯 ЧТО СДЕЛАНО
### 1. Поднят новый Standalone OnlyOffice Document Server
**Контейнер:** `onlyoffice-standalone`
**Порт:** `127.0.0.1:8083` → проксируется через Nginx на `office.clientright.ru:9443`
**Docker Compose:** `/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/docker-compose.onlyoffice-standalone.yml`
**Конфигурация:**
- JWT отключён (`JWT_ENABLED=false`)
- WOPI отключён (`WOPI_ENABLED=false`)
- Полностью независим от Nextcloud
- Работает в standalone режиме
### 2. Настроен Nginx
**Файл:** `/etc/nginx/conf.d/01-onlyoffice-standalone.conf`
```nginx
server {
listen 147.45.146.17:9443 ssl http2;
server_name onlyoffice.clientright.ru office.clientright.ru;
# SSL от office.clientright.ru (используем тот же сертификат)
ssl_certificate /etc/letsencrypt/live/office.clientright.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/office.clientright.ru/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8083;
# ВАЖНО: Host с портом для правильной генерации URL кеша
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $host:$server_port;
...
}
}
```
**Доступ:** `https://office.clientright.ru:9443`
### 3. Создан open_file_v3_standalone.php
**Файл:** `crm_extensions/file_storage/api/open_file_v3_standalone.php`
**Особенности:**
- ✅ Использует standalone OnlyOffice (порт 9443)
- ✅ Прямой S3 URL (публичный bucket)
- ✅ Уникальный `documentKey` при каждом запросе (обход кеша)
- ✅ Сохраняет маппинг `documentKey → S3 path` в Redis
- ✅ Поддержка Range requests из коробки (S3)
- ✅ CORS настроен правильно
### 4. Обновлён onlyoffice_callback.php
**Файл:** `crm_extensions/file_storage/api/onlyoffice_callback.php`
**Что делает:**
- ✅ Принимает callback от OnlyOffice при сохранении
- ✅ Скачивает изменённый файл от OnlyOffice
- ✅ Загружает в S3 (временно в папку `onlyoffice_saved/`)
- ⚠️ **TODO:** Сохранять в оригинальный путь (используя Redis маппинг)
### 5. Обновлён open_file_v2.php
**Файл:** `crm_extensions/file_storage/api/open_file_v2.php`
**Изменения:**
- ✅ Переключён на standalone OnlyOffice (9443)
- ✅ Использует прямой S3 URL (без proxy)
- ✅ Добавлена информация о пользователе (`user.id`, `user.name`)
- ✅ Улучшен CSS для полноэкранного режима
### 6. Создан s3_proxy.php
**Файл:** `crm_extensions/file_storage/api/s3_proxy.php`
**Особенности:**
- ✅ Поддержка HTTP Range requests (206 Partial Content)
- ✅ Правильные CORS headers
- ✅ Обработка HEAD requests
- ✅ Проксирование файлов из S3
*(Сейчас не используется, так как S3 bucket публичный и OnlyOffice работает напрямую)*
---
## 🚀 КАК ЭТО РАБОТАЕТ
### Открытие файла
1. **CRM** → Кнопка "Редактировать" → `open_file_v2.php?recordId=X&fileName=...`
2. **PHP скрипт:**
- Извлекает S3 путь из URL
- Генерирует уникальный `documentKey`
- Сохраняет маппинг `documentKey → S3 path` в Redis (TTL 24ч)
- Отдаёт HTML с OnlyOffice редактором
3. **Браузер:**
- Загружает OnlyOffice API с `office.clientright.ru:9443`
- OnlyOffice скачивает файл **напрямую из S3** (публичный bucket)
- Документ открывается в редакторе
### Сохранение файла
1. **Пользователь редактирует** → Автосохранение каждые несколько секунд
2. **OnlyOffice**`POST https://crm.clientright.ru/.../onlyoffice_callback.php`
3. **Callback скрипт:**
- Получает `status: 2` (файл сохранён)
- Скачивает изменённый файл от OnlyOffice
- **ВРЕМЕННО:** Сохраняет в `onlyoffice_saved/` в S3
- **TODO:** Получить оригинальный путь из Redis и перезаписать файл там
---
## ⚠️ TODO (НА ЗАВТРА)
### 1. Доработать сохранение в оригинальный путь
**Проблема:** Сейчас файлы сохраняются в `onlyoffice_saved/`, а не в оригинальный путь.
**Решение:**
```php
// В onlyoffice_callback.php:
$redis = new Predis\Client([...]);
$mapping = $redis->get("crm:onlyoffice:key:$documentKey");
$data = json_decode($mapping, true);
$originalPath = $data['s3_path'];
// Сохраняем в ОРИГИНАЛЬНЫЙ путь
$s3Client->putObject([
'Bucket' => $bucket,
'Key' => $originalPath, // ← СЮДА!
'Body' => $fileContent
]);
```
### 2. Обновить CRM JS для использования нового скрипта
**Файл:** `layouts/v7/lib/nextcloud-editor.js`
Изменить вызов с `open_file_v2.php` на `open_file_v3_standalone.php`.
### 3. Тестирование
- [ ] Открытие разных типов файлов (docx, xlsx, pptx)
- [ ] Редактирование и сохранение
- [ ] Совместная работа (несколько пользователей)
- [ ] Проверка что файлы сохраняются в правильный путь
### 4. Очистка
Удалить тестовые файлы:
- `test_onlyoffice_simple.php`
- `test_onlyoffice_direct.php`
- `test_presigned.php`
---
## 📊 РЕЗУЛЬТАТ
### ✅ ЧТО РАБОТАЕТ
- **OnlyOffice Standalone запущен и работает**
- **Файлы открываются БЫСТРО** (напрямую из S3)
- **Редактор загружается полностью**
- **Поддержка Range requests** (S3)
- **CORS настроен правильно**
- **Callback вызывается** при сохранении
### ⚠️ ЧТО НУЖНО ДОРАБОТАТЬ
- **Сохранение в оригинальный путь** (сейчас в `onlyoffice_saved/`)
- **Тестирование разных файлов** (некоторые могут быть повреждены)
- **Обновление CRM JS** для использования нового скрипта
---
## 🔧 ТЕХНИЧЕСКАЯ ИНФОРМАЦИЯ
### Порты
- **8081:** Старый OnlyOffice (через Nextcloud/WOPI) — `office.clientright.ru:8443`
- **8083:** **Новый Standalone OnlyOffice**`office.clientright.ru:9443`
### URLs
- **OnlyOffice API:** `https://office.clientright.ru:9443/web-apps/apps/api/documents/api.js`
- **Открытие файла:** `https://crm.clientright.ru/crm_extensions/file_storage/api/open_file_v2.php`
- **Callback:** `https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php`
- **S3 Bucket:** `https://s3.twcstorage.ru/f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c/`
### Redis Keys
```
crm:onlyoffice:key:{documentKey} → {"s3_path":"...", "record_id":"...", "created_at":...}
TTL: 86400 секунд (24 часа)
```
---
## 🐛 ИЗВЕСТНЫЕ ПРОБЛЕМЫ
### 1. Некоторые файлы показывают только toolbar
**Причина:** Документ может быть повреждён или пустой
**Решение:** Проверить файл вручную, попробовать открыть другой
### 2. Pre-signed URL не работают для публичного bucket
**Причина:** S3 Timeweb возвращает 403 для pre-signed URL если bucket публичный
**Решение:** Используем прямой S3 URL (bucket публичный, подпись не нужна)
### 3. Старый OnlyOffice (8443) использует Nextcloud кеш
**Причина:** OnlyOffice на порту 8443 интегрирован с Nextcloud через WOPI
**Решение:** Используем новый standalone OnlyOffice (9443)
---
## 📝 КОМАНДЫ ДЛЯ УПРАВЛЕНИЯ
### Перезапуск OnlyOffice Standalone
```bash
cd /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage
docker-compose -f docker-compose.onlyoffice-standalone.yml restart
```
### Просмотр логов
```bash
docker logs -f onlyoffice-standalone
```
### Очистка кеша
```bash
docker exec onlyoffice-standalone rm -rf /var/lib/onlyoffice/documentserver/App_Data/cache/files/*
docker restart onlyoffice-standalone
```
### Проверка Redis маппинга
```bash
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
KEYS 'crm:onlyoffice:key:*'
```
---
## 🎓 ЧТО УЗНАЛИ
1. **OnlyOffice Community Edition** работает в standalone режиме без ограничений на открытие файлов
2. **S3 публичный bucket** поддерживает Range requests и CORS из коробки
3. **Pre-signed URL** не работают для публичных bucket на S3 Timeweb
4. **OnlyOffice требует уникальный documentKey** для каждого открытия (иначе использует старый кеш)
5. **Host header важен** — OnlyOffice генерирует URL для кеша на основе Host
6. **Callback обязателен** для режима редактирования
---
**Автор:** AI Assistant
**Дата:** 31.10.2025 23:40
**Следующий шаг:** Доработать callback для сохранения в оригинальный путь S3