# Arquitectura T茅cnica - Platform Marketing Content **Versi贸n:** 1.0.0 **Fecha:** 2025-12-08 **Estado:** Propuesta --- ## 1. Visi贸n de Arquitectura ### 1.1 Principios Arquitect贸nicos ```yaml Principios: 1. API-First: Todo servicio expuesto via REST/GraphQL 2. Modular: Componentes desacoplados por dominio 3. Multi-tenant Ready: Aislamiento de datos por tenant 4. Open Source First: Priorizar modelos auto-hosteados 5. Escalabilidad Horizontal: Preparado para m煤ltiples GPUs 6. Event-Driven: Comunicaci贸n as铆ncrona entre servicios ``` ### 1.2 Diagrama de Arquitectura de Alto Nivel ``` 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? CAPA DE PRESENTACI脫N 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? Web App Admin 鉁? 鉁? Portal Cliente 鉁? 鉁? 鉁? 鉁? (React + Vite) 鉁? 鉁? (Opcional) 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鈻? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? API GATEWAY 鉁? 鉁? (NestJS + JWT Auth) 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? 鉁? 鈻? 鈻? 鈻? 鈻? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? CAPA DE SERVICIOS 鉁? 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? CRM 鉁? 鉁? Projects 鉁? 鉁? Assets 鉁? 鉁? Auth 鉁? 鉁? 鉁? 鉁? Service 鉁? 鉁? Service 鉁? 鉁? Service 鉁? 鉁? Service 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? Generation 鉁? 鉁? Automation 鉁? 鉁? 鉁? 鉁? Service 鉁? 鉁? Service 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? 鉁? 鈻? 鈻? 鈻? 鈻? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? CAPA DE INFRAESTRUCTURA 鉁? 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? PostgreSQL 鉁? 鉁? Redis 鉁? 鉁? S3/MinIO 鉁? 鉁? ComfyUI 鉁? 鉁? 鉁? 鉁? 15+ 鉁? 鉁? (Cache) 鉁? 鉁? (Storage)鉁? 鉁? (GPU) 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁? 鉁? n8n 鉁? 鉁? Bull/BullMQ 鉁? 鉁? 鉁? 鉁? (Workflows) 鉁? 鉁? (Job Queues) 鉁? 鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? 鉁? 鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁斺攢鉁? ``` --- ## 2. Stack Tecnol贸gico Detallado ### 2.1 Backend ```yaml Framework: NestJS 10+ Runtime: Node.js 20 LTS Lenguaje: TypeScript 5.x Dependencias Core: - @nestjs/core - @nestjs/platform-express - @nestjs/typeorm - @nestjs/jwt - @nestjs/passport - @nestjs/bull - class-validator - class-transformer ORM/Database: - TypeORM 0.3+ - pg (PostgreSQL driver) Queues: - bull / bullmq - @nestjs/bull Caching: - ioredis - @nestjs/cache-manager HTTP Client: - axios (llamadas a ComfyUI) File Storage: - @aws-sdk/client-s3 (o minio compatible) Logging: - winston - @nestjs/winston ``` ### 2.2 Frontend ```yaml Framework: React 18 Build Tool: Vite 5+ Lenguaje: TypeScript 5.x UI Framework: - TailwindCSS 3.x - Shadcn/UI (componentes) - Radix UI (primitivos) State Management: - Zustand (global state) - React Query / TanStack Query (server state) Routing: - React Router 6 Forms: - React Hook Form - Zod (validaci贸n) Charts/Visualizaci贸n: - Recharts - Apache ECharts (opcional) Utilities: - date-fns - lodash-es ``` ### 2.3 Motor de Generaci贸n IA ```yaml Orquestador Principal: ComfyUI - Interfaz de nodos para workflows - Soporte para m煤ltiples modelos - Custom nodes extensibles Exposici贸n API: ComfyDeploy - Convierte workflows en APIs HTTP - Manejo de colas integrado - Webhooks para resultados Modelos Base: Text-to-Image: - Stable Diffusion XL 1.0 - SD 1.5 / 2.1 (fallback para menos VRAM) Checkpoints Especializados: - Realistic Vision (rostros) - Product Photography (e-commerce) - Juggernaut XL (general alta calidad) ControlNets: - OpenPose (control de poses) - Canny (bordes) - Depth (profundidad) - Segmentation (m谩scaras) Upscalers: - RealESRGAN x4 - SwinIR - SDXL refiner Inpainting: - SDXL Inpaint model - SD 1.5 Inpaint (fallback) Requisitos Hardware: M铆nimo: NVIDIA GPU 12GB VRAM (RTX 3060 12GB) Recomendado: NVIDIA GPU 24GB VRAM (RTX 4090, L4, A5000) 脫ptimo: M煤ltiples GPUs para colas paralelas ``` ### 2.4 Base de Datos ```yaml Motor: PostgreSQL 15+ Schemas: - auth: Usuarios, sesiones, permisos - crm: Clientes, contactos, marcas, productos - projects: Proyectos, campa帽as, briefs - assets: Im谩genes, copys, metadatos - generation: Jobs, workflows, resultados - config: Configuraci贸n por tenant Extensiones: - uuid-ossp (UUIDs) - pgcrypto (encriptaci贸n) - pg_trgm (b煤squeda fuzzy) Estrategia Multi-tenant: - Discriminador: tenant_id en todas las tablas - Row-Level Security (RLS) por tenant - Contexto de sesi贸n: app.current_tenant_id ``` ### 2.5 Automatizaci贸n ```yaml Orquestador: n8n (self-hosted) Triggers Soportados: - Webhooks desde backend - Cron / schedules - Eventos de base de datos Integraciones: - HTTP/REST (cualquier API) - PostgreSQL queries - S3/MinIO operations - Email (SMTP) - Slack/Discord (opcional) ``` --- ## 3. Estructura de M贸dulos Backend ### 3.1 Organizaci贸n de C贸digo ``` apps/backend/src/ 鉁斺攢鉁? modules/ 鉁? 鉁斺攢鉁? auth/ 鉁? 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁? 鉁斺攢鉁? services/ 鉁? 鉁? 鉁斺攢鉁? entities/ 鉁? 鉁? 鉁斺攢鉁? dto/ 鉁? 鉁? 鉁斺攢鉁? guards/ 鉁? 鉁? 鉁斺攢鉁? strategies/ 鉁? 鉁? 鉁斺攢鉁? auth.module.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? crm/ 鉁? 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁? 鉁? 鉁斺攢鉁? clients.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? brands.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? products.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? contacts.controller.ts 鉁? 鉁? 鉁斺攢鉁? services/ 鉁? 鉁? 鉁斺攢鉁? entities/ 鉁? 鉁? 鉁斺攢鉁? dto/ 鉁? 鉁? 鉁斺攢鉁? crm.module.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? projects/ 鉁? 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁? 鉁? 鉁斺攢鉁? projects.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? campaigns.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? briefs.controller.ts 鉁? 鉁? 鉁斺攢鉁? services/ 鉁? 鉁? 鉁斺攢鉁? entities/ 鉁? 鉁? 鉁斺攢鉁? dto/ 鉁? 鉁? 鉁斺攢鉁? projects.module.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? generation/ 鉁? 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁? 鉁? 鉁斺攢鉁? generation.controller.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? workflows.controller.ts 鉁? 鉁? 鉁斺攢鉁? services/ 鉁? 鉁? 鉁? 鉁斺攢鉁? generation.service.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? comfyui.service.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? llm.service.ts 鉁? 鉁? 鉁斺攢鉁? processors/ 鉁? 鉁? 鉁? 鉁斺攢鉁? generation.processor.ts 鉁? 鉁? 鉁斺攢鉁? entities/ 鉁? 鉁? 鉁斺攢鉁? dto/ 鉁? 鉁? 鉁斺攢鉁? generation.module.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? assets/ 鉁? 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁? 鉁斺攢鉁? services/ 鉁? 鉁? 鉁斺攢鉁? entities/ 鉁? 鉁? 鉁斺攢鉁? dto/ 鉁? 鉁? 鉁斺攢鉁? assets.module.ts 鉁? 鉁? 鉁? 鉁斺攢鉁? admin/ 鉁? 鉁斺攢鉁? controllers/ 鉁? 鉁斺攢鉁? services/ 鉁? 鉁斺攢鉁? admin.module.ts 鉁? 鉁斺攢鉁? shared/ 鉁? 鉁斺攢鉁? decorators/ 鉁? 鉁斺攢鉁? guards/ 鉁? 鉁? 鉁斺攢鉁? tenant.guard.ts 鉁? 鉁? 鉁斺攢鉁? roles.guard.ts 鉁? 鉁斺攢鉁? interceptors/ 鉁? 鉁? 鉁斺攢鉁? tenant-context.interceptor.ts 鉁? 鉁斺攢鉁? filters/ 鉁? 鉁斺攢鉁? pipes/ 鉁? 鉁斺攢鉁? utils/ 鉁? 鉁斺攢鉁? config/ 鉁? 鉁斺攢鉁? database.config.ts 鉁? 鉁斺攢鉁? redis.config.ts 鉁? 鉁斺攢鉁? storage.config.ts 鉁? 鉁斺攢鉁? comfyui.config.ts 鉁? 鉁斺攢鉁? app.module.ts 鉁斺攢鉁? main.ts ``` ### 3.2 API Endpoints (Borrador) ```yaml Auth: POST /api/v1/auth/login POST /api/v1/auth/register POST /api/v1/auth/refresh POST /api/v1/auth/logout GET /api/v1/auth/me CRM - Clients: GET /api/v1/crm/clients POST /api/v1/crm/clients GET /api/v1/crm/clients/:id PATCH /api/v1/crm/clients/:id DELETE /api/v1/crm/clients/:id CRM - Brands: GET /api/v1/crm/brands POST /api/v1/crm/brands GET /api/v1/crm/brands/:id PATCH /api/v1/crm/brands/:id GET /api/v1/crm/brands/:id/products CRM - Products: GET /api/v1/crm/products POST /api/v1/crm/products GET /api/v1/crm/products/:id PATCH /api/v1/crm/products/:id Projects: GET /api/v1/projects POST /api/v1/projects GET /api/v1/projects/:id PATCH /api/v1/projects/:id GET /api/v1/projects/:id/campaigns GET /api/v1/projects/:id/assets Campaigns: GET /api/v1/campaigns POST /api/v1/campaigns GET /api/v1/campaigns/:id PATCH /api/v1/campaigns/:id POST /api/v1/campaigns/:id/generate GET /api/v1/campaigns/:id/assets Generation: POST /api/v1/generation/image POST /api/v1/generation/copy GET /api/v1/generation/jobs/:id GET /api/v1/generation/workflows POST /api/v1/generation/workflows/:id/execute Assets: GET /api/v1/assets GET /api/v1/assets/:id PATCH /api/v1/assets/:id DELETE /api/v1/assets/:id POST /api/v1/assets/:id/approve GET /api/v1/assets/:id/download Admin: GET /api/v1/admin/users POST /api/v1/admin/users GET /api/v1/admin/tenants GET /api/v1/admin/metrics ``` --- ## 4. Modelo de Datos (Entidades Principales) ### 4.1 Schema: auth ```sql -- Tabla: auth.users CREATE TABLE auth.users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), email VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(100), last_name VARCHAR(100), role VARCHAR(50) NOT NULL DEFAULT 'user', status VARCHAR(20) NOT NULL DEFAULT 'active', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(tenant_id, email) ); -- Tabla: auth.sessions CREATE TABLE auth.sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES auth.users(id), refresh_token VARCHAR(500) NOT NULL, expires_at TIMESTAMPTZ NOT NULL, ip_address VARCHAR(45), user_agent TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` ### 4.2 Schema: crm ```sql -- Tabla: crm.clients CREATE TABLE crm.clients ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), name VARCHAR(255) NOT NULL, industry VARCHAR(100), status VARCHAR(20) NOT NULL DEFAULT 'active', notes TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: crm.brands CREATE TABLE crm.brands ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), client_id UUID NOT NULL REFERENCES crm.clients(id), name VARCHAR(255) NOT NULL, description TEXT, tone_of_voice VARCHAR(100), color_palette JSONB, restrictions JSONB, logo_url VARCHAR(500), lora_model_id UUID, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: crm.products CREATE TABLE crm.products ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), brand_id UUID NOT NULL REFERENCES crm.brands(id), name VARCHAR(255) NOT NULL, description TEXT, category VARCHAR(100), reference_images JSONB, lora_model_id UUID, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: crm.contacts CREATE TABLE crm.contacts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), client_id UUID REFERENCES crm.clients(id), first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100), email VARCHAR(255), phone VARCHAR(50), position VARCHAR(100), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` ### 4.3 Schema: projects ```sql -- Tabla: projects.projects CREATE TABLE projects.projects ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), client_id UUID REFERENCES crm.clients(id), name VARCHAR(255) NOT NULL, description TEXT, status VARCHAR(20) NOT NULL DEFAULT 'draft', start_date DATE, end_date DATE, created_by UUID REFERENCES auth.users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: projects.campaigns CREATE TABLE projects.campaigns ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), project_id UUID NOT NULL REFERENCES projects.projects(id), brand_id UUID REFERENCES crm.brands(id), name VARCHAR(255) NOT NULL, type VARCHAR(50) NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'draft', channels JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: projects.briefs CREATE TABLE projects.briefs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), campaign_id UUID NOT NULL REFERENCES projects.campaigns(id), objective TEXT NOT NULL, target_audience TEXT, tone_of_voice VARCHAR(100), key_messages JSONB, restrictions JSONB, reference_images JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` ### 4.4 Schema: assets ```sql -- Tabla: assets.assets CREATE TABLE assets.assets ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), campaign_id UUID REFERENCES projects.campaigns(id), type VARCHAR(20) NOT NULL, name VARCHAR(255), status VARCHAR(20) NOT NULL DEFAULT 'draft', file_url VARCHAR(500), file_size INTEGER, mime_type VARCHAR(100), width INTEGER, height INTEGER, metadata JSONB, version INTEGER NOT NULL DEFAULT 1, parent_id UUID REFERENCES assets.assets(id), created_by UUID REFERENCES auth.users(id), approved_by UUID REFERENCES auth.users(id), approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: assets.tags CREATE TABLE assets.tags ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), name VARCHAR(100) NOT NULL, UNIQUE(tenant_id, name) ); -- Tabla: assets.asset_tags CREATE TABLE assets.asset_tags ( asset_id UUID NOT NULL REFERENCES assets.assets(id), tag_id UUID NOT NULL REFERENCES assets.tags(id), PRIMARY KEY (asset_id, tag_id) ); ``` ### 4.5 Schema: generation ```sql -- Tabla: generation.jobs CREATE TABLE generation.jobs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES config.tenants(id), campaign_id UUID REFERENCES projects.campaigns(id), workflow_id VARCHAR(100) NOT NULL, type VARCHAR(20) NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'pending', priority INTEGER NOT NULL DEFAULT 0, input_params JSONB NOT NULL, result JSONB, error_message TEXT, started_at TIMESTAMPTZ, completed_at TIMESTAMPTZ, created_by UUID REFERENCES auth.users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: generation.workflows CREATE TABLE generation.workflows ( id VARCHAR(100) PRIMARY KEY, tenant_id UUID REFERENCES config.tenants(id), name VARCHAR(255) NOT NULL, description TEXT, type VARCHAR(50) NOT NULL, comfyui_workflow JSONB NOT NULL, input_schema JSONB, is_system BOOLEAN NOT NULL DEFAULT false, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Tabla: generation.models CREATE TABLE generation.models ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID REFERENCES config.tenants(id), name VARCHAR(255) NOT NULL, type VARCHAR(50) NOT NULL, file_path VARCHAR(500), description TEXT, training_images JSONB, is_system BOOLEAN NOT NULL DEFAULT false, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` --- ## 5. Flujo de Generaci贸n de Contenido ### 5.1 Secuencia de Generaci贸n de Imagen ``` 1. Usuario solicita generaci贸n 鈻? Frontend 鈫? POST /api/v1/generation/image { "campaign_id": "uuid", "workflow_id": "product_photography", "params": { "prompt": "...", "product_id": "uuid", "style": "commercial" } } 2. Backend crea Job 鈻? GenerationService.createJob() 鈫? Valida permisos 鈫? Crea registro en generation.jobs 鈫? Encola job en Bull queue 3. Worker procesa Job 鈻? GenerationProcessor.process() 鈫? Obtiene workflow de ComfyUI 鈫? Inyecta par谩metros (prompt, LoRA, etc.) 鈫? Env铆a a ComfyUI API 鈫? Espera resultado (webhook o polling) 4. ComfyUI ejecuta workflow 鈻? 鈫? Carga modelo SDXL 鈫? Aplica LoRAs (si hay) 鈫? Ejecuta pipeline de difusi贸n 鈫? Aplica upscaling 鈫? Retorna imagen 5. Worker procesa resultado 鈻? 鈫? Descarga imagen de ComfyUI 鈫? Sube a S3/MinIO 鈫? Crea registro en assets.assets 鈫? Actualiza job como completado 鈫? Emite evento (webhook a n8n) 6. Frontend recibe notificaci贸n 鈻? WebSocket / Polling 鈫? Job completado 鈫? Muestra imagen al usuario ``` ### 5.2 Integraci贸n con ComfyUI ```typescript // services/comfyui.service.ts interface ComfyUIWorkflowParams { prompt: string; negativePrompt?: string; width?: number; height?: number; steps?: number; cfg?: number; seed?: number; loraModels?: string[]; controlNet?: { type: string; image: string; strength: number; }; } @Injectable() export class ComfyUIService { constructor( private httpService: HttpService, @Inject('COMFYUI_CONFIG') private config: ComfyUIConfig, ) {} async executeWorkflow( workflowId: string, params: ComfyUIWorkflowParams, ): Promise { // 1. Cargar workflow template const workflow = await this.getWorkflowTemplate(workflowId); // 2. Inyectar par谩metros const modifiedWorkflow = this.injectParams(workflow, params); // 3. Enviar a ComfyUI const response = await this.httpService.post( `${this.config.baseUrl}/prompt`, { prompt: modifiedWorkflow }, ).toPromise(); return response.data.prompt_id; } async getResult(promptId: string): Promise { // Polling o webhook para obtener resultado const history = await this.httpService.get( `${this.config.baseUrl}/history/${promptId}`, ).toPromise(); const outputNode = this.findOutputNode(history.data); const imageUrl = `${this.config.baseUrl}/view?filename=${outputNode.filename}`; const imageResponse = await this.httpService.get(imageUrl, { responseType: 'arraybuffer', }).toPromise(); return Buffer.from(imageResponse.data); } } ``` --- ## 6. Seguridad ### 6.1 Autenticaci贸n ```yaml M茅todo: JWT (JSON Web Tokens) Access Token: - Expiraci贸n: 15 minutos - Payload: userId, tenantId, role - Almacenamiento: Memory (frontend) Refresh Token: - Expiraci贸n: 7 d铆as - Almacenamiento: HTTP-only cookie - Rotaci贸n en cada uso ``` ### 6.2 Autorizaci贸n (RBAC) ```yaml Roles: super_admin: - Acceso total a todos los tenants - Configuraci贸n global - Gesti贸n de modelos del sistema admin: - Gesti贸n de usuarios del tenant - Configuraci贸n del tenant - Aprobaci贸n de workflows manager: - CRUD completo de proyectos/campa帽as - Aprobaci贸n de assets - Acceso a anal铆ticas creative: - Crear proyectos y campa帽as - Generar contenido - Editar assets propios viewer: - Solo lectura - Descargar assets aprobados ``` ### 6.3 Multi-tenancy ```sql -- Pol铆tica RLS ejemplo CREATE POLICY "crm_clients_tenant_isolation" ON crm.clients FOR ALL TO authenticated USING (tenant_id::text = current_setting('app.current_tenant_id', true)) WITH CHECK (tenant_id::text = current_setting('app.current_tenant_id', true)); ``` --- ## 7. Despliegue ### 7.1 Docker Compose (Desarrollo/Staging) ```yaml version: '3.8' services: backend: build: ./apps/backend ports: - "3000:3000" environment: - DATABASE_URL=postgresql://... - REDIS_URL=redis://redis:6379 - COMFYUI_URL=http://comfyui:8188 - S3_ENDPOINT=http://minio:9000 depends_on: - postgres - redis - minio frontend: build: ./apps/frontend ports: - "5173:80" depends_on: - backend postgres: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_DB=pmc - POSTGRES_USER=pmc - POSTGRES_PASSWORD=${DB_PASSWORD} redis: image: redis:7-alpine volumes: - redis_data:/data minio: image: minio/minio ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data command: server /data --console-address ":9001" comfyui: image: comfyui/comfyui:latest ports: - "8188:8188" volumes: - comfyui_models:/models - comfyui_output:/output deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] n8n: image: n8nio/n8n ports: - "5678:5678" volumes: - n8n_data:/home/node/.n8n volumes: postgres_data: redis_data: minio_data: comfyui_models: comfyui_output: n8n_data: ``` ### 7.2 Requisitos de Hardware (Producci贸n) ```yaml Backend + Frontend: CPU: 4 cores RAM: 8 GB Storage: 50 GB SSD PostgreSQL: CPU: 2 cores RAM: 8 GB Storage: 100 GB SSD ComfyUI (GPU Server): CPU: 8 cores RAM: 32 GB GPU: NVIDIA RTX 4090 (24GB) o similar Storage: 500 GB NVMe (modelos) Storage (S3/MinIO): Storage: 1 TB+ (escalable) ``` --- ## 8. Monitoreo y Observabilidad ### 8.1 Logs ```yaml Backend: - Winston con formato JSON estructurado - Niveles: error, warn, info, debug - Rotaci贸n diaria Agregaci贸n: - ELK Stack (Elasticsearch, Logstash, Kibana) - O alternativa: Loki + Grafana ``` ### 8.2 M茅tricas ```yaml Application Metrics: - API response times (p50, p95, p99) - Queue depths y processing times - Generation success rate - Error rates por tipo Business Metrics: - Assets generados por d铆a - Tiempo promedio de generaci贸n - Assets aprobados vs rechazados - Uso por tenant/usuario Infrastructure: - CPU, RAM, disk usage - GPU utilization - Network I/O ``` ### 8.3 Alertas ```yaml Cr铆ticas: - API down > 1 min - GPU unavailable - Queue backlog > 100 jobs - Error rate > 5% Advertencias: - Response time p95 > 2s - Disk usage > 80% - Queue processing slow ``` --- **Documento generado por:** Requirements-Analyst **Fecha:** 2025-12-08