272 lines
10 KiB
Markdown
272 lines
10 KiB
Markdown
# 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
|
||
|