Por qué autoalojar una interfaz de despliegue en un VPS
Un VPS con Docker te deja una sola interfaz: la línea de comandos. Es suficiente para una máquina, tedioso para cinco e inmanejable para un equipo. Una interfaz web centraliza los logs, las actualizaciones de imágenes, las variables de entorno y los certificados TLS, sin obligarte a mantener un pipeline CI/CD completo desde el primer día.
Dos familias compiten: los gestores (Portainer, Yacht) que exponen Docker tal como es, y los PaaS ligeros (Dokploy, Coolify, CapRover) que añaden una capa de despliegue — ramas Git, dominios automáticos, certificados Let's Encrypt. La diferencia no es cosmética: determina si tus desarrolladores pueden desplegar solos o necesitan acceso SSH.
Lo que ganas al desplegar este template en tu VPS
- Despliegue desde Git o Docker Hub en pocos clics, sin SSH
- Gestión automática de certificados TLS mediante Let's Encrypt
- Variables de entorno versionadas y aisladas por proyecto
- Logs centralizados y terminal web desde el navegador
- Panel de salud: CPU, RAM, estado de los contenedores
- Gestión de volúmenes y redes Docker sin memorizar comandos
Portainer en 2026: el fin de la edición Community
Portainer CE (Community Edition) fue la referencia del sector durante años. Con Portainer 3, el editor puso fin a la edición Community: Portainer 3 no tiene edición CE, y CE 2.45 es la última versión Community publicada. Portainer 3 se distribuye como Business Edition (gratuita hasta tres nodos con la licencia «3 Nodes Free»), da prioridad a Kubernetes para las nuevas funciones y mantiene Docker, Swarm y Podman. Las instancias CE 2.45 siguen funcionando y reciben los parches de la 2.45 LTS hasta agosto de 2027, pero ninguna función nueva.
Este cambio tiene varias consecuencias prácticas. Las nuevas instalaciones que buscan una interfaz Docker gratuita no encuentran hoja de ruta para CE. Las imágenes portainer/portainer-ce siguen existiendo y recibiendo los parches de la rama 2.45, pero ya no evolucionarán. Y de forma crítica — Portainer 2.x ha acumulado fallos críticos, entre ellos dos CVEs con puntuación 9.4, que siguen siendo explotables en cualquier instalación sin parchear.
Si todavía usas Portainer 2.x, la pregunta no es si migrar por principio: es si tu instancia está actualizada y si el riesgo es aceptable.
CVEs críticos de Portainer 2.x: verificar y parchear
Dos CVEs afectan a todas las ramas de Portainer hasta las versiones corregidas indicadas abajo (las versiones anteriores a 2.33.0, sin soporte, no se corregirán):
CVE-2026-44848 (CVSS 9.4) — Los endpoints /plugins/* de la API Docker que Portainer reenvía escapan al control de autorización. Un usuario estándar (no administrador) con acceso a un entorno Docker puede instalar y activar un plugin Docker, que se ejecuta como root en tu host.
CVE-2026-44849 (CVSS 9.4) — El mecanismo de restricciones Swarm puede ser eludido: un usuario de Portainer con derechos reducidos puede ejecutar acciones normalmente reservadas al administrador en un clúster Swarm.
Versiones corregidas: 2.33.8, 2.39.2, 2.41.0. Desde entonces se han publicado otros fallos críticos, corregidos en 2.45.2 y 2.45.3 y sin parche en la rama 2.39: apunta a la 2.45.3 LTS, última versión publicada a 7 de noviembre de 2026.
Para verificar tu versión:
docker exec portainer /portainer --versionPara actualizar:
docker pull portainer/portainer-ce:lts
docker stop portainer
docker rm portainer
docker run -d \
--name=portainer \
--restart=always \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:ltsSi estás por debajo de 2.45.3, actualiza antes de seguir usando la instancia. Este comando solo publica la interfaz en 127.0.0.1: accede mediante un túnel SSH (ssh -L 9443:127.0.0.1:9443 user@tu-vps, luego https://localhost:9443) o un proxy inverso. Añade -p 8000:8000 solo si usas agentes Edge. Portainer expuesto en internet sin parches es un vector de intrusión directo en tu host Docker.
CVE de Dokploy: el secreto hardcoded (< 0.29.3)
Dokploy tampoco está exento de vulnerabilidades. CVE-2026-45631 (CVSS 10.0) afectaba a las instalaciones por defecto anteriores a 0.29.3: cuando la variable BETTER_AUTH_SECRET no estaba definida — y el script de instalación no la definía —, el código recurría a un valor hardcoded, idéntico en todas las instancias. Cualquiera podía falsificar un token y tomar la cuenta de administrador, sin autenticación.
La corrección llegó en 0.29.3, junto con un script de migración que se ejecuta tras actualizar. Muchos otros fallos críticos (inyecciones de comandos, controles de acceso ausentes) se corrigieron hasta la 0.29.13: no te quedes por debajo y apunta a la última versión (0.31.0 a 7 de noviembre de 2026). Para verificar y actualizar:
# Verificar la versión instalada (tag de la imagen del servicio)
docker service inspect dokploy --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'
# Actualizar mediante el script oficial
curl -sSL https://dokploy.com/install.sh | sh -s updateDesde 0.29.3, Dokploy lee BETTER_AUTH_SECRET desde un secreto Docker (variable BETTER_AUTH_SECRET_FILE). Tras actualizar, verifica que el servicio lo usa:
docker service inspect dokploy --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' | grep BETTER_AUTH_SECRET_FILESi la línea no aparece, ejecuta el script de seguridad oficial publicado con la 0.29.3: genera un secreto único y actualiza el servicio.
curl -sSL https://dokploy.com/security/0.29.3.sh | bashPrerequisitos para alojar Portainer o Dokploy
Ambas herramientas funcionan sobre Docker. Dokploy requiere algo más de recursos, ya que incluye una base de datos PostgreSQL y un proxy Traefik además del servicio principal.
Recursos mínimos recomendados
- Portainer 2.x: el editor no publica un mínimo de hardware; la 2.45.3 está validada con Docker 28.5.1 y 29.8.1 — funciona en un VPS pequeño
- Dokploy: al menos 2 GB de RAM y 30 GB de disco según la documentación oficial — PostgreSQL y Traefik se ejecutan junto al servicio principal
- Un dominio o subdominio apuntando a tu VPS (Dokploy lo necesita para los certificados automáticos)
- Puertos 80 y 443 abiertos si usas Let's Encrypt vía Traefik (Dokploy)
- Acceso SSH root o sudo para la instalación inicial
Desplegar Dokploy en un VPS (≥ 0.29.13)
Instalación mediante el script oficial
El método más sencillo y actualizado:
curl -sSL https://dokploy.com/install.sh | shEl script instala Docker si es necesario, inicializa Docker Swarm, crea los servicios
dokployydokploy-postgresy el contenedordokploy-traefik(configuración en/etc/dokploy/), genera unBETTER_AUTH_SECRETaleatorio guardado en un secreto Docker y arranca todo.Verificar el BETTER_AUTH_SECRET
Tras la instalación, asegúrate de que el servicio lee su secreto:
docker service inspect dokploy --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' | grep BETTER_AUTH_SECRET_FILEDeberías ver una línea
BETTER_AUTH_SECRET_FILE=/run/secrets/...: el valor (64 caracteres hexadecimales generados poropenssl rand -hex 32) queda en el secreto Docker y nunca aparece en claro. Si la línea no aparece (instalación antigua), ejecuta el script de seguridad oficial:curl -sSL https://dokploy.com/security/0.29.3.sh | bashAcceder a la interfaz y crear la cuenta de administrador
Dokploy escucha en el puerto 3000 por defecto. Abre
http://<ip-de-tu-vps>:3000en el navegador. La primera visita te invita a crear la cuenta de administrador. Hazlo inmediatamente — la interfaz es pública hasta que exista esta cuenta.Configurar tu dominio y activar HTTPS
En Settings → Web Server → Server Domain, introduce tu FQDN (
dokploy.tudominio.com). Traefik obtiene automáticamente un certificado Let's Encrypt vía ACME HTTP-01. Tu DNS debe apuntar al VPS antes de este paso. Cuando la interfaz se sirva por HTTPS, cierra el puerto 3000 a internet, como recomienda la guía de endurecimiento de Dokploy:ufwpor sí solo no filtra los puertos publicados por Docker, usaufw-dockero el cortafuegos de tu proveedor.Actualizar Dokploy
Dokploy expone un botón de actualización en Settings → Web Server, o usa el script:
curl -sSL https://dokploy.com/install.sh | sh -s updateCon el argumento
update, el script descarga la imagen de la última versión y actualiza el serviciodokploysin borrar tu configuración ni tus proyectos. Sin ese argumento, lanza una instalación completa, que falla en un servidor ya instalado (puertos 80, 443 y 3000 ocupados).
Portainer como alternativa — instalación rápida
Si prefieres quedarte con Portainer (instancia existente o elección deliberada), el comando de referencia:
docker run -d \
--name=portainer \
--restart=always \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:ltsAcceso mediante un túnel SSH (ssh -L 9443:127.0.0.1:9443 user@tu-vps, luego https://localhost:9443) o un proxy inverso. Sustituye lts por 2.45.3 para fijar la versión y evitar actualizaciones silenciosas.
Portainer 2.x vs Dokploy — comparativa completa 2026
Desplace la tabla
| Criterio | Portainer 2.x | Dokploy |
|---|---|---|
| Licencia | CE gratuita (licencia zlib) | Apache 2.0 (salvo la carpeta /proprietary) |
| Futuro CE | CE se detiene en 2.45 (parches hasta agosto de 2027) | Hoja de ruta activa, comunidad creciente |
| CVEs activos | CVE-2026-44848 + 44849 (CVSS 9.4) y avisos posteriores: apuntar a 2.45.3 | CVE-2026-45631 (CVSS 10.0) si < 0.29.3; apuntar a ≥ 0.29.13 |
| RAM mínima | No publicada (herramienta ligera) | 2 GB (PostgreSQL + Traefik incluidos) |
| Despliegue Git | Sí (stacks Compose desde un repositorio Git) | Sí (GitHub, GitLab, Gitea, Bitbucket) |
| Certificados TLS | Manual (proxy inverso externo) | Automático Let's Encrypt vía Traefik |
| Templates de apps | Sí (biblioteca integrada) | Sí (Docker Compose importado) |
| Registro privado | Sí | Sí |
| CI/CD integrado | Actualizaciones GitOps (polling o webhook) | Webhooks Git + notificaciones |
| Kubernetes | Sí (CE y BE) | No (Docker Compose / Swarm) |
| Multi-servidor | Sí (endpoints) | Sí (servidores remotos por SSH) |
| Interfaz | Madura y exhaustiva | Moderna, orientada a proyectos |
Cuándo quedarse en Portainer, cuándo pasar a Dokploy
Quedarse en Portainer 2.x tiene sentido en tres situaciones: ya gestionas un clúster Docker Swarm o Kubernetes con configuraciones complejas; tienes equipos que dominan la interfaz con runbooks documentados; o necesitas el nivel de detalle sobre redes y volúmenes que Portainer expone de forma nativa.
En estos casos, la condición innegociable es estar en una versión actualizada (2.45.3 a 7 de noviembre de 2026) y restringir el acceso a la interfaz: nunca expongas el puerto 9000/9443 directamente en internet, coloca Portainer detrás de un proxy inverso con autenticación adicional si usuarios no administradores acceden a él.
Migrar a Dokploy es la decisión correcta si: empiezas desde cero en un VPS nuevo; quieres que tus desarrolladores desplieguen desde Git sin SSH; gestionas múltiples dominios y no quieres mantener Nginx/Traefik manualmente; o buscas una alternativa tras el fin de CE (Portainer 3 no tiene edición Community) para tu uso con Docker.
Migración de Portainer a Dokploy: pasos concretos
Exportar tu inventario de Portainer
Antes de migrar, lista tus stacks y contenedores activos:
docker ps --format 'table {{.Names}} {{.Image}} {{.Status}}' docker volume ls docker network ls --filter driver=bridgePara cada stack de Portainer, obtén el
docker-compose.ymldesde la interfaz (Stacks → tu stack → Editor) o desde el sistema de archivos.Hacer copia de seguridad de los volúmenes de datos
Los volúmenes con nombre contienen tus datos de aplicación. Hazles copia de seguridad antes de cualquier operación:
docker run --rm \ -v <nombre_volumen>:/data \ -v $(pwd):/backup \ alpine tar czf /backup/<nombre_volumen>.tar.gz /dataRepite para cada volumen crítico.
Instalar Dokploy en el mismo VPS o en uno dedicado
Si migras en el mismo host, detén Portainer primero para liberar los puertos:
docker stop portainer && docker rm portainerLuego ejecuta la instalación de Dokploy (ver procedimiento arriba). Dokploy usa Traefik en los puertos 80/443 — verifica que ningún otro servicio los ocupe.
Recrear tus proyectos en Dokploy
En Dokploy, crea un Compose Project para cada stack de Portainer:
1. Proyectos → Nuevo proyecto
2. Añade un servicio de tipo Docker Compose
3. Pega tudocker-compose.ymlo apunta a tu repositorio Git
4. Configura las variables de entorno desde la pestaña Environment
5. Asigna un dominio — Dokploy configura Traefik automáticamenteVerificar y cambiar el DNS
Despliega primero en un subdominio de prueba (
test.tudominio.com). Una vez validado, actualiza tus entradas DNS para apuntar a Dokploy. Traefik emite los certificados automáticamente en cuanto el DNS se propaga.
Resolución de problemas: errores frecuentes
Portainer — interfaz inaccesible tras actualización
Verifica que el volumen portainer_data esté correctamente montado. Una actualización sin volumen con nombre parte de una base vacía y vuelve a solicitar la creación de la cuenta de administrador.
Portainer — TLS handshake error en el puerto 9443
Portainer genera un certificado autofirmado. Tu navegador avisa correctamente. Coloca Portainer detrás de un proxy inverso (nginx, Caddy) con un certificado real para acceso seguro en producción.
Dokploy — Traefik no genera un certificado
Causa más frecuente: el DNS aún no se ha propagado hacia el VPS. Verifica con dig +short tudominio.com. Traefik espera una respuesta DNS válida antes de lanzar el challenge ACME. Si el DNS es correcto, verifica que el puerto 80 esté abierto (ufw allow 80).
Dokploy — despliegue Git que falla silenciosamente
Revisa los logs del servicio en la interfaz (Deployments → pestaña Logs). En un repositorio privado, una causa frecuente es una clave SSH ausente o no autorizada en el repositorio. Dokploy permite crear una en Settings → SSH Keys (botón Create SSH Key), para añadirla como clave de despliegue del repositorio; para GitHub, GitLab, Gitea o Bitbucket, también puedes conectar el proveedor en los ajustes Git de Dokploy.
Las dos herramientas no son siempre excluyentes
Portainer puede gestionar varios endpoints Docker remotos desde una sola interfaz — incluido un VPS donde esté instalado Dokploy. Algunos equipos mantienen Portainer como herramienta de observación y Dokploy como herramienta de despliegue. No es un antipatrón si los roles están claramente separados. El coste: dos superficies que parchear. Si has elegido esta arquitectura, asegúrate de que ambas herramientas están actualizadas — consulta los CVEs al inicio del artículo.
Para ir más lejos: alternativas a Portainer CE, guía completa de despliegue con Dokploy y la actualización crítica de CVE Dokploy 2026.