diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 0000000..80c7d3a --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,229 @@ +# 🔧 Solución de Problemas - Dokploy + +## ❌ Error: `[Errno 2] No such file or directory` + +### Causa + +El Dockerfile intentaba copiar `script.py` pero el archivo no existía en el directorio `cron/`. + +### ✅ Solución Aplicada + +1. **Creado `script.py`** en el directorio `cron/` +2. **Actualizado Dockerfiles** para mejor logging con flag `-u` (unbuffered output) +3. **Mejorado healthcheck** para no depender de wget/curl + +### 📝 Archivos Corregidos + +- ✅ `cron/script.py` - Creado +- ✅ `cron/Dockerfile` - Actualizado con `-u` flag +- ✅ `engine/Dockerfile` - Actualizado con `-u` flag +- ✅ `docker-compose.dokploy.yml` - Healthcheck mejorado + +### 🚀 Cómo Proceder en Dokploy + +1. **Commitea los cambios**: + + ```bash + git add . + git commit -m "Fix: Add missing script.py and improve Dockerfiles" + git push + ``` + +2. **En Dokploy UI**: + + - Ve a tu proyecto + - Clic en **"Rebuild & Deploy"** (no solo "Deploy") + - Esto forzará rebuild de las imágenes con los nuevos archivos + +3. **Verifica los logs**: + - Service → Logs + - Deberías ver: `"Running initial test..."` + +--- + +## 🔍 Otros Problemas Comunes + +### 1. Build Context Incorrecto + +**Síntoma**: `Cannot find Dockerfile` o `No such file or directory` durante build + +**Solución**: + +- En Dokploy: Build Path debe ser `./` (raíz del repo) +- Compose File Path: `docker-compose.dokploy.yml` + +### 2. Variables de Entorno No Cargadas + +**Síntoma**: Servicios inician pero fallan al conectarse + +**Solución**: + +- Verifica que TODAS estas variables estén configuradas: + ``` + E5_CLIENT_ID + E5_CLIENT_SECRET + E5_REFRESH_TOKEN + WEB_APP_PASSWORD + E5_WEB_APP_PASSWORD + CRON_PASSWORD + CRON_REFRESH_TOKEN + ``` + +### 3. Healthcheck Falla + +**Síntoma**: El servicio se reinicia constantemente + +**Solución**: + +- Aumenta `start_period` a 60s o más +- Verifica que el puerto 8080 esté correcto +- Revisa logs para errores de inicio + +### 4. odcron No Puede Conectarse a odengin + +**Síntoma**: Logs de cron muestran "Connection refused" + +**Solución**: + +- Verifica que ambos servicios estén en la misma red +- IP debe ser `odengin:8080` (nombre del servicio, no localhost) +- Espera a que el healthcheck de odengin pase + +### 5. Puerto Ya en Uso + +**Síntoma**: `Address already in use` o `port is already allocated` + +**Solución**: + +- Cambia `ENGINE_PORT` en variables de entorno +- O elimina el puerto y usa dominios de Dokploy + +--- + +## 📊 Checklist de Deploy Exitoso + +Antes de hacer deploy: + +- [ ] Todos los archivos están en Git y pusheados +- [ ] `script.py` existe en `cron/` +- [ ] Dockerfiles tienen `CMD ["python", "-u", ...]` +- [ ] Variables de entorno configuradas en Dokploy UI +- [ ] Build Path: `./` +- [ ] Compose File: `docker-compose.dokploy.yml` + +Después del deploy: + +- [ ] Ambos servicios muestran estado "Running" +- [ ] Healthcheck pasa (ícono verde) +- [ ] Logs de odengin muestran inicio exitoso +- [ ] Logs de odcron muestran "Running initial test..." +- [ ] No hay errores de conexión en logs + +--- + +## 🔬 Debug Avanzado + +### Ver Logs en Tiempo Real + +En Dokploy UI: + +1. Service → Logs +2. Activa "Follow" (auto-scroll) +3. Busca por "error", "exception", "failed" + +### SSH al Contenedor + +```bash +# Desde Dokploy UI: Service → Terminal +# O desde SSH del servidor: +docker exec -it /bin/bash + +# Verificar archivos +ls -la /app + +# Verificar proceso Python +ps aux | grep python + +# Test manual del script +cd /app +python -u script.py +``` + +### Verificar Red Docker + +```bash +# Listar redes +docker network ls | grep onedrive + +# Inspeccionar red +docker network inspect + +# Verificar que ambos contenedores estén en la red +``` + +### Test de Conectividad + +```bash +# Desde el contenedor odcron +docker exec -it /bin/bash +ping odengin +wget -O- http://odengin:8080 +``` + +--- + +## 💡 Tips Pro + +### 1. Unbuffered Output + +La flag `-u` en Python es crucial para Dokploy: + +```dockerfile +CMD ["python", "-u", "script.py"] +``` + +Sin ella, los logs pueden no aparecer en tiempo real. + +### 2. Healthcheck Realista + +El healthcheck actual usa Python nativo (siempre disponible): + +```yaml +test: + [ + "CMD-SHELL", + 'python -c ''import urllib.request; urllib.request.urlopen("http://localhost:8080")'' || exit 1', + ] +``` + +### 3. Start Period Generoso + +Dale tiempo al servicio de iniciar: + +```yaml +start_period: 60s # 60 segundos antes de empezar healthchecks +``` + +### 4. Logs Estructurados + +El script usa `logging` de Python: + +```python +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +``` + +Esto hace los logs más legibles en Dokploy. + +--- + +## 📞 Necesitas Más Ayuda? + +1. **Revisa logs completos**: Service → Logs → Download +2. **Verifica configuración**: Service → Settings +3. **Rebuild limpio**: Service → "Clear Build Cache" → Rebuild + +Si el problema persiste, comparte: + +- Logs completos (últimas 50 líneas) +- Variables de entorno configuradas (sin valores sensibles) +- Output del build diff --git a/cron/Dockerfile b/cron/Dockerfile index 8838d59..dca126e 100644 --- a/cron/Dockerfile +++ b/cron/Dockerfile @@ -7,4 +7,4 @@ RUN pip install --no-cache-dir -r requirements.txt COPY script.py . -CMD ["python", "script.py"] \ No newline at end of file +CMD ["python", "-u", "script.py"] \ No newline at end of file diff --git a/cron/script.sh b/cron/script.py similarity index 99% rename from cron/script.sh rename to cron/script.py index 281f404..584c97c 100644 --- a/cron/script.sh +++ b/cron/script.py @@ -43,4 +43,4 @@ def main(): time.sleep(1) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/docker-compose.dokploy.yml b/docker-compose.dokploy.yml index ac21495..d226735 100644 --- a/docker-compose.dokploy.yml +++ b/docker-compose.dokploy.yml @@ -26,12 +26,12 @@ services: test: [ "CMD-SHELL", - "wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1", + 'python -c ''import urllib.request; urllib.request.urlopen("http://localhost:8080")'' || exit 1', ] interval: 30s timeout: 10s - retries: 3 - start_period: 40s + retries: 5 + start_period: 60s labels: - "com.dokploy.project=onedrive" - "com.dokploy.service=engine" diff --git a/engine/Dockerfile b/engine/Dockerfile index 30ffb71..0b57ea2 100644 --- a/engine/Dockerfile +++ b/engine/Dockerfile @@ -22,5 +22,5 @@ COPY . . # Exponer el puerto EXPOSE 8080 -# Establecer el comando de entrada -CMD ["python", "main.py"] \ No newline at end of file +# Establecer el comando de entrada con unbuffered output para mejor logging +CMD ["python", "-u", "main.py"] \ No newline at end of file