Files
Onedrive/MULTI_INSTANCIAS.md

307 lines
7.9 KiB
Markdown

# 🚀 Ejecutar Múltiples Instancias
Este proyecto está configurado para ejecutar múltiples instancias en la misma máquina sin conflictos de puertos o nombres.
## 📋 Estructura de Directorios
Para ejecutar múltiples instancias, organiza el proyecto así:
```
OneDrive/
├── instancia1/ # Primera instancia
│ ├── .env
│ └── docker-compose.yml (enlace simbólico o copia)
├── instancia2/ # Segunda instancia
│ ├── .env
│ └── docker-compose.yml (enlace simbólico o copia)
└── instancia3/ # Tercera instancia
├── .env
└── docker-compose.yml (enlace simbólico o copia)
```
## 🔧 Configuración para Múltiples Instancias
### Opción 1: Directorios Separados (Recomendado)
**Paso 1: Crea directorios para cada instancia**
```powershell
# Windows
mkdir instancia1, instancia2, instancia3
# o crear estructura completa
mkdir instancia1\engine, instancia1\cron
mkdir instancia2\engine, instancia2\cron
mkdir instancia3\engine, instancia3\cron
```
**Paso 2: Copia el proyecto a cada directorio**
```powershell
# Copiar archivos base
Copy-Item -Path "docker-compose.yml", ".env.example", ".gitignore" -Destination "instancia1"
Copy-Item -Path "docker-compose.yml", ".env.example", ".gitignore" -Destination "instancia2"
Copy-Item -Path "docker-compose.yml", ".env.example", ".gitignore" -Destination "instancia3"
# Copiar carpetas engine y cron
Copy-Item -Path "engine\*" -Destination "instancia1\engine" -Recurse
Copy-Item -Path "cron\*" -Destination "instancia1\cron" -Recurse
# Repetir para instancia2 y instancia3
```
**Paso 3: Crea archivos `.env` para cada instancia**
```powershell
# Instancia 1
cd instancia1
cp .env.example .env
# Editar .env con credenciales de cuenta 1
# Instancia 2
cd ..\instancia2
cp .env.example .env
# Editar .env con credenciales de cuenta 2
# Instancia 3
cd ..\instancia3
cp .env.example .env
# Editar .env con credenciales de cuenta 3
```
**Contenido del `.env` para cada instancia:**
```env
# instancia1/.env
COMPOSE_PROJECT_NAME=instancia1
ENGINE_PORT=8089
E5_CLIENT_ID=cuenta1_client_id
E5_CLIENT_SECRET=cuenta1_secret
E5_REFRESH_TOKEN=cuenta1_refresh_token
WEB_APP_PASSWORD=password1
E5_WEB_APP_PASSWORD=e5_password1
CRON_PASSWORD=cron_password1
CRON_REFRESH_TOKEN=cron_refresh_token1
```
```env
# instancia2/.env
COMPOSE_PROJECT_NAME=instancia2
ENGINE_PORT=8090
E5_CLIENT_ID=cuenta2_client_id
E5_CLIENT_SECRET=cuenta2_secret
E5_REFRESH_TOKEN=cuenta2_refresh_token
WEB_APP_PASSWORD=password2
E5_WEB_APP_PASSWORD=e5_password2
CRON_PASSWORD=cron_password2
CRON_REFRESH_TOKEN=cron_refresh_token2
```
```env
# instancia3/.env
COMPOSE_PROJECT_NAME=instancia3
ENGINE_PORT=8091
E5_CLIENT_ID=cuenta3_client_id
E5_CLIENT_SECRET=cuenta3_secret
E5_REFRESH_TOKEN=cuenta3_refresh_token
WEB_APP_PASSWORD=password3
E5_WEB_APP_PASSWORD=e5_password3
CRON_PASSWORD=cron_password3
CRON_REFRESH_TOKEN=cron_refresh_token3
```
### Opción 2: Una Sola Carpeta con Múltiples `.env`
Si prefieres mantener un solo directorio, usa `.env` personalizados:
```powershell
# Crear archivos .env específicos
cp .env.example .env.instancia1
cp .env.example .env.instancia2
cp .env.example .env.instancia3
```
**Comando para lanzar:**
```powershell
# Instancia 1
docker-compose -p instancia1 --env-file .env.instancia1 up -d
# Instancia 2
docker-compose -p instancia2 --env-file .env.instancia2 up -d
# Instancia 3
docker-compose -p instancia3 --env-file .env.instancia3 up -d
```
## 🎯 Gestión de Múltiples Instancias
### Iniciar todas las instancias
```powershell
# Opción 1: Directorios separados
cd instancia1; docker-compose up -d; cd ..
cd instancia2; docker-compose up -d; cd ..
cd instancia3; docker-compose up -d; cd ..
# Opción 2: Script PowerShell
@("instancia1", "instancia2", "instancia3") | ForEach-Object {
Write-Host "Iniciando $_..."
Push-Location $_
docker-compose up -d
Pop-Location
}
```
### Ver estado de todas las instancias
```powershell
# Opción 1: Por instancia
cd instancia1; docker-compose ps; cd ..
cd instancia2; docker-compose ps; cd ..
cd instancia3; docker-compose ps; cd ..
# Opción 2: Comando único
docker ps --filter "label=com.docker.compose.project" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
```
### Ver logs de una instancia
```powershell
cd instancia1
docker-compose logs -f odengin
docker-compose logs -f odcron
```
### Detener todas las instancias
```powershell
@("instancia1", "instancia2", "instancia3") | ForEach-Object {
Write-Host "Deteniendo $_..."
Push-Location $_
docker-compose down
Pop-Location
}
```
### Reiniciar una instancia
```powershell
cd instancia2
docker-compose restart
```
## 📊 Tabla de Puertos Recomendados
| Instancia | Puerto Motor | Contenedor Engine | Contenedor Cron |
|-----------|-------------|-------------------|-----------------|
| instancia1 | 8089 | instancia1-odengin | instancia1-odcron |
| instancia2 | 8090 | instancia2-odengin | instancia2-odcron |
| instancia3 | 8091 | instancia3-odengin | instancia3-odcron |
| instancia4 | 8092 | instancia4-odengin | instancia4-odcron |
## 🔗 Cómo Funcionan las Variables de Entorno
El `docker-compose.yml` usa variables para ser flexible:
| Variable | Uso | Valor Por Defecto |
|----------|-----|-------------------|
| `COMPOSE_PROJECT_NAME` | Prefijo de nombres y redes | `onedrive` |
| `ENGINE_PORT` | Puerto expuesto del motor | `8089` |
| `CRON_IP` | Dirección del motor para cron | `{COMPOSE_PROJECT_NAME}-odengin:8080` |
### Ejemplo de Expansión
Con `COMPOSE_PROJECT_NAME=instancia1` y `ENGINE_PORT=8089`:
```yaml
container_name: instancia1-odengin
ports: ["8089:8080"]
hostname: instancia1-odengin
networks:
- instancia1-net
```
## 🚨 Solución de Problemas
### Error: "Port is already in use"
**Causa:** Dos instancias intentan usar el mismo puerto.
**Solución:** Verifica que cada instancia tenga un `ENGINE_PORT` único en su `.env`:
```powershell
# Ver qué puertos están en uso
docker ps --format "table {{.Names}}\t{{.Ports}}"
# Ver un puerto específico
netstat -ano | findstr :8089
```
### Error: "Container name is already in use"
**Causa:** Docker intenta crear un contenedor con nombre duplicado.
**Solución:** Verifica que cada instancia tenga un `COMPOSE_PROJECT_NAME` único.
### Los contenedores se detienen solos
**Causa:** Probablemente hay un error en el script Python.
**Solución:** Revisa los logs:
```powershell
docker-compose logs -f odengin
docker-compose logs -f odcron
```
## 💡 Tips
1. **Usa nombres descriptivos:** `cuenta-juan`, `cuenta-maria`, `cuenta-externa`
2. **Documenta la configuración:** Crea un archivo `INSTANCIAS.txt` con la asignación
3. **Automatiza con scripts:** Crea scripts para iniciar/detener todo de una vez
4. **Monitorea recursos:** Con varias instancias, monitorea CPU y memoria
## 📝 Script de Inicialización (Opcional)
Crea un archivo `init-multi-instances.ps1`:
```powershell
param(
[int]$NumInstances = 3
)
for ($i = 1; $i -le $NumInstances; $i++) {
$instanceName = "instancia$i"
$port = 8088 + $i
Write-Host "Creando $instanceName en puerto $port..." -ForegroundColor Green
mkdir -Force "$instanceName/engine", "$instanceName/cron"
Copy-Item -Path "docker-compose.yml", ".env.example" -Destination "$instanceName"
Copy-Item -Path "engine\*" -Destination "$instanceName\engine" -Recurse -Force
Copy-Item -Path "cron\*" -Destination "$instanceName\cron" -Recurse -Force
# Crear .env
@"
COMPOSE_PROJECT_NAME=$instanceName
ENGINE_PORT=$port
E5_CLIENT_ID=cambiar_aqui
E5_CLIENT_SECRET=cambiar_aqui
E5_REFRESH_TOKEN=cambiar_aqui
WEB_APP_PASSWORD=cambiar_aqui
E5_WEB_APP_PASSWORD=cambiar_aqui
CRON_PASSWORD=cambiar_aqui
CRON_REFRESH_TOKEN=cambiar_aqui
"@ | Set-Content "$instanceName\.env"
Write-Host "$instanceName creada. Edita $instanceName\.env con tus credenciales" -ForegroundColor Yellow
}
```
Uso:
```powershell
.\init-multi-instances.ps1 -NumInstances 3
```