EQVPS

Como implantar um stack Docker Compose num VPS

Implante um stack multicontêiner num VPS com Docker Compose: escreva docker-compose.yml, guarde os segredos no .env, suba-o com reinício-após-reboot e publique apenas as portas que você realmente quer. Exemplo copiar-colar com um app web, banco de dados e reverse proxy.

O Docker Compose descreve um stack multicontêiner num único arquivo e o roda com um comando. Este é o guia de implantação; primeiro instale o Docker se ainda não o fez. Para um stack específico de agentes de IA (agente + banco vetorial + Redis), veja docker-compose para agentes de IA.

1. Um stack: app + banco de dados + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

Os segredos vivem no .env, nunca no arquivo compose:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Um Caddyfile mínimo faz proxy do seu domínio para o app e obtém HTTPS sozinho:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Suba-o

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped em cada serviço + Docker habilitado no boot = o stack volta sozinho após um reboot.

3. Comandos do dia a dia

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

A parte que as pessoas erram: portas expostas

O Docker publica portas via iptables, então um contêiner com ports: ["5432:5432"] fica acessível pela internet mesmo atrás de um firewall UFW que você achava fechado. Publique apenas o ponto de entrada público (o proxy na 80/443); mantenha bancos de dados e caches na rede compose ou vinculados a 127.0.0.1. Tudo que serve tráfego web precisa de um plano de IP dedicado; combine com um firewall UFW.

Para um stack inteiro atrás de um IP, veja auto-hospedar vários serviços. Root em cerca de um minuto, NVMe, sem KYC, pagamento em cripto.

Perguntas frequentes

Como implanto um stack Docker Compose num VPS?

Instale o Docker com o plugin Compose, escreva um docker-compose.yml descrevendo cada serviço, guarde os segredos num .env ignorado pelo git, depois docker compose up -d. Ponha restart: unless-stopped em cada serviço e habilite o Docker no boot para o stack sobreviver a reboots. O exemplo abaixo roda um app web, Postgres e um reverse proxy Caddy.

Onde vão os segredos — no arquivo compose?

Não. Ponha-os num arquivo .env (chmod 600, ignorado pelo git) e referencie como ${VAR} no compose, ou use Docker secrets. Nunca faça commit de senhas ou chaves de API no docker-compose.yml — um arquivo vazado com credenciais ativas é o erro clássico.

O stack volta após um reboot?

Só se você mandar. Ponha restart: unless-stopped (ou always) em cada serviço e habilite o Docker no boot (systemctl enable docker). Aí o docker compose up -d sobrevive a reboots e reinicia contêineres que caíram.

Quais portas ficam expostas?

Só o que você publicar com ports:. Vincule os serviços internos (bancos de dados, caches) à rede compose ou a 127.0.0.1 e publique apenas o ponto de entrada público — normalmente um reverse proxy na 80/443. O Docker publica via iptables, então uma linha ports: acidental fica acessível pela internet mesmo atrás do UFW.

Vocês pedem documento ou cartão?

Não. Um e-mail para cadastrar, pagamento em USDC ou USDT — sem documentos, sem cartão. Root em cerca de um minuto.

Comentários

Nenhum comentário ainda. Seja o primeiro.

Deixe um comentário

Os comentários são moderados antes de aparecerem.