✅ ЧТО СДЕЛАНО: - Поднят новый 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)
12 KiB
12 KiB
🏗️ Архитектура системы мониторинга файлов
🎯 Общая схема
┌─────────────────────────────────────────────────────────────────────────┐
│ ИСТОЧНИКИ ФАЙЛОВ │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ CRM PHP │ │ Nextcloud │ │ S3 Browser │ │ Внешние │ │
│ │ │ │ WebUI │ │ Cyberduck │ │ скрипты │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └─────┬──────┘ │
│ │ │ │ │ │
│ └─────────────────┼─────────────────┼─────────────────┘ │
│ │ │ │
└───────────────────────────┼─────────────────┼───────────────────────────┘
▼ ▼
┌──────────────────────────────────────┐
│ │
│ TWC S3 Storage (Cloud) │
│ f9825c87-18698658-c378-... │
│ │
└────┬─────────────────────────────┬───┘
│ │
│ (mounted via │ (polling)
│ external │
│ storage) │
▼ ▼
┌──────────────────────┐ ┌──────────────────────────┐
│ Nextcloud │ │ n8n S3 Monitor │
│ Docker Container │ │ Workflow │
│ │ │ │
│ Files change → │ │ Every 30s: │
│ notify_storage_ │ │ 1. List S3 files │
│ update (Redis) │ │ 2. Compare with prev │
└──────────┬───────────┘ │ 3. Detect changes │
│ └─────────┬────────────────┘
│ │
▼ ▼
┌──────────────────────┐ ┌─────────────────────────┐
│ redis_bridge.js │ │ │
│ (Node.js) │ │ (n8n internal) │
│ │ │ │
│ 1. Subscribe NC │ │ │
│ Redis │ │ │
│ 2. Parse events │ │ │
│ 3. Enrich data │ │ │
└──────────┬───────────┘ └─────────┬───────────────┘
│ │
│ │
└────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ CRM Redis │
│ 147.45.146.17:6379 │
│ │
│ Channel: │
│ crm:file:events │
└───────────┬──────────────────┘
│
│ (subscribe)
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ n8n │ │ CRM PHP │ │ Другие │
│ Workflows │ │ Listeners │ │ сервисы │
└────────────┘ └────────────┘ └────────────┘
📊 Потоки событий
Поток 1: Файлы через Nextcloud WebUI
User uploads file → Nextcloud → S3 Storage →
→ Nextcloud detects change → notify_storage_update (NC Redis) →
→ redis_bridge.js → crm:file:events (CRM Redis) → Обработчики
⏱️ Задержка: ~1-2 секунды (реал-тайм)
Поток 2: Файлы напрямую в S3
External tool → S3 Storage →
→ n8n S3 Monitor (polling every 30s) → Detects change →
→ crm:file:events (CRM Redis) → Обработчики
⏱️ Задержка: 0-30 секунд (зависит от интервала polling)
🔄 Компоненты системы
1. redis_bridge.js (Node.js, работает на хосте)
- Задача: Мост между Nextcloud Redis и CRM Redis
- Вход:
notify_storage_update(Nextcloud Redis, port 6380) - Выход:
crm:file:events(CRM Redis, port 6379) - Статус: ✅ Работает
- Запуск:
cd /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage /usr/bin/nodejs redis_bridge.js &
2. n8n S3 Monitor Workflow (в n8n)
- Задача: Мониторинг прямых изменений в S3
- Метод: Polling (каждые 30 секунд)
- Вход: TWC S3 API (ListObjectsV2)
- Выход:
crm:file:events(CRM Redis) - Статус: ⚙️ Нужно настроить
- Файл:
n8n_s3_monitor_workflow.json
3. CRM Redis (центральная шина событий)
- Адрес:
147.45.146.17:6379 - Канал:
crm:file:events - Формат события:
{ "type": "file_created|file_modified|file_deleted", "source": "nextcloud|s3_monitor|crm", "timestamp": "2025-10-30T12:34:56Z", "path": "full/path/to/file.txt", "filename": "file.txt", "size": 12345, "file_id": 73460, "etag": "abc123...", "operation": "create|update|delete" }
🎯 Сценарии использования
Сценарий 1: Обработка ERV файлов
1. Загружаешь ERV файл в S3 через S3 Browser
2. n8n S3 Monitor обнаруживает файл (через 0-30с)
3. Событие публикуется в Redis → crm:file:events
4. n8n ERV Processor подхватывает событие
5. Скачивает файл из S3
6. Обрабатывает ERV
7. Загружает в CRM
8. Отправляет уведомление
Сценарий 2: Автоматическая обработка PDF счетов
1. Клиент загружает PDF в Nextcloud
2. Nextcloud → notify_storage_update → redis_bridge.js
3. Событие в Redis (реал-тайм, ~1с)
4. n8n Invoice Processor:
- Распознаёт текст (OCR)
- Извлекает данные
- Создаёт счёт в CRM
- Уведомляет бухгалтера
Сценарий 3: Синхронизация с внешней системой
1. Внешний скрипт пишет в S3
2. n8n S3 Monitor (через 30с)
3. Redis событие
4. n8n External Sync:
- Проверяет формат файла
- Отправляет в external API
- Логирует в CRM
⚙️ Настройки производительности
Интервал polling S3 Monitor
| Интервал | Задержка | Нагрузка на API | Рекомендация |
|---|---|---|---|
| 10 сек | 0-10с | Высокая | Только для критичных файлов |
| 30 сек | 0-30с | Средняя | ✅ Оптимально |
| 60 сек | 0-60с | Низкая | Для некритичных файлов |
| 300 сек | 0-5мин | Минимальная | Для архивов |
Количество файлов
- < 1000 файлов: Мониторь весь bucket
- 1000-10000: Используй
Prefixдля фильтрации папок - > 10000: Создай отдельные workflows для разных папок
🔧 Мониторинг и логи
Проверка работы redis_bridge.js
ps aux | grep redis_bridge.js
tail -f /var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/redis_bridge.log
Проверка событий в Redis
redis-cli -h 147.45.146.17 -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \
SUBSCRIBE crm:file:events
Проверка n8n workflow
- n8n UI → Workflows → S3 File Monitor → Executions
🚀 Расширение системы
Добавление новых источников событий
Любой компонент может публиковать в crm:file:events:
Пример из PHP (CRM):
$redis = new Redis();
$redis->connect('147.45.146.17', 6379);
$redis->auth('CRM_Redis_Pass_2025_Secure!');
$event = [
'type' => 'file_created',
'source' => 'crm_api',
'timestamp' => date('c'),
'path' => $filePath,
'filename' => basename($filePath),
'size' => filesize($localPath),
'user_id' => $userId
];
$redis->publish('crm:file:events', json_encode($event));
Пример из Python:
import redis
import json
from datetime import datetime
r = redis.Redis(
host='147.45.146.17',
port=6379,
password='CRM_Redis_Pass_2025_Secure!'
)
event = {
'type': 'file_created',
'source': 'python_script',
'timestamp': datetime.utcnow().isoformat() + 'Z',
'path': file_path,
'filename': os.path.basename(file_path)
}
r.publish('crm:file:events', json.dumps(event))
📝 Итого
✅ Nextcloud файлы → реал-тайм через redis_bridge.js
✅ S3 прямые загрузки → polling через n8n (0-30с задержка)
✅ CRM файлы → прямая публикация в Redis
✅ Единая точка обработки → Redis канал crm:file:events
✅ Гибкость → любой сервис может подписаться и обработать
Всё работает через один канал Redis! 🎉