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