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.
Comentários
Nenhum comentário ainda. Seja o primeiro.