# 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`
