239 lines
6.8 KiB
Markdown
239 lines
6.8 KiB
Markdown
|
|
# 🎉 ФИНАЛЬНАЯ СВОДКА - 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 и начинай обрабатывать файлы!** 🚀
|
|||
|
|
|