~/blog/vercel-propio-vps-coolify-dokploy.md
Tu propio Vercel en un VPS: despliegues con Coolify y Dokploy
Cómo montar una plataforma de despliegue propia en un VPS con Coolify o Dokploy: push a Git y despliegue automático, SSL con Let's Encrypt, bases de datos y previews, más una comparación honesta con Vercel y sus límites reales.
- autor
- Alejandro Peñaloza
- Publicado
- Lectura
- 6 min
- English
- Read in English →

En este artículo
Vercel, Netlify y Railway hicieron que desplegar sea tan simple como hacer git push. El problema llega con la factura: cuando tienes varios proyectos, bases de datos, workers y tráfico que crece, el costo por proyecto y por uso se acumula rápido.
La alternativa que más me ha convencido es tener mi propia plataforma de despliegue en un VPS, con la misma experiencia de "push y listo". Hoy hay dos herramientas de código abierto que lo resuelven muy bien: Coolify y Dokploy.
Qué resuelven exactamente
Ambas son un panel web que se instala en tu servidor y se encarga de:
- Construir y desplegar desde un repositorio Git en cada push (con Dockerfile, Docker Compose o detección automática del stack).
- Proxy inverso y SSL automático con Let's Encrypt, sin tocar Nginx.
- Dominios y subdominios por aplicación.
- Variables de entorno y secretos por ambiente.
- Bases de datos listas con un clic (PostgreSQL, MySQL, Redis, MongoDB) y respaldos programados a S3.
- Logs, reinicios y rollback desde el navegador.
- Notificaciones cuando un despliegue falla.
En otras palabras: la parte de Vercel que usas a diario, corriendo en un servidor que pagas a precio fijo.
Coolify vs. Dokploy
| Coolify | Dokploy | |
|---|---|---|
| Licencia | Código abierto | Código abierto |
| Base | Docker, proxy Traefik o Caddy | Docker (Swarm), proxy Traefik |
| Builds | Nixpacks, Dockerfile, Compose, estáticos | Nixpacks, Buildpacks, Dockerfile, Compose |
| Bases de datos | Sí, con respaldos a S3 | Sí, con respaldos a S3 |
| Previews por pull request | Sí | Sí |
| Varios servidores | Sí, administra servidores remotos por SSH | Sí, con nodos de Docker Swarm |
| Plantillas de servicios | Catálogo muy amplio | Catálogo más acotado |
| Sensación general | Más completo, más opciones | Más liviano y directo |
Las dos funcionan muy bien. Mi recomendación: Coolify si quieres el catálogo más amplio de servicios en un clic y muchas opciones; Dokploy si prefieres algo más simple y con menor consumo. Las dos avanzan rápido, así que revisa sus versiones y funciones actuales antes de elegir.
Requisitos del servidor
- Un VPS limpio con Ubuntu o Debian. No instales esto sobre un servidor que ya tiene Nginx o Apache usando los puertos 80 y 443, porque el proxy de la plataforma necesita esos puertos.
- Al menos 2 vCPU, 4 GB de RAM y 40 GB de disco para trabajar cómodo. Funciona con menos, pero los builds de Next.js consumen bastante memoria.
- Un dominio con acceso al DNS.
Antes de instalar, aplica lo básico de seguridad: usuario sin privilegios, login solo con llave SSH y firewall con los puertos 22, 80 y 443 (lo detallo en mi post De localhost a producción sin llorar).
Instalación
Ambas se instalan con un script oficial. Como siempre que ejecutas un script remoto con privilegios, revísalo antes.
Coolify:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh -o install-coolify.sh
less install-coolify.sh # revísalo
sudo bash install-coolify.shEl panel queda en http://IP_DEL_SERVIDOR:8000.
Dokploy:
curl -sSL https://dokploy.com/install.sh -o install-dokploy.sh
less install-dokploy.sh
sudo sh install-dokploy.shEl panel queda en http://IP_DEL_SERVIDOR:3000.
Lo primero después de instalar: crea la cuenta de administrador de inmediato (el primero que entra se queda con ella), asigna un dominio al panel para acceder por HTTPS y luego cierra el puerto del panel en el firewall.
DNS: un comodín y te olvidas
En lugar de crear un registro por cada aplicación, apunta un comodín al servidor:
| Tipo | Nombre | Valor |
|---|---|---|
| A | deploy.midominio.cl |
IP del VPS |
| A | *.apps.midominio.cl |
IP del VPS |
Con eso, cualquier aplicación nueva puede usar nombre.apps.midominio.cl y la plataforma emite su certificado sola. Para los dominios "de verdad" de cada proyecto (como miproducto.cl) agregas su registro A apuntando al mismo servidor.
Si usas Cloudflare con el proxy activado (nube naranja), configura el SSL en modo Full (strict). Si la emisión del certificado falla, desactiva el proxy temporalmente para que Let's Encrypt pueda validar el dominio.
Desplegar una aplicación paso a paso
- Conecta GitHub. Ambas plataformas permiten crear una GitHub App desde el panel: así acceden a repositorios privados y reciben un webhook en cada push.
- Crea la aplicación eligiendo el repositorio y la rama (por ejemplo,
mainpara producción ydeveloppara staging). - Elige cómo construir: si el repo tiene
Dockerfile, úsalo; si no, Nixpacks detecta Node, PHP, Python o Go y construye solo. - Define el puerto en que escucha la aplicación y el dominio.
- Carga las variables de entorno.
- Despliega y sigue el log del build en vivo.
Un Dockerfile que funciona bien para Next.js
Nixpacks sirve, pero con un Dockerfile propio controlas el tamaño de la imagen y el tiempo de build. Con output: "standalone" en next.config.js:
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production PORT=3000 HOSTNAME=0.0.0.0
RUN addgroup -S app && adduser -S app -G app
COPY --from=build /app/.next/standalone ./
COPY --from=build /app/.next/static ./.next/static
COPY --from=build /app/public ./public
USER app
EXPOSE 3000
CMD ["node", "server.js"]Y uno para Laravel
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --prefer-dist --no-interaction
FROM php:8.3-fpm-alpine
RUN apk add --no-cache nginx supervisor libpq-dev \
&& docker-php-ext-install pdo_pgsql opcache
WORKDIR /var/www
COPY --from=vendor /app/vendor ./vendor
COPY . .
RUN php artisan optimize:clear \
&& chown -R www-data:www-data storage bootstrap/cache
COPY docker/nginx.conf /etc/nginx/http.d/default.conf
COPY docker/supervisord.conf /etc/supervisord.conf
EXPOSE 80
CMD ["supervisord", "-c", "/etc/supervisord.conf"]Para Laravel agrega en la plataforma un comando posterior al despliegue con php artisan migrate --force && php artisan optimize, y crea un servicio aparte para el worker de colas (php artisan queue:work) y otro para el scheduler.
Previews por pull request
Una de las funciones más útiles de Vercel también está aquí: al abrir un PR, la plataforma despliega esa rama en un subdominio propio (por ejemplo, pr-42.apps.midominio.cl) y lo elimina al cerrarlo. Ideal para que un cliente o el equipo revise cambios antes de mezclarlos. Ojo con la RAM: cada preview es un contenedor más corriendo.
Bases de datos y respaldos
Crear un PostgreSQL toma un clic, pero no lo expongas a internet: deja que las aplicaciones se conecten por la red interna de Docker usando el nombre del servicio. Si necesitas entrar desde tu máquina, usa un túnel SSH:
ssh -L 5433:localhost:5432 deploy@mi-servidorConfigura de inmediato los respaldos programados a S3 (o a un servicio compatible como Cloudflare R2 o Backblaze B2) y prueba una restauración. Un VPS es un solo disco en un solo lugar; sin respaldos externos, un error de disco o un borrado accidental es definitivo.
Lo que pierdes respecto de Vercel
Hay que ser honesto con los límites:
- No hay red global (edge). Tu aplicación vive en un datacenter. Para usuarios en Chile, un VPS en Sudamérica o en la costa este de EE. UU. funciona bien; para usuarios globales, pon Cloudflare adelante para cachear lo estático.
- Eres el equipo de operaciones. Actualizaciones del sistema, de la plataforma y de Docker son tuyas.
- Un servidor es un punto único de falla. Si se cae, se cae todo. Para proyectos críticos considera un segundo servidor o mantener esos proyectos en una plataforma administrada.
- Los builds compiten con las aplicaciones por CPU y RAM. Si un build pesado ralentiza producción, compila las imágenes en GitHub Actions, súbelas a un registro y que la plataforma solo las descargue.
¿Cuándo conviene?
- Sí conviene: varios proyectos propios o de clientes, APIs, workers y bases de datos, presupuesto predecible, y ganas de aprender lo que pasa bajo el capó.
- No conviene: un solo frontend estático que cabe en un plan gratuito, un equipo sin nadie que quiera hacerse cargo del servidor, o requisitos de alta disponibilidad que un solo VPS no puede cumplir.
Conclusión
Coolify y Dokploy le dan a un VPS la experiencia que antes solo tenían las plataformas administradas: push, build, SSL y dominio sin escribir una línea de Nginx. A cambio, asumes la operación del servidor. Para alguien que maneja varios proyectos y quiere costos fijos, es un intercambio que vale mucho la pena, siempre que no olvides lo aburrido pero vital: actualizaciones, firewall y respaldos fuera del servidor.
Comentarios
Aún no hay comentarios. ¿Quieres dejar el primero?
Deja un comentario
$ ls ~/blog | grep relacionados
Sigue leyendo

Bitácora de guerra: depurar CORS, refactorizar código propio e integrar Webpay sin perder la tarde
Problemas reales y cómo los resolví: un error de CORS que solo fallaba en producción, una fuga de memoria en el servidor, código mío de hace un año refactorizado sin vergüenza y una guía práctica para integrar Webpay Plus, Mercado Pago y Flow.

Productividad para desarrolladores: VS Code, Git avanzado, gestión ágil y scripts de automatización
Mi flujo de trabajo diario como desarrollador: las extensiones y ajustes de VS Code que sí aportan, Git más allá de commit y push (rebase, cherry-pick y bisect), cómo gestionar proyectos pequeños sin burocracia y los scripts que automatizan lo repetitivo.

De localhost a producción sin llorar: VPS, DNS, hosting y Docker para desarrolladores
Guía práctica para sacar un proyecto a producción: cómo asegurar un VPS desde cero, configurar DNS y Cloudflare, elegir entre hosting compartido, VPS o cloud, y levantar tu base de datos local con Docker Compose en segundos.