Files
crm.clientright.ru/ONLYOFFICE_STANDALONE_SETUP.md

272 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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