# PRACTICA: Implementación de Idurar ERP/CRM

**Vamos a realizar una práctica de implementación de la aplicación IDURAR ERP/CRM** en nuestro stack MERN que hemos creado previamente en la anterior guía, usaré **Idurar** porque:

1. Contiene una estructura profesional como la vista antes (`backend/`, `frontend/`)
2. Contiene  `.env.example` completo para Mongo
3. Documentación extensa de despliegue
4. Muchas features (CRUD, auth, charts)
5. Se trata de un Frontend moderno (AntD + React)

**IDURAR** es un ERP/CRM open source completo (facturación, CRM, inventario, contabilidad) construido con MERN stack. Esta guía combina la [guía de configuración anterior](https://apuntes-alex.gitbook.io/apuntes-sistemas-y-redes/servicios/web/mern-stack/explicacion-app-vite-+-react-+-express.js) con los requisitos específicos de IDURAR.

Tal y como hemos visto, no es fácil implementar una aplicación moderna en un entorno como MERN en servidor linux pero tampoco es imposible, los pasos básicos para implementar cualquier tipo de aplicación son los siguientes:

```
# 1. Clonar
git clone [URL] /var/www/mi-app
cd /var/www/mi-app

# 2. Backend PM2
cd backend && npm i && cp .env.example .env
pm2 start server.js --name mi-backend

# 3. Frontend build
cd ../frontend && npm i && npm run build
sudo chown -R www-data:www-data dist/

# 4. Nginx ya configurado = listo, sino configura
curl http://localhost
```

Vamos a ver esto mismo aplicado a esta aplicación:

## Guía de implementación

### 0. Pre-requisitos <a href="#id-0-pre-requisitos-ya-los-tienes" id="id-0-pre-requisitos-ya-los-tienes"></a>

Asegúrate por si acaso:

* Ubuntu 22.04 con Node 20 LTS, MongoDB 7.0, Nginx, PM2 instalados
* MongoDB con usuario `app_user` / `Passw0rdApp` en base `mi_aplicacion`
* Estructura `/var/www/mi-app-mern/` lista

### 1. Clonar y Preparar IDURAR <a href="#id-1-clonar-y-preparar-idurar" id="id-1-clonar-y-preparar-idurar"></a>

```bash
cd /var/www
sudo git clone https://github.com/idurar/idurar-erp-crm.git idurar-erp
sudo chown -R $USER:$USER idurar-erp
cd idurar-erp
```

**Estructura esperada:**

```
/var/www/mi-app-mern/
├── backend/          # Node/Express/Mongo
├── frontend/         # React + Ant Design
├── setup/            # Scripts de inicialización
└── README.md
```

### 2. MongoDB: Base de datos específica para IDURAR <a href="#id-2-mongodb-base-de-datos-especfica-para-idurar" id="id-2-mongodb-base-de-datos-especfica-para-idurar"></a>

```bash
# Conectar como admin
mongosh -u admindb -p Passw0rd --authenticationDatabase admin

# Crear base y usuario específico para IDURAR
use idurar_erp
db.createUser({
  user: "idurar_user",
  pwd: "Idurar2026",
  roles: [{ role: "readWrite", db: "idurar_erp" }]
})
exit
```

**Verificar:**

```bash
mongosh "mongodb://idurar_user:Idurar2026@localhost:27017/idurar_erp?authSource=idurar_erp"
show collections  # Debe estar vacía inicialmente
exit
```

### 3. Backend: Instalación y Configuración <a href="#id-3-backend-instalacin-y-configuracin" id="id-3-backend-instalacin-y-configuracin"></a>

```bash
cd /var/www/idurar-erp/backend

# Instalar dependencias
npm install

# Copiar y configurar .env
nano .env
```

Antes de empezar a tocar configuraciones, hacer backup del `.env` actual:

```bash
cp .env .env.backup
```

El archivo `.env` para IDURAR modifícalo tal que así:

```
# MongoDB (¡DESCOMENTA Y CONFIGURA!)
DATABASE="mongodb://idurar_user:Idurar2026@localhost:27017/idurar_erp?authSource=idurar_erp"

# JWT (genera uno más largo y seguro)
JWT_SECRET="IDURAR_ERP_2026_SuperSecureJWTKey_abc123XYZ789_miClaveSecreta123456"

# Entorno
NODE_ENV="production"

# OpenSSL (mantiene como está)
OPENSSL_CONF='/dev/null'

# URL pública del servidor (¡CAMBIA por tu IP!)
PUBLIC_SERVER_FILE="http://192.168.1.137"

# Puerto del backend (por defecto 3000)
PORT=3000

# Opcionales (descomenta si los necesitas)
#RESEND_API="re_1234567890abcdef"
#OPENAI_API_KEY="sk-1234567890abcdef..."

# CORS (para frontend, la ip otra vez)
FRONTEND_URL="http://192.168.1.137"

# Email SMTP (opcional, para notificaciones)
#SMTP_HOST=smtp.gmail.com
#SMTP_PORT=587
#SMTP_USER=tu-email@gmail.com
#SMTP_PASS=tu-app-password

```

{% hint style="info" %}
**RESEND\_API y OPENAI\_API\_KEY son funcionalidades Avanzadas de IDURAR opcionales.**

* **RESEND\_API:** Es para envío de Emails Transaccionales automáticos, confirmaciones de registro, recuperación de contraseña, invitaciones... para obtenerlo gratis puedes ir a resend.com y registrarte gratis por 250emails/dia.
* **OPENAI\_API\_KEY:** Es para Inteligencia Artificial, para resumenes automáticos de clientes, generación de descripciones de productos, asistente de facturación y analisis de datos. Para obtenerlo puedes acceder a platform.openai.com
  {% endhint %}

**Ejecutar setup de IDURAR (IMPORTANTE):**

```bash
npm run setup
```

Esto crea las colecciones iniciales, índices y datos de prueba en MongoDB.

**Probar backend:**

```bash
npm run dev  # Desarrollo (Ctrl+C después)
```

En otra terminal:

```bash
curl http://localhost:3000/api/health
# Debe responder: {"success":true,"message":"IDURAR Backend is running"} o algo asi como:
# {"success":false,"result":null,"message":"No authentication token, authorization denied.","jwtExpired":true}ub
```

**Arrancar con PM2:**

```bash
pm2 stop backend-api  # Si existe de antes
pm2 start server.js --name "idurar-backend"
pm2 save
pm2 status
```

### 4. Frontend: Build de Producción <a href="#id-4-frontend-build-de-produccin" id="id-4-frontend-build-de-produccin"></a>

```bash
cd /var/www/mi-app-mern/frontend

# Instalar dependencias
npm install

# Configurar .env (Vite)
cp .env.example .env
nano .env
```

**Archivo `.env` del frontend:**

```
# API Backend (¡A través de Nginx proxy!)
VITE_FILE_BASE_URL = 'http://192.168.1.137/'
VITE_BACKEND_SERVER="/api"
PROD = true
```

**Build de producción:**

```bash
npm run build
```

**Permisos para Nginx:**

```bash
sudo chown -R www-data:www-data dist/
sudo chmod -R 755 dist/
```

### 5. Nginx: Configuración Específica IDURAR <a href="#id-5-nginx-configuracin-especfica-idurar" id="id-5-nginx-configuracin-especfica-idurar"></a>

```bash
sudo nano /etc/nginx/sites-available/idurar-erp
```

**Contenido completo:**

```
server {
    listen 80;
    server_name TU_IP ;  # Cambia por tu IP o dominio
    
    # Frontend estático (React)
    root /var/www/idurar-erp/frontend/dist;
    index index.html index.htm;
    
    # Logs
    access_log /var/log/nginx/idurar.access.log;
    error_log /var/log/nginx/idurar.error.log;
    
    # Archivos estáticos con cache agresivo
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
        access_log off;
    }
    
    # SPA React Router
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # Backend API (proxy a puerto 3000)
    location /api/ {
        proxy_pass http://localhost:3000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 300s;
        proxy_connect_timeout 75s;
    }
    
    # Socket.io para realtime (si IDURAR lo usa)
    location /socket.io/ {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}
```

**Activar sitio:**

```bash
# Desactivar anterior si existe
sudo rm -f /etc/nginx/sites-enabled/mi-app-mern

# Activar nuevo
sudo ln -s /etc/nginx/sites-available/idurar-erp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

### 6. Pruebas Completas <a href="#id-6-pruebas-completas" id="id-6-pruebas-completas"></a>

```bash
# 1. Verificar servicios
sudo systemctl status nginx mongod
pm2 status

# 2. Probar frontend
curl -I http://localhost
# Debe retornar: HTTP/1.1 200 OK

# 3. Probar API
curl http://localhost/api/health
# {"success":true,"message":"IDURAR Backend is running"}

# 4. Ver logs si hay errores
pm2 logs idurar-backend
tail -f /var/log/nginx/idurar.error.log
```

### 7. Acceso y Primera Configuración <a href="#id-7-acceso-y-primera-configuracin" id="id-7-acceso-y-primera-configuracin"></a>

1. **Abrir navegador:** `http://IP_DE_TU_VM`
2. **Registro inicial:** Crea cuenta `admin@idurar.com` / `admin123`
3. **Dashboard completo:** Facturación, CRM, Inventario listos

### 8. Mantenimiento y Actualizaciones <a href="#id-8-mantenimiento-y-actualizaciones" id="id-8-mantenimiento-y-actualizaciones"></a>

```bash
# Actualizar IDURAR
cd /var/www/mi-app-mern
git pull origin main

# Backend
cd backend
npm install
npm run setup  # Re-ejecuta migraciones
pm2 restart idurar-backend

# Frontend
cd ../frontend
npm install
npm run build
sudo chown -R www-data:www-data dist/
sudo systemctl reload nginx
```

### 9. Troubleshooting Común <a href="#id-9-troubleshooting-comn" id="id-9-troubleshooting-comn"></a>

| Problema                                  | Solución                                  |
| ----------------------------------------- | ----------------------------------------- |
| `MongoServerError: Authentication failed` | Verifica `MONGODB_URI` en `.env`          |
| `404 en /api/*`                           | Revisa proxy Nginx `location /api/`       |
| Build frontend falla                      | `npm install` + `npm run build`           |
| PM2 no inicia                             | `pm2 logs idurar-backend` + `pm2 restart` |
| Assets no cargan                          | Permisos `www-data` en `dist/`            |
