Si alguna vez has querido la comodidad de Heroku sin el coste ni el vendor lock-in, Dokku es probablemente la pieza que te falta. Es un PaaS de código abierto que corre en un único servidor (tu VPS favorito, una Raspberry Pi potente o una instancia bare-metal) y que te permite crear, desplegar y escalar aplicaciones con un flujo tan simple como git push
. La última versión estable, v0.36.9, llega con la misma receta de siempre: núcleo mínimo, extensibilidad por plugins, compatibilidad con Buildpacks y Dockerfile, y una instalación que cualquiera puede completar en menos de media hora.
A continuación se explica, con enfoque práctico, qué es Dokku, cómo instalarlo bien (sin sorpresas), y cómo pasar del “hola mundo” a un entorno con dominio, SSL, plugins de bases de datos, logs y scaling, además de matices de seguridad y operación que conviene aplicar desde el primer día.
Qué es Dokku (y qué no)
Dokku es un PaaS extensible que vive en un servidor de tu elección. Se apoya en Docker para construir y ejecutar las aplicaciones, en nginx para el reverse proxy y en pequeños componentes (cron, init, plugins) para completar el ciclo de vida. Puedes hacer git push
como en Heroku —usando Buildpacks para autodetectar lenguajes— o aportar tu propio Dockerfile si necesitas control total de la imagen.
No es un orquestador multi-nodo ni pretende competir con Kubernetes. Su zona de confort son proyectos individuales o carteras de servicios que caben en un solo host (con CPU/RAM razonables) y que agradecen la simplicidad operativa: una sola IP, un proxy frontal, apps aisladas en contenedores, plugins a demanda.
Requisitos y preparación (lo que ahorra dolores)
- Sistema operativo: Ubuntu 22.04/24.04 o Debian 11+ x64.
- Arquitectura: amd64 (lo habitual en la nube) o arm64 (Raspberry Pi 4/5, Graviton).
- Memoria: 1 GB mínimo (recomendado más). Con menos de 1 GB, habilita swap para evitar fallos durante builds.
- DNS: asocia un dominio o subdominio al servidor. Puedes usar un comodín (
*.midominio.com
) para que cada app seaapp.midominio.com
. Sin dominio, Dokku expone puertos aleatorios en la IP, pero la experiencia mejora mucho con nombres.
Sugerencias de base:
- Usuario con acceso sudo y SSH por clave (desactiva contraseñas).
- Firewall (UFW) abierto en 80/443 y 22.
- Swap de 1–2 GB en VPS pequeños:
fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
.
Instalación de Dokku v0.36.9 (5–10 minutos)
En Debian/Ubuntu, el instalador oficial automatiza dependencias, nginx y plugins base:
# Descargar el instalador
wget -NP . https://dokku.com/install/v0.36.9/bootstrap.sh
# Ejecutar con privilegios, fijando la versión estable
sudo DOKKU_TAG=v0.36.9 bash bootstrap.sh
Lenguaje del código: PHP (php)
Al finalizar, Dokku ya está activo. Toca configurar la clave SSH y el dominio global:
# Añadir tu clave pública al usuario dokku
cat ~/.ssh/authorized_keys | sudo dokku ssh-keys:add admin
# Establecer dominio global (A o CNAME debe apuntar a la IP del servidor)
dokku domains:set-global midominio.com
# Alternativas útiles:
# - Usar directamente la IP (apps por puerto aleatorio)
dokku domains:set-global 10.0.0.2
# - Usar sslip.io para pruebas con subdominios: <IP>.sslip.io
dokku domains:set-global 10.0.0.2.sslip.io
Lenguaje del código: PHP (php)
Consejo: si instalas en nubes como Azure, DigitalOcean o DreamHost, existen guías oficiales con imágenes listas para usar.
Primer despliegue: git push
… y a producción
Crea tu app y despliega como harías en Heroku. Dokku detectará el lenguaje con Buildpacks o usará tu Dockerfile si lo hay.
# Crear la aplicación
dokku apps:create mi-app
# Opcional: asignar dominio explícito a la app
dokku domains:add mi-app app.midominio.com
Lenguaje del código: CSS (css)
En tu repo:
# Añade el remoto de Dokku (sustituye host/dominio según tu caso)
git remote add dokku [email protected]:mi-app
# Sube el código; Dokku construye la imagen y arranca contenedores
git push dokku main
Lenguaje del código: PHP (php)
Al terminar, nginx enruta tráfico a los containers de tu app. Si configuraste app.midominio.com
(y el DNS apunta al servidor), ya estás en línea.
¿Y si falla el build? Lee logs con:
dokku logs mi-app -t
SSL en un comando: Let’s Encrypt
Instala el plugin oficial dokku-letsencrypt
y emite certificados gratuitos:
# Instalar plugin
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
# Ajustar email de notificaciones de certificados
dokku letsencrypt:set --global email [email protected]
# Emitir/renovar para una app
dokku letsencrypt mi-app
# Renovación automática
dokku letsencrypt:cron-job --add
Lenguaje del código: PHP (php)
Con esto, nginx servirá tu app en HTTPS sin más configuración.
Configuración de entorno, logs y scaling
- Variables de entorno:
dokku config:set mi-app NODE_ENV=production API_URL=https://api.midominio.com
# Listar y comprobar
dokku config mi-app
Lenguaje del código: PHP (php)
- Escalar procesos (si tu Procfile define web, worker, etc.):
dokku ps:scale mi-app web=2 worker=1
- Logs en vivo:
dokku logs mi-app -t
- Reinicios / zero-downtime: Dokku hace rolling restarts al reconstruir; puedes forzar reinicio:
dokku ps:restart mi-app
Lenguaje del código: CSS (css)
Añadir servicios con plugins: bases de datos y más
El ecosistema de plugins es la forma de “crecer” Dokku sin inflarlo. Ejemplos comunes:
PostgreSQL
# Instalar plugin
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git
# Crear servicio
dokku postgres:create pg-miapp
# Enlazarlo a la app (inyecta DATABASE_URL)
dokku postgres:link pg-miapp mi-app
# Copia de seguridad (dump)
dokku postgres:export pg-miapp > backup.sql
Lenguaje del código: PHP (php)
Redis
sudo dokku plugin:install https://github.com/dokku/dokku-redis.git
dokku redis:create redis-miapp
dokku redis:link redis-miapp mi-app
Lenguaje del código: JavaScript (javascript)
Tareas programadas (cron)
dokku cron:report # ver tareas
dokku cron:entries:add mi-app "*/5 * * * *" "node scripts/cleanup.js"
Lenguaje del código: PHP (php)
Hay plugins para MySQL/MariaDB, MongoDB, Elasticsearch, MinIO, backups remotos, S3, certificados, entre otros. Como Dokku está basado en plugins —el propio núcleo es un conjunto de ellos—, puedes escribir los tuyos en el lenguaje que prefieras.
Buildpacks vs Dockerfile: ¿qué conviene?
- Buildpacks (Heroku-style): ideales para Node, Ruby, Python, PHP, Go, etc., cuando no necesitas control fino de la imagen. Detectan el stack, instalan dependencias y generan la imagen por ti.
- Dockerfile: elige esta vía si requieres paquetes del sistema, optimizaciones, multi-stage builds o si ya publicas tu app como imagen. Dokku la usará tal cual.
Ambos enfoques coexisten: si hay Dockerfile, se aplica; si no, se recurre a Buildpacks.
Dominios y enrutado: lo justo para no perderte
- Dominio global (lo que configuraste tras instalar) es el fallback para todas las apps.
- Puedes añadir/quitar dominios por aplicación:
dokku domains:add mi-app otra.midominio.com
dokku domains:report mi-app
Lenguaje del código: CSS (css)
- Sin dominio, Dokku asigna puertos aleatorios accesibles vía
http://IP:puerto
. Útil para pruebas, pero en cuanto tengas un subdominio, todo es más fácil (y profesional).
Seguridad y operación: pequeñas decisiones, gran diferencia
- Actualiza Dokku y plugins de forma periódica:
sudo dokku update
sudo dokku plugin:update --all
Lenguaje del código: CSS (css)
- Cierra servicios al exterior: las bases de datos que crea Dokku no exponen puertos públicos por defecto (se accede por link de red interna). Mantén esa política.
- Copias de seguridad: automatiza dumps a S3/Backblaze o snapshots del volumen.
- Logs: considera enviarlos a Papertrail/Logtail/OpenSearch si necesitas retención/consulta avanzada.
- Monitoreo: node exporter + Prometheus/Grafana o soluciones SaaS ligeras te dan métricas (CPU, RAM, disco, latencias de nginx).
- Swap y builds: en VPS pequeños, sin swap los builds fallan. Añádela desde el principio.
- Usuarios/SSH: gestiona claves con
dokku ssh-keys:*
y desactiva acceso por contraseña en el servidor.
¿Cuándo elegir Dokku (y cuándo no)?
Elige Dokku si…
- Buscas propiedad y portabilidad: tu PaaS es tu servidor.
- Necesitas desplegar rápido proyectos greenfield o migrar de Heroku sin rehacer pipelines.
- Quieres costes controlados (un VPS modesto) y simplicidad operativa.
Evita Dokku si…
- Requieres alta disponibilidad multi-zona o escalado multi-nodo.
- Tu equipo/empresa ya está alineado con Kubernetes (y tiene el músculo para operarlo).
- Necesitas servicios gestionados 24/7 con SLA duros y soporte certificado.
Problemas comunes (y cómo salir de ellos)
- Builds que se quedan sin memoria: añade swap, sube el tamaño de la instancia o usa multi-stage builds para imágenes más pequeñas.
- Puertos en uso / conflictos de nginx:
dokku proxy:report mi-app
ydokku ps:report mi-app
para ver rutas y puertos; evita tocar nginx a mano. - Certificados que no renuevan: comprueba que los dominios resuelven a la IP del servidor; re-lanza
dokku letsencrypt:cron-job --add
. - DNS comodín que no responde: revisa el A
*.midominio.com
apuntando a la IP y propagación.
Un cierre honesto
Dokku no promete magia, promete control con poca fricción. Si lo que necesitas es poner en producción una o varias aplicaciones rápido, con git push
, SSL, dominios y bases de datos en minutos, y mantenerlo todo en un único servidor que entiendes, es difícil encontrar una herramienta más directa. La v0.36.9 mantiene la filosofía: un núcleo mínimo, extensible y un camino claro de wget → bootstrap → git push
.
Y si algún día te quedas corto, siempre podrás migrar lo aprendido (Docker, reverse proxy, logs, builds) a entornos más complejos. Mientras tanto, tu PaaS es tuyo.