✅ Интеграция SSE + Redis Pub/Sub для real-time OCR результатов
🎯 Основные изменения: Backend: - Реализован SSE endpoint /events/{task_id} для real-time стриминга событий - Интеграция Redis Pub/Sub для получения событий от n8n - Исправлен путь к .env файлу (абсолютный путь) - Убран префикс /api/v1 для events router - Добавлено подробное логирование событий Frontend: - Переключён на Vite dev mode для работы proxy - Настроен proxy /events -> backend:8100 - Реализована модалка с крутилкой при загрузке файла - SSE клиент для получения OCR результатов в real-time - Отображение результатов AI анализа в модалке Docker: - Frontend: изменён на npm run dev (Vite dev server) - Добавлен host.docker.internal для доступа к backend - Настроен proxy в docker-compose Утилиты: - monitor_redis_direct.py - мониторинг Redis Pub/Sub - test_redis_publish_direct.py - тестирование публикации в Redis 🚀 Полная цепочка работает: Frontend → Backend SSE → Redis Pub/Sub ← n8n → OCR/AI → Result
This commit is contained in:
68
monitor_redis_direct.py
Executable file
68
monitor_redis_direct.py
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Мониторинг Redis Pub/Sub для проверки прямой публикации из n8n
|
||||
"""
|
||||
import redis
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
print("=" * 60)
|
||||
print("🎧 МОНИТОРИНГ REDIS PUB/SUB")
|
||||
print("=" * 60)
|
||||
|
||||
# Подключение к Redis
|
||||
r = redis.Redis(
|
||||
host='crm.clientright.ru',
|
||||
port=6379,
|
||||
password='CRM_Redis_Pass_2025_Secure!',
|
||||
decode_responses=True
|
||||
)
|
||||
|
||||
# Проверка подключения
|
||||
try:
|
||||
r.ping()
|
||||
print("✅ Redis подключен!")
|
||||
except Exception as e:
|
||||
print(f"❌ Ошибка подключения: {e}")
|
||||
exit(1)
|
||||
|
||||
# Подписка на все каналы ocr_events:*
|
||||
pubsub = r.pubsub()
|
||||
pubsub.psubscribe('ocr_events:*')
|
||||
|
||||
print(f"📡 Слушаем каналы: ocr_events:*")
|
||||
print(f"⏰ Запущено: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print("-" * 60)
|
||||
print("\n⏳ Ожидаю события... (Ctrl+C для выхода)\n")
|
||||
|
||||
# Счётчик событий
|
||||
event_count = 0
|
||||
|
||||
try:
|
||||
for message in pubsub.listen():
|
||||
if message['type'] == 'pmessage':
|
||||
event_count += 1
|
||||
print(f"\n{'='*60}")
|
||||
print(f"📢 СОБЫТИЕ #{event_count}")
|
||||
print(f"⏰ Время: {datetime.now().strftime('%H:%M:%S')}")
|
||||
print(f"📺 Канал: {message['channel']}")
|
||||
print(f"📦 Данные:")
|
||||
print("-" * 60)
|
||||
|
||||
try:
|
||||
# Пытаемся распарсить как JSON
|
||||
data = json.loads(message['data'])
|
||||
print(json.dumps(data, indent=2, ensure_ascii=False))
|
||||
except json.JSONDecodeError:
|
||||
# Если не JSON - показываем как есть
|
||||
print(message['data'])
|
||||
|
||||
print(f"{'='*60}\n")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print(f"\n\n✅ Остановлено. Получено событий: {event_count}")
|
||||
print(f"⏰ Завершено: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
finally:
|
||||
pubsub.close()
|
||||
r.close()
|
||||
|
||||
Reference in New Issue
Block a user