feat: OnlyOffice Document Server integration with auto-save

- Добавлен s3Path в callbackUrl для сохранения в оригинальный файл
- Исправлено сохранение: теперь файлы обновляются в S3 автоматически
- Отключена проверка SSL в OnlyOffice (rejectUnauthorized: false)
- Разрешены callback на приватные IP адреса
- Добавлено логирование callback в onlyoffice_callback.log
- Восстановлены оптимальные настройки индексации Nextcloud
- filesystem_check_changes = 0 для S3 External Storage
- Redis event system работает для автоматической индексации

Документация:
- ИСПРАВЛЕНИЕ_СОХРАНЕНИЯ_ONLYOFFICE_01_11_2025.md
- ИСПРАВЛЕНИЕ_SSL_ONLYOFFICE_01_11_2025.md
- ВОССТАНОВЛЕНИЕ_ОПТИМИЗАЦИИ_01_11_2025.md
- ONLYOFFICE_НАСТРОЙКИ.md
- ТЕСТИРОВАНИЕ_СОХРАНЕНИЯ_ONLYOFFICE.md
This commit is contained in:
Fedor
2025-11-01 10:32:51 +03:00
parent 3e8c3968a0
commit 3a1635ec4d
7 changed files with 1563 additions and 9 deletions

View File

@@ -9,6 +9,8 @@ EnvLoader::load('/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/.e
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log');
// Логируем все запросы
$input = file_get_contents('php://input');
@@ -43,12 +45,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
error_log("Downloaded file: " . strlen($fileContent) . " bytes");
// Извлекаем путь к файлу из documentKey
// В $key хранится md5($s3Path . '_' . $version)
// Нам нужен оригинальный путь, который мы должны хранить отдельно
// Получаем оригинальный путь файла из query параметра
$s3Path = $_GET['s3Path'] ?? null;
// ВРЕМЕННО: Сохраняем в отдельную папку в S3 для отладки
// TODO: Нужно связать documentKey с оригинальным путём файла
if (!$s3Path) {
error_log("ERROR: s3Path not provided in callback URL!");
// Fallback: сохраняем во временную папку
$s3Path = 'onlyoffice_saved/' . $key . '_' . date('Y-m-d_H-i-s') . '.docx';
error_log("Using fallback path: " . $s3Path);
} else {
error_log("Saving to original path: " . $s3Path);
}
// Инициализируем S3 клиент
$s3Client = new Aws\S3\S3Client([
@@ -65,14 +72,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
$bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c';
// ВРЕМЕННОЕ РЕШЕНИЕ: Сохраняем в папку /onlyoffice_saved/
$savedPath = 'onlyoffice_saved/' . $key . '_' . date('Y-m-d_H-i-s') . '.docx';
// Сохраняем в ОРИГИНАЛЬНОЕ место!
$savedPath = $s3Path;
// Определяем Content-Type на основе расширения файла
$contentType = getContentType($savedPath);
error_log("Content-Type: " . $contentType);
$result = $s3Client->putObject([
'Bucket' => $bucket,
'Key' => $savedPath,
'Body' => $fileContent,
'ContentType' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
'ContentType' => $contentType
]);
error_log("File saved to S3: " . $savedPath);
@@ -99,5 +110,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
// Для всех остальных запросов - 200 OK
http_response_code(200);
echo json_encode(['error' => 0]);
/**
* Определяет Content-Type на основе расширения файла
*/
function getContentType($filename) {
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$types = [
'doc' => 'application/msword',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'xls' => 'application/vnd.ms-excel',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'ppt' => 'application/vnd.ms-powerpoint',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
];
return $types[$ext] ?? 'application/octet-stream';
}
?>