10 KiB
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
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 работает напрямую)
🚀 КАК ЭТО РАБОТАЕТ
Открытие файла
- CRM → Кнопка "Редактировать" →
open_file_v2.php?recordId=X&fileName=... - PHP скрипт:
- Извлекает S3 путь из URL
- Генерирует уникальный
documentKey - Сохраняет маппинг
documentKey → S3 pathв Redis (TTL 24ч) - Отдаёт HTML с OnlyOffice редактором
- Браузер:
- Загружает OnlyOffice API с
office.clientright.ru:9443 - OnlyOffice скачивает файл напрямую из S3 (публичный bucket)
- Документ открывается в редакторе
- Загружает OnlyOffice API с
Сохранение файла
- Пользователь редактирует → Автосохранение каждые несколько секунд
- OnlyOffice →
POST https://crm.clientright.ru/.../onlyoffice_callback.php - Callback скрипт:
- Получает
status: 2(файл сохранён) - Скачивает изменённый файл от OnlyOffice
- ВРЕМЕННО: Сохраняет в
onlyoffice_saved/в S3 - TODO: Получить оригинальный путь из Redis и перезаписать файл там
- Получает
⚠️ TODO (НА ЗАВТРА)
1. Доработать сохранение в оригинальный путь
Проблема: Сейчас файлы сохраняются в onlyoffice_saved/, а не в оригинальный путь.
Решение:
// В 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.phptest_onlyoffice_direct.phptest_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
cd /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage
docker-compose -f docker-compose.onlyoffice-standalone.yml restart
Просмотр логов
docker logs -f onlyoffice-standalone
Очистка кеша
docker exec onlyoffice-standalone rm -rf /var/lib/onlyoffice/documentserver/App_Data/cache/files/*
docker restart onlyoffice-standalone
Проверка Redis маппинга
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
KEYS 'crm:onlyoffice:key:*'
🎓 ЧТО УЗНАЛИ
- OnlyOffice Community Edition работает в standalone режиме без ограничений на открытие файлов
- S3 публичный bucket поддерживает Range requests и CORS из коробки
- Pre-signed URL не работают для публичных bucket на S3 Timeweb
- OnlyOffice требует уникальный documentKey для каждого открытия (иначе использует старый кеш)
- Host header важен — OnlyOffice генерирует URL для кеша на основе Host
- Callback обязателен для режима редактирования
Автор: AI Assistant
Дата: 31.10.2025 23:40
Следующий шаг: Доработать callback для сохранения в оригинальный путь S3