🚀 Dokploy — Tu Propio PaaS Self-Hosted
Vercel/Heroku, pero en tu VPS
Plataforma de despliegue gratuita y open source que convierte cualquier servidor propio (VPS o dedicado) en un PaaS. Despliegas con
git push, obtienes SSL automático, proxy reverso, bases de datos y métricas, sin pagar por usuario ni ancho de banda y sin vendor lock-in.
- 🌐 Web: dokploy.com
- 📜 Licencia: open source
- 🧰 Stack: Docker · Traefik · Next.js · PostgreSQL
- 🖥️ Requisitos mínimos: 2 GB RAM · 30 GB disco
- 🎥 Fuente: video de Nicolás Schürmann (HolaMundo) — URL por confirmar
1️⃣ Qué es Dokploy
Una alternativa autoalojada a Vercel, Heroku o Netlify. En lugar de pagar una plataforma gestionada, montas la tuya en un servidor y conservas el control de la infraestructura.
Características principales
| Capacidad | Detalle |
|---|---|
| Multi-lenguaje | Node.js, Python, PHP, Go, Ruby y más. |
| Integración Git | GitHub, GitLab, Bitbucket, Gitea o Git estándar, con despliegues continuos. |
| Infraestructura | Gestión de dominios, SSL automático (Let’s Encrypt / Traefik) y bases de datos: PostgreSQL, MySQL, Redis, MongoDB, etc. |
| Escalabilidad horizontal | Empiezas con un servidor y agregas más vía Docker Swarm, distribuyendo la carga entre máquinas. |
| Empaquetado automático | Dockerfile, docker-compose, Nixpacks y Railpack. |
Railpack vs Nixpacks
Railpack detecta lenguaje y dependencias y arma el contenedor sin que escribas un
Dockerfile. En el video, Nixpacks falló con Node 26; Railpack resolvió la versión sin problema.
2️⃣ Arquitectura interna
Dokploy se compone de cuatro capas:
Internet
│
▼
┌─────────────────────────────┐
│ Traefik (reverse proxy) │ ← 80/443, SSL, enrutamiento por dominio
└──────────────┬──────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ Panel Next.js│ │ Contenedores app │
│ (admin) │ │ APIs y DBs │
└──────┬───────┘ └──────────────────┘
│
▼
┌──────────────┐
│ PostgreSQL │ ← credenciales, configs, estados, registros
└──────────────┘| Capa | Función |
|---|---|
| Proxy reverso (Traefik) | Recibe todo el tráfico HTTP/HTTPS externo y lo enruta al contenedor correcto. |
| Panel de administración | App web en Next.js para proyectos, métricas y configuración. |
| Base de datos interna | PostgreSQL: credenciales, configuración, estados de servicios y registros. |
| Capa de contenedores | Apps, APIs y bases de datos en contenedores Docker aislados. |
3️⃣ Forward Proxy vs Reverse Proxy
Paréntesis conceptual clave para entender dónde encaja Traefik.
| Forward Proxy | Reverse Proxy | |
|---|---|---|
| Posición | Entre los clientes (oficina/red local) e Internet. | Entre Internet y los servidores/contenedores internos. |
| Actúa en nombre de | Los clientes. | Los servidores. |
| Usos | Filtrar páginas, bloquear tráfico peligroso, registrar actividad saliente. | Recibir peticiones a un dominio y reenviarlas al contenedor/puerto interno. |
| Ejemplo | Proxy corporativo. | Traefik en Dokploy. |
Cómo enruta Traefik
Un usuario pide
holamundo.ioochanchitofeliz.com. Traefik recibe la petición en 80/443, inspecciona dominio o ruta y la manda al contenedor interno correspondiente.
4️⃣ Requisitos y preparación del servidor
- Mínimo recomendado: 2 GB RAM y 30 GB disco.
- El disco importa: la compilación y la descarga de imágenes Docker consumen espacio temporal.
- Entorno del video: VPS de HostGator con 2 GB DDR5 y 50 GB NVMe, imagen limpia de Ubuntu 22.04 LTS.
- Definir contraseña de
rootpara entrar por consola.
2 GB es el piso, no lo cómodo
Los builds de Node pueden quedarse sin memoria en 2 GB. Si el presupuesto lo permite, 4 GB RAM evita OOM durante compilaciones. El propio video muestra un caso ajustado.
5️⃣ Instalación paso a paso
1. Acceso SSH
ssh -p 22022 root@<IP_DEL_SERVIDOR>El puerto
22022es el del ejemplo; usa el que te asigne tu proveedor.
2. Script instalador
curl -sSL https://dokploy.com/install.sh | shEl script:
- Instala dependencias.
- Instala Docker si no está.
- Levanta Traefik y PostgreSQL.
- Levanta el contenedor de Dokploy.
curl | shEs cómodo, pero ejecuta código remoto como root. Si te importa la cadena de suministro, descarga el script, revísalo y ejecútalo localmente.
3. Dashboard
Tras un par de minutos, la terminal indica que el servicio está en el puerto 3000:
http://<IP_DEL_SERVIDOR>:30004. Cuenta administrador
En el primer acceso se crea el usuario inicial: nombre, correo y contraseña.
6️⃣ Configurar proyecto y aplicación
Crear el proyecto
- Proyecto de ejemplo:
Shorty(acortador de enlaces). - Dokploy ofrece plantillas de un clic vía Docker Compose: WordPress, Ghost, n8n, Uptime Kuma, etc.
- En el video se salta el onboarding para desplegar código propio.
Explorar el dashboard
- Monitoring: CPU, RAM, disco, almacenamiento de Docker, red e I/O en tiempo real.
- Contenedores Docker: vista del estado de cada contenedor.
Crear el servicio
- En
Shorty→ Create Service → Application. - Nombre:
Node React Web app.
Conectar GitHub
Settings→Git Providers.- Agregar GitHub creando automáticamente una GitHub App.
- Dar permisos solo al repositorio del proyecto (
shorty).
Configurar el despliegue
| Campo | Valor |
|---|---|
| Provider | GitHub |
| Cuenta | La del usuario |
| Repositorio | shorty |
| Rama | main |
| Trigger Type | On Push |
| Build Type | Railpack |
On Push hace que cada push a main dispare un despliegue automático.
7️⃣ Primer despliegue, 502 y variables de entorno
- Pulsar Deploy y seguir los logs de compilación en tiempo real mientras Railpack prepara las capas.
- En Domains, asociar un dominio propio o generar uno temporal con
sslip.io, apuntando al puerto interno 3000.
El error 502
Al abrir el dominio, la web devuelve 502 Bad Gateway.
Diagnóstico:
- Ir a Logs de la aplicación.
- Los contenedores se crean pero pasan a estado
Exitedinmediatamente.
Causa: faltan variables de entorno obligatorias para que la app arranque.
Solución:
- Ir a la pestaña Environment.
- Agregar las variables necesarias:
NODE_ENV=production
PORT=3000- Pulsar Save.
- La app se reinicia; al recargar la URL, carga correctamente.
Lección de troubleshooting
502 + contenedor
Exitedcasi siempre significa que el proceso murió al arrancar, no que el proxy esté mal. Revisar logs del contenedor antes de tocar Traefik.
8️⃣ Probar el flujo CI/CD
- En el editor local (Neovim), modificar
Login.jsxy cambiar el título a"Hola Mundo Shorty". - Con lazygit, hacer commit:
"Nuevo título en pantalla de login". git pushamain.- En Dokploy, Deployments detecta el webhook de GitHub y muestra
Runningpara el nuevo commit. - Al terminar en verde (
Done), recargar el navegador: el cambio ya está en producción.
push → webhook GitHub → build Railpack → deploy contenedor → SSL/Traefik → producción9️⃣ Conclusión
Dokploy da las comodidades de un PaaS moderno:
- Despliegues con
git push - SSL automático
- Proxy reverso
- Soporte multi-servidor
- Métricas
Sin tarifas elevadas por usuario o ancho de banda, sin vendor lock-in y sobre infraestructura propia.
⚠️ Notas prácticas
- Seguridad del panel: el dashboard en
:3000debería quedar detrás de firewall/VPN o de un dominio con SSL y auth. No exponerlo abierto a Internet. - Backups: la PostgreSQL interna guarda credenciales y configuración; respaldarla es parte del plan.
- Multi-servidor: Docker Swarm suma capacidad, pero también complejidad operativa (redes, volúmenes, estado).
- Builds: vigilar RAM y disco durante compilaciones; limpiar imágenes huérfanas.
- Dependencia del proveedor: aunque evitas el lock-in de Vercel/Heroku, dependes de tu VPS y de tu operación.
- Plantillas: WordPress, Ghost, n8n y Uptime Kuma son atajos útiles para empezar; revisar sus requisitos y actualizaciones.
🔗 Enlaces relacionados
- ☁️ Botkeep Cloud & DevLink Stack — PostgreSQL, Redis y stack self-hosted.
- Git · Github — base del flujo de despliegue.
- 💼 freehire — app full-stack que podría desplegarse con este modelo.
- 🚨 PHP2Shell — si despliegas PHP, parchear el runtime.
- 📥 Vault Ingest — cómo se guardó esta nota.