Files
crm.clientright.ru/crm_extensions/file_storage/FINAL_SETUP_SUMMARY.md
Fedor 269c7ea216 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)
2025-11-01 01:02:03 +03:00

6.8 KiB
Raw Blame History

🎉 ФИНАЛЬНАЯ СВОДКА - S3 МОНИТОРИНГ

ЧТО РАБОТАЕТ:

1 S3 Monitor (Docker контейнер)

Контейнер: s3-monitor
Статус: ✅ Работает
Bucket: f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c
Файлов: 24,523
Интервал: каждые 30 секунд
Автоперезапуск: ✅

Что делает:

  • Каждые 30 секунд сканирует S3 bucket
  • Получает ВСЕ файлы (24,523 штук через pagination)
  • Сравнивает с предыдущим состоянием
  • Публикует изменения в Redis

Команды:

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

Команды:

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:

{
  "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):

{
  "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 (если нужно)

// n8n автоматически парсит, но если нужно:
const message = $json.message;
const event = typeof message === 'string' ? JSON.parse(message) : message;
return [{ json: event }];

Шаг 4: Фильтруй по типу

// Только новые файлы
$json.type === 'file_created'

// Только XLSX
$json.filename.endsWith('.xlsx')

// Только из определённой папки
$json.path.includes('Documents/')

Шаг 5: Обработай файл

Switch по расширению:
├─ .xlsx → Обработка Excel
├─ .pdf → OCR и извлечение данных
├─ .jpg → Обработка изображений
└─ Другие → Логирование

🧪 ПРОВЕРКА СОБЫТИЙ:

Подпишись на Redis:

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 сек Дедупликация
Фильтр .part
Фильтр cache
S3 прямая загрузка S3 Monitor 0-30 сек Нет
CRM API Прямая публикация 0 сек Настраивается

🔧 ДОПОЛНИТЕЛЬНАЯ ФИЛЬТРАЦИЯ В N8N:

Если всё ещё приходит много событий от Nextcloud, добавь в n8n:

// Фильтр: пропускаем дубликаты по 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 и начинай обрабатывать файлы! 🚀