feat: OnlyOffice Standalone integration with S3 direct URLs
✅ ЧТО СДЕЛАНО: - Поднят новый standalone OnlyOffice Document Server (порт 8083) - Настроен Nginx для доступа через office.clientright.ru:9443 - Создан open_file_v3_standalone.php для работы с новым OnlyOffice - Реализована поддержка прямых S3 URL (bucket публичный) - Добавлен s3_proxy.php с поддержкой Range requests - Создан onlyoffice_callback.php для сохранения (базовая версия) - Файлы успешно открываются и загружаются! ⚠️ TODO (на завтра): - Доработать onlyoffice_callback.php для сохранения обратно в ОРИГИНАЛЬНЫЙ путь в S3 - Добавить Redis маппинг documentKey → S3 path - Обновить CRM JS для использования open_file_v3_standalone.php - Протестировать сохранение файлов - Удалить тестовые файлы 📊 РЕЗУЛЬТАТ: - OnlyOffice Standalone РАБОТАЕТ! ✅ - Файлы открываются напрямую из S3 ✅ - Редактор загружается БЫСТРО ✅ - Автосохранение настроено ✅ (но нужна доработка callback)
This commit is contained in:
238
crm_extensions/file_storage/FINAL_SETUP_SUMMARY.md
Normal file
238
crm_extensions/file_storage/FINAL_SETUP_SUMMARY.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# 🎉 ФИНАЛЬНАЯ СВОДКА - S3 МОНИТОРИНГ
|
||||
|
||||
## ✅ ЧТО РАБОТАЕТ:
|
||||
|
||||
### 1️⃣ **S3 Monitor** (Docker контейнер)
|
||||
```
|
||||
Контейнер: s3-monitor
|
||||
Статус: ✅ Работает
|
||||
Bucket: f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c
|
||||
Файлов: 24,523
|
||||
Интервал: каждые 30 секунд
|
||||
Автоперезапуск: ✅
|
||||
```
|
||||
|
||||
**Что делает:**
|
||||
- Каждые 30 секунд сканирует S3 bucket
|
||||
- Получает **ВСЕ** файлы (24,523 штук через pagination)
|
||||
- Сравнивает с предыдущим состоянием
|
||||
- Публикует изменения в Redis
|
||||
|
||||
**Команды:**
|
||||
```bash
|
||||
docker logs s3-monitor -f # Логи в реальном времени
|
||||
docker stop s3-monitor # Остановить
|
||||
docker start s3-monitor # Запустить
|
||||
docker restart s3-monitor # Перезапустить
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2️⃣ **Redis Bridge** (Nextcloud → CRM Redis)
|
||||
```
|
||||
Процесс: /usr/bin/nodejs redis_bridge.js
|
||||
Статус: ✅ Работает
|
||||
Порт NC Redis: 127.0.0.1:6380
|
||||
Порт CRM Redis: 147.45.146.17:6379
|
||||
```
|
||||
|
||||
**Что делает:**
|
||||
- Слушает Nextcloud Redis канал `notify_storage_update`
|
||||
- Фильтрует временные файлы (.part, .lock, cache)
|
||||
- **Дедупликация** - один file_id = одно событие (в течение 5 сек)
|
||||
- Публикует в CRM Redis канал `crm:file:events`
|
||||
|
||||
**Команды:**
|
||||
```bash
|
||||
tail -f redis_bridge.log # Логи
|
||||
ps aux | grep redis_bridge # Статус
|
||||
pkill -f redis_bridge.js # Остановить
|
||||
nohup /usr/bin/nodejs redis_bridge.js > redis_bridge.log 2>&1 & # Запустить
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3️⃣ **Redis Канал** (централизованная шина событий)
|
||||
```
|
||||
Host: 147.45.146.17
|
||||
Port: 6379
|
||||
Password: CRM_Redis_Pass_2025_Secure!
|
||||
Channel: crm:file:events
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 ФОРМАТ СОБЫТИЙ:
|
||||
|
||||
### От S3 Monitor:
|
||||
```json
|
||||
{
|
||||
"type": "file_created",
|
||||
"source": "s3_monitor",
|
||||
"timestamp": "2025-10-30T20:49:31.593Z",
|
||||
"path": "folder/subfolder/file.xlsx",
|
||||
"filename": "file.xlsx",
|
||||
"action": "created",
|
||||
"size": 8224,
|
||||
"etag": "7004954627252c9d0a7e6417f8325d07",
|
||||
"last_modified": "2025-10-30T20:49:14.132Z"
|
||||
}
|
||||
```
|
||||
|
||||
### От Nextcloud (redis_bridge):
|
||||
```json
|
||||
{
|
||||
"type": "file_update",
|
||||
"source": "nextcloud",
|
||||
"timestamp": "2025-10-30T20:52:21.236Z",
|
||||
"storage_id": 4,
|
||||
"path": "crm2/CRM_Active_Files/file.pdf",
|
||||
"file_id": 42594,
|
||||
"filename": "file.pdf",
|
||||
"operation": "update"
|
||||
}
|
||||
```
|
||||
|
||||
**Оба публикуются в один канал:** `crm:file:events`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 КАК ОБРАБАТЫВАТЬ В N8N:
|
||||
|
||||
### Шаг 1: Импортируй workflow обработчик
|
||||
Файл: `n8n_s3_event_processor.json`
|
||||
|
||||
### Шаг 2: Настрой Redis Trigger
|
||||
```
|
||||
Node: Redis Subscribe
|
||||
Channel: crm:file:events
|
||||
Credential: CRM Redis
|
||||
```
|
||||
|
||||
### Шаг 3: Parse JSON (если нужно)
|
||||
```javascript
|
||||
// n8n автоматически парсит, но если нужно:
|
||||
const message = $json.message;
|
||||
const event = typeof message === 'string' ? JSON.parse(message) : message;
|
||||
return [{ json: event }];
|
||||
```
|
||||
|
||||
### Шаг 4: Фильтруй по типу
|
||||
```javascript
|
||||
// Только новые файлы
|
||||
$json.type === 'file_created'
|
||||
|
||||
// Только XLSX
|
||||
$json.filename.endsWith('.xlsx')
|
||||
|
||||
// Только из определённой папки
|
||||
$json.path.includes('Documents/')
|
||||
```
|
||||
|
||||
### Шаг 5: Обработай файл
|
||||
```
|
||||
Switch по расширению:
|
||||
├─ .xlsx → Обработка Excel
|
||||
├─ .pdf → OCR и извлечение данных
|
||||
├─ .jpg → Обработка изображений
|
||||
└─ Другие → Логирование
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 ПРОВЕРКА СОБЫТИЙ:
|
||||
|
||||
### Подпишись на Redis:
|
||||
```bash
|
||||
redis-cli -h 147.45.146.17 -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
|
||||
SUBSCRIBE crm:file:events
|
||||
```
|
||||
|
||||
### Загрузи файл:
|
||||
- Через Nextcloud WebUI
|
||||
- Через S3 Browser
|
||||
- Через aws-cli
|
||||
|
||||
### Увидишь событие:
|
||||
```
|
||||
1) "message"
|
||||
2) "crm:file:events"
|
||||
3) "{\"type\":\"file_created\",\"filename\":\"test.pdf\",...}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 ИСТОЧНИКИ СОБЫТИЙ:
|
||||
|
||||
| Источник | Метод | Задержка | Фильтры |
|
||||
|----------|-------|----------|---------|
|
||||
| **Nextcloud WebUI** | Redis Bridge | 1-2 сек | ✅ Дедупликация<br>✅ Фильтр .part<br>✅ Фильтр cache |
|
||||
| **S3 прямая загрузка** | S3 Monitor | 0-30 сек | Нет |
|
||||
| **CRM API** | Прямая публикация | 0 сек | Настраивается |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 ДОПОЛНИТЕЛЬНАЯ ФИЛЬТРАЦИЯ В N8N:
|
||||
|
||||
Если всё ещё приходит много событий от Nextcloud, добавь в n8n:
|
||||
|
||||
```javascript
|
||||
// Фильтр: пропускаем дубликаты по filename + timestamp
|
||||
const cache = $getWorkflowStaticData('node');
|
||||
cache.recent = cache.recent || [];
|
||||
|
||||
const key = `${$json.filename}_${$json.file_id}`;
|
||||
const now = Date.now();
|
||||
|
||||
// Очищаем старые (>10 секунд)
|
||||
cache.recent = cache.recent.filter(item => (now - item.time) < 10000);
|
||||
|
||||
// Проверяем дубликат
|
||||
if (cache.recent.find(item => item.key === key)) {
|
||||
return []; // Пропускаем дубликат
|
||||
}
|
||||
|
||||
// Добавляем в кеш
|
||||
cache.recent.push({ key, time: now });
|
||||
|
||||
return [$input.item];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 ФАЙЛЫ:
|
||||
|
||||
Все в:
|
||||
```
|
||||
/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/
|
||||
```
|
||||
|
||||
**Рабочие скрипты:**
|
||||
- ✅ `s3_monitor_docker.js` - S3 мониторинг (запущен в Docker)
|
||||
- ✅ `redis_bridge.js` - Nextcloud→CRM мост (запущен)
|
||||
- ✅ `.env.s3monitor` - credentials для S3
|
||||
|
||||
**N8N Workflows для импорта:**
|
||||
- `n8n_s3_event_processor.json` - обработчик событий (НОВЫЙ!)
|
||||
- `n8n_nextcloud_activity_monitor.json` - альтернатива через Activity API
|
||||
- `n8n_s3_monitor_workflow.json` - альтернатива S3 Monitor (если не хочешь Docker)
|
||||
|
||||
**Документация:**
|
||||
- `SETUP_CHECKLIST.md` - чек-лист настройки
|
||||
- `S3_MONITORING_GUIDE.md` - руководство по S3
|
||||
- `ARCHITECTURE.md` - схема архитектуры
|
||||
- `NEXTCLOUD_API_OVERVIEW.md` - обзор Nextcloud API
|
||||
|
||||
---
|
||||
|
||||
## 🎉 ГОТОВО!
|
||||
|
||||
**Система полностью работает:**
|
||||
- ✅ S3 мониторинг (24,523 файла)
|
||||
- ✅ Nextcloud мониторинг (с дедупликацией)
|
||||
- ✅ Redis публикация
|
||||
- ✅ Автоперезапуск
|
||||
- ✅ Фильтрация дубликатов
|
||||
|
||||
**Теперь импортируй `n8n_s3_event_processor.json` в n8n и начинай обрабатывать файлы!** 🚀
|
||||
|
||||
Reference in New Issue
Block a user