Files
crm.clientright.ru/crm_extensions/file_storage/ARCHITECTURE.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

12 KiB
Raw Blame History

🏗️ Архитектура системы мониторинга файлов

🎯 Общая схема

┌─────────────────────────────────────────────────────────────────────────┐
│                        ИСТОЧНИКИ ФАЙЛОВ                                  │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                           │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌────────────┐ │
│  │   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! 🎉