# 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 ```sql -- 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: ```sql -- 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: ```bash # 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: 1. **PostgreSQL** (si no existe) 2. **Redis** (si no existe) 3. **ERP-Core** (siempre primero - carga schemas base) 4. **Verticales** (en cualquier orden después de core) --- ## 5. Variables de Entorno por Vertical ### 5.1 Variables Comunes ```bash # 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 ```bash #!/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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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 ```bash # 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`