docs: Добавлена документация по OnlyOffice Standalone setup
This commit is contained in:
271
ONLYOFFICE_STANDALONE_SETUP.md
Normal file
271
ONLYOFFICE_STANDALONE_SETUP.md
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user