Agregar script.py y mejorar Dockerfiles con salida unbuffered y healthcheck optimizado
This commit is contained in:
229
TROUBLESHOOTING.md
Normal file
229
TROUBLESHOOTING.md
Normal 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
|
||||
@@ -7,4 +7,4 @@ RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY script.py .
|
||||
|
||||
CMD ["python", "script.py"]
|
||||
CMD ["python", "-u", "script.py"]
|
||||
@@ -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"
|
||||
|
||||
@@ -22,5 +22,5 @@ COPY . .
|
||||
# Exponer el puerto
|
||||
EXPOSE 8080
|
||||
|
||||
# Establecer el comando de entrada
|
||||
CMD ["python", "main.py"]
|
||||
# Establecer el comando de entrada con unbuffered output para mejor logging
|
||||
CMD ["python", "-u", "main.py"]
|
||||
Reference in New Issue
Block a user