Arquitectura de microservicios · multi-nube

FICCT Boutique: venta, facturación verificable e IA sobre seis servicios desplegados.

Plataforma retail donde un núcleo Go orquesta catálogo, inventario y ventas; la automatización emite facturas con integridad por hash-chain; y un servicio de IA agrega similitud visual, pronóstico y segmentación. Este sitio explica los flujos reales, sin marketing.

MS1 Go Core
Railway · GraphQL
n8n + Gotenberg
Railway · automatización
MS3 Documentos
AWS Lambda · S3
MS2 IA
GCP Cloud Run
Angular Admin
panel web
App Móvil
React Native
C4 · Contenedores

Arquitectura general

Mapa interactivo de contenedores y nubes. Recorre los pasos o toca una tarjeta para ver el detalle de cada servicio.

GraphQL / JWT GraphQL / JWT Angular AdminRailway · nginxApp MóvilReact Native · ExpoMS1 Go CoreRailway · GraphQLNeonDBPostgreSQLn8nRailway · workflowGotenbergPDF (interno)MS3 DocumentosAWS LambdaS3bucket privadoAWS SESdev@ficct.comMS2 IAGCP Cloud RunDynamoDB4 tablas IA
Paso 1 / 5

Núcleo transaccional: catálogo, inventario multisucursal, ventas/pedidos, BI, tokens push y outbox de webhooks.

  • API GraphQL en POST /graphql con autenticación JWT RS256 y roles admin/staff/customer.
  • Productos y variantes (talla/color), inventario por sucursal (SC-01, SC-02), ventas y órdenes.
  • Reportes BI: ventas mensuales, productos populares, resumen de tablero.
  • webhook_outbox + WebhookDispatcher que firma el evento sale.confirmed con HMAC-SHA256.
  • PushSender que llama a la Expo Push API y desactiva tokens inválidos.
Datos
NeonDB PostgreSQL (serverless).
Por qué este proveedor
Railway entrega despliegue continuo desde Git y red interna privada para hablar con n8n sin exponer puertos.
Flujos animados

Flujos operativos

Cada flujo se anima paso a paso sobre el sistema real. Usa el control para cambiar de flujo.

confirmSale Venta confirmadaCliente / PersonalGo · confirmSaleorden ORD-…webhook_outboxNeonDBn8n · valida HMACtimingSafeEqualRechazosin efectosGotenbergHTML → PDFMS3 upload/confirmSHA-256S3PUT presignadoHash-ledgerverify intactAWS SESdev@ficct.com
Paso 1 / 8
Rama negativa

HMAC inválido = sin efectos

Un webhook con firma inválida se responde con 200 pero no produce PDF, objeto en S3, documento en MS3 ni correo. La firma HMAC-SHA256 se valida con comparación de tiempo constante sobre el cuerpo crudo.

Angular Admin

Panel administrativo

El panel consume Go GraphQL, la API de documentos MS3 y la API de IA MS2; los tres orígenes están habilitados en CORS.

Login

Autenticación JWT contra Go; formulario sin credenciales precargadas.

Tablero / BI

Ventas del día, productos activos, sucursales y gráficos mensuales.

Productos

Catálogo con variantes (talla/color) y alta/edición/baja.

Inventario

Stock y reorden por sucursal (SC-01, SC-02).

Ventas / Pedidos

Registro y confirmación de ventas, reportes.

Documentos + Ledger

Consola MS3 con verificación de hash-ledger por documento.

Analítica IA

Pronóstico (Holt) y clustering (K-Means) ejecutados desde el navegador.

CI/CD · proveedores

Despliegue

Cada repositorio se despliega a su proveedor. MS3 vive en AWS (no en Railway) por coste por uso y cercanía a S3/SES; SES reemplaza al SMTP que Railway bloquea en egress.

Repositorio Servicio Proveedor CI/CD Nota
ficct-boutique-backend-go MS1 Go Core Railway Git push → Railway GraphQL + NeonDB; redeploy automático al hacer push a main.
gotenberg n8n + Gotenberg Railway Railway (imagen) Workflow self-hosted; Gotenberg por red interna.
ficct-boutique-backend-express MS3 Documentos AWS GitHub Actions CI build/test → update Lambda; NeonDB migrate.
ficct-boutique-backend-python MS2 IA GCP GitHub Actions (WIF) Despliegue keyless a Cloud Run con Workload Identity Federation.
ficct-boutique-frontend-angular Angular Admin Railway GitHub Actions → Railway Build estático (nginx); dominio en Cloudflare.
ficct-boutique-mobile-react-native App Móvil Expo EAS (manual) Builds nativos por EAS; export web para QA.
ficct-boutique-workflow Este sitio Railway Git push → Railway Frontend estático Svelte (nginx).
Coste consciente

Decisiones de infraestructura

  • Escala a cero: Cloud Run (MS2) y Lambda (MS3) sólo cobran al ejecutarse.
  • NeonDB serverless evita una base siempre encendida.
  • S3 privado con ciclo de vida y SES por HTTPS evitan infraestructura de correo dedicada.
  • Sin EC2, sin RDS, sin balanceadores ni NAT gateways de pago.
Verificación de producción

Evidencia

Resultados verificados del sistema real. Sin secretos ni credenciales.

Flujo de factura verificado

verificado

Una venta confirmada genera el PDF, lo sube a MS3/S3 y envía el correo, extremo a extremo.

documento activo · intact=true · chainIntact=true

HMAC inválido sin efectos

verificado

Un webhook con firma inválida es aceptado con 200 pero no produce PDF, objeto S3, documento ni correo.

sideEffectDocument = null

Correo por AWS SES

verificado

Remitente verificado dev@ficct.com con acceso de producción; envío por HTTPS (SendRawEmail), sin SMTP.

remitente dev@ficct.com · production access

Bucket S3 privado

verificado

ficct-boutique-documents con BlockPublicAcls y cifrado SSE-AES256; acceso sólo por URLs presignadas.

BlockPublicAcls=true · AES256

Hash-ledger de MS3

verificado

Cada documento encadena su SHA-256; /verify recomputa la cadena desde génesis y confirma la integridad.

chain_hash = SHA256(prev | sha256)

MS2 IA operativo

verificado

Health público y lectura/escritura en DynamoDB; similitud visual verificada (consulta → match con puntaje).

similitud: match 1.0 / 0.67 / 0.35

Capturas de frontends

info

Angular Admin (login/dashboard/inventario/documentos/IA) y app móvil (catálogo/carrito/sucursales) capturadas con Playwright.

evidencia UI por viewport

CI/CD en verde

verificado

Pipelines de MS3 (AWS) y MS2 (GCP Cloud Run, keyless WIF) con última corrida exitosa.

MS3 ok · MS2 ok

Resumen de la verificación de producción. No incluye secretos, credenciales ni contraseñas de prueba.

FICCT Boutique — arquitectura y flujos operativos. Sitio estático, sin backend.

Go · n8n + Gotenberg · MS3 (AWS) · MS2 (GCP) · Angular Admin · React Native.