Agregar script.py y mejorar Dockerfiles con salida unbuffered y healthcheck optimizado

This commit is contained in:
2025-12-07 14:33:26 -05:00
parent e69d2414b9
commit aecf2b4466
5 changed files with 236 additions and 7 deletions

229
TROUBLESHOOTING.md Normal file
View File

@@ -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 <container-name> /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 <network-name>
# Verificar que ambos contenedores estén en la red
```
### Test de Conectividad
```bash
# Desde el contenedor odcron
docker exec -it <odcron-container> /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

View File

@@ -7,4 +7,4 @@ RUN pip install --no-cache-dir -r requirements.txt
COPY script.py . COPY script.py .
CMD ["python", "script.py"] CMD ["python", "-u", "script.py"]

View File

@@ -43,4 +43,4 @@ def main():
time.sleep(1) time.sleep(1)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -26,12 +26,12 @@ services:
test: test:
[ [
"CMD-SHELL", "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 interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 5
start_period: 40s start_period: 60s
labels: labels:
- "com.dokploy.project=onedrive" - "com.dokploy.project=onedrive"
- "com.dokploy.service=engine" - "com.dokploy.service=engine"

View File

@@ -22,5 +22,5 @@ COPY . .
# Exponer el puerto # Exponer el puerto
EXPOSE 8080 EXPOSE 8080
# Establecer el comando de entrada # Establecer el comando de entrada con unbuffered output para mejor logging
CMD ["python", "main.py"] CMD ["python", "-u", "main.py"]