Volver a la wiki

Dokploy Internals — CreaRack Pro

Dokploy Internals — CreaRack Pro

Fecha: 07-04-2026 Objetivo: Documentar cómo Dokploy gestiona redes, labels, Swarm y deploys Contexto: Incidentes del 04-04-2026 por desconocimiento de la arquitectura interna


1. Qué es Dokploy

Dokploy v0.28.8 es una plataforma de deploy self-hosted. No es un binario — es un conjunto de 3 contenedores Docker gestionados por Docker Swarm.

Servicio SwarmImagenFunción
dokploydokploy/dokploy:v0.28.8Panel web (puerto 3000) + orquestador
dokploy-postgrespostgres:16BD interna (proyectos, config, historial)
dokploy-redisredis:7Cache/queue interna

Dato crítico: Dokploy requiere Docker Swarm con node.role == manager. Sin Swarm, Dokploy no existe.


2. Redes Docker — El punto más crítico

Mapa de redes

RedDriverSubnetQuién la usa
dokploy-networkoverlay (Swarm)10.0.1.0/24Traefik ↔ web container
crearack_internalbridge172.19.0.0/16web ↔ db, cache, VM, pgbouncer, worker
crearack_defaultbridge172.20.0.0/16Red default del compose
ingressoverlay—Red interna de Swarm
docker_gwbridgebridge172.18.0.0/16Puente entre host y overlay

El container web está en 3 redes simultáneamente

Internet → Traefik (dokploy-network:10.0.1.18)
               ↓
           web (dokploy-network:10.0.1.28)  ← Traefik enruta aquí
           web (crearack_internal:172.19.0.7) ← DB, cache, VM viven aquí
           web (default:172.20.0.2)

Por qué esto importa


3. Traefik — Reverse proxy

Arquitectura

Traefik v3.6.7 corre como container standalone (no Swarm service), conectado a dokploy-network.

Internet → :80 (HTTP) → middleware redirect-to-https → :443
         → :443 (HTTPS + HTTP/3) → router → web:8000

Configuración (3 niveles)

Nivel 1 — Estática (/etc/dokploy/traefik/traefik.yml):

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"
    http3: {}           # HTTP/3 habilitado

providers:
  docker:
    exposedByDefault: false          # Solo containers con traefik.enable=true
    network: dokploy-network         # Red donde Traefik busca containers
  swarm:
    exposedByDefault: false
    network: dokploy-network
  file:
    directory: /etc/dokploy/traefik/dynamic
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      email: info@crearack.com
      storage: /etc/dokploy/traefik/dynamic/acme.json
      httpChallenge:
        entryPoint: web

Nivel 2 — Dinámica (/etc/dokploy/traefik/dynamic/):

ArchivoContenido
middlewares.ymlredirect-to-https (HTTP→HTTPS), hide-server-header
dokploy.ymlRouter al panel Dokploy (localhost only)
acme.jsonCertificados Let’s Encrypt (auto-renovados)

Nivel 3 — Labels en containers (inyectados por Dokploy en deploy):

traefik.enable=true
traefik.docker.network=dokploy-network

# HTTP → redirect a HTTPS
traefik.http.routers.crearack-pro-zcmvsl-1-web.rule=Host(`crearack.com`)
traefik.http.routers.crearack-pro-zcmvsl-1-web.entrypoints=web
traefik.http.routers.crearack-pro-zcmvsl-1-web.middlewares=redirect-to-https@file

# HTTPS → TLS con Let's Encrypt
traefik.http.routers.crearack-pro-zcmvsl-1-websecure.rule=Host(`crearack.com`)
traefik.http.routers.crearack-pro-zcmvsl-1-websecure.entrypoints=websecure
traefik.http.routers.crearack-pro-zcmvsl-1-websecure.tls.certresolver=letsencrypt

# Load balancer → Daphne en puerto 8000
traefik.http.services.crearack-pro-zcmvsl-1-web.loadbalancer.server.port=8000

IMPORTANTE: Estos labels los inyecta Dokploy. No están en compose.prod.yml. Si haces docker compose up manual, los containers NO tendrán labels y Traefik no los verá.


4. Flujo de deploy

Cómo Dokploy despliega CreaRack

1. Webhook GitHub (push a main)
   ↓
2. Dokploy recibe webhook → clona/actualiza repo
   en /etc/dokploy/compose/crearack-pro-zcmvsl/code/
   ↓
3. Inyecta variables de entorno (.env)
   ↓
4. docker compose build (usa Dockerfile.prod)
   ↓
5. docker compose up -d (con labels de Traefik)
   ↓
6. Traefik detecta nuevo container → enruta tráfico

IMPORTANTE — [skip ci] bloquea Dokploy: Si el mensaje del commit contiene la palabra skip (ej. [skip ci]), Dokploy omite silenciosamente el deploy. Devuelve HTTP 200 OK pero el log indica "Deployment skipped: commit message contains skip keyword". Usar [skip ci] solo en commits de documentación que no deban disparar deploy.

Estructura en disco

/etc/dokploy/
├── compose/
│   └── crearack-pro-zcmvsl/
│       └── code/                    ← Git clone completo del repo
│           ├── compose.prod.yml
│           ├── Dockerfile.prod
│           ├── .env                 ← Generado por Dokploy (secrets)
│           └── ... (todo el código)
├── traefik/
│   ├── traefik.yml                  ← Config estática
│   └── dynamic/
│       ├── acme.json                ← Certificados SSL
│       ├── middlewares.yml
│       └── dokploy.yml
├── applications/                    ← Vacío (no usamos tipo "application")
├── logs/
├── monitoring/
├── schedules/
├── ssh/
└── volume-backups/

5. Deploy manual (sin Dokploy)

Si Dokploy muere y necesitas desplegar manualmente:

# 1. Ir al directorio del código
cd /etc/dokploy/compose/crearack-pro-zcmvsl/code/

# 2. Pull último código
git pull origin main

# 3. Rebuild
docker compose -f compose.prod.yml build web

# 4. Recrear con labels de Traefik
docker compose -f compose.prod.yml up -d web \
  --label "traefik.enable=true" \
  --label "traefik.docker.network=dokploy-network"

# ⚠️ PROBLEMA: docker compose up no soporta --label
# Alternativa: añadir labels al compose.prod.yml temporalmente:
#
# services:
#   web:
#     labels:
#       - "traefik.enable=true"
#       - "traefik.docker.network=dokploy-network"
#       - "traefik.http.routers.crearack-web.rule=Host(`crearack.com`)"
#       - "traefik.http.routers.crearack-web.entrypoints=websecure"
#       - "traefik.http.routers.crearack-web.tls.certresolver=letsencrypt"
#       - "traefik.http.services.crearack-web.loadbalancer.server.port=8000"

# 5. Conectar a dokploy-network manualmente si no está
docker network connect dokploy-network crearack-pro-zcmvsl-web-1

# 6. Verificar que Traefik ve el container
curl -s https://crearack.com/health

6. Contenedores en producción

ContenedorRed(es)Puerto expuestoRol
crearack-pro-zcmvsl-web-1internal + default + dokploy-network0.0.0.0:8000Django/Daphne ASGI
crearack-pro-zcmvsl-worker-1internal—Huey task worker
crearack-pro-zcmvsl-db-1internal—PostgreSQL 18
crearack-pro-zcmvsl-pgbouncer-1internal—Connection pooler (6432)
crearack-pro-zcmvsl-cache-1internal—Valkey 7.2
crearack-pro-zcmvsl-victoriametrics-1internal—Time-series DB
dokploy (Swarm)dokploy-network0.0.0.0:3000Panel Dokploy
dokploy-traefikdokploy-network0.0.0.0:80,443Reverse proxy
dokploy-redis (Swarm)dokploy-network—Redis Dokploy
dokploy-postgres (Swarm)dokploy-network—PG Dokploy

7. Volúmenes persistentes

VolumenDatosTamañoBackup offsite
pg_data_prodBase de datos PostgreSQL~20 MBSí (pg_dump → Object Storage)
app_mediaMedia uploads (stencils, signage)~654 MBNo
valkey_data_prodCache Valkey (AOF)< 10 MBNo (reconstruible)
vm_data_prodMétricas VictoriaMetrics~83 MBNo (repoblable)
mib_cacheMIBs SNMP compiladas< 5 MBNo (regenerable)
app_logsLogs de la aplicaciónVariableNo
dokployConfig Docker de Dokploy< 1 MBNo
dokploy-postgresBD interna Dokploy< 5 MBNo

8. FOOTGUNS — Lo que NUNCA hacer

AcciónConsecuenciaAlternativa
docker swarm leaveDestruye Dokploy, Traefik y toda la infra de deployNUNCA hacerlo
Quitar dokploy-network del web service en composeApp inaccesible (Traefik no la alcanza)Mantener siempre
docker compose up manual en el servidorContainers sin labels de Traefik → 404Redesplegar desde Dokploy
docker compose down manualDokploy queda desincronizadoUsar panel Dokploy
Editar .env directamente en servidorSe sobreescribe en el próximo deployEditar env vars desde panel Dokploy
Borrar acme.jsonPierde certificados SSL → downtime hasta re-emisiónHacer backup antes
Cambiar label traefik.docker.networkTraefik busca en red equivocada → 404Debe ser dokploy-network
Añadir servicios a crearack_internal manualmenteNo resuelven DNS si no están en el composeAñadir al compose.prod.yml
Commit message con [skip ci] o cualquier “skip”Dokploy omite el deploy silenciosamente (HTTP 200 pero sin deploy)Usar [skip ci] solo en docs-only
Password Valkey/Redis con caracteres especiales (-, !, @)El parser de config falla al leer la passwordUsar solo caracteres hex (a-f0-9)
Healthcheck del worker apuntando a curl localhost:8000Worker no es servidor web → healthcheck siempre fallaUsar pgrep run_huey

9. Troubleshooting

“404 Not Found” en crearack.com

# 1. ¿Web container está corriendo?
docker ps | grep web

# 2. ¿Está en dokploy-network?
docker inspect crearack-pro-zcmvsl-web-1 | grep -A 5 dokploy-network
# Si no aparece:
docker network connect dokploy-network crearack-pro-zcmvsl-web-1

# 3. ¿Tiene labels de Traefik?
docker inspect crearack-pro-zcmvsl-web-1 | grep traefik
# Si no: redesplegar desde Dokploy

# 4. ¿Traefik está corriendo?
docker ps | grep traefik
# Si no: docker start dokploy-traefik

“502 Bad Gateway”

# Web container existe pero no responde
docker logs crearack-pro-zcmvsl-web-1 --tail 20

# Health check
docker exec crearack-pro-zcmvsl-web-1 curl -s localhost:8000/health

# Reiniciar
docker restart crearack-pro-zcmvsl-web-1

Dokploy no arranca

# Verificar Swarm
docker info | grep "Swarm:"
# Si "inactive": docker swarm init

# Verificar servicios
docker service ls
# Si no aparecen: reinstalar Dokploy
curl -sSL https://dokploy.com/install.sh | sh

Traefik no renueva SSL

# Verificar ACME
cat /etc/dokploy/traefik/dynamic/acme.json | python3 -m json.tool | head -20

# Verificar que puerto 80 está abierto (ACME HTTP challenge)
curl -s http://crearack.com/.well-known/acme-challenge/test
# Debe responder (aunque sea 404 de Traefik, no timeout)

# Forzar renovación: borrar acme.json y reiniciar Traefik
# ⚠️ Solo si SSL está expirado y no se renueva automáticamente
mv /etc/dokploy/traefik/dynamic/acme.json /etc/dokploy/traefik/dynamic/acme.json.bak
docker restart dokploy-traefik

10. Variables de entorno

Las variables se gestionan exclusivamente desde el panel Dokploy (Settings → Environment).

Categoría de variables actuales:

TipoVariablesEjemplo
DjangoDJANGO_SETTINGS_MODULE, DJANGO_SECRET_KEY, DJANGO_ALLOWED_HOSTS, CSRF_TRUSTED_ORIGINS—
PostgreSQLPOSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD—
CacheREDIS_PASSWORDhex-only (sin -, !, @)
AI ProvidersGEMINI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY—
EmailRESEND_API_KEY—
GitHubGITHUB_TOKEN—
MonitoringVICTORIAMETRICS_URLhttp://victoriametrics:8428
Seguridad cookiesSECURE_COOKIEStrue (producción) / false (staging HTTP)

NOTA: Si Dokploy muere, estos secrets se pierden (están en la BD interna de Dokploy). Mantener una copia cifrada fuera del servidor.


11. Servidor de Staging

ParámetroValor
IP178.104.131.173
Hostnamecrearack-staging
TipoCX23 con 2 vCPU, 3.7 GB RAM (upgrade sin snapshot previo), 40 GB disco
OSUbuntu 24.04.4 LTS (Noble Numbat)
Python3.12.3 (suficiente para bib_ast.py — zero-deps, solo stdlib)
SetupDokploy + stack completo (misma configuración que producción)
Diferencia claveSECURE_COOKIES=false (HTTP sin SSL)

El staging sirve para probar cambios antes de producción. Mismo compose.prod.yml, pero con las variables de entorno ajustadas al dominio de staging. No tiene WAL archiving ni backups offsite — la BD se restaura manualmente desde un backup de producción si es necesario.

Crons del sistema (fuera de Dokploy)

Además del stack Docker, Staging ejecuta varios crons del host como “servidor de tareas periódicas” del ecosistema CreaRack:

CronScriptPropósito
0 0 * * */opt/dr-backups/cron-dr-backup.shBackup nightly del workspace D1 (ver Auto-Reports)
0 3 * * 0/opt/dr-backups/cron-gdrive-sync.shSync semanal de backups a Google Drive
0 8 * * */opt/dr-backups/cron-stale-check.shChequeo diario de docs desactualizados
*/10 * * * */opt/bib-reindex/cron-bib-reindex.shReindex de la Biblioteca (desde 2026-04-21)

El reindex de la Biblioteca vivía hasta 2026-04-20 en el Task Scheduler del PC de Edu (diario 04:00). Se movió a Staging para que el grafo evolucione sin depender de equipos individuales.

Instalación del reindex (documentada para reproducibilidad):

Otros directorios operacionales


Generado por: Claude (Anthropic) + Edu Actualizado: 21-04-2026 (auditoría + migración bib-reindex)

Véase también

Subir