Files
SKEEN-Proyecto/hermes/docs/ROADMAP_SKEEN_HERMES.md
Consultoría Alcaraz Salazar a718592291 Initial commit: SKEEN Derma Experts - Sistema Integral de Gestión Clínica
- Frontend React (SKEEN Brand) con Vite, TypeScript, Tailwind
- Frontend Homenest (versión alternativa)
- Módulos Odoo 17 custom (citas, pacientes, monedero, pagos, ventas, inventario, whatsapp)
- WACRM fork (Next.js 16 + Supabase)
- Hermes + Bridge + Skills (Qwen3.6 via Nan Builders)
- Scripts de migración y operación
- Documentación extensiva en docs/
2026-07-20 07:44:23 +00:00

41 KiB

ROADMAP SKEEN Derma Experts: WACRM + Hermes + Odoo

Arquitectura Tecnica Actualizada | Reemplazo Twilio → WACRM | FastAPI → Hermes

Consultoria Alcaraz Salazar, S.A.S. 5 de julio de 2026


Tabla de Contenidos

  1. Comparativa: Arquitectura Original vs Nueva
  2. Arquitectura Detallada con WACRM + Hermes
  3. Stack Tecnologico Actualizado
  4. Estructura de Proyecto Actualizada
  5. Skills de Hermes para SKEEN
  6. Integraciones Detalladas
  7. Configuracion de WACRM
  8. Configuracion de Hermes
  9. Roadmap Actualizado por Fase
  10. Ventajas y Desventajas de esta Arquitectura
  11. Requisitos del Cliente (Actualizados)
  12. Presupuesto de Infraestructura Actualizado

1. Comparativa: Arquitectura Original vs Nueva

1.1 Tabla Comparativa General

Componente Arquitectura ORIGINAL Arquitectura NUEVA (WACRM + Hermes) Justificacion
WhatsApp Gateway Twilio API ($0.005/msg) + webhook custom WACRM + Meta WhatsApp Cloud API directo Sin intermediario, inbox nativo, costo solo Meta fees (~$0.003-0.008/msg)
Inbox / CRM Inbox custom en React (a construir) WACRM shared inbox (listo) Inbox multi-agente con asignacion, notas internas, Kanban pipelines, broadcast — sin desarrollo
Backend IA FastAPI custom + GPT-4o directo Hermes gateway + skills (SKILL.md) Agente autonomo con 25+ tools, memoria persistente SQLite, cron nativo, multi-model, subagentes
Agente "Sofia" API endpoint REST stateless Agente autonomo Hermes con contexto Memoria persistente, proactive (cron), skills modulares, handoff a humano, context compression
Pipelines de ventas A construir en Odoo/Odoo + custom WACRM Kanban pipelines nativos Drag-drop, deals vinculados a conversaciones, win-rate analytics
Base de datos CRM PostgreSQL custom Supabase (PostgreSQL + RLS + Auth) Auth built-in, Row-Level Security, Realtime subscriptions, Storage
Automatizaciones Codigo custom en FastAPI WACRM no-code automations + Hermes skills Visual builder (Figma-like) + agente IA con razonamiento
Broadcasts Twilio API custom WACRM broadcasts con templates Meta Templates aprobados por Meta, delivery tracking, segmentacion
Contactos / Leads Tabla custom en PostgreSQL WACRM contacts + tags + custom fields Deduplicacion automatica, CSV import, tags, campos custom
AI Assistant GPT-4o directo via API WACRM AI Assistant (BYOK) + Hermes skills Draft replies, auto-reply bot, knowledge base, handoff a humano
Costo mensual infra ~$150-250 USD/mes ~$80-150 USD/mes WACRM es MIT (gratis), Hermes es MIT (gratis), solo hosting + API fees
Tiempo de desarrollo inbox ~2 semanas ~0 dias (listo) WACRM inbox funcional dia 1 post-configuracion
Tiempo de desarrollo agente IA ~3 semanas ~1 semana (skills + config) Hermes ya tiene tools, memoria, gateway, cron — solo configurar skills

1.2 Diferencias Clave por Dimension

Dimension Original Nueva Impacto
Complejidad de codigo Alto (inbox + agente + CRM desde cero) Medio (solo skills + integraciones) ~60% menos codigo custom
Mantenimiento Equipo propio mantiene todo Comunidad open-source mantiene WACRM/Hermes Menos deuda tecnica
Escalabilidad Manual WACRM escala con Supabase; Hermes con gateway Mejor arquitectura cloud-native
Vendor lock-in Twilio (API propietaria) Meta Cloud API (estandar) + MIT code Codigo propio, migrable
Onboarding de agentes Desarrollo custom WACRM invita por link, roles nativos Minutos vs dias
Analytics A construir WACRM dashboard real-time nativo Disponible dia 1
Subagentes No disponible Sí — delegacion aislada con terminal propio Tareas paralelas sin costo de contexto
Fallback providers No disponible Sí — cadena de failover automatico Mayor resiliencia
Context compression No disponible Sí nativo — hasta 50% de ventana Manejo de conversaciones largas
Credential pools No disponible Sí — rotacion de API keys Mayor tolerancia a rate limits

1.3 Mapa de Reemplazo de Componentes

Twilio API ──────────────→ Meta WhatsApp Cloud API (via WACRM)
Twilio webhooks ─────────→ WACRM webhooks (/api/v1/webhooks)
Inbox React custom ──────→ WACRM shared inbox (Next.js 16 App Router)
FastAPI backend ─────────→ Hermes gateway (Python daemon)
GPT-4o directo ──────────→ Hermes agent runtime (multi-model + fallback)
PostgreSQL CRM ──────────→ Supabase PostgreSQL + RLS
Automatizaciones code ───→ WACRM no-code automations + Hermes skills + cron
Dashboard analytics ─────→ WACRM dashboard real-time
Contact management ──────→ WACRM contacts + tags + pipelines
OpenClaw gateway ────────→ Hermes gateway (Python, mas plataformas nativas)
OpenClaw heartbeat ───────→ Hermes cron nativo (mas flexible)
OpenClaw skills ─────────→ Hermes skills (compatible agentskills.io)
OpenClaw memory MD ──────→ Hermes SQLite + MEMORY.md + plugins

2. Arquitectura Detallada con WACRM + Hermes

2.1 Diagrama de Componentes Completo

┌─────────────────────────────────────────────────────────────────────────────┐
│                              LAYER: PACIENTE                                │
│  WhatsApp Business (telefono SKEEN) ─── App movil del paciente              │
└─────────────────────────────────────────────────────────────────────────────┘
                                       │
                                       ▼ Meta Cloud API (HTTPS webhook)
┌─────────────────────────────────────────────────────────────────────────────┐
│                           LAYER: WACRM (CRM)                                │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │  WACRM — Next.js 16 + Supabase PostgreSQL                           │    │
│  │  Puerto: 3000 (interno) / HTTPS via Nginx                           │    │
│  │                                                                     │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │ Shared Inbox │  │   Contacts   │  │   Sales Pipelines (Kanban)│  │    │
│  │  │ Multi-agente │  │ + Tags +     │  │   Deals → Conversaciones  │  │    │
│  │  │ Asignacion   │  │ Custom Fields│  │   Win-rate analytics      │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │  Broadcasts  │  │ Automations  │  │   AI Assistant (BYOK)    │  │    │
│  │  │  Templates   │  │   No-code    │  │  OpenAI/Anthropic key    │  │    │
│  │  │  Meta        │  │   Triggers   │  │  Auto-reply + Handoff    │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │    │
│  │  │   Dashboard  │  │    Flows     │  │   Templates Manager      │  │    │
│  │  │  Real-time   │  │  Chatbots    │  │   Meta approval sync     │  │    │
│  │  └──────────────┘  └──────────────┘  └──────────────────────────┘  │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │  API REST PUBLICA: /api/v1                                          │    │
│  │  ├── POST   /messages          (enviar WhatsApp)                    │    │
│  │  ├── GET    /contacts          (listar contactos)                   │    │
│  │  ├── POST   /contacts          (crear/find-or-create)               │    │
│  │  ├── GET    /conversations     (listar conversaciones)              │    │
│  │  ├── GET    /conversations/:id/messages (thread)                    │    │
│  │  ├── POST   /broadcasts        (campaña broadcast)                  │    │
│  │  ├── POST   /webhooks          (registrar webhook outbound)         │    │
│  │  └── GET    /me                (info cuenta + scopes)               │    │
│  │                                                                     │    │
│  │  Webhooks outbound (a Hermes):                                     │    │
│  │  ├── message.received          (nuevo mensaje)                      │    │
│  │  ├── message.status_updated    (delivery/read)                      │    │
│  │  └── conversation.created      (nueva conversacion)                │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
                                       │
                    ┌──────────────────┼──────────────────┐
                    │                  │                  │
                    ▼                  ▼                  ▼
┌───────────────────────┐   ┌─────────────────┐   ┌──────────────────────────┐
│  LAYER: Hermes        │   │ LAYER: Odoo 17  │   │  LAYER: Frontend React   │
│  (Agente IA "Sofia")  │   │  (Backend ERP)  │   │  (app.skeen.mx)          │
│                       │   │                 │   │                          │
│  Gateway Python       │   │  Modulos:       │   │  Dashboard clinicos      │
│  Puerto: 8080 (HTTP)  │   │  ├── Pacientes  │   │  Agenda citas            │
│  + WS API (cron)      │   │  ├── Citas      │   │  Monedero digital        │
│  Daemon (systemd)     │   │  ├── Historial  │   │  Pagos (Stripe/MP)       │
│                       │   │  ├── Inventario │   │  Reportes                │
│  ┌──────────────────┐ │   │  ├── POS        │   │                          │
│  │  Agent Runtime   │ │   │  ├── Monedero   │   │  Auth: Odoo JWT          │
│  │  ├─ SOUL.md      │ │   │  └── Website    │   │  API: Odoo REST +        │
│  │  ├─ AGENTS.md    │ │   │                 │   │       WACRM REST         │
│  │  ├─ SKILL.md (5) │ │   │  API REST XML/   │   │                          │
│  │  ├─ MEMORY.md    │ │   │  JSON (custom)   │   │  Puerto: 5173 (dev)      │
│  │  └─ SQLite state │ │   │                 │   │         80/443 (prod)    │
│  └──────────────────┘ │   └─────────────────┘   └──────────────────────────┘
│                       │
│  ┌──────────────────┐ │
│  │  Cron (nativo)   │ │
│  │  ├─ Recordatorios│ │
│  │  ├─ Follow-ups   │ │
│  │  └─ Re-engagement│ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  Tools Built-in  │ │
│  │  ├─ web_search   │ │
│  │  ├─ web_fetch    │ │
│  │  ├─ exec (python)│ │
│  │  ├─ shell        │ │
│  │  ├─ browser      │ │
│  │  └─ file R/W     │ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  Custom Plugins  │ │
│  │  ├─ odoo_api_call│ │
│  │  ├─ wacrm_send   │ │
│  │  └─ calendar_check│ │
│  └──────────────────┘ │
│                       │
│  ┌──────────────────┐ │
│  │  API Server      │ │
│  │  /v1/chat/completions│ │
│  │  /api/jobs (cron)│ │
│  └──────────────────┘ │
└───────────────────────┘

2.2 Flujo de Datos Paso a Paso

FLUJO 1: Primera vez que un paciente escribe por WhatsApp

[1] Paciente envia "Hola, quiero agendar una cita" por WhatsApp
         │
         ▼
[2] Meta WhatsApp Cloud API recibe el mensaje
         │
         ▼
[3] Meta envia webhook HTTPS a WACRM: POST /api/whatsapp/webhook
         │
         ▼
[4] WACRM procesa:
     - Crea/actualiza contacto (telefono, nombre si disponible)
     - Crea conversacion en inbox
     - Almacena mensaje en Supabase
     - Dispara trigger de automatizacion ("Nuevo mensaje")
         │
         ├──► WACRM AI Assistant (opcional, si auto-reply activo)
         │
         └──► Webhook outbound a Hermes: POST http://hermes:8080/webhook/wacrm
                  │
                  ▼
[5] Hermes Gateway recibe webhook via HTTP endpoint custom
     - Parsea payload: { event: "message.received", data: { from, text, conversation_id } }
     - Inicia/continua sesion para ese contacto (SQLite session store)
     - Inyecta skills relevantes al contexto
         │
         ▼
[6] Hermes Agent Runtime procesa con LLM (GPT-4o):
     - Lee skills: skeen-rag.md (catalogo) + skeen-agendar.md (citas)
     - Detecta intencion: "agendar_cita"
     - Consulta disponibilidad via plugin odoo_api_call
         │
         ▼
[7] Hermes → Odoo API (XML-RPC/JSON-RPC):
     - Consulta slots disponibles del dermatologo
     - Recibe: ["2026-07-05 10:00", "2026-07-05 14:00", "2026-07-06 09:00"]
         │
         ▼
[8] Hermes formatea respuesta y envia a WACRM:
     POST /api/v1/messages
     { "to": "+526641234567", "type": "text",
       "text": "Hola! Soy Sofia de SKEEN. Puedo agendarte para:
               1. Sab 5 jul 10:00 AM
               2. Sab 5 jul 2:00 PM
               3. Dom 6 jul 9:00 AM
               Cual prefieres?" }
         │
         ▼
[9] WACRM envia via Meta Cloud API → WhatsApp → Paciente
         │
         ▼
[10] Respuesta del paciente: "El sabado a las 10"
          │
          └──► Repite [2]→[6], Hermes confirma cita
               └──► Odoo: crea cita + WACRM: envia confirmacion

FLUJO 2: Confirmacion de cita + Recordatorio automatico

[1] Hermes crea la cita en Odoo via odoo_api_call
     - Modelo: salon.booking (o calendar.event)
     - Datos: paciente_id, servicio_id, fecha_hora, estado='confirmada'
         │
         ▼
[2] Hermes programa recordatorio via cron nativo:
     - hermes cron schedule --name "recordatorio-cita-[ID]" \
       --at "2026-07-04 18:00" \
       --command "skill skeen-recordatorios --phone +526641234567 --cita 2026-07-05T10:00"
         │
         ▼
[3] Cron de Hermes ejecuta a la hora programada:
     - Skill skeen-recordatorios se activa
     - Consulta Odoo: citas para manana (5 jul)
     - Para cada cita sin recordatorio enviado:
       └──► WACRM API: POST /api/v1/messages
            { "to": "+526641234567", "type": "template",
              "template": { "name": "recordatorio_cita_skeen",
                            "language": "es_MX",
                            "params": ["Sofia", "5 de julio", "10:00 AM"] } }
         │
         ▼
[4] WACRM envia template aprobado por Meta → WhatsApp → Paciente
     "Hola Sofia! Te recordamos tu cita manana 5 de julio a las 10:00 AM
      en SKEEN Derma Experts. Ubicacion: Blvd. Popotla 123, Rosarito."
         │
         ▼
[5] Odoo marca recordatorio como enviado

FLUJO 3: Pago de cita + Monedero digital

[1] Paciente despues de cita: "Quiero pagar mi tratamiento"
         │
         ▼
[2] WACRM → Hermes (webhook message.received)
         │
         ▼
[3] Hermes skill skeen-pagos.md:
     - Consulta Odoo: citas del paciente + servicios pendientes de pago
     - Calcula total
     - Genera link de pago (Stripe Checkout / MercadoPago preference)
         │
         ▼
[4] Hermes responde via WACRM:
     "Tu tratamiento de Acne Control tiene un saldo de $1,200 MXN.
      Puedes pagar aqui: [Link Stripe] o [Link MercadoPago]
      Tambien acumulas 120 puntos en tu monedero SKEEN!"
         │
         ▼
[5] Paciente paga via Stripe/MP
         │
         ▼
[6] Webhook Stripe/MP → Odoo (confirmacion de pago)
     - Odoo actualiza estado de factura
     - Odoo acumula puntos en monedero del paciente
         │
         ▼
[7] Hermes cron detecta pago confirmado:
     - WACRM: envia confirmacion + saldo de monedero
     "Pago confirmado! Gracias Sofia. Tu monedero SKEEN: 450 puntos
      (equivalente a $450 MXN). Los puedes usar en tu proxima visita."

2.3 Diagrama de Secuencia: Agendar Cita Completa

Paciente          WhatsApp         Meta API        WACRM          Hermes        Odoo
   │                  │                │              │               │             │
   │ "Hola, quiero    │                │              │               │             │
   │  agendar"        │                │              │               │             │
   │─────────────────>│                │              │               │             │
   │                  │                │              │               │             │
   │                  │  Webhook msg   │              │               │             │
   │                  │<───────────────│              │               │             │
   │                  │                │              │               │             │
   │                  │                │  POST /webhook              │             │
   │                  │                │─────────────>│               │             │
   │                  │                │              │  message.received             │
   │                  │                │              │  webhook outbound             │
   │                  │                │              │──────────────>│             │
   │                  │                │              │               │             │
   │                  │                │              │               │ odoo_api_call│
   │                  │                │              │               │ (slots libres)│
   │                  │                │              │               │─────────────>│
   │                  │                │              │               │             │
   │                  │                │              │               │<─────────────│
   │                  │                │              │               │  ["10:00",   │
   │                  │                │              │               │   "14:00"]   │
   │                  │                │              │               │             │
   │                  │                │  POST /api/v1/messages       │             │
   │                  │                │<─────────────│               │             │
   │                  │                │  (WACRM envia opciones)      │             │
   │                  │                │              │               │             │
   │                  │  Template msg  │              │               │             │
   │                  │<───────────────│              │               │             │
   │  "Hola! Opciones:│                │              │               │             │
   │   1. 10:00..."  │                │              │               │             │
   │<─────────────────│                │              │               │             │
   │                  │                │              │               │             │
   │ "Opcion 1"       │                │              │               │             │
   │─────────────────>│                │              │               │             │
   │                  │ ... (mismo flujo) ...          │               │             │
   │                  │                │              │               │             │
   │                  │                │              │               │ odoo_api_call│
   │                  │                │              │               │ (crear cita) │
   │                  │                │              │               │─────────────>│
   │                  │                │              │               │             │
   │                  │                │  POST /api/v1/messages       │             │
   │                  │                │<─────────────│               │             │
   │                  │                │              │               │             │
   │  "Cita confirmada│                │              │               │             │
   │   para 5 jul 10AM│               │              │               │             │
   │   con Dra. Ana"  │                │              │               │             │
   │<─────────────────│                │              │               │             │
   │                  │                │              │               │             │

2.4 Comunicacion entre Componentes

De A Protocolo Auth Payload
Meta API WACRM HTTPS webhook Verify Token HMAC JSON mensaje
WACRM Meta API HTTPS REST Bearer Access Token JSON mensaje/template
WACRM Hermes HTTPS webhook outbound HMAC-SHA256 signature JSON evento
Hermes WACRM HTTPS REST Bearer API Key (wacrm_live_*) JSON mensaje
Hermes Odoo XML-RPC / JSON-RPC / HTTP API Key / OAuth XML/JSON
Odoo Frontend HTTPS REST (CORS) JWT Token JSON
Frontend WACRM HTTPS REST Bearer API Key JSON (dashboard unificado)
Hermes LLM Provider HTTPS SSE/REST Bearer API Key JSON (OpenAI/Anthropic format)
Hermes Hermes API HTTPS REST Bearer Token JSON (OpenAI-compatible)

3. Stack Tecnologico Actualizado

3.1 Tabla Completa de Tecnologias

WACRM (CRM WhatsApp)

Capa Tecnologia Version Proposito Licencia/Costo
Framework Next.js 16 (App Router) SSR + API routes + ISR MIT / Gratis
UI React 19 Componentes interactivos MIT / Gratis
Lenguaje TypeScript 5.x Tipado estatico OSS / Gratis
Estilos Tailwind CSS v4 Utility-first CSS MIT / Gratis
UI Kit shadcn/ui + base-ui latest Componentes accesibles MIT / Gratis
Database Supabase (PostgreSQL) 15+ Datos + Auth + RLS + Realtime OSS Cloud / ~$25/mes
Auth Supabase Auth built-in Email/password + JWT Incluido
Storage Supabase Storage built-in Avatares + media Incluido
WhatsApp Meta Cloud API v18.0+ Mensajeria oficial Meta fees
Encriptacion node:crypto built-in AES-256-GCM tokens built-in

Hermes (Agente IA)

Capa Tecnologia Version Proposito Licencia/Costo
Runtime Python 3.11+ Gateway daemon OSS / Gratis
Package uv / pip latest Gestor de paquetes OSS / Gratis
Gateway hermes-agent 0.14.0+ Gateway HTTP + WS + API MIT / Gratis
Comunicacion HTTP / WebSocket RFC 6455 Gateway ↔ clients built-in
Skills SKILL.md (Markdown) agentskills.io Capacidades del agente MIT / Gratis
Memory SQLite + MEMORY.md - Memoria persistente + FTS5 search File system
Cron hermes cron built-in Tareas programadas built-in
LLM Provider OpenAI GPT-4o latest Modelo principal ~$0.005-0.015/token
Fallback LLM Claude 3.5 Sonnet latest Fallback / tareas complejas ~$0.003-0.015/token
Fallback chain Hermes nativo 0.6.0+ Failover automatico built-in
Local LLM Ollama / LM Studio 0.4+ / 0.12.0+ Desarrollo offline OSS / Gratis
Context compression Hermes nativo built-in Compresion de contexto built-in
Credential pools Hermes nativo 0.7.0+ Rotacion de API keys built-in
Subagentes Hermes delegate built-in Tareas aisladas built-in
API Server OpenAI-compatible 0.4.0+ /v1/chat/completions built-in
TUI Ink (React) 0.11.0+ Interfaz terminal interactiva built-in
Plugins Python files 0.3.0+ Custom tools built-in
MCP Model Context Protocol 0.4.0+ Integracion MCP built-in

Odoo 17 (ERP)

Capa Tecnologia Version Proposito Licencia/Costo
ERP Odoo Community 17.0 Backend negocio completo LGPL / Gratis
Lenguaje Python 3.10+ Logica de servidor OSS
Database PostgreSQL 15+ Datos ERP (compartido con Supabase o separado) OSS
Cache Redis 7.x Cache + sessions + queue BSD / Gratis
Queue Celery + Redis 5.x+ Tareas asincronas OSS

Frontend SKEEN

Capa Tecnologia Version Proposito Licencia/Costo
Framework React 18 UI components MIT / Gratis
Lenguaje TypeScript 5.x Tipado estatico OSS
Build Vite 5.x+ Bundler + dev server MIT / Gratis
Estilos Tailwind CSS v3+ Estilos utility-first MIT / Gratis
Routing React Router v6+ SPA routing MIT / Gratis
HTTP Client Axios 1.6+ Llamadas API MIT / Gratis
Estado Zustand 4.x+ State management MIT / Gratis
Calendario react-big-calendar 1.x+ Vista agenda citas MIT
Charts Recharts 2.x+ Graficos dashboard MIT

Infraestructura

Capa Tecnologia Version Proposito Licencia/Costo
VPS Hetzner Cloud CPX31 4 vCPU / 8 GB / 160 GB SSD ~$15/mes
OS Ubuntu Server 24.04 LTS Sistema operativo Gratis
Proxy Nginx 1.24+ Reverse proxy + SSL + rate limit BSD
SSL Let's Encrypt latest Certificados HTTPS gratis Gratis
Contenedores Docker 25.x+ Container runtime Apache 2.0
Orquestacion Docker Compose 2.24+ Multi-container local Apache 2.0
DNS Cloudflare Free tier DNS + CDN + DDoS protection Gratis
Monitoreo Uptime Kuma 1.x+ Health checks + alerting MIT

Pagos

Capa Tecnologia Version Proposito Costo
Pagos intl Stripe latest Tarjetas internacionales 2.9% + $0.30
Pagos MX MercadoPago latest OXXO, tarjetas MX, SPEI 3.5-4.5%

Desarrollo

Capa Tecnologia Version Proposito Licencia/Costo
Git GitHub - Repositorios + CI/CD Free/Pro
IDE VS Code latest Editor + extensions Gratis
API Testing Postman / Hoppscotch latest Test APIs Gratis
DB Admin pgAdmin / Tableplus latest Admin PostgreSQL Gratis

3.2 Diagrama de Puertos y Servicios

Servicio Puerto Interno Puerto Externo Path Nginx
WACRM (Next.js) 3000 443 /crm/* → localhost:3000
Hermes Gateway 8080 443 /webhook/* → localhost:8080
Hermes API Server 8080 (mismo) - Solo interno (localhost)
Hermes TUI - - Interactivo local
Odoo 8069 443 /odoo/* → localhost:8069
Odoo Longpolling 8072 - Solo interno
Frontend React 5173 (dev) / 80 (prod) 443 / → localhost:80
PostgreSQL 5432 - Solo interno
Redis 6379 - Solo interno
Nginx 80, 443 80, 443 Reverse proxy principal
Uptime Kuma 3001 443 /status → localhost:3001

4. Estructura de Proyecto Actualizada

4.1 Repositorios Git

skeen-derma-experts/                          (organizacion GitHub)
├── wacrm/                                    (fork de ArnasDon/wacrm)
│   ├── src/
│   │   ├── app/
│   │   │   ├── (auth)/                       # login, signup
│   │   │   ├── (dashboard)/                  # UI autenticada
│   │   │   │   ├── dashboard/                # home / metrics
│   │   │   │   ├── inbox/                    # shared inbox
│   │   │   │   ├── contacts/                 # contactos + tags
│   │   │   │   ├── pipelines/                # Kanban deals
│   │   │   │   ├── broadcasts/               # campañas
│   │   │   │   ├── automations/              # flow builder
│   │   │   │   └── settings/                 # perfil / WhatsApp / API keys
│   │   │   ├── api/                          # endpoints server-only
│   │   │   │   ├── whatsapp/webhook/         # inbound desde Meta
│   │   │   │   ├── whatsapp/send/            # outbound a Meta
│   │   │   │   ├── automations/              # engine + cron
│   │   │   │   └── v1/                       # API publica (messages, contacts, etc.)
│   │   ├── components/
│   │   ├── lib/
│   │   │   ├── supabase/                     # client, server, middleware
│   │   │   ├── whatsapp/                     # Meta API client
│   │   │   └── automations/                  # engine, steps, validation
│   │   └── types/
│   ├── supabase/migrations/                  # SQL idempotente
│   ├── .env.local                            # variables de entorno
│   └── package.json
│
├── hermes/                                   # Gateway + Skills SKEEN
│   ├── .hermes/
│   │   ├── config.yaml                       # config principal
│   │   ├── plugins/
│   │   │   ├── odoo_api_call.py              # plugin Odoo XML-RPC
│   │   │   ├── wacrm_send.py                 # plugin WACRM API
│   │   │   └── calendar_check.py             # plugin disponibilidad
│   │   └── workspace/
│   │       ├── AGENTS.md                     # instrucciones operativas
│   │       ├── SOUL.md                       # personalidad "Sofia"
│   │       ├── MEMORY.md                     # memoria persistente
│   │       ├── TOOLS.md                      # notas de tools
│   │       ├── IDENTITY.md                   # nombre/vibe/emoji
│   │       └── USER.md                       # perfil clinica
│   ├── skills/
│   │   ├── skeen-rag/
│   │   │   └── SKILL.md                      # catalogo servicios
│   │   ├── skeen-agendar/
│   │   │   └── SKILL.md                      # agendamiento citas
│   │   ├── skeen-pagos/
│   │   │   └── SKILL.md                      # pagos Stripe/MP
│   │   ├── skeen-monedero/
│   │   │   └── SKILL.md                      # monedero digital
│   │   └── skeen-recordatorios/
│   │       └── SKILL.md                      # recordatorios citas
│   ├── webhooks/
│   │   └── wacrm_webhook_server.py           # servidor HTTP para webhooks WACRM
│   ├── pyproject.toml
│   ├── requirements.txt
│   └── Dockerfile
│
├── odoo-backend/                             # Odoo 17 + modulos custom
│   ├── odoo/
│   │   ├── addons/
│   │   │   ├── skeen_pacientes/              # gestion pacientes
│   │   │   ├── skeen_citas/                  # agendamiento
│   │   │   ├── skeen_monedero/               # monedero digital
│   │   │   ├── skeen_pagos/                  # integracion Stripe/MP
│   │   │   ├── skeen_whatsapp/               # webhook WACRM → Odoo
│   │   │   └── skeen_reportes/               # reportes clinicos
│   │   └── odoo.conf
│   ├── Dockerfile
│   └── docker-compose.yml
│
├── frontend/                                 # React 18 + TypeScript
│   ├── src/
│   │   ├── components/                       # UI components
│   │   ├── pages/                            # vistas (Home, Agenda, Pagos)
│   │   ├── hooks/                            # custom hooks
│   │   ├── services/                         # API clients (Odoo + WACRM)
│   │   ├── store/                            # Zustand state
│   │   └── types/                            # TypeScript types
│   ├── package.json
│   └── Dockerfile
│
└── infra/                                    # Docker Compose completo
    ├── docker-compose.yml                    # orquestacion total
    ├── .env                                  # variables globales
    ├── nginx/
    │   ├── nginx.conf                        # reverse proxy
    │   └── ssl/                              # certificados Let's Encrypt
    ├── scripts/
    │   ├── init-supabase.sh                  # migraciones SQL
    │   ├── setup-wacrm.sh                    # post-install WACRM
    │   └── setup-hermes.sh                   # post-install Hermes
    └── monitoring/
        ├── uptime-kuma/                      # health checks
        └── prometheus/                       # metrics (opcional)

4.2 Estructura de Docker Compose

# infra/docker-compose.yml — Resumen de servicios

services:
  # ── WACRM (CRM WhatsApp) ──────────────────────────────
  wacrm:
    build: ../wacrm/
    ports: ["3000:3000"]
    environment:
      - NEXT_PUBLIC_SUPABASE_URL=${SUPABASE_URL}
      - NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY}
      - SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE}
      - ENCRYPTION_KEY=${WACRM_ENCRYPTION_KEY}
      - WHATSAPP_PHONE_NUMBER_ID=${META_PHONE_ID}
      - WHATSAPP_BUSINESS_ACCOUNT_ID=${META_BUSINESS_ID}
      - WHATSAPP_ACCESS_TOKEN=${META_ACCESS_TOKEN}
      - WHATSAPP_VERIFY_TOKEN=${META_VERIFY_TOKEN}
    depends_on: [postgres, redis]

  # ── Hermes (Agente IA) ──────────────────────────────
  hermes:
    build: ../hermes/
    ports: ["8080:8080"]
    environment:
      - HERMES_MODEL_PROVIDER=openai
      - HERMES_MODEL=gpt-4o
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - ODOO_URL=http://odoo:8069
      - ODOO_DB=skeen
      - ODOO_API_KEY=${ODOO_API_KEY}
      - WACRM_URL=http://wacrm:3000
      - WACRM_API_KEY=${WACRM_API_KEY}
      - HERMES_WEBHOOK_PORT=8080
      - HERMES_API_SERVER_ENABLED=true
      - HERMES_CRON_ENABLED=true
    volumes:
      - hermes_workspace:/root/.hermes/workspace
      - hermes_plugins:/root/.hermes/plugins
      - ./../hermes/skills:/skills:ro
    depends_on: [odoo, wacrm]
    command: ["hermes", "gateway", "start"]

  # ── Odoo 17 (ERP) ─────────────────────────────────────
  odoo:
    build: ../odoo-backend/
    ports: ["8069:8069", "8072:8072"]
    environment:
      - HOST=postgres
      - PORT=5432
      - USER=odoo
      - PASSWORD=${POSTGRES_PASSWORD}
      - DB_NAME=skeen
    volumes:
      - odoo_data:/var/lib/odoo
      - ./../odoo-backend/odoo/addons:/mnt/extra-addons:ro
    depends_on: [postgres, redis]

  # ── Frontend React ────────────────────────────────────
  frontend:
    build: ../frontend/
    ports: ["80:80"]
    depends_on: [odoo, wacrm]

  # ── PostgreSQL ────────────────────────────────────────
  postgres:
    image: postgres:15-alpine
    ports: ["5432:5432"]
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=skeen
    volumes:
      - postgres_data:/var/lib/postgresql/data

  # ── Redis ─────────────────────────────────────────────
  redis:
    image: redis:7-alpine
    ports: ["6379:6379"]
    volumes:
      - redis_data:/data

  # ── Nginx (Reverse Proxy) ─────────────────────────────
  nginx:
    image: nginx:1.24-alpine
    ports: ["443:443"]
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
    depends_on: [wacrm, odoo, frontend, hermes]

  # ── Uptime Kuma ───────────────────────────────────────
  uptime-kuma:
    image: louislam/uptime-kuma:1
    ports: ["3001:3001"]
    volumes:
      - uptime_data:/app/data

volumes:
  hermes_workspace:
  hermes_plugins:
  odoo_data:
  postgres_data:
  redis_data:
  uptime_data:

4.3 Variables de Entorno (.env)

# ============================================================
# INFRA — infra/.env
# ============================================================

# PostgreSQL
POSTGRES_PASSWORD=skeen_postgres_2026_secure
POSTGRES_USER=odoo
POSTGRES_DB=skeen

# Redis
REDIS_PASSWORD=skeen_redis_2026

# WACRM
SUPABASE_URL=http://postgres:5432
SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE=eyJ...
WACRM_ENCRYPTION_KEY=a1b2c3d4e5f6... # 64 chars hex AES-256
META_PHONE_ID=123456789012345
META_BUSINESS_ID=987654321098765
META_ACCESS_TOKEN=EAA...
META_VERIFY_TOKEN=skeen_webhook_verify_2026

# Hermes
OPENAI_API_KEY=sk-proj-...
ANTHROPIC_API_KEY=sk-ant-...
HERMES_MODEL_PROVIDER=openai
HERMES_MODEL=gpt-4o
HERMES_FALLBACK_PROVIDERS=anthropic,openrouter
HERMES_API_SERVER_ENABLED=true
HERMES_CRON_ENABLED=true
HERMES_WEBHOOK_PORT=8080
HERMES_TUI_ENABLED=false
ODOO_API_KEY=skeen_odoo_api_key_2026
WACRM_API_KEY=wacrm_live_xxxxxxxx

# Stripe / MercadoPago
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
MP_ACCESS_TOKEN=TEST-...
MP_PUBLIC_KEY=TEST-...

# Dominio
DOMAIN=skeen.mx
WACRM_SUBDOMAIN=crm.skeen.mx
ODOO_SUBDOMAIN=erp.skeen.mx
APP_SUBDOMAIN=app.skeen.mx
HERMES_SUBDOMAIN=hermes.skeen.mx