📌 Versión 2.1 - Blueprint Técnico Real
Este README es el punto de entrada oficial para el equipo. Refleja la arquitectura confirmada por los Leads de Backend y Data Science.
Nota importante: Solo los scripts de testing están enmain. El desarrollo activo ocurre en las ramasfeature/.
EquineLead es una plataforma MVP diseñada para ayudar a empresas de la industria ecuestre a identificar, calificar y convertir leads de alto valor utilizando estrategias de crecimiento basadas en datos.
La plataforma se enfoca en transformar visitantes casuales en leads calificados B2C y B2B a través de análisis de sentimiento, scoring de leads, automatización y APIs backend.
Las empresas en el nicho ecuestre tienen dificultades para identificar y capturar leads de alto valor.
La industria está altamente fragmentada, lo que hace costoso e ineficiente llegar a:
- Propietarios individuales (B2C)
- Gerentes de establos, mayoristas y proveedores de servicios (B2B)
Construir un MVP de Motor de Crecimiento que convierta tráfico anónimo en leads calificados para productos de alto valor como:
- Caballos de $50,000 USD
- Monturas de $2,000 USD
- Servicios y eventos ecuestres
- Sistema de captura de leads (formularios, tracking)
- Análisis de sentimiento y detección de intención
- Motor de scoring de leads
- Lógica de embudo automatizada
- APIs backend
- Scraping de datos (opcional)
- Dashboard de analíticas básico
- Automatización CI/CD
💡 Nota: Esta arquitectura representa el diseño planificado. Algunos componentes están en desarrollo.
graph TB
subgraph "Capa de Cliente"
WEB[Dashboard Web<br/>React + Node.js 18]
MOBILE[App Móvil<br/>Android Kotlin]
LANDING[Landing Page<br/>Formularios de Captura]
end
subgraph "Servicios Backend MVP"
BACKEND[API Backend<br/>.NET 8.0<br/>Entrada + Lógica de Negocio]
ML[Servicio ML<br/>Python 3.12.3<br/>FastAPI]
SCRAPPER[Servicio Scrapper<br/>Rust 1.75.0<br/>Recolección de Datos]
end
subgraph "Capa de Datos"
DB[(PostgreSQL<br/>Base de Datos Principal)]
CACHE[(Redis<br/>Capa de Caché)]
end
subgraph "CI/CD"
JENKINS[Jenkins<br/>Instancia OCI]
DOCKER[Docker Registry]
end
WEB --> BACKEND
MOBILE --> BACKEND
LANDING --> BACKEND
SCRAPPER --> BACKEND
BACKEND --> ML
ML --> BACKEND
BACKEND --> DB
BACKEND --> CACHE
JENKINS --> DOCKER
DOCKER --> BACKEND
DOCKER --> ML
DOCKER --> SCRAPPER
style WEB fill:#4CAF50,stroke:#2E7D32,color:#fff
style MOBILE fill:#4CAF50,stroke:#2E7D32,color:#fff
style BACKEND fill:#2196F3,stroke:#1565C0,color:#fff
style ML fill:#FF9800,stroke:#E65100,color:#fff
style SCRAPPER fill:#9C27B0,stroke:#6A1B9A,color:#fff
style DB fill:#F44336,stroke:#C62828,color:#fff
style JENKINS fill:#607D8B,stroke:#37474F,color:#fff
💡 Nota: Para el MVP, el API Backend absorbe el rol de puerta de entrada (API Gateway). No existe un Gateway separado.
- Dashboard Web: Interfaz de analíticas basada en React — Ronald
- App Móvil (Android): App para agentes CRM y supervisores — Franklin
- Landing Page: Formularios de captura de leads
- API Backend (.NET 8.0): Punto de entrada único + lógica de negocio. Recibe leads del scrapper, llama al servicio ML para scoring y persiste resultados en DB — Junior
- Servicio ML (Python 3.12.3 / FastAPI): Calcula el score del lead y devuelve clasificación (Cold/Warm/Hot) al Backend — Leandro + David Alejandro
- Scrapper (Rust 1.75.0): Extrae leads de fuentes públicas y los envía al API Backend — Jorge
- PostgresSQL 15: Base de datos principal. C# es el único dueño de la persistencia.
- Nota técnica: Se utiliza un Volumen de Docker (
postgres_data) para asegurar que los datos persistan en el disco duro del servidor (AWS o Local) incluso si el contenedor se recrea.
- Nota técnica: Se utiliza un Volumen de Docker (
Para evitar el patrón de "Monolito Distribuido", el sistema sigue estas reglas:
- Single Source of Truth: Solo el Backend C# tiene credenciales y acceso a la base de datos.
- Stateless Brain: El servicio de Data Science (Python) no guarda ni lee de la base de datos. Recibe datos vía JSON, calcula el score y devuelve el resultado.
- Persistencia Centralizada: El Backend C# es el encargado de recibir la respuesta de Python y persistirla en Postgres.
- Jenkins: Testing automático y validación de PRs — Diego
- Docker: Containerización de todos los servicios 💡
✅ = Verificado desde configuraciones de testing
💡 = Sugerido basado en mejores prácticas
⚠️ Tecnologías Pendientes de Confirmación:
Las tecnologías marcadas con 💡 son propuestas técnicas que el equipo aún no ha confirmado oficialmente. Estas representan un primer vistazo de la arquitectura planificada.
- Runtime: .NET 8.0 ✅ (SDK 8.0.407)
- Framework: ASP.NET Core 8.0 💡 (pendiente de confirmación)
- ORM: Entity Framework Core 8.0 💡 (pendiente de confirmación)
- Documentación API: Swagger/OpenAPI 💡 (pendiente de confirmación)
- Testing: xUnit 2.4.2 ✅
- Runtime: Python 3.12.3 ✅
- Framework API: FastAPI ✅
- Modelo de Scoring: Basado en Reglas (Rule-Based) ✅ (Lógica: I + B + T - P)
- Análisis de Sentimiento: BERT (Integración planeada) 💡
- Testing: pytest 7.4+ ✅
- Lenguaje: Rust 1.75.0 ✅ (Edition 2021)
- Runtime Async: tokio 💡 (pendiente de confirmación)
- Cliente HTTP: reqwest 💡 (pendiente de confirmación)
- Parsing HTML: scraper 💡 (pendiente de confirmación)
- Testing: Framework de testing integrado de Rust ✅
- Runtime: Node.js 20.x (LTS) ✅
- Framework: React 18.2+ 💡 (pendiente de confirmación)
- Gestión de Estado: Redux Toolkit 💡 (pendiente de confirmación)
- Librería UI: Material-UI (MUI) 5.0+ 💡 (pendiente de confirmación)
- Build Tool: Vite 4.0+ 💡 (pendiente de confirmación)
- Testing: Jest 29.5.0 ✅ + React Testing Library 14.0.0 ✅
- iOS: Swift 5.9+ 💡 (SwiftUI) (pendiente de confirmación)
- Android: Kotlin 1.9+ 💡 (Jetpack Compose) (pendiente de confirmación)
- Testing: XCTest (iOS), JUnit (Android) 💡 (pendiente de confirmación)
- Base de Datos Principal: PostgreSQL 15+ ✅ (Esquema v2 Confirmado)
- Caché: Redis 7.0+ 💡 (Visión Futura — Fase 3. No implementado. No necesario para el MVP. Evaluar cuando supere 1.000 requests/min concurrentes)
- Cola de Mensajes: RabbitMQ 3.12+ 💡 (Visión Futura — Fase 3. No implementado. Necesario recién cuando el Scrapper Rust procese miles de leads/hora. La instancia t3.small de 2GB no soporta este servicio adicional)
- CI/CD: Jenkins ✅ (Java 21, IP:
129.151.114.218en OCI) - App Server: AWS
t3.small✅ (2GB RAM + 4GB Swap, IP:44.202.43.214) - Memoria Virtual: Swap File 4GB ✅ (configurado en el App Server AWS)
- Containerización: Docker + Docker Compose ✅ (instalado en App Server)
- Orquestación:
docker-compose.yml(raíz del proyecto) ✅ - IaC: Terraform ✅ (en uso activo — OCI para Jenkins, AWS para App Server)
- Nube:
- OCI (Jenkins) ✅
- AWS us-east-1 (App Server Plan B) ✅
- Control de Versiones: Git + GitHub
- Calidad de Código: ESLint, Prettier (Frontend), dotnet format (Backend)
- Testing de API: Postman, Thunder Client
💡 Nota: Este esquema representa el diseño planificado de la base de datos. La implementación está en desarrollo.
erDiagram
Leads ||--o{ LeadInteractions : registra
Leads ||--|| LeadScores : posee
Leads {
INT id PK
VARCHAR email
VARCHAR name
TIMESTAMP_TZ created_at
}
LeadInteractions {
INT id PK
INT lead_id FK
INT interaction_type_id
JSONB metadata
TIMESTAMP_TZ interaction_date
}
LeadScores {
INT id PK
INT lead_id FK
INT score_value
INT classification_id
TIMESTAMP_TZ updated_at
}
| Tabla | Propósito | Campos Clave |
|---|---|---|
Leads |
Almacenar leads capturados | email, name, status, created_at |
InteractionTypes |
Catálogo maestro de tipos de interacción | id, description (INT mapping) |
LeadInteractions |
Historial completo de actividad del lead | lead_id, type_id, metadata, interaction_date |
LeadScoreClassifications |
Catálogo maestro de estados (1-Cold, 2-Warm, 3-Hot) | id, description |
LeadScores |
Almacenamiento del scoring vigente por lead | lead_id, value, classification_id |
| Valor INT | Clasificación | Significado |
|---|---|---|
| 1 | Cold | Bajo interés inicial / Inactivo |
| 2 | Warm | Interés moderado / Nutrición |
| 3 | Hot | Alta intención de compra / Urgente |
📖 Diccionario de Datos: docs/database/especificacion-tecnica-db-v2.md
💡 Nota: Estos endpoints representan el diseño de API planificado. La implementación está en desarrollo.
URL Base (App Server): http://44.202.43.214:8000 (AWS Plan B activo — Ver Terraform outputs)
URL Base (Local): http://localhost:5286
POST /api/users # Recibir nuevo lead desde el scrapper
GET /api/leads # Listar leads con score (paginado)Pendientes de implementar luego
GET /api/leads/{id} # Obtener lead por id
PUT /api/leads/{id} # Actualizar lead
DELETE /api/leads/{id} # Eliminar lead💡 Nota: Endpoints en definición por Junior (Contrato 2 pendiente). Ver:
docs/meetings/2026-02-19-flujo-pipeline-narrado.md
Ejemplo de Request:
POST /api/leads
{
"email": "cliente@example.com",
"phone": "+1234567890",
"name": "Juan Pérez",
"source": "landing_page",
"metadata": {
"interest": "horse_purchase",
"budget": "50000"
}
}Ejemplo de Response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "cliente@example.com",
"status": "new",
"created_at": "2026-02-12T06:30:00Z",
"score": null
}POST /api/leads/{id}/score # Calcular score de lead
GET /api/leads/{id}/score # Obtener score actualEjemplo de Response:
{
"lead_id": "550e8400-e29b-41d4-a716-446655440000",
"score": 87,
"category": "hot",
"confidence": 0.92,
"features": {
"engagement_score": 85,
"budget_match": 95,
"intent_score": 82
}
}URL Base (App Server): http://44.202.43.214:8090 (AWS Plan B activo)
URL Base (Local): http://localhost:8090
POST /api/sentiment/analyze # Analizar sentimiento de textoEjemplo de Request:
POST /api/sentiment/analyze
{
"text": "Estoy muy interesado en comprar un caballo de alto rendimiento",
"language": "es"
}Ejemplo de Response:
{
"sentiment": "positive",
"score": 0.89,
"confidence": 0.94,
"model": "bert-base-spanish-wwm-cased"
}POST /api/leads/predict # Predecir score de leadEjemplo de Request:
POST /api/leads/predict
{
"features": {
"page_views": 15,
"time_on_site": 420,
"interactions": 5,
"budget_range": "50000-100000",
"sentiment_avg": 0.85
}
}Ejemplo de Response:
{
"predicted_score": 87,
"category": "hot",
"probability": {
"hot": 0.87,
"warm": 0.11,
"cold": 0.02
}
}📖 Contrato Técnico Scoring: docs/data-contracts/contrato-json-scoring-v1.md
💡 Nota: Esta configuración de seguridad representa las mejores prácticas planificadas. La implementación está en desarrollo.
- Método: JWT (JSON Web Tokens)
- Expiración de Token: 1 hora (access token), 7 días (refresh token)
- Header:
Authorization: Bearer <token>
Ejemplo:
GET /api/leads
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...- iOS/Android: OAuth 2.0 con PKCE
- Biométrico: Face ID / Touch ID / Fingerprint
- En Tránsito: TLS 1.3 (HTTPS)
- En Reposo: Encriptación transparente de datos PostgreSQL
- Campos Sensibles: Encriptación AES-256 para PII
- Desarrollo Local: Archivos
.env(¡nunca commitear!) - Producción: Oracle Cloud Secrets Manager
- CI/CD: Almacén de credenciales de Jenkins
- ✅ Rate limiting en todos los endpoints de API
- ✅ Validación y sanitización de inputs
- ✅ Prevención de inyección SQL (queries parametrizadas)
- ✅ Protección XSS
- ✅ Configuración CORS
- ✅ Auditorías de seguridad regulares
💡 Nota: Estas configuraciones representan el setup planificado. Los valores específicos se definirán durante la implementación.
Crear archivo .env en src/backend-csharp/:
# Base de Datos
DATABASE_URL=postgresql://user:password@localhost:5432/equinelead
DATABASE_POOL_SIZE=20
# Caché Redis
REDIS_URL=redis://localhost:6379
REDIS_TTL=3600
# Autenticación JWT
JWT_SECRET=your-super-secret-key-change-in-production
JWT_ISSUER=equinelead-api
JWT_AUDIENCE=equinelead-clients
JWT_EXPIRY_MINUTES=60
# Servicios Externos
ML_SERVICE_URL=http://localhost:8090
SCRAPPER_SERVICE_URL=http://localhost:8081
# RabbitMQ
RABBITMQ_URL=amqp://guest:guest@localhost:5672
# Logging
LOG_LEVEL=Information
SENTRY_DSN=https://your-sentry-dsn@sentry.io/projectCrear archivo .env en src/data-science/:
# Base de Datos
DATABASE_URL=postgresql://user:password@localhost:5432/equinelead
# Caché Redis
REDIS_URL=redis://localhost:6379
# Modelos ML
MODEL_PATH=/models
SENTIMENT_MODEL=bert-base-spanish-wwm-cased
SCORING_MODEL=lead_scoring_rf_v1.pkl
# Configuración API
API_HOST=0.0.0.0
API_PORT=8090
API_WORKERS=4
# Logging
LOG_LEVEL=INFOCrear archivo .env en src/scrapper-rust/:
# Base de Datos
DATABASE_URL=postgresql://user:password@localhost:5432/equinelead
# RabbitMQ
RABBITMQ_URL=amqp://guest:guest@localhost:5672
QUEUE_NAME=scrapper_tasks
# Configuración de Scrapping
USER_AGENT=EquineLead-Bot/1.0
REQUEST_TIMEOUT=30
MAX_RETRIES=3
RATE_LIMIT_PER_SECOND=5
# Logging
RUST_LOG=infoCrear archivo .env en src/frontend-web/:
# Endpoints API
VITE_API_URL=http://localhost:8000/api
VITE_ML_API_URL=http://localhost:8090/api
# Autenticación
VITE_AUTH_DOMAIN=auth.equinelead.com
VITE_AUTH_CLIENT_ID=your-client-id
# Analytics
VITE_GA_TRACKING_ID=UA-XXXXXXXXX-X
VITE_SENTRY_DSN=https://your-sentry-dsn@sentry.io/project
# Feature Flags
VITE_ENABLE_ANALYTICS=true
VITE_ENABLE_CHAT=false- Nunca commitear archivos
.env- Ya están en.gitignore - Usar secrets diferentes para dev/staging/producción
- Rotar secrets regularmente (cada 90 días)
- Usar contraseñas fuertes - Mínimo 32 caracteres para producción
📖 Ver configuración completa: docs/environment-setup.md (documento aún no implementado)
equine-lead/
├── ci-cd/ # 🤖 Automatización y Despliegue Continuo
│ ├── jenkins/ # Configuraciones y pipelines para Jenkins
│ └── README.md # Guía maestra de DevOps
├── docs/ # 📚 Documentación técnica y de negocio
│ ├── database/ # Esquema DB, SQL y Diagramas v2
│ ├── data-contracts/ # Contratos JSON y Notas de Diseño DS
│ ├── guides/ # 📖 Guías operativas y estándares
│ │ ├── DEVELOPER_ONBOARDING.md # 🎓 Guía de onboarding para developers
│ │ ├── DOCUMENTATION_FLOW.md # 📊 Mapa de navegación de documentación
│ │ └── GIT_WORKFLOW.md # 🔄 Guía de flujo de Git
├── infrastructure/ # 🏗️ Configuración de la Nube (Oracle Cloud)
│ ├── terraform/ # Infraestructura como código (IaC)
│ └── docker/ # Configuración de servicios en contenedores
├── src/ # 💻 Código fuente de componentes
│ ├── backend-csharp/ # API Backend en C# (.NET 8.0)
│ ├── data-science/ # Modelos ML y análisis (Python 3.12.3)
│ ├── scrapper-rust/ # Servicio de scraping (Rust 1.75.0)
│ ├── frontend-web/ # Dashboard web (React + Node.js 18)
│ └── mobile-apps/ # Apps móviles (iOS Swift, Android Kotlin)
├── tests/ # 🧪 Infraestructura de Testing
│ ├── scripts/ # Scripts de automatización de tests
│ ├── backend-csharp/ # Tests del Backend
│ ├── data-science/ # Tests de ML/IA
│ ├── scrapper-rust/ # Tests del Scrapper
│ ├── frontend-web/ # Tests del Frontend
│ └── README.md # Guía completa de testing
└── README.md # 📖 Este archivo (Hub de documentación)- DevOps Lead: Diego Zapata Salhuana
- Backend Developer (.NET): Junior
- Backend DB: Isabel
- Data Scientist / FastAPI: Leandro + David Alejandro
- Frontend Developer: Franklin y Ronald
- Mobile Developer: Franklin
- Scrapping Engineer: Jorge
- Project Manager: Franklin
- GitHub Manager: Junior
- Guía de Onboarding - Ruta de aprendizaje paso a paso desde cero hasta productividad completa
- Mapa de Documentación - Navegación visual de todos los READMEs y orden de lectura recomendado
- Infrastructure README - Configuración de Oracle Cloud, Terraform, Docker
- CI/CD README - Automatización y procesos de deployment
- Jenkins Pipelines - Configuración detallada de pipelines
- Jenkins Paso a Paso - Guía rápida de configuración y desbloqueo
- Testing README - Guía completa de testing, health checks, y scripts
- Test Scripts - Automatización de tests locales
⚠️ Nota: Los READMEs de componentes individuales están en desarrollo o pendientes de creación. Los enlaces a continuación apuntan a las ubicaciones planificadas.
- Backend C# - API Backend y lógica de negocio (README pendiente)
- Data Science - Modelos ML y análisis de sentimiento (README en desarrollo)
- Scrapper Rust - Servicio de scraping de alto rendimiento (README pendiente)
- Frontend Web - Dashboard y UI web (README pendiente)
- Mobile Apps - Apps iOS y Android (README pendiente)
graph LR
A[Desarrollo Local] --> B[Ejecutar Tests]
B --> C[Push a Feature Branch]
C --> D[Jenkins: Tests Automáticos]
D --> E{Tests Pasan?}
E -->|Sí| F[Merge a Dev]
E -->|No| A
F --> G[Deploy a Staging]
G --> H[QA Manual]
H --> I{Aprobado?}
I -->|Sí| J[Merge a Main]
I -->|No| A
J --> K[Deploy a Producción]
-
Desarrollo Local
git checkout -b feature/nombre-feature # Desarrollar código... -
Testing Local
./tests/scripts/run_all_tests.sh
-
Push y PR
git push origin feature/nombre-feature # Crear Pull Request en GitHub -
CI/CD Automático
- Jenkins ejecuta tests automáticamente
- Reporta resultados en el PR
- Merge solo si todos los tests pasan
Según tu componente, necesitarás:
- .NET 8.0 SDK (Backend)
- Python 3.12.3 (Data Science)
- Rust 1.75.0 (Scrapper)
- Node.js 20.x (Frontend)
- Docker (Todos)
# 1. Clonar repositorio
git clone <repo-url>
cd equine-lead
# 2. Configurar entorno de testing
./tests/scripts/setup_test_env.sh
# 3. Ejecutar tests para verificar setup
./tests/scripts/run_all_tests.sh
# 4. Configurar tu componente específico
# Ver README de tu componente en src/<componente>/README.md# Todos los tests
./tests/scripts/run_all_tests.sh
# Tests específicos por componente
./tests/scripts/run_backend_tests.sh
./tests/scripts/run_ml_tests.sh
./tests/scripts/run_scrapper_tests.sh
./tests/scripts/run_frontend_tests.sh✅ Completado:
- Health checks para todos los componentes
- Scripts de automatización de tests
- Jenkinsfiles para CI/CD
- Documentación completa de testing
- Configuración de entornos de test
| Tipo | Descripción | Ubicación |
|---|---|---|
| Health Checks | Verificación básica de compilación/ejecución | tests/*/health_* |
| Unit Tests | Tests unitarios de componentes | tests/*/UnitTests/ |
| Integration Tests | Tests de integración entre servicios | tests/*/IntegrationTests/ |
| E2E Tests | Tests end-to-end del flujo completo | tests/e2e/ |
Piensa en EquineLead como un auto de carreras de alta tecnología:
- Testing = Inspección técnica antes de salir a la pista
- Jenkins = Director del taller mecánico que coordina todas las revisiones
- Scripts = Mecánicos automáticos especializados
- Health Checks = Verificación rápida de que el motor enciende
- Unit Tests = Revisión detallada de cada pieza
- Integration Tests = Verificación de que todas las piezas trabajan juntas
- Producción = La pista de carreras donde compites
📖 Ver guía completa: tests/README.md
- Health checks para todos los componentes
- Scripts de automatización de tests
- Jenkinsfiles para pipelines CI/CD
- Documentación completa
- Configuración de entornos
- Backend API (.NET 8.0)
- Servicio ML (Python 3.12.3)
- Scrapper (Rust 1.75.0)
- Frontend Web (React + Node.js 18)
- Apps Móviles (iOS/Android)
- Integración completa de servicios
- Deployment a staging
- QA y testing end-to-end
- Deployment a producción
- Guía de Onboarding - Para nuevos developers
- Mapa de Documentación - Navegación de docs
- Testing Guide - Guía completa de testing
- Infrastructure Guide - Setup de infraestructura
- CI/CD Guide - Automatización y deployment
- DevOps Lead: Diego Zapata Salhuana
- Canal de equipo: [Slack/Discord]
Este proyecto está bajo la Licencia MIT. Puedes ver los términos detallados en el archivo LICENSE
La Licencia MIT permite:
- ✅ Uso comercial
- ✅ Modificación
- ✅ Distribución
- ✅ Uso privado
Condiciones:
- ℹ️ Mantener el aviso de copyright y la licencia en las copias del software.
Última actualización: 2026-02-20
Versión: 2.1 - Blueprint Técnico Real
Estado: Sprint semana 2/4 en progreso — cuello de botella en API Backend (Junior)