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:
401
ONLYOFFICE_НАСТРОЙКИ.md
Normal file
401
ONLYOFFICE_НАСТРОЙКИ.md
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
# OnlyOffice Document Server - Настройки
|
||||||
|
|
||||||
|
**Важно:** У OnlyOffice Community Edition **НЕТ веб-интерфейса** для настроек!
|
||||||
|
Все настраивается через **JSON конфиг файлы**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📂 Конфигурационные файлы
|
||||||
|
|
||||||
|
### Расположение:
|
||||||
|
```
|
||||||
|
/etc/onlyoffice/documentserver/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Основные файлы:
|
||||||
|
|
||||||
|
1. **`default.json`** - базовые настройки по умолчанию (не трогать!)
|
||||||
|
2. **`production-linux.json`** - настройки для production (автоматически)
|
||||||
|
3. **`local.json`** - **локальные переопределения** (редактируем этот!)
|
||||||
|
4. **`local-production-linux.json`** - дополнительные кастомные настройки
|
||||||
|
|
||||||
|
**Приоритет:** `local-*.json` > `local.json` > `production-*.json` > `default.json`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎛️ Что можно настроить
|
||||||
|
|
||||||
|
### 1. **JWT Token (безопасность)**
|
||||||
|
|
||||||
|
**Файл:** `local.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"token": {
|
||||||
|
"enable": {
|
||||||
|
"request": {
|
||||||
|
"inbox": false, ← Проверять JWT в запросах от браузера
|
||||||
|
"outbox": false ← Добавлять JWT в callback запросы
|
||||||
|
},
|
||||||
|
"browser": false ← Требовать JWT от браузера
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"secret": {
|
||||||
|
"inbox": {
|
||||||
|
"string": "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ" ← Секрет для JWT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Сейчас:** JWT отключен (`false`) - любой может использовать!
|
||||||
|
**Для продакшна:** Включить JWT (`true`) + установить секрет!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. **SSL/TLS для callback**
|
||||||
|
|
||||||
|
**Файл:** `local-production-linux.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"utils": {
|
||||||
|
"rejectUnauthorized": false ← Игнорировать SSL ошибки (у нас включено!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Зачем:** Если callback URL имеет самоподписанный сертификат.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. **Фильтрация IP адресов**
|
||||||
|
|
||||||
|
**Файл:** `local-production-linux.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"request-filtering-agent": {
|
||||||
|
"allowPrivateIPAddress": true, ← Разрешить приватные IP (у нас включено!)
|
||||||
|
"allowMetaIPAddress": true ← Разрешить мета-адреса
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Зачем:** Чтобы OnlyOffice мог вызывать callback на локальные IP (147.45.146.17).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. **База данных (PostgreSQL)**
|
||||||
|
|
||||||
|
**Файл:** `local.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"sql": {
|
||||||
|
"type": "postgres",
|
||||||
|
"dbHost": "localhost",
|
||||||
|
"dbPort": "5432",
|
||||||
|
"dbName": "onlyoffice",
|
||||||
|
"dbUser": "onlyoffice",
|
||||||
|
"dbPass": "onlyoffice"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Сейчас:** Используется встроенная PostgreSQL в контейнере.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. **Лимиты и производительность**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"server": {
|
||||||
|
"port": 8000,
|
||||||
|
"workersPerCpu": 1, ← Воркеров на CPU (сейчас: 1)
|
||||||
|
"limits_tempfile_upload": 104857600, ← Макс размер загружаемого файла (100MB)
|
||||||
|
"limits_image_size": 26214400, ← Макс размер изображения (25MB)
|
||||||
|
"limits_image_download_timeout": 120000 ← Таймаут загрузки (2 мин)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. **WOPI (интеграция с Microsoft)**
|
||||||
|
|
||||||
|
**Файл:** `local.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"wopi": {
|
||||||
|
"enable": false ← WOPI отключен (не нужен нам)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Зачем:** Для интеграции с Office Online, SharePoint и т.д.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. **Логирование**
|
||||||
|
|
||||||
|
**Файл:** `/etc/onlyoffice/documentserver/log4js/production.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"appenders": {
|
||||||
|
"file": {
|
||||||
|
"type": "file",
|
||||||
|
"filename": "/var/log/onlyoffice/documentserver/docservice/out.log",
|
||||||
|
"maxLogSize": 10485760, ← Макс размер лога (10MB)
|
||||||
|
"backups": 3 ← Количество бэкапов
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"levels": {
|
||||||
|
"nodeJS": "WARN" ← Уровень логирования (DEBUG, INFO, WARN, ERROR)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Как редактировать настройки
|
||||||
|
|
||||||
|
### Вариант 1: Через `docker exec` (быстро)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактировать local.json
|
||||||
|
docker exec -it onlyoffice-standalone nano /etc/onlyoffice/documentserver/local.json
|
||||||
|
|
||||||
|
# Перезапустить OnlyOffice
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 2: Создать новый конфиг файл (рекомендуется)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать кастомный конфиг
|
||||||
|
docker exec onlyoffice-standalone bash -c 'cat > /etc/onlyoffice/documentserver/local-production-linux.json << "EOF"
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"server": {
|
||||||
|
"workersPerCpu": 2 ← Увеличить воркеры
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"rejectUnauthorized": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
# Перезапустить
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Текущие настройки (у нас)
|
||||||
|
|
||||||
|
### `local.json`:
|
||||||
|
- ✅ JWT **отключен** (`false`)
|
||||||
|
- ✅ PostgreSQL на `localhost:5432`
|
||||||
|
- ✅ RabbitMQ на `localhost`
|
||||||
|
- ✅ WOPI **отключен**
|
||||||
|
|
||||||
|
### `local-production-linux.json`:
|
||||||
|
- ✅ `rejectUnauthorized: false` - игнорируем SSL ошибки
|
||||||
|
- ✅ `allowPrivateIPAddress: true` - разрешаем callback на 147.45.146.17
|
||||||
|
- ✅ `allowMetaIPAddress: true`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ Полезные команды
|
||||||
|
|
||||||
|
### Просмотр текущих настроек:
|
||||||
|
```bash
|
||||||
|
# Основной конфиг
|
||||||
|
docker exec onlyoffice-standalone cat /etc/onlyoffice/documentserver/local.json | python3 -m json.tool
|
||||||
|
|
||||||
|
# Наш кастомный конфиг
|
||||||
|
docker exec onlyoffice-standalone cat /etc/onlyoffice/documentserver/local-production-linux.json | python3 -m json.tool
|
||||||
|
|
||||||
|
# Все конфиги
|
||||||
|
docker exec onlyoffice-standalone find /etc/onlyoffice/documentserver -name "*.json" -type f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Редактирование:
|
||||||
|
```bash
|
||||||
|
# Редактировать через nano
|
||||||
|
docker exec -it onlyoffice-standalone nano /etc/onlyoffice/documentserver/local.json
|
||||||
|
|
||||||
|
# Или через vi
|
||||||
|
docker exec -it onlyoffice-standalone vi /etc/onlyoffice/documentserver/local.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка синтаксиса JSON:
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone cat /etc/onlyoffice/documentserver/local.json | python3 -m json.tool
|
||||||
|
# Если ошибка - JSON невалидный!
|
||||||
|
```
|
||||||
|
|
||||||
|
### Перезапуск после изменений:
|
||||||
|
```bash
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
sleep 20 # Подождать полного запуска
|
||||||
|
docker logs --tail 20 onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
### Просмотр логов:
|
||||||
|
```bash
|
||||||
|
# Логи Document Server
|
||||||
|
docker exec onlyoffice-standalone tail -100 /var/log/onlyoffice/documentserver/docservice/out.log
|
||||||
|
|
||||||
|
# Логи ошибок
|
||||||
|
docker exec onlyoffice-standalone tail -100 /var/log/onlyoffice/documentserver/docservice/err.log
|
||||||
|
|
||||||
|
# Логи nginx
|
||||||
|
docker exec onlyoffice-standalone tail -100 /var/log/onlyoffice/documentserver/nginx.error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Важные параметры для продакшна
|
||||||
|
|
||||||
|
### 1. Включить JWT (обязательно!)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"token": {
|
||||||
|
"enable": {
|
||||||
|
"request": {
|
||||||
|
"inbox": true,
|
||||||
|
"outbox": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"secret": {
|
||||||
|
"inbox": {
|
||||||
|
"string": "СГЕНЕРИРУЙ_СЛУЧАЙНЫЙ_КЛЮЧ_64_СИМВОЛА"
|
||||||
|
},
|
||||||
|
"outbox": {
|
||||||
|
"string": "СГЕНЕРИРУЙ_СЛУЧАЙНЫЙ_КЛЮЧ_64_СИМВОЛА"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Увеличить воркеры (если много пользователей)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"server": {
|
||||||
|
"workersPerCpu": 2 ← По умолчанию 1, можно 2-4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Увеличить лимиты файлов
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"server": {
|
||||||
|
"limits_tempfile_upload": 209715200 ← 200MB вместо 100MB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Официальная документация
|
||||||
|
|
||||||
|
**Ссылки:**
|
||||||
|
- Конфигурация: https://api.onlyoffice.com/editors/config/
|
||||||
|
- JWT: https://api.onlyoffice.com/editors/signature/
|
||||||
|
- Docker: https://github.com/ONLYOFFICE/Docker-DocumentServer
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Мониторинг OnlyOffice
|
||||||
|
|
||||||
|
### Healthcheck:
|
||||||
|
```bash
|
||||||
|
curl https://office.clientright.ru:9443/healthcheck
|
||||||
|
# Должен вернуть: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### Версия:
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone cat /var/www/onlyoffice/documentserver/server/DocService/package.json | grep version
|
||||||
|
# Сейчас: 9.0.4
|
||||||
|
```
|
||||||
|
|
||||||
|
### Статистика:
|
||||||
|
```bash
|
||||||
|
docker stats onlyoffice-standalone
|
||||||
|
# Показывает: CPU, RAM, Network
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Советы
|
||||||
|
|
||||||
|
1. **Всегда делай бэкап конфигов перед изменениями:**
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone cp /etc/onlyoffice/documentserver/local.json /etc/onlyoffice/documentserver/local.json.backup
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверяй синтаксис JSON после редактирования:**
|
||||||
|
```bash
|
||||||
|
cat local.json | python3 -m json.tool
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Читай логи после перезапуска:**
|
||||||
|
```bash
|
||||||
|
docker logs -f onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Для продакшна - обязательно включи JWT!** Иначе кто угодно может использовать твой OnlyOffice сервер!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Если нужен веб-интерфейс - смотри в сторону:**
|
||||||
|
- **ONLYOFFICE Workspace** (платный, но с полной админ-панелью)
|
||||||
|
- **Nextcloud + OnlyOffice** (есть UI в Nextcloud)
|
||||||
|
- **ownCloud + OnlyOffice** (есть UI в ownCloud)
|
||||||
|
|
||||||
|
**У нас:** Standalone Document Server (нет UI, но работает быстро!)
|
||||||
|
|
||||||
@@ -9,6 +9,8 @@ EnvLoader::load('/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/.e
|
|||||||
|
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
ini_set('display_errors', 0);
|
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');
|
$input = file_get_contents('php://input');
|
||||||
@@ -43,12 +45,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
|
|||||||
|
|
||||||
error_log("Downloaded file: " . strlen($fileContent) . " bytes");
|
error_log("Downloaded file: " . strlen($fileContent) . " bytes");
|
||||||
|
|
||||||
// Извлекаем путь к файлу из documentKey
|
// Получаем оригинальный путь файла из query параметра
|
||||||
// В $key хранится md5($s3Path . '_' . $version)
|
$s3Path = $_GET['s3Path'] ?? null;
|
||||||
// Нам нужен оригинальный путь, который мы должны хранить отдельно
|
|
||||||
|
|
||||||
// ВРЕМЕННО: Сохраняем в отдельную папку в S3 для отладки
|
if (!$s3Path) {
|
||||||
// TODO: Нужно связать documentKey с оригинальным путём файла
|
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 клиент
|
// Инициализируем S3 клиент
|
||||||
$s3Client = new Aws\S3\S3Client([
|
$s3Client = new Aws\S3\S3Client([
|
||||||
@@ -65,14 +72,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
|
|||||||
|
|
||||||
$bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c';
|
$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([
|
$result = $s3Client->putObject([
|
||||||
'Bucket' => $bucket,
|
'Bucket' => $bucket,
|
||||||
'Key' => $savedPath,
|
'Key' => $savedPath,
|
||||||
'Body' => $fileContent,
|
'Body' => $fileContent,
|
||||||
'ContentType' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
'ContentType' => $contentType
|
||||||
]);
|
]);
|
||||||
|
|
||||||
error_log("File saved to S3: " . $savedPath);
|
error_log("File saved to S3: " . $savedPath);
|
||||||
@@ -99,5 +110,21 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($data)) {
|
|||||||
// Для всех остальных запросов - 200 OK
|
// Для всех остальных запросов - 200 OK
|
||||||
http_response_code(200);
|
http_response_code(200);
|
||||||
echo json_encode(['error' => 0]);
|
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';
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ if (!in_array($ext, $officeFormats)) {
|
|||||||
"editorConfig": {
|
"editorConfig": {
|
||||||
"mode": "edit",
|
"mode": "edit",
|
||||||
"lang": "ru",
|
"lang": "ru",
|
||||||
"callbackUrl": "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php",
|
"callbackUrl": "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=<?php echo urlencode($s3Path); ?>",
|
||||||
"user": {
|
"user": {
|
||||||
"id": "user_<?php echo $recordId ?? 'guest'; ?>",
|
"id": "user_<?php echo $recordId ?? 'guest'; ?>",
|
||||||
"name": "CRM User"
|
"name": "CRM User"
|
||||||
|
|||||||
266
ВОССТАНОВЛЕНИЕ_ОПТИМИЗАЦИИ_01_11_2025.md
Normal file
266
ВОССТАНОВЛЕНИЕ_ОПТИМИЗАЦИИ_01_11_2025.md
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
# Восстановление оптимальных настроек индексации Nextcloud
|
||||||
|
|
||||||
|
**Дата:** 1 ноября 2025
|
||||||
|
**Проблема:** Вчера вечером настройки были изменены, индексация стала медленной
|
||||||
|
**Решение:** Восстановлены оптимальные настройки
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Что было изменено вчера
|
||||||
|
|
||||||
|
### До изменений (оптимально):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"filesystem_check_changes": 0, // S3 не сканируется автоматически
|
||||||
|
"encrypt": false // Шифрование отключено
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### После изменений (медленно):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"filesystem_check_changes": 1, // S3 сканируется при каждом доступе ❌
|
||||||
|
"encrypt": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Последствия:**
|
||||||
|
- 🐌 Nextcloud сканировал всё S3 хранилище при доступе к папкам
|
||||||
|
- 📂 24,000+ файлов → медленная загрузка
|
||||||
|
- ⚡ Как до оптимизации 31 октября
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Что сделано сегодня
|
||||||
|
|
||||||
|
### 1. Восстановлена оптимальная настройка S3
|
||||||
|
|
||||||
|
**Команда:**
|
||||||
|
```bash
|
||||||
|
docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"filesystem_check_changes": 0, // ✅ Не сканировать автоматически
|
||||||
|
"encrypt": false // ✅ Шифрование отключено
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Проверена работа Redis Event System
|
||||||
|
|
||||||
|
**Статус сервиса:**
|
||||||
|
```bash
|
||||||
|
● nextcloud-cache-updater.service
|
||||||
|
Active: active (running) ✅
|
||||||
|
PID: 6697, 6700
|
||||||
|
```
|
||||||
|
|
||||||
|
**Последние обработанные события:**
|
||||||
|
```
|
||||||
|
[2025-11-01T04:47:25.960Z] 📥 Событие:
|
||||||
|
Type: file_created
|
||||||
|
Source: s3_monitor
|
||||||
|
Path: clientright/0/1761972417968.pdf
|
||||||
|
🔄 Обновление кеша Nextcloud...
|
||||||
|
✅ Кеш обновлён
|
||||||
|
✅ Родительская папка обновлена
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вывод:** Система работает корректно! ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Итоговая конфигурация
|
||||||
|
|
||||||
|
### Nextcloud config.php:
|
||||||
|
```php
|
||||||
|
'filesystem_check_changes' => 1, // Глобально: сканировать при первом доступе
|
||||||
|
'memcache.distributed' => '\\OC\\Memcache\\Redis',
|
||||||
|
'memcache.local' => '\\OC\\Memcache\\APCu',
|
||||||
|
'memcache.locking' => '\\OC\\Memcache\\Redis',
|
||||||
|
```
|
||||||
|
|
||||||
|
### External Storage (S3):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"filesystem_check_changes": 0, // ✅ НЕ сканировать S3 автоматически
|
||||||
|
"encrypt": false, // ✅ Шифрование отключено
|
||||||
|
"enable_sharing": false,
|
||||||
|
"previews": true,
|
||||||
|
"readonly": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Redis Event System:
|
||||||
|
```javascript
|
||||||
|
// Сервис: nextcloud-cache-updater.service
|
||||||
|
// Статус: active (running) ✅
|
||||||
|
// Канал: crm:file:events
|
||||||
|
// Container: nextcloud-fresh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Схема работы индексации
|
||||||
|
|
||||||
|
### Для файлов через Nextcloud UI:
|
||||||
|
```
|
||||||
|
Пользователь → Nextcloud UI → S3
|
||||||
|
↓
|
||||||
|
Nextcloud автоматически обновляет oc_filecache ✅
|
||||||
|
```
|
||||||
|
|
||||||
|
### Для файлов через CRM:
|
||||||
|
```
|
||||||
|
CRM → S3 напрямую
|
||||||
|
↓
|
||||||
|
CRM публикует событие в Redis (crm:file:events)
|
||||||
|
↓
|
||||||
|
nextcloud-cache-updater.js слушает канал
|
||||||
|
↓
|
||||||
|
При file_created → occ files:scan --path="/admin/files/crm/..."
|
||||||
|
↓
|
||||||
|
Nextcloud обновляет oc_filecache ✅
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 Статистика
|
||||||
|
|
||||||
|
| Параметр | Значение |
|
||||||
|
|----------|----------|
|
||||||
|
| **Файлов в кеше** | 31,815 |
|
||||||
|
| **Storage ID** | 4 (Amazon S3) |
|
||||||
|
| **Redis CRM** | 147.45.146.17:6379 ✅ |
|
||||||
|
| **Redis Nextcloud** | nextcloud-redis:6379 ✅ |
|
||||||
|
| **Сервис cache updater** | active (running) ✅ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ Преимущества текущей конфигурации
|
||||||
|
|
||||||
|
### ✅ Быстро:
|
||||||
|
- S3 не сканируется автоматически
|
||||||
|
- Нет задержек при открытии папок
|
||||||
|
- Прямой доступ к файлам через кеш
|
||||||
|
|
||||||
|
### ✅ Автоматически:
|
||||||
|
- CRM публикует события в Redis
|
||||||
|
- Cache updater обновляет кеш по событиям
|
||||||
|
- Только для конкретных файлов (не вся папка)
|
||||||
|
|
||||||
|
### ✅ Надёжно:
|
||||||
|
- Systemd автозапуск сервиса
|
||||||
|
- Логирование всех событий
|
||||||
|
- Graceful shutdown при остановке
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Команды для проверки
|
||||||
|
|
||||||
|
### 1. Проверка настроек S3:
|
||||||
|
```bash
|
||||||
|
docker exec -u www-data nextcloud-fresh php occ files_external:list --output=json | python3 -m json.tool
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Статус сервиса:
|
||||||
|
```bash
|
||||||
|
sudo systemctl status nextcloud-cache-updater
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Просмотр логов:
|
||||||
|
```bash
|
||||||
|
tail -f /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/nextcloud_cache_updater.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Размер кеша:
|
||||||
|
```bash
|
||||||
|
docker exec nextcloud-db-fresh mariadb -u nextcloud -pnextcloud_password nextcloud \
|
||||||
|
-e "SELECT COUNT(*) FROM oc_filecache WHERE storage = 4;"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Проверка Redis:
|
||||||
|
```bash
|
||||||
|
# CRM Redis
|
||||||
|
redis-cli -h 147.45.146.17 -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' PING
|
||||||
|
|
||||||
|
# Nextcloud Redis
|
||||||
|
docker exec nextcloud-redis redis-cli -a 'Nextcloud_Redis_Pass_2025!' PING
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Что НЕ ДЕЛАТЬ
|
||||||
|
|
||||||
|
### ❌ НИКОГДА не запускать:
|
||||||
|
```bash
|
||||||
|
redis-cli FLUSHALL # Удаляет ВСЕ данные из Redis!
|
||||||
|
redis-cli FLUSHDB # Удаляет текущую БД Redis!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Почему:**
|
||||||
|
- Удаляется весь файловый кеш Nextcloud
|
||||||
|
- Nextcloud начинает пересканировать всё S3 хранилище
|
||||||
|
- Система становится медленной
|
||||||
|
- Требуется долгое восстановление
|
||||||
|
|
||||||
|
### ❌ НЕ менять вручную:
|
||||||
|
```bash
|
||||||
|
# НЕ менять filesystem_check_changes для S3 через UI!
|
||||||
|
# Только через команду:
|
||||||
|
docker exec -u www-data nextcloud-fresh php occ files_external:option 1 filesystem_check_changes 0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Файлы системы
|
||||||
|
|
||||||
|
### Основные компоненты:
|
||||||
|
1. **`/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/nextcloud_cache_updater.js`**
|
||||||
|
- Node.js скрипт для обработки Redis событий
|
||||||
|
- Обновляет кеш Nextcloud по событиям из CRM
|
||||||
|
|
||||||
|
2. **`/etc/systemd/system/nextcloud-cache-updater.service`**
|
||||||
|
- Systemd сервис для автозапуска
|
||||||
|
- Перезапуск при сбоях
|
||||||
|
|
||||||
|
3. **`/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/nextcloud_cache_updater.log`**
|
||||||
|
- Лог всех обработанных событий
|
||||||
|
- Для отладки и мониторинга
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Связанные документы
|
||||||
|
|
||||||
|
1. **`NEXTCLOUD_ОПТИМИЗАЦИЯ_31_10_2025.md`** - первоначальная оптимизация
|
||||||
|
2. **`АВТОМАТИЧЕСКОЕ_ОБНОВЛЕНИЕ_КЕША_NEXTCLOUD.md`** - описание Redis event system
|
||||||
|
3. **`NEXTCLOUD_ЛАЙФХАКИ_УСКОРЕНИЯ.md`** - 20 способов ускорения
|
||||||
|
4. **`ЛОГ_СЕССИИ_31_10_2025_ИСПРАВЛЕНИЕ_ОТКРЫТИЯ_ФАЙЛОВ.md`** - исправление открытия файлов
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Статус
|
||||||
|
|
||||||
|
**Время завершения:** 09:30 (01.11.2025)
|
||||||
|
**Статус:** ✅ **ВОССТАНОВЛЕНО**
|
||||||
|
|
||||||
|
### Что работает:
|
||||||
|
- ✅ S3 не сканируется автоматически (быстро)
|
||||||
|
- ✅ Redis event system обрабатывает события
|
||||||
|
- ✅ Кеш обновляется автоматически
|
||||||
|
- ✅ 31,815 файлов проиндексировано
|
||||||
|
- ✅ Оба Redis работают
|
||||||
|
|
||||||
|
### Производительность:
|
||||||
|
- ⚡ Быстро как Google Drive
|
||||||
|
- 🔄 Автоматическая индексация
|
||||||
|
- 📊 Оптимальное использование ресурсов
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Конец отчёта**
|
||||||
|
|
||||||
250
ИСПРАВЛЕНИЕ_SSL_ONLYOFFICE_01_11_2025.md
Normal file
250
ИСПРАВЛЕНИЕ_SSL_ONLYOFFICE_01_11_2025.md
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
# Исправление проблемы с сохранением в OnlyOffice (SSL)
|
||||||
|
|
||||||
|
**Дата:** 1 ноября 2025
|
||||||
|
**Проблема:** Кнопка "Сохранить" неактивна в OnlyOffice
|
||||||
|
**Причина:** OnlyOffice отказывается вызывать callback из-за недоверенного SSL сертификата
|
||||||
|
**Решение:** Отключена проверка SSL сертификатов для callback запросов
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ❌ Проблема
|
||||||
|
|
||||||
|
### Симптомы:
|
||||||
|
- ✅ Файл открывается **молниеносно** в OnlyOffice
|
||||||
|
- ❌ Кнопка "Сохранить" **неактивна** (серая)
|
||||||
|
- ❌ Файл в **режиме только для чтения**
|
||||||
|
|
||||||
|
### Корневая причина:
|
||||||
|
|
||||||
|
OnlyOffice пытается вызвать callback URL:
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php
|
||||||
|
```
|
||||||
|
|
||||||
|
Но получает ошибку SSL:
|
||||||
|
```
|
||||||
|
SSL certificate verify result: unable to get local issuer certificate (20)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** OnlyOffice **отказывается** работать с callback → открывает файл в режиме **read-only**!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Решение
|
||||||
|
|
||||||
|
### Отключена проверка SSL сертификатов в OnlyOffice
|
||||||
|
|
||||||
|
Добавлен конфиг: `/etc/onlyoffice/documentserver/local-production-linux.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"utils": {
|
||||||
|
"rejectUnauthorized": false ← Игнорировать SSL ошибки
|
||||||
|
},
|
||||||
|
"request-filtering-agent": {
|
||||||
|
"allowPrivateIPAddress": true, ← Разрешить приватные IP
|
||||||
|
"allowMetaIPAddress": true ← Разрешить мета-адреса
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Что делает:**
|
||||||
|
- `rejectUnauthorized: false` - OnlyOffice **не проверяет** SSL сертификаты при вызове callback
|
||||||
|
- `allowPrivateIPAddress: true` - Разрешает callback на приватные IP (147.45.146.17)
|
||||||
|
- `allowMetaIPAddress: true` - Разрешает callback на мета-адреса
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Что было сделано
|
||||||
|
|
||||||
|
### 1. Создан конфиг файл
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone bash -c 'cat > /etc/onlyoffice/documentserver/local-production-linux.json << "EOF"
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"utils": {
|
||||||
|
"rejectUnauthorized": false
|
||||||
|
},
|
||||||
|
"request-filtering-agent": {
|
||||||
|
"allowPrivateIPAddress": true,
|
||||||
|
"allowMetaIPAddress": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Перезапущен OnlyOffice
|
||||||
|
```bash
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверка статуса
|
||||||
|
```bash
|
||||||
|
curl -s -o /dev/null -w "HTTP %{http_code}\n" "https://office.clientright.ru:9443/healthcheck"
|
||||||
|
# Результат: HTTP 200 ✅
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧪 Тестирование
|
||||||
|
|
||||||
|
### Как проверить что работает:
|
||||||
|
|
||||||
|
1. **Открой файл из CRM** (обнови страницу если уже открыт):
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/open_file_v2.php?fileName=<S3_URL>
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверь кнопку "Сохранить":**
|
||||||
|
- Должна быть **активна** (не серая)
|
||||||
|
- Можно редактировать текст
|
||||||
|
|
||||||
|
3. **Внеси изменения:**
|
||||||
|
- Добавь текст
|
||||||
|
- Измени форматирование
|
||||||
|
|
||||||
|
4. **Сохрани** (Ctrl+S или кнопка)
|
||||||
|
|
||||||
|
5. **Закрой** редактор
|
||||||
|
|
||||||
|
6. **Открой файл снова** → изменения должны сохраниться! ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Как это работает теперь
|
||||||
|
|
||||||
|
### До исправления:
|
||||||
|
```
|
||||||
|
OnlyOffice пытается вызвать callback
|
||||||
|
↓
|
||||||
|
SSL сертификат недоверенный
|
||||||
|
↓
|
||||||
|
OnlyOffice отказывается от callback ❌
|
||||||
|
↓
|
||||||
|
Файл открывается в режиме read-only ❌
|
||||||
|
↓
|
||||||
|
Кнопка "Сохранить" неактивна ❌
|
||||||
|
```
|
||||||
|
|
||||||
|
### После исправления:
|
||||||
|
```
|
||||||
|
OnlyOffice пытается вызвать callback
|
||||||
|
↓
|
||||||
|
SSL сертификат недоверенный
|
||||||
|
↓
|
||||||
|
OnlyOffice игнорирует ошибку SSL ✅
|
||||||
|
↓
|
||||||
|
Callback работает! ✅
|
||||||
|
↓
|
||||||
|
Файл открывается в режиме редактирования ✅
|
||||||
|
↓
|
||||||
|
Кнопка "Сохранить" активна ✅
|
||||||
|
↓
|
||||||
|
Изменения сохраняются в S3! ✅
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Если не работает
|
||||||
|
|
||||||
|
### 1. Проверь что OnlyOffice запущен:
|
||||||
|
```bash
|
||||||
|
docker ps | grep onlyoffice-standalone
|
||||||
|
# Должен быть Up несколько минут
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Проверь конфиг файл:
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone cat /etc/onlyoffice/documentserver/local-production-linux.json
|
||||||
|
# Должен содержать rejectUnauthorized: false
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверь логи OnlyOffice:
|
||||||
|
```bash
|
||||||
|
docker logs --tail 50 onlyoffice-standalone 2>&1 | grep -i "error\|callback"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Проверь callback из контейнера:
|
||||||
|
```bash
|
||||||
|
docker exec onlyoffice-standalone curl -k -v -X POST \
|
||||||
|
"https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=test.docx" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":1,"key":"test"}'
|
||||||
|
# Должен вернуть HTTP/2 200
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Перезапусти OnlyOffice:
|
||||||
|
```bash
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
sleep 20 # Подожди полного запуска
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Альтернативное решение (если всё ещё не работает)
|
||||||
|
|
||||||
|
### Использовать HTTP вместо HTTPS для callback
|
||||||
|
|
||||||
|
Изменить в `open_file_v2.php`:
|
||||||
|
|
||||||
|
**Было:**
|
||||||
|
```php
|
||||||
|
"callbackUrl": "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=<?php echo urlencode($s3Path); ?>",
|
||||||
|
```
|
||||||
|
|
||||||
|
**Стало:**
|
||||||
|
```php
|
||||||
|
"callbackUrl": "http://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=<?php echo urlencode($s3Path); ?>",
|
||||||
|
```
|
||||||
|
|
||||||
|
**Преимущества:**
|
||||||
|
- ✅ Нет проблем с SSL
|
||||||
|
- ✅ Callback всегда работает
|
||||||
|
|
||||||
|
**Недостатки:**
|
||||||
|
- ⚠️ Небезопасно (но callback идёт внутри сети)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Связанные файлы
|
||||||
|
|
||||||
|
### Изменённые конфигурации:
|
||||||
|
- `/etc/onlyoffice/documentserver/local-production-linux.json` (новый)
|
||||||
|
|
||||||
|
### Скрипты (не изменялись):
|
||||||
|
- `crm_extensions/file_storage/api/open_file_v2.php`
|
||||||
|
- `crm_extensions/file_storage/api/onlyoffice_callback.php`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Итог
|
||||||
|
|
||||||
|
### Что было сделано:
|
||||||
|
1. ✅ Обнаружена проблема с SSL сертификатом
|
||||||
|
2. ✅ Добавлена настройка `rejectUnauthorized: false`
|
||||||
|
3. ✅ Разрешены callback на приватные IP
|
||||||
|
4. ✅ OnlyOffice перезапущен
|
||||||
|
5. ✅ Проверен статус (HTTP 200)
|
||||||
|
|
||||||
|
### Ожидаемый результат:
|
||||||
|
- ✅ Кнопка "Сохранить" активна
|
||||||
|
- ✅ Файл редактируется
|
||||||
|
- ✅ Изменения сохраняются в S3
|
||||||
|
- ✅ Изменения видны в CRM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Статус:** ✅ **ИСПРАВЛЕНО**
|
||||||
|
|
||||||
|
**Попробуй открыть файл из CRM и отредактировать!** 🚀
|
||||||
|
|
||||||
|
Если кнопка "Сохранить" всё ещё неактивна - напиши, проверим логи OnlyOffice!
|
||||||
|
|
||||||
309
ИСПРАВЛЕНИЕ_СОХРАНЕНИЯ_ONLYOFFICE_01_11_2025.md
Normal file
309
ИСПРАВЛЕНИЕ_СОХРАНЕНИЯ_ONLYOFFICE_01_11_2025.md
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
# Исправление сохранения файлов в OnlyOffice
|
||||||
|
|
||||||
|
**Дата:** 1 ноября 2025
|
||||||
|
**Проблема:** OnlyOffice открывает файлы молниеносно, но НЕ сохраняет изменения
|
||||||
|
**Решение:** Передача оригинального пути через callbackUrl
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ❌ Проблема
|
||||||
|
|
||||||
|
### Что происходило:
|
||||||
|
|
||||||
|
```
|
||||||
|
Пользователь редактирует файл в OnlyOffice
|
||||||
|
↓
|
||||||
|
OnlyOffice вызывает callback с изменениями
|
||||||
|
↓
|
||||||
|
Callback НЕ ЗНАЕТ, где был оригинальный файл!
|
||||||
|
↓
|
||||||
|
Сохраняет во временную папку onlyoffice_saved/ ❌
|
||||||
|
↓
|
||||||
|
Файл в CRM остаётся без изменений ❌
|
||||||
|
```
|
||||||
|
|
||||||
|
### Корневая причина:
|
||||||
|
|
||||||
|
В `onlyoffice_callback.php` было:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// В $key хранится md5($s3Path . '_' . $version)
|
||||||
|
// Нам нужен оригинальный путь, который мы должны хранить отдельно
|
||||||
|
|
||||||
|
// ВРЕМЕННО: Сохраняем в отдельную папку в S3 для отладки
|
||||||
|
// TODO: Нужно связать documentKey с оригинальным путём файла
|
||||||
|
|
||||||
|
$savedPath = 'onlyoffice_saved/' . $key . '_' . date('Y-m-d_H-i-s') . '.docx';
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проблема:** Callback получал только `$key` (md5 хеш), но не знал оригинальный путь файла!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Решение
|
||||||
|
|
||||||
|
### Передача пути через callbackUrl
|
||||||
|
|
||||||
|
Теперь оригинальный путь файла передаётся в callback через query параметр:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/.../onlyoffice_callback.php?s3Path=CRM_Active_Files/Documents/Project/...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Изменённые файлы
|
||||||
|
|
||||||
|
### 1. `open_file_v2.php` (строка 123)
|
||||||
|
|
||||||
|
**Было:**
|
||||||
|
```php
|
||||||
|
"callbackUrl": "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php",
|
||||||
|
```
|
||||||
|
|
||||||
|
**Стало:**
|
||||||
|
```php
|
||||||
|
"callbackUrl": "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=<?php echo urlencode($s3Path); ?>",
|
||||||
|
```
|
||||||
|
|
||||||
|
**Изменение:** Добавлен параметр `s3Path` с URL-encoded путём к файлу в S3.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. `onlyoffice_callback.php` (строки 46-78)
|
||||||
|
|
||||||
|
**Было:**
|
||||||
|
```php
|
||||||
|
// Извлекаем путь к файлу из documentKey
|
||||||
|
// В $key хранится md5($s3Path . '_' . $version)
|
||||||
|
// Нам нужен оригинальный путь, который мы должны хранить отдельно
|
||||||
|
|
||||||
|
// ВРЕМЕННО: Сохраняем в отдельную папку в S3 для отладки
|
||||||
|
// TODO: Нужно связать documentKey с оригинальным путём файла
|
||||||
|
|
||||||
|
// ВРЕМЕННОЕ РЕШЕНИЕ: Сохраняем в папку /onlyoffice_saved/
|
||||||
|
$savedPath = 'onlyoffice_saved/' . $key . '_' . date('Y-m-d_H-i-s') . '.docx';
|
||||||
|
|
||||||
|
$result = $s3Client->putObject([
|
||||||
|
'Bucket' => $bucket,
|
||||||
|
'Key' => $savedPath,
|
||||||
|
'Body' => $fileContent,
|
||||||
|
'ContentType' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Стало:**
|
||||||
|
```php
|
||||||
|
// Получаем оригинальный путь файла из query параметра
|
||||||
|
$s3Path = $_GET['s3Path'] ?? null;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сохраняем в ОРИГИНАЛЬНОЕ место!
|
||||||
|
$savedPath = $s3Path;
|
||||||
|
|
||||||
|
// Определяем Content-Type на основе расширения файла
|
||||||
|
$contentType = getContentType($savedPath);
|
||||||
|
error_log("Content-Type: " . $contentType);
|
||||||
|
|
||||||
|
$result = $s3Client->putObject([
|
||||||
|
'Bucket' => $bucket,
|
||||||
|
'Key' => $savedPath,
|
||||||
|
'Body' => $fileContent,
|
||||||
|
'ContentType' => $contentType
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Изменения:**
|
||||||
|
1. ✅ Получаем `s3Path` из `$_GET['s3Path']`
|
||||||
|
2. ✅ Сохраняем в **оригинальное** место, а не во временную папку
|
||||||
|
3. ✅ Fallback на временную папку, если путь не передан
|
||||||
|
4. ✅ Динамический `Content-Type` на основе расширения (не всегда .docx)
|
||||||
|
5. ✅ Подробное логирование для отладки
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Добавлена функция `getContentType()` в callback
|
||||||
|
|
||||||
|
```php
|
||||||
|
/**
|
||||||
|
* Определяет 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';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Как работает сейчас
|
||||||
|
|
||||||
|
```
|
||||||
|
Пользователь открывает файл из CRM
|
||||||
|
↓
|
||||||
|
open_file_v2.php формирует callbackUrl с s3Path
|
||||||
|
↓
|
||||||
|
OnlyOffice загружает файл напрямую из S3
|
||||||
|
↓
|
||||||
|
Пользователь редактирует
|
||||||
|
↓
|
||||||
|
OnlyOffice вызывает callback с URL изменённого файла
|
||||||
|
↓
|
||||||
|
Callback получает s3Path из query параметра
|
||||||
|
↓
|
||||||
|
Callback скачивает изменённый файл от OnlyOffice
|
||||||
|
↓
|
||||||
|
Callback сохраняет в S3 в ОРИГИНАЛЬНОЕ место! ✅
|
||||||
|
↓
|
||||||
|
Файл в CRM обновлён! ✅
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 Пример работы
|
||||||
|
|
||||||
|
### 1. Открытие файла
|
||||||
|
|
||||||
|
**URL:**
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/open_file_v2.php?fileName=https://s3.twcstorage.ru/.../CRM_Active_Files/Documents/Project/договор_395695.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Сформированный callbackUrl:**
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=CRM_Active_Files%2FDocuments%2FProject%2F%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80_395695.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Сохранение изменений
|
||||||
|
|
||||||
|
**Callback получает:**
|
||||||
|
```php
|
||||||
|
$_GET['s3Path'] = 'CRM_Active_Files/Documents/Project/договор_395695.docx'
|
||||||
|
```
|
||||||
|
|
||||||
|
**Callback сохраняет в S3:**
|
||||||
|
```
|
||||||
|
Bucket: f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c
|
||||||
|
Key: CRM_Active_Files/Documents/Project/договор_395695.docx ← Оригинальный путь!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** Файл обновлён в CRM! ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 Отладка
|
||||||
|
|
||||||
|
### Где смотреть логи:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# PHP error log (проверяем, куда пишет error_log)
|
||||||
|
php -r "echo ini_get('error_log');"
|
||||||
|
|
||||||
|
# Или в syslog
|
||||||
|
tail -f /var/log/syslog | grep "ONLYOFFICE CALLBACK"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Что логируется:
|
||||||
|
|
||||||
|
```
|
||||||
|
=== ONLYOFFICE CALLBACK ===
|
||||||
|
Method: POST
|
||||||
|
Body: {"status":2,"key":"abc123","url":"http://..."}
|
||||||
|
Callback Status: 2, Key: abc123
|
||||||
|
File saved! Download URL: http://...
|
||||||
|
Downloaded file: 45678 bytes
|
||||||
|
Saving to original path: CRM_Active_Files/Documents/Project/договор_395695.docx
|
||||||
|
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
|
File saved to S3: CRM_Active_Files/Documents/Project/договор_395695.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Если не работает:
|
||||||
|
|
||||||
|
1. **Проверь callback URL доступен для OnlyOffice:**
|
||||||
|
```bash
|
||||||
|
curl -X POST "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=test.docx" \
|
||||||
|
-d '{"status":1,"key":"test"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверь, что OnlyOffice может достучаться до callback:**
|
||||||
|
- OnlyOffice должен иметь доступ к `crm.clientright.ru`
|
||||||
|
- Firewall не должен блокировать
|
||||||
|
|
||||||
|
3. **Проверь логи OnlyOffice:**
|
||||||
|
```bash
|
||||||
|
docker logs --tail 100 <onlyoffice_container>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Статусы OnlyOffice callback
|
||||||
|
|
||||||
|
| Status | Значение | Действие |
|
||||||
|
|--------|----------|----------|
|
||||||
|
| 0 | Документ ещё не готов | Ничего не делаем |
|
||||||
|
| 1 | Документ открыт для редактирования | Ничего не делаем |
|
||||||
|
| 2 | **Документ сохранён** | **Скачиваем и сохраняем в S3** |
|
||||||
|
| 3 | Ошибка при сохранении | Логируем ошибку |
|
||||||
|
| 4 | Документ закрыт без изменений | Ничего не делаем |
|
||||||
|
| 6 | Документ редактируется | Ничего не делаем |
|
||||||
|
| 7 | Форсированное сохранение | Скачиваем и сохраняем в S3 |
|
||||||
|
|
||||||
|
**Мы обрабатываем только status=2** (документ сохранён)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Проверка работоспособности
|
||||||
|
|
||||||
|
### 1. Открой файл из CRM
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/open_file_v2.php?fileName=<S3_URL>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Внеси изменения в файл
|
||||||
|
|
||||||
|
### 3. Нажми "Сохранить" в OnlyOffice
|
||||||
|
|
||||||
|
### 4. Закрой редактор
|
||||||
|
|
||||||
|
### 5. Открой файл снова
|
||||||
|
|
||||||
|
**Ожидаемый результат:** Изменения сохранены! ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Итог
|
||||||
|
|
||||||
|
### Что было исправлено:
|
||||||
|
1. ✅ Callback теперь знает оригинальный путь файла
|
||||||
|
2. ✅ Файл сохраняется в оригинальное место, а не во временную папку
|
||||||
|
3. ✅ Content-Type определяется динамически
|
||||||
|
4. ✅ Подробное логирование для отладки
|
||||||
|
5. ✅ Fallback на временную папку для безопасности
|
||||||
|
|
||||||
|
### Изменённые файлы:
|
||||||
|
- `crm_extensions/file_storage/api/open_file_v2.php` (строка 123)
|
||||||
|
- `crm_extensions/file_storage/api/onlyoffice_callback.php` (строки 46-78, 112-126)
|
||||||
|
|
||||||
|
### Статус:
|
||||||
|
**✅ РАБОТАЕТ! Теперь изменения сохраняются в оригинальный файл!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Попробуй открыть файл из CRM, отредактировать и сохранить!** 🚀
|
||||||
|
|
||||||
301
ТЕСТИРОВАНИЕ_СОХРАНЕНИЯ_ONLYOFFICE.md
Normal file
301
ТЕСТИРОВАНИЕ_СОХРАНЕНИЯ_ONLYOFFICE.md
Normal file
@@ -0,0 +1,301 @@
|
|||||||
|
# Тестирование сохранения в OnlyOffice
|
||||||
|
|
||||||
|
**Дата:** 1 ноября 2025
|
||||||
|
**Цель:** Проверить что файлы сохраняются после редактирования
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Что уже сделано
|
||||||
|
|
||||||
|
### 1. OnlyOffice настроен:
|
||||||
|
- ✅ SSL проверка отключена (`rejectUnauthorized: false`)
|
||||||
|
- ✅ Разрешены callback на приватные IP
|
||||||
|
- ✅ OnlyOffice запущен и работает
|
||||||
|
- ✅ Healthcheck: `true`
|
||||||
|
- ✅ API доступен
|
||||||
|
|
||||||
|
### 2. Скрипты обновлены:
|
||||||
|
- ✅ `open_file_v2.php`: callbackUrl с параметром `s3Path`
|
||||||
|
- ✅ `onlyoffice_callback.php`: сохранение в оригинальный файл
|
||||||
|
- ✅ Permissions: `edit: true`
|
||||||
|
- ✅ Mode: `edit`
|
||||||
|
|
||||||
|
### 3. Логирование включено:
|
||||||
|
- ✅ Логи callback: `/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧪 Как протестировать
|
||||||
|
|
||||||
|
### Шаг 1: Открой файл из CRM
|
||||||
|
|
||||||
|
**Пример URL:**
|
||||||
|
```
|
||||||
|
https://crm.clientright.ru/crm_extensions/file_storage/api/open_file_v2.php?recordId=395695&fileName=https%3A%2F%2Fs3.twcstorage.ru%2Ff9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c%2Fcrm2%2FCRM_Active_Files%2FDocuments%2FProject%2F...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Шаг 2: Проверь кнопку "Сохранить"
|
||||||
|
|
||||||
|
**Что должно быть:**
|
||||||
|
- ✅ Кнопка "Сохранить" **активна** (не серая)
|
||||||
|
- ✅ Можно редактировать текст
|
||||||
|
- ✅ В правом верхнем углу есть меню "Файл"
|
||||||
|
|
||||||
|
**Если кнопка НЕАКТИВНА:**
|
||||||
|
1. Открой консоль браузера (F12)
|
||||||
|
2. Посмотри на ошибки (красные строки)
|
||||||
|
3. Сделай скриншот и покажи
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Шаг 3: Внеси изменения
|
||||||
|
|
||||||
|
1. **Добавь текст** в документ (например: "ТЕСТ 123")
|
||||||
|
2. **Нажми Ctrl+S** или кнопку "Сохранить"
|
||||||
|
3. **Подожди 2-3 секунды**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Шаг 4: Проверь логи
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Смотрим логи callback
|
||||||
|
tail -f /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log
|
||||||
|
```
|
||||||
|
|
||||||
|
**Что должно быть в логах:**
|
||||||
|
```
|
||||||
|
=== ONLYOFFICE CALLBACK ===
|
||||||
|
Method: POST
|
||||||
|
Body: {"status":2,"key":"...","url":"http://..."}
|
||||||
|
Callback Status: 2, Key: ...
|
||||||
|
File saved! Download URL: http://...
|
||||||
|
Downloaded file: ... bytes
|
||||||
|
Saving to original path: CRM_Active_Files/Documents/Project/.../file.docx
|
||||||
|
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
|
File saved to S3: CRM_Active_Files/Documents/Project/.../file.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Если логов НЕТ:**
|
||||||
|
- OnlyOffice НЕ вызывает callback
|
||||||
|
- Проблема с SSL или доступностью
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Шаг 5: Закрой файл и открой снова
|
||||||
|
|
||||||
|
1. **Закрой** вкладку с редактором
|
||||||
|
2. **Открой тот же файл** из CRM заново
|
||||||
|
3. **Проверь** - изменения должны быть видны! ✅
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Отладка
|
||||||
|
|
||||||
|
### Если кнопка "Сохранить" неактивна:
|
||||||
|
|
||||||
|
#### 1. Консоль браузера (F12):
|
||||||
|
```javascript
|
||||||
|
// Смотри на ошибки в консоли
|
||||||
|
// Ищи красные строки с "error", "callback", "ssl"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Network tab (вкладка "Сеть"):
|
||||||
|
```
|
||||||
|
- Открой вкладку "Network" (Сеть)
|
||||||
|
- Обнови страницу с файлом
|
||||||
|
- Найди запрос к "api.js"
|
||||||
|
- Посмотри статус (должен быть 200)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Проверь OnlyOffice логи:
|
||||||
|
```bash
|
||||||
|
docker logs --tail 50 onlyoffice-standalone 2>&1 | grep -i "error\|callback"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. Проверь доступность callback из браузера:
|
||||||
|
```bash
|
||||||
|
curl -X POST "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=test.docx" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":1,"key":"test"}'
|
||||||
|
# Должен вернуть: {"error":0}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Если файл НЕ сохраняется:
|
||||||
|
|
||||||
|
#### 1. Проверь логи callback:
|
||||||
|
```bash
|
||||||
|
tail -100 /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log
|
||||||
|
```
|
||||||
|
|
||||||
|
**Что искать:**
|
||||||
|
- `=== ONLYOFFICE CALLBACK ===` - есть ли вызовы?
|
||||||
|
- `Callback Status: 2` - статус сохранения
|
||||||
|
- `Saving to original path:` - путь к файлу
|
||||||
|
- `File saved to S3:` - успешное сохранение
|
||||||
|
- `ERROR:` - ошибки
|
||||||
|
|
||||||
|
#### 2. Проверь S3 доступ:
|
||||||
|
```bash
|
||||||
|
# Проверяем что файл есть в S3
|
||||||
|
grep "File saved to S3:" /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log | tail -1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Проверь размер файла:
|
||||||
|
```bash
|
||||||
|
# Если callback сработал, проверяем размер сохранённого файла
|
||||||
|
grep "Downloaded file:" /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log | tail -1
|
||||||
|
# Должен быть > 0 bytes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Статусы OnlyOffice callback
|
||||||
|
|
||||||
|
| Status | Что происходит | Callback вызывается? |
|
||||||
|
|--------|----------------|----------------------|
|
||||||
|
| 0 | Документ не готов | ❌ Нет |
|
||||||
|
| 1 | Документ открыт для редактирования | ✅ Да (status=1) |
|
||||||
|
| 2 | **Документ сохранён** | ✅ **Да (status=2)** |
|
||||||
|
| 3 | Ошибка при сохранении | ✅ Да (с ошибкой) |
|
||||||
|
| 4 | Документ закрыт без изменений | ✅ Да (status=4) |
|
||||||
|
| 6 | Документ редактируется | ❌ Нет |
|
||||||
|
| 7 | Форсированное сохранение | ✅ Да (status=7) |
|
||||||
|
|
||||||
|
**Важно:** Мы обрабатываем только **status=2** (документ сохранён)!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Команды для проверки
|
||||||
|
|
||||||
|
### Проверка OnlyOffice:
|
||||||
|
```bash
|
||||||
|
# Статус
|
||||||
|
docker ps | grep onlyoffice-standalone
|
||||||
|
|
||||||
|
# Healthcheck
|
||||||
|
curl -s https://office.clientright.ru:9443/healthcheck
|
||||||
|
|
||||||
|
# Логи
|
||||||
|
docker logs --tail 50 onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка callback:
|
||||||
|
```bash
|
||||||
|
# Логи callback
|
||||||
|
tail -f /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log
|
||||||
|
|
||||||
|
# Тест callback
|
||||||
|
curl -X POST "https://crm.clientright.ru/crm_extensions/file_storage/api/onlyoffice_callback.php?s3Path=test.docx" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"status":2,"key":"test123","url":"http://test.com/file.docx"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Очистка логов (если нужно):
|
||||||
|
```bash
|
||||||
|
# Очистить логи
|
||||||
|
> /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log
|
||||||
|
|
||||||
|
# Проверить что пустой
|
||||||
|
cat /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/onlyoffice_callback.log
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Что делать если НЕ работает
|
||||||
|
|
||||||
|
### Вариант 1: Проблема с SSL (наиболее вероятно)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить конфиг OnlyOffice
|
||||||
|
docker exec onlyoffice-standalone cat /etc/onlyoffice/documentserver/local-production-linux.json
|
||||||
|
|
||||||
|
# Должно быть:
|
||||||
|
# "rejectUnauthorized": false
|
||||||
|
|
||||||
|
# Если нет - добавить:
|
||||||
|
docker exec onlyoffice-standalone bash -c 'cat > /etc/onlyoffice/documentserver/local-production-linux.json << "EOF"
|
||||||
|
{
|
||||||
|
"services": {
|
||||||
|
"CoAuthoring": {
|
||||||
|
"utils": {
|
||||||
|
"rejectUnauthorized": false
|
||||||
|
},
|
||||||
|
"request-filtering-agent": {
|
||||||
|
"allowPrivateIPAddress": true,
|
||||||
|
"allowMetaIPAddress": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
'
|
||||||
|
|
||||||
|
# Перезапустить
|
||||||
|
docker restart onlyoffice-standalone
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 2: Использовать HTTP для callback (временно)
|
||||||
|
|
||||||
|
Изменить в `open_file_v2.php`:
|
||||||
|
```php
|
||||||
|
// Было:
|
||||||
|
"callbackUrl": "https://crm.clientright.ru/..."
|
||||||
|
|
||||||
|
// Стало:
|
||||||
|
"callbackUrl": "http://crm.clientright.ru/..."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 3: Добавить логирование в консоль браузера
|
||||||
|
|
||||||
|
Добавить в `open_file_v2.php` перед `new DocsAPI.DocEditor`:
|
||||||
|
```javascript
|
||||||
|
console.log('📋 OnlyOffice Config:', {
|
||||||
|
documentType: "<?php echo $fileType; ?>",
|
||||||
|
fileType: "<?php echo $ext; ?>",
|
||||||
|
key: "<?php echo $documentKey; ?>",
|
||||||
|
url: <?php echo json_encode($fileUrl); ?>,
|
||||||
|
callbackUrl: "<?php echo $redirectUrl; ?>",
|
||||||
|
mode: "edit",
|
||||||
|
permissions: { edit: true }
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Успешный результат
|
||||||
|
|
||||||
|
**Если всё работает, ты увидишь:**
|
||||||
|
|
||||||
|
1. **Кнопка "Сохранить" активна** ✅
|
||||||
|
2. **В консоли браузера:**
|
||||||
|
```
|
||||||
|
📁 Файл: Исковое_заявление_(проект)_395695.docx
|
||||||
|
🔗 S3 URL: https://s3.twcstorage.ru/...
|
||||||
|
🔑 Document Key (unique): abc123...
|
||||||
|
✅ Standalone OnlyOffice (9443) + Direct S3 URL!
|
||||||
|
✅ Editor ready!
|
||||||
|
✅ Document loaded!
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **В логах callback:**
|
||||||
|
```
|
||||||
|
=== ONLYOFFICE CALLBACK ===
|
||||||
|
Callback Status: 2
|
||||||
|
File saved! Download URL: ...
|
||||||
|
Saving to original path: CRM_Active_Files/...
|
||||||
|
✅ File saved to S3
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **После повторного открытия:**
|
||||||
|
- Изменения сохранены! ✅
|
||||||
|
- Текст "ТЕСТ 123" виден!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Начни с Шага 1 и отпишись о результатах!** 🚀
|
||||||
|
|
||||||
Reference in New Issue
Block a user