Интеграция 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:
AI Assistant
2025-10-27 19:37:41 +03:00
parent d8508aa89d
commit f72aa59476
9 changed files with 331 additions and 64 deletions

73
test_redis_publish_direct.py Executable file
View File

@@ -0,0 +1,73 @@
#!/usr/bin/env python3
"""
Тест прямой публикации в Redis (имитация n8n Redis ноды)
"""
import redis
import json
from datetime import datetime
print("=" * 60)
print("🧪 ТЕСТ ПРЯМОЙ ПУБЛИКАЦИИ В REDIS")
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)
# Тестовые данные
claim_id = "CLM-TEST-DIRECT-123"
channel = f"ocr_events:{claim_id}"
event_data = {
"event_type": "ocr_completed",
"status": "success",
"message": "✅ Тест прямой публикации из Python (имитация n8n)",
"data": {
"file_id": "test-file-123",
"is_valid_document": True,
"test_mode": True,
"source": "direct_redis_publish"
},
"timestamp": datetime.now().isoformat()
}
message = json.dumps(event_data, ensure_ascii=False)
print(f"\n📺 Канал: {channel}")
print(f"📦 Сообщение:")
print(json.dumps(event_data, indent=2, ensure_ascii=False))
print("\n" + "=" * 60)
# Публикация
try:
num_subscribers = r.publish(channel, message)
print(f"\n✅ Сообщение опубликовано!")
print(f"👥 Количество подписчиков: {num_subscribers}")
if num_subscribers == 0:
print("\n⚠️ ВНИМАНИЕ: Нет активных подписчиков!")
print(" Это нормально, если никто не слушает канал.")
print(" Запусти monitor_redis_direct.py в другом терминале.")
else:
print(f"\n🎉 {num_subscribers} подписчик(ов) получили сообщение!")
except Exception as e:
print(f"\n❌ Ошибка публикации: {e}")
finally:
r.close()
print("\n" + "=" * 60)
print(f"⏰ Завершено: {datetime.now().strftime('%H:%M:%S')}")