From 3e8c3968a096d2d0ffd08abf36af03d1e1b53eac Mon Sep 17 00:00:00 2001 From: Fedor Date: Sat, 1 Nov 2025 01:04:08 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20OnlyOffice=20St?= =?UTF-8?q?andalone=20setup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ONLYOFFICE_STANDALONE_SETUP.md | 271 +++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 ONLYOFFICE_STANDALONE_SETUP.md diff --git a/ONLYOFFICE_STANDALONE_SETUP.md b/ONLYOFFICE_STANDALONE_SETUP.md new file mode 100644 index 00000000..3757412d --- /dev/null +++ b/ONLYOFFICE_STANDALONE_SETUP.md @@ -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 +