rss2/README.md

549 lines
No EOL
20 KiB
Markdown

# 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 <repo_url>
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 <repo_url>
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.*