ERP-Suite - Arquitectura de Despliegue
Resumen Ejecutivo
ERP-Suite es un monorepo de microservicios con base de datos compartida. Cada vertical es un proyecto independiente que:
- Se compila y despliega por separado
- Tiene su propia configuración de puertos
- Comparte la misma instancia de PostgreSQL pero con schemas separados
- Hereda patrones arquitectónicos de erp-core (no código directo)
1. Arquitectura General
┌─────────────────────────────────────────────────────────────────────────────┐
│ ERP-SUITE ARCHITECTURE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ NGINX (80/443) ││
│ │ erp.isem.dev | construccion.erp.isem.dev | mecanicas.erp.isem.dev ││
│ └─────────────────────────────────────────────────────────────────────────┘│
│ │ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ ERP-CORE │ │CONSTRUCCION│ │ VIDRIO │ │ MECANICAS │ │ RETAIL │ │
│ │ FE: 3010 │ │ FE: 3020 │ │ FE: 3030 │ │ FE: 3040 │ │ FE: 3050 │ │
│ │ BE: 3011 │ │ BE: 3021 │ │ BE: 3031 │ │ BE: 3041 │ │ BE: 3051 │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ ┌───────────┐ ┌───────────┐ │
│ │ CLINICAS │ │ POS-MICRO │ │
│ │ FE: 3060 │ │ FE: 3070 │ │
│ │ BE: 3061 │ │ BE: 3071 │ │
│ └───────────┘ └───────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────┐│
│ │ PostgreSQL (5432) - BD COMPARTIDA ││
│ │ ┌─────────┐ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ ││
│ │ │ auth │ │ core │ │ construccion│ │ mecanicas │ │ retail │ ││
│ │ │ schema │ │ schema │ │ schema │ │ schema │ │ schema │ ││
│ │ └─────────┘ └─────────┘ └─────────────┘ └─────────────┘ └───────────┘ ││
│ └─────────────────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────────────────┘
2. Matriz de Componentes
2.1 Proyectos y Puertos
| Componente |
Frontend |
Backend |
DB Schema |
Redis |
Estado |
| erp-core |
3010 |
3011 |
auth, core, inventory |
6379 |
✅ 60% |
| construccion |
3020 |
3021 |
construccion (7 sub-schemas) |
6380 |
✅ 35% |
| vidrio-templado |
3030 |
3031 |
vidrio |
6381 |
⏳ 0% |
| mecanicas-diesel |
3040 |
3041 |
service_mgmt, parts_mgmt, vehicle_mgmt |
6379 |
⏳ 0% |
| retail |
3050 |
3051 |
retail |
6383 |
⏳ 25% |
| clinicas |
3060 |
3061 |
clinicas |
6384 |
⏳ 0% |
| pos-micro |
3070 |
3071 |
pos |
6379 |
⏳ Planificado |
2.2 Subdominios
| Vertical |
Frontend |
API |
| erp-core |
erp.isem.dev |
api.erp.isem.dev |
| construccion |
construccion.erp.isem.dev |
api.construccion.erp.isem.dev |
| vidrio-templado |
vidrio.erp.isem.dev |
api.vidrio.erp.isem.dev |
| mecanicas-diesel |
mecanicas.erp.isem.dev |
api.mecanicas.erp.isem.dev |
| retail |
retail.erp.isem.dev |
api.retail.erp.isem.dev |
| clinicas |
clinicas.erp.isem.dev |
api.clinicas.erp.isem.dev |
| pos-micro |
pos.erp.isem.dev |
api.pos.erp.isem.dev |
3. Estructura de Base de Datos
3.1 Modelo de Schemas
-- ORDEN DE CARGA DDL
-- 1. ERP-CORE (base requerida)
CREATE SCHEMA auth; -- users, tenants, roles, permissions
CREATE SCHEMA core; -- partners, products, categories
CREATE SCHEMA inventory; -- stock, locations, movements
-- 2. VERTICALES (dependen de auth.*, core.*)
CREATE SCHEMA construccion; -- projects, budgets, hr, hse, estimates
CREATE SCHEMA mecanicas; -- service_management, parts, vehicles
CREATE SCHEMA retail; -- pos, sales, ecommerce
CREATE SCHEMA clinicas; -- patients, appointments, medical
CREATE SCHEMA vidrio; -- quotes, production, installation
3.2 Dependencias de Schemas por Vertical
| Vertical |
Schemas Propios |
Depende de |
| erp-core |
auth, core, inventory |
- (base) |
| construccion |
construccion.* |
auth.tenants, auth.users, core.partners |
| mecanicas-diesel |
service_mgmt, parts_mgmt, vehicle_mgmt |
auth.tenants, auth.users |
| retail |
retail.* |
auth., core.products, inventory. |
| clinicas |
clinicas.* |
auth.*, core.partners |
| vidrio |
vidrio.* |
auth., core., inventory.* |
3.3 Row-Level Security (RLS)
Todas las tablas implementan multi-tenancy via RLS:
-- Política estándar por tenant
ALTER TABLE construccion.projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON construccion.projects
USING (tenant_id = current_setting('app.current_tenant')::uuid);
4. Estrategia de Despliegue
4.1 Opción Recomendada: Despliegue Independiente por Vertical
Cada vertical se despliega como un servicio independiente:
# Estructura de despliegue
/opt/apps/erp-suite/
├── erp-core/
│ ├── docker-compose.yml
│ └── .env.production
├── construccion/
│ ├── docker-compose.yml
│ └── .env.production
├── mecanicas-diesel/
│ ├── docker-compose.yml
│ └── .env.production
└── shared/
└── nginx/
4.2 Pipeline de Despliegue
[Git Push] → [Jenkins] → [Build Images] → [Push Registry] → [Deploy]
│
├── erp-core → erp-core-backend:latest, erp-core-frontend:latest
├── construccion → construccion-backend:latest, construccion-frontend:latest
├── mecanicas → mecanicas-backend:latest, mecanicas-frontend:latest
└── ...
4.3 Orden de Despliegue
IMPORTANTE: Respetar el orden de despliegue:
- PostgreSQL (si no existe)
- Redis (si no existe)
- ERP-Core (siempre primero - carga schemas base)
- Verticales (en cualquier orden después de core)
5. Variables de Entorno por Vertical
5.1 Variables Comunes
# Todas las verticales comparten:
NODE_ENV=production
DB_HOST=localhost
DB_PORT=5432
DB_SSL=true
REDIS_HOST=localhost
JWT_SECRET=${JWT_SECRET} # Compartido para SSO
5.2 Variables Específicas por Vertical
| Variable |
erp-core |
construccion |
mecanicas |
retail |
| PORT |
3011 |
3021 |
3041 |
3051 |
| DB_NAME |
erp_generic |
erp_generic |
erp_generic |
erp_generic |
| DB_SCHEMA |
auth,core |
construccion |
mecanicas |
retail |
| FRONTEND_URL |
erp.isem.dev |
construccion.erp.isem.dev |
mecanicas.erp.isem.dev |
retail.erp.isem.dev |
| REDIS_DB |
0 |
1 |
2 |
3 |
6. Docker Images
6.1 Naming Convention
${REGISTRY}/${PROJECT}-${COMPONENT}:${VERSION}
Ejemplos:
- 72.60.226.4:5000/erp-core-backend:1.0.0
- 72.60.226.4:5000/erp-core-frontend:1.0.0
- 72.60.226.4:5000/construccion-backend:1.0.0
- 72.60.226.4:5000/construccion-frontend:1.0.0
6.2 Base Images
| Componente |
Base Image |
Tamaño Aprox |
| Backend |
node:20-alpine |
~150MB |
| Frontend |
nginx:alpine |
~25MB |
7. Health Checks
7.1 Endpoints por Vertical
| Vertical |
Health Endpoint |
Expected Response |
| erp-core |
/health |
{"status":"ok","db":true,"redis":true} |
| construccion |
/health |
{"status":"ok","db":true} |
| mecanicas |
/health |
{"status":"ok","db":true} |
7.2 Script de Verificación
#!/bin/bash
VERTICALS=("erp-core:3011" "construccion:3021" "mecanicas:3041")
for v in "${VERTICALS[@]}"; do
name="${v%%:*}"
port="${v##*:}"
status=$(curl -s "http://localhost:${port}/health" | jq -r '.status')
echo "${name}: ${status}"
done
8. Comandos de Despliegue
8.1 Despliegue Individual
# ERP-Core
cd /opt/apps/erp-suite/erp-core
docker-compose pull && docker-compose up -d
# Construcción
cd /opt/apps/erp-suite/construccion
docker-compose pull && docker-compose up -d
8.2 Despliegue Completo
# Desde Jenkins o script
./scripts/deploy-all.sh production
# O manualmente
cd /opt/apps/erp-suite
docker-compose -f docker-compose.full.yml up -d
8.3 Rollback
# Rollback específico
cd /opt/apps/erp-suite/construccion
docker-compose down
docker-compose pull --tag previous
docker-compose up -d
9. Monitoreo
9.1 Logs
# Ver logs de un vertical
docker logs -f construccion-backend
# Logs centralizados (si configurado)
tail -f /var/log/erp-suite/construccion/app.log
9.2 Métricas Clave
| Métrica |
Descripción |
Alerta |
| Response Time |
Tiempo de respuesta API |
> 2s |
| Error Rate |
% de requests con error |
> 5% |
| DB Connections |
Conexiones activas |
> 80% pool |
| Memory Usage |
Uso de memoria |
> 80% |
10. Troubleshooting
10.1 Problemas Comunes
| Problema |
Causa |
Solución |
| Connection refused |
Servicio no iniciado |
docker-compose up -d |
| Schema not found |
DDL no cargado |
Ejecutar migrations de erp-core primero |
| Auth failed |
JWT secret diferente |
Verificar JWT_SECRET compartido |
| Tenant not found |
RLS mal configurado |
Verificar SET app.current_tenant |
10.2 Verificar Estado
# Estado de contenedores
docker ps --filter "name=erp"
# Verificar conectividad BD
docker exec erp-core-backend npm run db:check
# Verificar schemas
psql -h localhost -U erp_admin -d erp_generic -c "\dn"
Referencias
- Inventario de Puertos:
core/orchestration/inventarios/DEVENV-PORTS-INVENTORY.yml
- Herencia ERP-Core:
apps/verticales/*/database/HERENCIA-ERP-CORE.md
- Arquitectura General:
core/orchestration/deployment/DEPLOYMENT-ARCHITECTURE.md