Um passo a passo pra quem nunca mexeu com servidor. No final, você tem seus
programas rodando na internet, cada um num endereço tipo meuapp.seudominio.com,
com o cadeado de segurança (HTTPS) automático.
Você monta isso da direita pra esquerda: primeiro o servidor e os apps, depois o porteiro, e por último aponta o domínio. Vamos por partes.
É um computador na nuvem, ligado 24h, que você controla. “VPS” = servidor virtual privado.
É o nome bonito do seu site (ex.: seudominio.com). Sem ele, só o número (IP).
Ao criar a VPS o provedor te dá três coisas: o IP (tipo 203.0.113.10),
o usuário (root) e uma senha (ou uma chave). Guarde bem — é o que
abre a porta do servidor.
Crie a conta, clique em criar servidor (às vezes chamado de “droplet” ou “instance”), escolha Ubuntu 24.04 e o plano mais barato. Em 1–2 minutos ele fica pronto e mostra o IP. Copie o IP — vamos usar em tudo.
DNS é a “agenda de contatos” da internet: ele diz qual nome leva a qual IP. Você cria registros do tipo A (nome → IP):
Tipo Nome Valor (aponta para) A @ SEU_IP # o domínio raiz (seudominio.com) A www SEU_IP A app1 SEU_IP # vira app1.seudominio.com A app2 SEU_IP # um por app...
Pra não criar um registro por app, dá pra usar um curinga: Nome: * →
SEU_IP. Aí qualquer subdomínio já cai no servidor.
DNS demora pra “espalhar” — de alguns minutos até algumas horas. Se o endereço não abrir
logo, espere e teste de novo. Troque SEU_IP pelo IP real da sua VPS.
SSH é o jeito de controlar o servidor por texto, de longe. Abra o terminal do seu computador e digite (troque pelo seu IP):
$ ssh root@SEU_IPEle pergunta a senha (a que o provedor te deu). Ao digitar, não aparece nada na tela — é normal, é segurança. Aperte Enter. Deu certo? Você está “dentro” do servidor.
Primeiro atualize tudo. Depois instale o Docker — o programa que roda seus apps em “caixinhas” isoladas (containers), sem bagunçar o servidor.
$ apt update && apt upgrade -y # atualiza o sistema $ curl -fsSL https://get.docker.com | sh # instala o Docker $ ufw allow 22 && ufw allow 80 && ufw allow 443 && ufw --force enable
A última linha é o firewall: só deixa entrar pelas portas 22 (o SSH), 80 e 443 (sites — http e https). O resto fica fechado.
O Caddy recebe todas as visitas, coloca o cadeado (HTTPS de graça, automático) e encaminha cada endereço pro app certo. Vamos deixar o Caddy e os apps juntos, numa pasta só.
a) O código do seu app vai em /opt/meuapp,
com um Dockerfile (a “receita” de como rodar). Exemplo pra um app Python/FastAPI:
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
b) A “planta” que sobe tudo, em /opt/stack/docker-compose.yml:
services:
caddy:
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443"]
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
meuapp:
build: /opt/meuapp
restart: unless-stopped
expose: ["8000"]
volumes:
caddy_data:c) A lista do porteiro, em /opt/stack/Caddyfile
— cada endereço e pra qual app ele vai:
app1.seudominio.com {
reverse_proxy meuapp:8000
encode zstd gzip
}d) Suba tudo:
$ cd /opt/stack $ docker compose up -d --build
Pronto! Abra https://app1.seudominio.com. O Caddy pega o certificado de
segurança sozinho (Let’s Encrypt, grátis) na primeira visita — você não faz nada. O cadeado
aparece em segundos.
Para cada app novo você faz três passos rápidos: 1) põe o código em
/opt/outroapp; 2) adiciona um serviço no docker-compose.yml e um
bloco no Caddyfile; 3) cria o registro A do subdomínio no DNS (se não
usou o curinga *).
app2.seudominio.com {
reverse_proxy outroapp:8000
encode zstd gzip
}$ cd /opt/stack $ docker compose up -d --build # sobe o app novo $ docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
O último comando avisa o porteiro do endereço novo sem derrubar os que já estão no ar.
$ docker compose ps # o que está rodando $ docker compose logs -f meuapp # ver mensagens/erros de um app $ docker compose restart meuapp # reiniciar um app $ docker compose up -d --build # aplicar mudanças no código
Entrar com senha funciona, mas o certo é usar uma chave SSH (um par de arquivos que substitui a senha e é muito mais seguro). Procure “gerar chave SSH e usar na VPS” quando estiver confortável. E nunca compartilhe a chave nem a senha do servidor com ninguém.
apt update && apt upgrade -y de vez em quando.203.0.113.10.app1.seudominio.com.