# RSS2 - AI-Powered News Intelligence Platform RSS2 es una plataforma avanzada de agregación, traducción, análisis y vectorización de noticias, diseñada para transformar flujos masivos de información en inteligencia accionable. Utiliza una arquitectura híbrida de microservicios (Go + Python) integrada con modelos de inteligencia artificial de última generación para ofrecer búsqueda semántica, clasificación inteligente y automatización de contenidos. --- ## 🚀 Capacidades Principales * **Enriquecimiento con Wikipedia**: Sistema automatizado que detecta personas y organizaciones, descarga sus biografías e imágenes oficiales de Wikipedia para mostrarlas en tooltips interactivos con avatares circulares. * **Categorización Inteligente (LLM)**: Clasificación de noticias mediante una instancia local de Mistral-7B / Llama-3 (vía Ollama), procesando contenido en tiempo real. * **Búsqueda Semántica**: Motor vectorial Qdrant para descubrir noticias por contexto y significado, yendo más allá de las palabras clave tradicionales. * **Traducción Neuronal de Alta Calidad**: Integración de NLLB-200 (vía CTranslate2) para traducir noticias de múltiples idiomas al español con precisión profesional. * **Inteligencia de Entidades (NER)**: Extracción y normalización automática de Personas, Organizaciones y Lugares para análisis de tendencias y mapeo de relaciones. * **Búsqueda de Noticias Relacionadas**: Algoritmos de similitud que agrupan noticias sobre el mismo tema automáticamente. * **Detección de Idioma**: Identificación automática del idioma de origen para routing correcto a traducción. * **Clustering de Noticias**: Agrupación automática de noticias relacionadas en eventos mediante embeddings. * **Remote Workers GPU**: Workers de traducción GPUremotos conectados vía WebSocket para procesamiento distribuido. * **Backup Automatizado**: Exportación completa de la base de datos en SQL o ZIP. --- ## 🏗️ Arquitectura de Servicios (Docker) El sistema se orquestra mediante Docker Compose y se divide en capas especializadas: ### Capa de Acceso y API | Servicio | Tecnología | Descripción | |---------|------------|-------------| | **`nginx`** | Nginx Alpine | Gateway y Proxy Inverso (Puerto **8888**). | | **`rss2_frontend`** | React + Vite | Interfaz web de usuario moderna y responsiva. | | **`backend-go`** | Go + Gin | API REST principal y gestión de lógica de negocio. | ### Ingesta y Descubrimiento (Go) | Servicio | Tecnología | Descripción | |---------|------------|-------------| | **`rss-ingestor-go`** | Go | Crawler de alto rendimiento para feeds RSS (100 workers). | | **`scraper`** | Go | Scraper profundo con sanitización de HTML y extracción de texto. | | **`discovery`** | Go | Agente autónomo para descubrir nuevos feeds a partir de URLs. | ### Procesamiento de Datos e IA (Go & Python) | Servicio | Tecnología | Descripción | |---------|------------|-------------| | **`translator`** | NLLB-200 (CPU) | Traducción neuronal optimizada con CTranslate2. | | **`translator-gpu`** | NLLB-200 (GPU) | Traducción acelerada por hardware (CUDA). | | **`remote-translator`** | WebSocket | Worker GPU remoto (conexión vía ws://backend-go:8080/ws/worker). | | **`wiki-worker`** | Go | Integración con Wikipedia y gestión de imágenes locales. | | **`embeddings`** | S-Transformers | Generación de vectores para búsqueda semántica (paraphrase-multilingual-MiniLM-L12-v2). | | **`ner`** | Spacy / es_core_news_lg | Reconocimiento de entidades nombradas (NER). | | **`llm-categorizer`** | Ollama / Mistral | Clasificación avanzada mediante modelos de lenguaje. | | **`topics`** | Go | Matcher automático de países y temas predefinidos. | | **`related`** | Go | Motor de detección de noticias relacionadas (similitud coseno). | | **`qdrant-worker`** | Go | Vectorización y búsqueda semántica con Qdrant + Ollama. | | **`cluster`** | Python | Agrupación de noticias por eventos. | | **`langdetect`** | Python | Detección de idioma para routing de traducciones. | | **`translation-scheduler`** | Python | Creador de tareas de traducción. | ### Capa de Almacenamiento | Servicio | Tecnología | Descripción | |---------|------------|-------------| | **`db`** | PostgreSQL 18 | Base de datos relacional principal. | | **`qdrant`** | Qdrant | Base de datos vectorial para búsqueda por similitud. | | **`redis`** | Redis 7 | Colas de mensajes y caché de alto desempeño. | ### Monitoreo | Servicio | Tecnología | Descripción | |---------|------------|-------------| | **`prometheus`** | Prometheus | Métricas del sistema. | | **`grafana`** | Grafana | Dashboard (puerto **3001**). | | **`cadvisor`** | cAdvisor | Monitoreo Docker. | --- ## 📊 Endpoints de API ### News - `GET /api/news` - Listar noticias (paginado, filtros: q, category_id, country_id, translated_only) - `GET /api/news/:id` - Ver noticia con entidades (incluye Wikipedia enrichment) - `DELETE /api/news/:id` - Eliminar noticia (admin) ### Feeds - `GET /api/feeds` - Listar feeds - `POST /api/feeds` - Crear feed (auth requerido) - `PUT /api/feeds/:id` - Actualizar feed (auth requerido) - `DELETE /api/feeds/:id` - Eliminar feed (auth requerido) - `POST /api/feeds/:id/toggle` - Activar/desactivar feed - `POST /api/feeds/:id/reactivate` - Reactivar feed ### Search - `GET /api/search?q=...` - Búsqueda texto (filtros: lang, categoria_id, pais_id) - `GET /api/search?q=...&semantic=true` - Búsqueda semántica con Qdrant ### Entities - `GET /api/entities?tipo=persona|organizacion|lugar` - Listar entidades (con aliasing) ### Admin - `GET /api/admin/backup` - Backup SQL completo (descargable) - `GET /api/admin/backup/news` - Backup noticias (ZIP) - `GET /api/admin/users` - Listar usuarios - `POST /api/admin/users/:id/promote` - Promover a admin - `POST /api/admin/users/:id/demote` - Quitar admin - `POST /api/admin/reset-db` - Resetear base de datos - `POST /api/admin/aliases` - Crear alias de entidad - `GET /api/admin/aliases/export` - Exportar aliases (CSV) - `POST /api/admin/aliases/import` - Importar aliases (CSV) - `POST /api/admin/entities/retype` - Cambiar tipo de entidad - `POST /api/admin/workers/config` - Configurar workers (type, workers) - `POST /api/admin/workers/start` - Iniciar workers traducción - `POST /api/admin/workers/stop` - Detener workers traducción - `GET /api/admin/workers/status` - Estado de workers - `GET /api/admin/workers/remote` - Listar remote workers - `POST /api/admin/workers/remote` - Crear remote worker - `DELETE /api/admin/workers/remote/:id` - Eliminar remote worker ### Auth - `POST /api/auth/login` - Iniciar sesión - `POST /api/auth/register` - Registrarse - `GET /api/auth/me` - Usuario actual (auth requerido) - `GET /api/auth/check-first-user` - Verificar si existe primer usuario ### Stats - `GET /api/stats` - Estadísticas globales (total news, feeds, users, hoy/semana/mes) - `GET /api/categories` - Listar categorías - `GET /api/countries` - Listar países con continentes ### WebSocket - `GET /ws/worker` - Conexión de remote workers (protocolo de autenticación con API key) --- ## 🗄️ Esquema de Base de Datos (Tablas Principales) - **noticias**: Artículos RSS (titulo, resumen, url, feed_id, categoria_id, pais_id, lang) - **feeds**: Fuentes RSS (nombre, url, activo, ultimo_fetch) - **traducciones**: Traducciones (noticia_id, lang_from, lang_to, titulo_trad, resumen_trad, status, vectorized) - **tags**: Entidades (valor, tipo: persona/organizacion/lugar/tema, wiki_summary, wiki_url, image_path) - **tags_noticia**: Relación noticia-tag (traduccion_id, noticia_id, tag_id) - **entity_aliases**: Alias de entidades (canonical_name, alias, tipo) - **categorias**: Categorías de noticias - **paises**: Países con continentes - **related_noticias**: Noticias relacionadas (traduccion_id, related_traduccion_id, score) - **traduccion_embeddings**: Embeddings en BD (traduccion_id, model, embedding) - **users**: Usuarios (email, username, password_hash, is_admin) - **config**: Configuración del sistema (translator_type, translator_workers, translator_status) - **remote_workers**: Workers remotos (name, api_key, capabilities, status, last_seen) - **favoritos**: Noticias favoritas de usuarios - **search_history**: Historial de búsquedas --- ## ⚙️ Guía de Configuración ### 1. Requisitos de Hardware * **Modo Básico (CPU)**: 4+ Cores CPU, 8GB RAM. * **Modo Avanzado (IA)**: NVIDIA GPU con 8GB+ VRAM (mínimo recomendado para LLM y Traducción GPU). ### 2. Instalación Rápida con Seguridad Automática #### Opción A: Despliegue con Validación Automática (RECOMENDADO) ```bash # Paso 1: Clonar el proyecto git clone cd rss2 # Paso 2: Generar credenciales seguras automáticamente ./pre-deploy.sh --generate # Paso 3: Validar y desplegar ./pre-deploy.sh # Paso 4: Si eliges opción 2 en el prompt, despliega manualmente docker compose up -d ``` **Ventajas:** - ✅ Genera credenciales seguras de 32 caracteres - ✅ Valida que no haya contraseñas por defecto - ✅ Muestra resumen de credenciales en consola - ✅ Automático y seguro para producción #### Opción B: Despliegue Manual (Para desarrolladores) ```bash git clone cd rss2 # Generar credenciales manualmente ./generate_secure_credentials.sh # Copiar credenciales a .env cp .env.generated .env # Desplegar docker compose up -d ``` --- ## 🔐 Despliegue con Seguridad Automática (RECOMENDADO) ### 🛡️ Sistema de Validación Pre-Despliegue RSS2 incluye `pre-deploy.sh`, un script inteligente que se ejecuta **antes** de `docker compose` para: 1. ✅ **Validar credenciales**: Asegura que `POSTGRES_PASSWORD`, `REDIS_PASSWORD`, `DB_PASS` estén definidas 2. ✅ **Generar automáticamente**: Crea credenciales seguras de 32 caracteres si faltan 3. ✅ **Prevenir errores**: Evita que los WARN de Docker por variables vacías 4. ✅ **Mostrar resumen**: Te muestra todas las credenciales en consola ### 🚀 Despliegue Rápido y Seguro (3 Comandos) ```bash # 1. Generar credenciales seguras automáticamente ./pre-deploy.sh --generate # 2. Validar y desplegar (elige opción 2 para despliegue manual) ./pre-deploy.sh # 3. Alternativa: Despliegue manual después de validar ./pre-deploy.sh # ← Elige "2) Solo validar y salir" docker compose up -d ``` **Flujo recomendado:** ```bash ./pre-deploy.sh --generate # Genera .env con credenciales seguras ./pre-deploy.sh # Valida y te pregunta si quieres desplegar # Si eliges "2): Solo validar", luego: docker compose up -d # Despliega manualmente ``` ### 📋 Opciones del Script `pre-deploy.sh` ```bash # Validar credenciales existentes ./pre-deploy.sh # Generar credenciales seguras automáticamente ./pre-deploy.sh --generate # Saltar validación (NO RECOMENDADO para producción) ./pre-deploy.sh --skip # Ver ayuda ./pre-deploy.sh --help ``` **Salida típica del script:** ``` ╔═══════════════════════════════════════════════════════════╗ ║ 🔐 Pre-Deploy Security Check - RSS2 Platform ║ ╚═══════════════════════════════════════════════════════════╝ ✅ Archivo .env encontrado ✅ DEFINIDO: POSTGRES_PASSWORD=8x7f2k9m4p1q3w5e ✅ DEFINIDO: REDIS_PASSWORD=a9b8c7d6e5f4g3h2 ✅ DEFINIDO: DB_PASS=8x7f2k9m4p1q3w5e 📋 Resumen de Credenciales Activas POSTGRES_PASSWORD: ✓ REDIS_PASSWORD: ✓ DB_PASS: ✓ ✅ VALIDACIÓN COMPLETADA - LISTO PARA DESPLEGAR ``` ### 🔒 Variables Críticas que Requieren Contraseñas | Variable | Descripción | Uso | |----------|-------------|-----| | `POSTGRES_PASSWORD` | Contraseña de PostgreSQL | Base de datos | | `REDIS_PASSWORD` | Contraseña de Redis | Cache y colas | | `DB_PASS` | Contraseña para workers | Conexiones de workers | | `SECRET_KEY` | Key secreta de la aplicación | JWT, encriptación | | `GRAFANA_PASSWORD` | Contraseña de Grafana | Dashboard de monitoring | --- ### 3. Escalado de Workers GPU (¡Importante!) #### 🚀 Workers de Traducción GPU Multi-Instancia RSS2 soporta múltiples workers de traducción ejecutándose en paralelo utilizando GPUs, lo que acelera significativamente el proceso de traducción masiva. **Arquitectura Multi-Worker:** - Cada worker es una instancia independiente del servicio `ctranslator_worker` - Los workers compiten automáticamente por las traducciones pendientes usando `SELECT ... FOR UPDATE SKIP LOCKED` - Cada worker procesa su propio lote (batch) de traducciones sin bloquearse mutuamente - Soporta hasta 8 workers simultáneos (configurable vía panel admin) **Requisitos GPU:** ```bash # Verificar GPU disponibles nvidia-smi # Instalar drivers NVIDIA (si no los tienes) # Ubuntu/Debian: sudo apt-get update sudo apt-get install -y nvidia-driver-535 ``` **Despliegue con Múltiples Workers GPU:** ```bash # Opción 1: Desplegar 1 worker GPU (mínimo recomendado) docker compose up -d --scale translator-gpu=1 # Opción 2: Desplegar 2 workers GPU (recomendado: 16GB+ VRAM total) docker compose up -d --scale translator-gpu=2 # Opción 3: Desplegar 4 workers GPU (requiere: 32GB+ VRAM total) docker compose up -d --scale translator-gpu=4 # Opción 4: Combinar CPU y GPU # 2 workers CPU + 2 workers GPU docker compose up -d --scale translator=2 --scale translator-gpu=2 ``` **Panel de Administración:** Desde `/admin/settings`, puedes: - Activar modo GPU (CUDA) o CPU - Configurar número de workers (1-8) - Iniciar/detener workers automáticamente **Configuración de GPU por Worker:** Cada worker GPU está configurado con: - `CT2_DEVICE=cuda` - Usa dispositivos CUDA - `CT2_COMPUTE_TYPE=float16` - Precisión mixta para velocidad - `TRANSLATOR_BATCH=128` - Tamaño de lote optimizado - `PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512` - Gestión de memoria PyTorch - `NCCL_DEBUG=INFO` - Debug de comunicación multi-GPU **Monitorización:** ```bash # Ver estado de workers docker compose --profile gpu ps translator-gpu # Ver uso de GPU watch -n 1 nvidia-smi # Ver logs en tiempo real docker compose logs -f translator-gpu # Métricas en Grafana # Dashboard: Translation Workers # Métricas: translator_*_transitions_per_minute ``` **Performance Esperada:** | Workers GPU | VRAM Total | Tasa de Traducción | |-------------|------------|-------------------| | 1 worker | 8GB+ | ~500 traducciones/min | | 2 workers | 16GB+ | ~1000 traducciones/min | | 4 workers | 32GB+ | ~2000 traducciones/min | | 8 workers | 64GB+ | ~4000 traducciones/min | --- ## 🛡️ Administración y Mantenimiento ### Copias de Seguridad (Backups) Desde el panel de Administración (`/admin/settings`), puedes realizar: **Backup Completo (SQL):** - Descarga un archivo `.sql` con todo el contenido de la base de datos - Incluye: noticias, feeds, traducciones, usuarios, etiquetas, favoritos, videos, eventos, historial de búsqueda - Formato: PostgreSQL custom format con datos y estructura - Tamaño típico: 10-100MB dependiendo del volumen de datos **Backup de Noticias (ZIP):** - Genera un archivo comprimido `.zip` con: - Tabla `noticias` (artículos completos) - Tabla `traducciones` (todas las traducciones) - Tablas `tags` y `tags_noticia` (metadatos y relaciones) - Ideal para: Migraciones de contenido, exportación de datos, backup ligero - Tamaño típico: 5-50MB (solo contenido de noticias) ### Variables de Entorno Clave (`.env`) | Variable | Descripción | |----------|-------------| | `WIKI_SLEEP` | Tiempo de espera entre peticiones a Wikipedia (evita bloqueos). | | `SCHEDULER_BATCH`| Cantidad de noticias a enviar a traducir por ciclo. | | `TARGET_LANGS` | Idiomas destino (ej: `es`). | | `OLLAMA_URL` | URL del servidor Ollama para categorización. | --- ## 🎯 Descripción de Workers ### rss-ingestor-go Crawler RSS de alto rendimiento escrito en Go. Gestiona hasta 100 workers paralelos para procesar múltiples feeds simultáneamente. Detecta nuevos artículos, extrae metadatos básicos y los inserta en la base de datos. ### scraper (Go) Scraper profundo que: - Descarga el contenido completo de URLs de artículos - Sanitiza HTML removiendo scripts y estilos - Extrae texto limpio del body - Limita el contenido a 20 noticias por ciclo para evitar sobrecarga ### discovery (Go) Agente de descubrimiento de feeds que: - Analiza URLs proporcionadas para detectar feeds RSS/Atom - Soporta hasta 5 feeds por URL - Ejecuta cada 900 segundos (15 minutos) ### translator (Python/CTranslate2) Worker de traducción neuronal: - Modelo: facebook/nllb-200-distilled-600M convertido a CTranslate2 - Dispositivo: CPU (int8) - Batch: 32 traducciones por ciclo - Locking: `FOR UPDATE SKIP LOCKED` para evitar procesamiento duplicado - Soporta múltiples idiomas fuente ### translator-gpu (Python/CTranslate2) Versión acelerada por GPU del translator: - Dispositivo: CUDA - Compute type: float16 - Batch: 128 traducciones por ciclo - Ideal para procesamiento de alto volumen ### remote-translator (Python) Worker remoto conectado vía WebSocket: - Autenticación con API key - Conexión a `ws://backend-go:8080/ws/worker` - Modelo: facebook/nllb-200-1.3B (más grande) - GPU requerida ### langdetect (Python) Detector de idioma: - Usa biblioteca `langdetect` - Proceso: 1000 noticias por ciclo - Establece lang_from para correcto routing a traducción ### ner (Python/spaCy) Extracción de entidades nombradas: - Modelo: es_core_news_lg - Tipos: PERSON (persona), ORG (organizacion), LOC/GPE (lugar) - También extrae topics (noun-chunks) - Configurable via entity_config.json (blacklist, synonyms) ### embeddings (Python) Generador de embeddings para búsqueda semántica: - Modelo: paraphrase-multilingual-MiniLM-L12-v2 - Dispositivo: GPU (cuda) - Genera vectores de 384 dimensiones - Alimenta Qdrant ### qdrant-worker (Go) Worker de vectorización Qdrant: - Conecta a Qdrant (puerto 6333) - Genera embeddings via Ollama (mxbai-embed-large) - Sube puntos a collection "news_vectors" - Actualiza estado en BD (vectorized=true) ### related (Go) Detector de noticias relacionadas: - Usa similitud coseno entre embeddings - Almacena top-k relaciones en tabla related_noticias - Soporta configuración de threshold mínimo ### wiki-worker (Go) Enriquecedor de Wikipedia: - Descarga summaries de Wikipedia API - Descarga thumbnails de imágenes - Almacena en `./data/wiki_images` - Evita rate limiting con WIKI_SLEEP ### llm-categorizer (Python) Categorizador con LLM: - Conexión a Ollama - Usa modelo Mistral para clasificación - Procesa 10 noticias por batch ### cluster (Python) Agrupador de noticias por eventos: - Usa embeddings paraphrase-multilingual-MiniLM-L12-v2 - Threshold: 0.35 de distancia - Agrupa noticias similares ### translation-scheduler (Python) Creador de tareas de traducción: - Query: noticias sin traducción al español - Crea entradas en tabla traducciones - Batch: 1000 por ciclo - Ciclo: 30 segundos --- ## 📖 Documentación de la API (Campos Wikipedia) Las respuestas de noticias ahora incluyen el objeto `entities` enriquecido: ```json { "id": 67449, "titulo": "...", "entities": [ { "valor": "Apple", "tipo": "organizacion", "wiki_summary": "Apple Inc. es una empresa estadounidense...", "wiki_url": "https://es.wikipedia.org/wiki/Apple", "image_path": "/api/wiki-images/wiki_5723.png" } ] } ``` --- ## 🧪 Testing ### Backend (Go) ```bash cd backend && go test ./internal/handlers -v -run TestLogin cd backend && go test ./internal/auth -v -run TestGenerateToken ``` ### Frontend ```bash cd frontend && npm run test:ui ``` --- ## 📁 Estructura de Archivos del Proyecto ``` rss2/ ├── backend/ # API REST Go (Gin) ├── frontend/ # Interfaz React + TypeScript ├── workers/ # Workers Python ├── rss-ingestor-go/ # Crawler RSS Go ├── docker-compose.yml # Orquestación ├── nginx.conf # Config Nginx ├── monitoring/ # Prometheus + Grafana ├── init-db/ # Migraciones SQL ├── data/ # Datos persistentes ├── models/ # Modelos ML ├── hf_cache/ # Cache HuggingFace ├── pre-deploy.sh # Script seguridad ├── generate_secure_credentials.sh └── AGENTS.md # Guía desarrollo ``` --- **RSS2** - *Transformando noticias en inteligencia con IA localizada.*