Migrando um portfólio Next.js da Vercel para uma VPS com Coolify

Migrando um portfólio Next.js da Vercel para uma VPS com Coolify

CoolifyVPSNext.jsSelf-hostedDeploy

Por que e como migrei este portfólio em Next.js da Vercel para uma VPS própria usando Coolify, Docker e PostgreSQL self-hosted, sem abrir mão do deploy automático.

A Vercel é excelente para prototipagem e projetos pequenos, mas depois de conviver meses com o plano free da Supabase pausando o banco por inatividade — e precisar manter um cron só pra "manter o banco acordado" — decidi assumir o controle total da infraestrutura deste portfólio. A resposta foi migrar para uma VPS própria rodando Coolify.

Coolify é uma alternativa open-source e self-hosted a plataformas como Vercel e Heroku: você aponta um repositório Git, ele builda a aplicação (via Nixpacks, que detecta automaticamente o tipo de projeto, ou via Dockerfile customizado), sobe o container, configura o proxy reverso com Traefik e emite certificados SSL automaticamente via Let's Encrypt. Tudo isso rodando no seu próprio servidor, sem vendor lock-in.

A instalação é um único script (`curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash`) que sobe o dashboard em poucos minutos numa VPS Ubuntu comum. A partir daí, conectar o repositório do GitHub e configurar o domínio já é suficiente pra ter o primeiro deploy funcionando — no meu caso, o Nixpacks reconheceu o projeto Next.js sem precisar de configuração manual, só respeitando os scripts já definidos no `package.json`.

O banco de dados foi a parte mais importante da migração. Em vez de manter a dependência da Supabase, criei um recurso PostgreSQL dedicado dentro do próprio Coolify, isolado de outros projetos que já rodavam no mesmo servidor. Como a aplicação roda no mesmo host, a conexão usa o endereço interno da rede Docker do Coolify — nunca precisei expor a porta 5432 publicamente, o que já elimina uma superfície de ataque inteira.

Backup deixou de ser um "detalhe que a plataforma gerencia" e passou a ser responsabilidade minha — o Coolify tem um agendador de backups nativo pro recurso Postgres, que envia os dumps pra um storage S3-compatível. Usei Cloudflare R2, que tem camada gratuita generosa (10 GB de armazenamento e milhões de operações por mês) e egress zero, mais que suficiente pro tamanho de um banco de portfólio pessoal.

O fluxo de deploy ficou muito parecido com o da Vercel: um webhook configurado no GitHub dispara o build a cada push na branch principal, o Coolify builda a nova imagem, sobe um container novo e só depois remove o antigo — um rolling update sem downtime perceptível.

Nem tudo foi direto: o domínio precisa estar resolvendo corretamente pro IP do servidor antes do Let's Encrypt conseguir emitir o certificado, e dependendo de como o Traefik está configurado (desafio HTTP-01 ou DNS-01 via API da Cloudflare), um token com permissão insuficiente pode travar a emissão silenciosamente, caindo de volta pro certificado autoassinado padrão do Traefik. Esse troubleshooting específico rendeu outro post, porque o erro não é nada óbvio à primeira vista.

No fim, o custo mensal ficou na mesma faixa do que pagaria num plano pago da Vercel + Supabase, mas agora com um banco dedicado, backups configuráveis do meu jeito e zero surpresa de "projeto pausado por inatividade". A troca valeu menos pela economia e mais pelo controle: entender exatamente onde cada peça da infraestrutura está rodando é um aprendizado que nenhuma plataforma gerenciada ensina.

Migrando um portfólio Next.js da Vercel para uma VPS com Coolify | Dayvson Marques