Instalar Dokploy: Autoaloja tu SaaS y Olvídate de Vercel y Heroku
Guía de instalación de Dokploy en un VPS: protege SSH, añade CrowdSec y swap, y despliega tus primeras apps en esta alternativa gratuita y de código abierto a Vercel y Heroku.
Actualizado Publicado 27 min de lectura

Dokploy es una PaaS gratuita, de código abierto y autoalojada que sustituye a Vercel, Heroku y Netlify en tu propio servidor. Esta guía de instalación de Dokploy recorre todo el camino en un VPS de Hetzner o Hostinger: proteger SSH, añadir swap, bloquear ataques de fuerza bruta con CrowdSec, ejecutar el script de instalación, apuntar un dominio a Traefik y, después, desplegar tu primera app y base de datos.
Tú conservas los datos y tú decides la factura; a cambio, te encargas de los parches, las copias de seguridad y la guardia.
Lo que tendrás al final
Un VPS Ubuntu endurecido ejecutando Dokploy con Docker Swarm, Traefik y TLS de Let’s Encrypt, una app desplegada y una base de datos. Reserva unos 30 minutos de trabajo.
Orden de magnitud del coste: un VPS de 2 vCPU / 4 GB cuesta un dígito en euros al mes en Hetzner o Hostinger. Verifica los precios actuales antes de tomarlos como referencia.
¿Quieres apps gratuitas de código abierto para ejecutar encima? Explora la sección de autoalojadas en toolhunt.net.
Qué necesitas antes de instalar Dokploy
El script de instalación instala Docker, toma los puertos 80 y 443, y se niega a arrancar si algo más ya está escuchando en 80, 443 o 3000. Necesita un servidor limpio.
- Un VPS nuevo con 2 vCPU / 4 GB de RAM y 30 GB+ de disco
- Ubuntu 22.04 o 24.04 LTS, o Debian 12, como imagen del servidor
- Acceso SSH por clave como root al servidor
- Nada más ocupando los puertos 80, 443 o 3000
- Un dominio o subdominio al que puedas añadir registros DNS
- Unos 30 minutos
No instales esto en un servidor que ya aloja algo
El script instala Docker, inicializa Swarm, ejecuta Traefik y se queda con los puertos 80 y 443. Si Nginx, Apache, CyberPanel o Plesk ya están sirviendo sitios ahí, los romperás. Sí comprueba los puertos 80, 443 y 3000 ocupados y sale antes de cambiar nada, pero esa comprobación no es un plan de migración. Usa un VPS nuevo en lugar de probarlo en uno en producción.
Coste y recursos
La documentación de Dokploy pide 2 GB de RAM y 30 GB de disco como mínimo. Eso es el suelo, no el objetivo: el panel más una app pequeña cabe, pero añade PostgreSQL encima y el servidor empieza a usar swap. Para una base de datos y un par de apps, ve a 4 GB y 40 GB+ de disco.
Funciones de Dokploy: Una alternativa gratuita a Vercel y Heroku
Dokploy cubre las piezas que de otro modo conectarías a mano:
- Aplicaciones en Node.js, PHP, Python, Go, Ruby o sitios estáticos, además de cualquier cosa con un Dockerfile, desplegadas desde GitHub, GitLab, Gitea o una imagen directa.
- Stacks de Docker Compose. Pega un archivo compose y Dokploy lo ejecuta. Consulta cómo desplegar una app de Docker Compose en Dokploy.
- PostgreSQL, MySQL, MariaDB, MongoDB y Redis gestionados, con copias de seguridad programadas.
- Enrutado y TLS con Traefik: asocia un dominio en el panel y Traefik enruta al contenedor y solicita un certificado de Let’s Encrypt.
- Monitorización por servicio de CPU, memoria, disco y red. Para más, monitoriza tu servidor y uptime como un profesional con Beszel y Uptime Kuma.
- Copias de seguridad programadas de bases de datos y volúmenes a almacenamiento compatible con S3. Copias de seguridad de Dokploy con Cloudflare R2 cubre la configuración de R2.
- Despliegues multi-nodo: añade servidores y escala servicios con Docker Swarm.
- Plantillas de un clic para n8n, Uptime Kuma, Plausible y apps similares.
Lo que Dokploy no es. Es una PaaS de panel único en tu VPS, no una red edge global: sin CDN delante de cada petición, sin despliegue de vista previa por pull request, sin SLA gestionado, y un VPS es un único dominio de fallo. Si necesitas servir recursos estáticos en todo el mundo, añade un CDN a propósito. Bunny.net es la opción más barata que uso para eso. Cuando empiezas a apilar archivos compose, actualizar stacks de Docker Compose en Dokploy pasa a formar parte de tu semana. ¿Aún eligiendo herramienta? Coolify es la otra alternativa gratuita a Heroku y Netlify.
Instalar Dokploy en un VPS: Guía paso a paso
Vídeo: Recorrido de la instalación de Dokploy
Vídeo anterior
El segundo recorrido es anterior a la interfaz actual del panel, así que algunos menús han cambiado de sitio. Los pasos escritos a continuación son la referencia.
Prepara un VPS para Dokploy (Hetzner y Hostinger)
Elige una región cercana a tus usuarios, escoge un plan sin panel de hosting y añade tu clave pública SSH al crearlo en lugar de una contraseña de root.
Hetzner 20 € Gratis Hostinger VPSLos precios de los VPS subieron en general en 2026 — si estás reconsiderando un servidor alquilado, mira qué cambió y cuándo gana un mini PC.
Yo uso Hetzner por defecto por precio y API, y Hostinger para un KVM sin panel con NVMe fuera de la UE. Si necesitas más ubicaciones, Vultr funciona igual. La reseña de Hetzner Cloud cubre la creación de la cuenta, y monitorizar los recursos del servidor y Docker merece un marcador.
ssh root@your_vps_ip
lsb_release -aSi eso muestra algo que no sea Ubuntu 22.04/24.04 LTS o Debian, reconstruye el VPS ahora.
Actualizar los paquetes del sistema
sudo apt update && sudo apt upgrade -y
apt list --upgradableIdealmente no queda nada por actualizar. Si se instaló una actualización del kernel, reinicia ahora — hacerlo a mitad de la instalación significa reiniciar Swarm y Traefik después.
sudo rebootCrear un usuario sudo para el acceso SSH
# Crear nuevo usuario
adduser dragos
# Añadir el usuario al grupo sudo
usermod -aG sudo dragosUsa un solo nombre y mantenlo igual en cada comando de abajo.
Configurar sudo sin contraseña
# Añadir dragos a sudoers con NOPASSWD
echo "dragos ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/dragos
# Establecer los permisos correctos en el archivo sudoers
sudo chmod 0440 /etc/sudoers.d/dragosUn archivo sudoers mal formado te deja fuera de sudo por completo, así que verifica que sea válido:
sudo visudo -cNOPASSWD está bien en un VPS de un solo usuario donde las claves son la única vía de entrada. En un servidor compartido convierte un usuario de app comprometido en root instantáneo.
Copiar la clave SSH de root al nuevo usuario
# Crear el directorio .ssh para el nuevo usuario
mkdir -p /home/dragos/.ssh
# Copiar las claves autorizadas
cp /root/.ssh/authorized_keys /home/dragos/.ssh/
# Establecer propietario y permisos correctos
chown -R dragos:dragos /home/dragos/.ssh
chmod 700 /home/dragos/.ssh
chmod 600 /home/dragos/.ssh/authorized_keysUn propietario incorrecto aquí solo te dará Permission denied (publickey) en el cliente, así que comprueba:
ls -la /home/dragos/.sshdrwx------ en el directorio, -rw------- en authorized_keys.
Probar la conexión SSH con el nuevo usuario
Abre una nueva ventana de terminal y mantén abierta tu sesión de root:
ssh dragos@your_vps_ip
sudo whoamiNo cierres tu sesión de root hasta que esto funcione
sudo whoami debe devolver root. Es la puerta a todo lo que viene después. Deshabilita el login de root antes de tiempo y tu única vía de regreso es la consola de rescate del proveedor.
Deshabilitar el acceso SSH de root
sudo nano /etc/ssh/sshd_configEstablece:
PermitRootLogin noO permite root solo desde una IP conocida si lo necesitas para un segundo nodo de Dokploy:
Match User root
PermitRootLogin yes
AllowUsers root@<ip-address>Guarda (Ctrl+X, luego Y, luego Enter), verifica la configuración y reinicia SSH:
sudo sshd -t
sudo systemctl restart sshSi systemctl dice que la unidad no existe, en esa imagen es sshd. Luego abre una tercera terminal y confirma que ssh dragos@your_vps_ip sigue funcionando. Si no, usa tu sesión de root aún abierta para poner PermitRootLogin yes y revisa de nuevo los permisos de la clave. La guía completa de endurecimiento del servidor SSH cubre el resto.
Limitar el tiempo de espera de las sesiones SSH
Añade a /etc/ssh/sshd_config:
ClientAliveInterval 900
ClientAliveCountMax 0Luego sudo systemctl restart ssh. Esto cierra las sesiones inactivas tras 15 minutos. ClientAliveCountMax 0 las corta de golpe, así que un apt upgrade largo sobre un wifi inestable muere a mitad de camino — usa 3 en ese caso.
Añadir swap a tu VPS
El swap es lo que evita que un pico de memoria haga que el OOM killer mate tu base de datos:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabDale un tamaño cercano a la RAM: 2 GB para un servidor de 4 GB, más si el servidor es más pequeño. Que sea una red de seguridad, no una muleta:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
free -h
swapon --showDespués reinicia una vez mientras el servidor aún es desechable — si /etc/fstab está mal, quieres descubrirlo ahora. ¿Ya está usando swap? Averigua qué procesos están usando tu swap antes de culpar a la app.
Protege tu servidor con CrowdSec
CrowdSec bloquea ataques de fuerza bruta, escaneos de puertos y reincidentes, y protege SSH de fábrica. Los conceptos están en cómo proteger un servidor VPS con CrowdSec.
Instalar CrowdSec
curl -s https://install.crowdsec.net | sudo sh
sudo apt update && sudo apt install crowdsecInstalar el Firewall Bouncer con iptables
sudo apt install crowdsec-firewall-bouncer-iptables -y
sudo iptables -LDeberías ver CROWDSEC_CHAIN creada y activa:
Chain INPUT (policy ACCEPT)
target prot opt source destination
CROWDSEC_CHAIN all -- anywhere anywhere
Chain CROWDSEC_CHAIN (1 references)
target prot opt source destination
DROP all -- anywhere anywhere match-set crowdsec-blacklists srcConfigurar las reglas del firewall
Permite solo lo que el servidor sirve:
# Permitir conexiones establecidas
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permitir loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Permitir SSH (puerto 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Permitir HTTP (puerto 80)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Permitir HTTPS (puerto 443)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Permitir Dokploy (puerto 3000)
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
# Descartar el resto del tráfico entrante
sudo iptables -P INPUT DROP-P INPUT DROP establece la política por defecto en lugar de añadir una regla DROP, así que la cadena de CrowdSec mantiene su posición y evalúa el tráfico primero.
Lee esto antes de establecer la política DROP
iptables -P INPUT DROP por SSH te deja fuera si faltan las reglas ACCEPT o si un netfilter-persistent reload las borra. Mantén una sesión de root abierta y sabe dónde está la consola fuera de banda de tu proveedor antes de necesitarla. Recuperación: iptables -P INPUT ACCEPT, vuelve a añadir las reglas, netfilter-persistent save.
Advertencia honesta: Docker reescribe las cadenas de iptables al arrancar y reiniciar, y los puertos publicados de los contenedores pueden saltarse las reglas INPUT del host en algunas configuraciones. Trata estas reglas como protección del host y filtra el tráfico de los contenedores con la cadena DOCKER-USER o a nivel de aplicación.
Hacer persistentes las reglas del firewall
sudo apt install iptables-persistent -yResponde Yes a guardar las reglas IPv4 e IPv6 actuales, y después:
sudo netfilter-persistent saveTras cualquier cambio posterior: sudo netfilter-persistent save && sudo netfilter-persistent reload.
Verificar la instalación de CrowdSec
# Comprobar el estado de CrowdSec
sudo systemctl status crowdsec
# Listar colecciones activas (debería incluir crowdsecurity/sshd)
sudo cscli collections list
# Verificar que el bouncer del firewall está activo
sudo cscli bouncers listLa colección crowdsecurity/sshd se instala automáticamente. Vuelve al día siguiente y comprueba la otra mitad de la historia:
sudo cscli decisions list
sudo iptables -L CROWDSEC_CHAIN -n -vBaneos en el primer comando, contadores de paquetes en el segundo. Un bouncer activo con cero decisiones tras una semana suele significar que tu puerto SSH no es el que están escaneando, o que tu proveedor filtra aguas arriba.
Probar la protección de CrowdSec
# Ver las reglas gestionadas por CrowdSec
sudo iptables -L CROWDSEC_CHAIN -n -v
# Ver todas las reglas del firewall
sudo iptables -L -n -vCuando CrowdSec bloquea una IP, aparece en estas cadenas.
Comandos útiles de CrowdSec
# Ver bloqueos/baneos activos
sudo cscli decisions list
# Ver alertas de seguridad recientes
sudo cscli alerts list
# Ver métricas de seguridad
sudo cscli metrics
# Monitorizar logs en tiempo real
sudo tail -f /var/log/crowdsec.logInstalar Dokploy en Ubuntu (Docker y Traefik)
Servidor actualizado, usuario protegido, swap activado, CrowdSec vigilando. La instalación es un solo comando:
curl -sSL https://dokploy.com/install.sh | shEl script instala Docker e inicializa Swarm, despliega Traefik como proxy inverso para todo lo que despliegues después, y arranca el panel en el puerto 3000. El empaquetado ha cambiado entre versiones, así que verifícalo en tu propio servidor:
docker ps
curl -I http://localhost:3000docker ps debería mostrar el contenedor de Dokploy y Traefik (si tu versión incluye una unidad systemd en su lugar, systemctl status dokploy). Cualquier respuesta HTTP de curl -I demuestra que el panel está escuchando. Después abre http://your_vps_ip:3000 para la pantalla de configuración inicial.
Cuando falla, lo hace de una de estas maneras:
curl: command not found—apt install -y curlen imágenes mínimas.- El script rechaza tu versión del SO — reconstruye con Ubuntu LTS; no intentes saltarte la comprobación.
- Puerto 3000 en uso —
ss -tulpn | grep 3000, luego detén ese servicio o empieza de cero. - 80/443 ocupados por Nginx, Apache o un panel —
systemctl stop nginxes un parche temporal, no una solución. - Sin espacio en disco —
df -h. - Abortó a mitad, Swarm arriba pero sin panel — vuelve a ejecutar el mismo comando; se puede reejecutar. Verifica con
docker ps.
Apunta tu dominio o subdominio a Dokploy
Dale un nombre al panel y un wildcard a tus apps, para que los próximos diez despliegues no necesiten tocar el DNS.
- Registro A para el panel —
dokploy.yourdomain.com→ IPv4 del VPS. - Registro A wildcard para las apps —
*.apps.yourdomain.com→ la misma IP.
Type: A
Name: dokploy
Value: your_vps_ip
TTL: 3600
Type: A
Name: *.apps
Value: your_vps_ip
TTL: 3600Verifica antes de esperar a los certificados:
dig +short dokploy.yourdomain.comDebe devolver la IP de tu VPS. Luego carga https://dokploy.yourdomain.com y confirma que el certificado es un Let’s Encrypt real, no un aviso de autofirmado. Traefik lo solicita automáticamente una vez asociado el dominio.
El DNS wildcard te ahorra un paso por app
Un solo registro *.apps convierte una app nueva en una acción del panel, no en una edición de DNS. También hace que un certificado wildcard de Traefik valga la pena si emitir por host se vuelve tedioso.
Si el certificado no se emite: el DNS no se ha propagado (dig de nuevo, ojo al TTL), el puerto 80 está cerrado y el reto HTTP-01 falla, o has alcanzado el límite de peticiones de Let’s Encrypt y toca esperar. Por debajo, Traefik es un proxy inverso gobernado por labels — la guía de proxy inverso Traefik en Docker explica el modelo de enrutado.
Empieza a desplegar apps en el panel de Dokploy

- Abre el panel —
http://your_vps_ip:3000, ohttps://dokploy.yourdomain.comuna vez que DNS y TLS resuelvan. - Crea la cuenta de administrador — la pantalla de primer arranque. Hazlo antes de que el panel sea público, o quien encuentre el puerto 3000 será dueño de tu servidor.
- Crea un proyecto — una carpeta para apps y bases de datos relacionadas.
- Despliega algo — elige una vía de las de abajo.
- Añade una base de datos — PostgreSQL, MySQL, MariaDB, MongoDB o Redis, creada y con contraseña gestionada desde el panel.
- Asocia un dominio — pestaña Domains, elige el hostname, guarda. Traefik se encarga del resto.
App Git
Apunta Dokploy a un repo de GitHub/GitLab/Gitea o a una imagen Docker directa, elige el tipo de build (Dockerfile, buildpack o estático), configura las variables de entorno y despliega. Añade el webhook para despliegue automático en cada push.
Docker Compose
Pega el archivo compose, añade las variables de entorno en el panel y define qué contenedor responde a HTTP en la pestaña Domains. Detalles y labels de Traefik: desplegar una app de Docker Compose en Dokploy.
Plantilla
Servicios de un clic para bases de datos, n8n, Uptime Kuma, Plausible y más — la forma más rápida de aprender el panel. Autoalojar n8n con Docker, Traefik y Dokploy es una buena primera plantilla.
Verifica el despliegue desde ambos lados
Un badge verde en el panel y un 502 de Traefik es el desajuste clásico. Comprueba el contenedor en el panel y docker ps en el host, luego haz curl -I a la URL pública. Contenedor arriba pero URL con 502 suele significar que el dominio no está asociado o que la app no está en la red de Traefik.
En cuanto exista una base de datos, el orden importa: automatiza las copias de seguridad de Dokploy con Cloudflare R2 antes de que entre información real. Una base de datos sin copia de seguridad no está desplegada, está en peligro.
Solución de problemas comunes de la instalación de Dokploy
El script de instalación falla o sale antes de tiempo
Versión de SO no soportada, sin espacio en disco, o un Swarm a medias de un intento anterior:
df -h
docker infoSi el disco está bien y el SO está soportado, vuelve a ejecutar curl -sSL https://dokploy.com/install.sh | sh. Se puede reejecutar — verifica con docker ps, no lo des por hecho.
No puedo acceder al panel de Dokploy en el puerto 3000
Comprueba el proceso que escucha y tus reglas:
ss -tulpn | grep 3000
sudo iptables -L INPUT -n --line-numbersLuego la capa por encima de tu servidor: tanto Hetzner como Hostinger tienen firewalls en la nube que descartan tráfico antes de que iptables lo vea.
Me quedé fuera de SSH tras el paso del firewall o de CrowdSec
Usa la consola de rescate del proveedor e inicia sesión ahí:
iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
netfilter-persistent saveLuego vuelve a añadir el resto y guarda de nuevo. Nunca establezcas una política DROP desde la sesión en la que la estás probando. Más en proteger un VPS con CrowdSec.
Traefik devuelve 404 o 502 para mi app
404 significa que Traefik no conoce el hostname; 502 que encontró la ruta pero nada responde en el puerto configurado. Revisa primero la pestaña Domains — dominio asociado, puerto de destino igual al que la app realmente escucha. Después:
docker network inspect dokploy-networkUn archivo compose que declara el puerto 3000 mientras la app escucha en 8080 da un 502 permanente que parece culpa de Traefik y no lo es.
Mi app funciona pero HTTPS falla o el certificado se queda pendiente
El DNS no se ha propagado (dig +short your.domain), el puerto 80 está cerrado y el reto HTTP-01 no puede completarse, o has quemado el límite de peticiones de Let’s Encrypt y toca esperar. Arregla el DNS, prueba curl -I http://your.domain, y reintenta HTTPS.
El servidor se queda sin memoria o todo va lento
Casi siempre es un servidor de 2 GB ejecutando Postgres y una app:
free -h
docker stats --no-streamLo más barato primero: confirma que el swap está montado, pon límites de memoria de Docker por servicio, usa imágenes más pequeñas o saca la base de datos del servidor. Usar swap bajo carga normal significa que el plan es demasiado pequeño — amplía en lugar de ajustar.
¿Cómo actualizo Dokploy?
Usa el mecanismo de actualización del panel, o el procedimiento vigente en la documentación de dokploy.com. No te doy un curl de una línea: el comando de actualización ha cambiado entre versiones. Haz un snapshot del VPS y copia /etc/dokploy primero — ese directorio es lo que convierte una reconstrucción en un trabajo de 10 minutos.
Antes de depurar nada, ejecuta el chequeo de salud de una línea:
docker ps && curl -I https://dokploy.yourdomain.com && free -hEndurecimiento, copias de seguridad y notas de operación para un servidor Dokploy
- Copias de seguridad:
/etc/dokploycopiado fuera del servidor, dumps programados de la base de datos a almacenamiento compatible con S3, y un procedimiento de restauración que hayas ejecutado de verdad - Actualizaciones:
unattended-upgradesde Ubuntu para los parches de seguridad; Docker y Dokploy en un calendario con snapshot previo - Exposición: no dejes el panel en
:3000para siempre — ponlo detrás de un dominio con TLS y restringe el puerto a tu IP, o ciérralo - Monitorización: Beszel + Uptime Kuma, para enterarte de un disco lleno antes de que tus usuarios vean un error
- Recursos: límites de memoria de Docker por app, alertas de espacio en disco y un plan para el día en que el único VPS muera
Una capa más que vale la pena en un servidor que sirve a internet público: NextDNS cubre el filtrado a nivel DNS (redes de malware, anuncios y rastreo) mientras CrowdSec cubre SSH y el host.
Preguntas frecuentes
¿Dokploy es gratis?
Sí. Dokploy es de código abierto y autoalojado, así que el coste recurrente es el VPS más tu tiempo; existe una oferta gestionada si prefieres no parchear un servidor. Los botones de Hetzner y Hostinger de arriba son enlaces de afiliado — no te cuestan nada extra.
¿Cuánta RAM y CPU necesita Dokploy?
2 GB para el panel y una app pequeña; 4 GB en cuanto añades PostgreSQL o MySQL en el mismo servidor. Las bases de datos en un VPS de 2 GB son la forma en que el OOM killer conoce tus datos de producción. 1 vCPU aguanta tráfico ligero, 2 va cómodo, y empieza con 40 GB de disco.
¿Dokploy sustituye a Vercel para un sitio estático?
Puede alojarlo, pero pierdes lo que pagabas a Vercel: una red edge global que sirve cada petición desde el PoP más cercano. Un VPS es un solo datacenter. Pon un CDN delante y la diferencia se cierra casi por completo para recursos estáticos.
¿Puedo ejecutar Dokploy en ARM (Hetzner CAX, Ampere) o en una Raspberry Pi?
Docker, Traefik y la mayoría de las apps autoalojadas funcionan en ARM, pero no he probado esta guía ahí, así que no afirmaré que vaya fino: las imágenes sin soporte multi-arch son el fallo habitual, y una Raspberry Pi vieja es un mal host para bases de datos. Para servicios reales, usa x86_64.
¿Dokploy o Coolify?
Ambos son paneles Docker gratuitos con proxy inverso, y ambos ejecutan la misma app; la diferencia está en cómo se configuran los despliegues y cuánto te oculta el panel. Elige uno, despliega dos apps reales y luego decide — el coste de cambiar es bajo. Análisis completo: la comparativa Coolify vs Dokploy vs Kamal 2.
Conclusión
Ahora tienes tu propia PaaS pequeña: un usuario sudo en lugar de root, SSH cerrado, swap configurado, CrowdSec bloqueando intentos de fuerza bruta, Dokploy instalado con Docker y Traefik, un dominio con certificado real, y una primera app más base de datos funcionando.
- Actualizaciones del sistema aplicadas antes que cualquier otra cosa
- Un usuario sudo dedicado en lugar de root
- Endurecimiento de SSH — sin login de root, tiempo de espera por inactividad
- CrowdSec con el bouncer de iptables activo
- Swap, para que un pico de memoria no mate tu base de datos
Lo siguiente, en el orden en que yo lo haría: copias de seguridad de la base de datos a almacenamiento compatible con S3, luego Beszel y Uptime Kuma para que los problemas te encuentren primero, y después una segunda app desde un stack de Docker Compose — ahí es donde el panel empieza a pagarse solo.
La línea de coste honesta
Autoalojar Dokploy es un VPS de un dígito de euros al mes más tu tiempo, y el tiempo es la parte recurrente. Si prefieres no parchear, copiar y monitorizar un servidor, la factura de Vercel o Heroku es exactamente lo que compras a cambio de ese trabajo. Pagar por ambos es la única respuesta realmente equivocada.
¿Aún indeciso? La comparativa Coolify vs Dokploy vs Kamal 2 cubre dónde encaja cada PaaS autoalojada.


