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 seis años. En 2026, Portainer reestructuró su modelo de licencia: la edición Community queda limitada a Kubernetes o pasa a ser de pago (Portainer Business). Las instancias Portainer 2.x ya desplegadas siguen funcionando, pero CE ya no evoluciona.
Este cambio tiene varias consecuencias prácticas. Las nuevas instalaciones que buscan una interfaz Docker gratuita no encuentran una hoja de ruta clara para CE. Las imágenes portainer/portainer-ce:latest siguen existiendo y actualizándose, pero el canal comunitario ha perdido impulso. Y de forma crítica — Portainer 2.x ha acumulado dos CVEs con puntuación 9.4 que permanecen activos 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 las versiones Portainer 2.33.0 a 2.40.x:
CVE-2026-44848 (CVSS 9.4) — Los endpoints /plugins/* no están protegidos por autenticación. Un atacante no autenticado puede consultar y modificar los plugins Docker de tu host a través de la API de Portainer.
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.
Para verificar tu versión:
docker exec portainer /app/portainer --versionPara actualizar:
docker pull portainer/portainer-ce:latest
docker stop portainer
docker rm portainer
docker run -d \
--name=portainer \
--restart=always \
-p 8000:8000 -p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latestSi estás por debajo de 2.33.8 o 2.39.2 según tu rama, actualiza antes de seguir usando la instancia. Portainer expuesto en internet sin este parche es un vector de intrusión directo en tu host Docker.
CVE de Dokploy: el secreto hardcoded (< 0.29.13)
Dokploy tampoco está exento de vulnerabilidades. CVE-2026-45631 (CVSS 10.0) afecta a las versiones anteriores a 0.29.13: un secreto de autenticación estaba hardcoded en el código fuente, permitiendo a cualquiera que conociera ese secreto autenticarse en cualquier instancia Dokploy.
Este CVE está corregido desde la versión 0.29.13. Para verificar y actualizar:
# Verificar la versión instalada
docker exec dokploy dokploy --version
# Actualizar mediante el script oficial
curl -sSL https://dokploy.com/install.sh | shDokploy usa BETTER_AUTH_SECRET como clave de sesión. En una instalación anterior a 0.29.13, este valor era estático en el código. Tras actualizar, verifica que tu docker-compose.yml de Dokploy declara un valor aleatorio fuerte:
grep BETTER_AUTH_SECRET /etc/dokploy/docker-compose.ymlSi la variable está vacía o ausente, genera un nuevo valor y reinicia:
export BETTER_AUTH_SECRET=$(openssl rand -hex 32)Prerequisitos 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: 1 vCPU, 512 MB RAM, Docker 20+ — funciona en el VPS más pequeño
- Dokploy: 2 vCPU, 2 GB RAM, Docker 24+ — PostgreSQL y Traefik añaden ~400 MB al arranque
- 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, genera un
docker-compose.ymlen/etc/dokploy/, crea unBETTER_AUTH_SECRETaleatorio y arranca todo.Verificar el BETTER_AUTH_SECRET
Tras la instalación, confirma que la variable se generó correctamente:
grep BETTER_AUTH_SECRET /etc/dokploy/docker-compose.ymlDeberías ver una cadena aleatoria de 64 caracteres. Si la variable está vacía, genera una nueva y reinicia:
sed -i "s/BETTER_AUTH_SECRET=/BETTER_AUTH_SECRET=$(openssl rand -hex 32)/" /etc/dokploy/docker-compose.yml docker compose -f /etc/dokploy/docker-compose.yml up -dAcceder 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 los ajustes de Dokploy → 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.Actualizar Dokploy
Dokploy expone un botón Update en sus ajustes, o usa el script:
curl -sSL https://dokploy.com/install.sh | shEl script es idempotente: actualiza la imagen sin borrar tu configuración ni tus proyectos.
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 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latestAcceso en https://<ip>:9443. Sustituye latest por 2.41.0 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 (solo Docker) | Código abierto (Apache 2.0) |
| Futuro CE | Limitado — CE 3.0 Kubernetes/pago | Hoja de ruta activa, comunidad creciente |
| CVEs activos | CVE-2026-44848 + 44849 (CVSS 9.4) si < 2.41.0 | CVE-2026-45631 (CVSS 10.0) si < 0.29.13 |
| RAM mínima | 512 MB | 2 GB (PostgreSQL + Traefik incluidos) |
| Despliegue Git | No (solo imágenes Docker) | 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 | No | Webhooks Git + notificaciones |
| Kubernetes | Sí (BE de pago) | No (Docker Compose / Swarm) |
| Multi-servidor | Sí (endpoints) | Sí (agentes remotos) |
| 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 parcheada (2.33.8, 2.39.2 o 2.41.0) 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 cambio de CE 3.0 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). El error más común es un BETTER_AUTH_SECRET ausente o una clave SSH no configurada para repositorios privados. Dokploy ofrece un botón Generate SSH Key en los ajustes del proyecto para repositorios privados de GitLab/GitHub.
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 3.0, guía completa de despliegue con Dokploy y la actualización crítica de CVE Dokploy 2026.