# 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