Files
crm.clientright.ru/ONLYOFFICE_STANDALONE_SETUP.md

10 KiB
Raw Permalink Blame History

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 работает напрямую)


🚀 КАК ЭТО РАБОТАЕТ

Открытие файла

  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. OnlyOfficePOST https://crm.clientright.ru/.../onlyoffice_callback.php
  3. 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.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 OnlyOfficeoffice.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:*'

🎓 ЧТО УЗНАЛИ

  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