Deploy com Docker
Dockerfile, Docker Compose e variáveis de ambiente
Deploy com Docker
Os arquivos de deploy ficam em deploy/docker/:
um Dockerfile
multi-stage e dois composes —
docker-compose.yml
(dev/single-node) e
docker-compose.prod.yml
(override de produção).
A imagem
O Dockerfile
compila o binário em rust:1.97-bookworm e copia para um runtime
debian:bookworm-slim com tini, libpq5 e usuário não-root sentry.
Defaults do runtime: SENTRY_CONFIG=/etc/sentry/sentry.toml, porta exposta
8080 (dashboard/API de [server]), entrypoint sentry com comando default
run.
Cargo features pesadas (ONNX, TLS, zstd, pcap, redis) são opt-in — o build
default não as inclui. Passe-as via build ARG FEATURES:
docker build -t sentry --build-arg FEATURES=sentry-cli/edge-tls,sentry-cli/edge-zstd .Docker Compose (dev / single-node)
docker compose -f deploy/docker/docker-compose.yml up -dO compose faz o build a partir da raiz do repo e sobe dois serviços:
postgres—postgres:16-alpinecom healthcheck (pg_isready); a porta5432fica publicada (conveniência de dev — feche em produção).sentry— o daemon (sentry run), dependendo do healthcheck do Postgres, com osentry.example.tomlmontado read-only em/etc/sentry/sentry.tomle volumesentrydataem/var/lib/sentry.
O compose aceita as variáveis SENTRY_CF_TOKEN, SENTRY_CF_ZONE,
SENTRY_LLM_KEY e SENTRY_PG_PASSWORD (senha do Postgres, default
changeme).
Override de produção
O docker-compose.prod.yml
ajusta o compose para um host de produção real:
docker compose -f deploy/docker/docker-compose.yml \
-f deploy/docker/docker-compose.prod.yml up -dDiferenças: sentry roda como root (para ler logs de nginx cujo dono não é o
usuário do container), Postgres sem porta publicada no host, monta um
sentry.toml real (gitignored) no lugar do example, monta os logs do nginx
(/www/wwwlogs → /var/log/nginx, read-only) e restart: always.
Variáveis de ambiente
Segredos vão em env vars, nunca no config commitado. O overlay de env
(SENTRY_<SECTION>__<KEY>, figment) sobrescreve qualquer campo do TOML:
export SENTRY_CF_TOKEN=xxx # Cloudflare API token (opcional)
export SENTRY_CF_ZONE=yyy # Cloudflare zone ID (opcional)
export SENTRY_LLM_KEY=zzz # LLM key (opcional)
export SENTRY_STORAGE__POSTGRES__URL=postgres://sentry:secret@db/sentry
export SENTRY_SESSION_SECRET=... # HMAC dos cookies do dashboard (auth ligado)Volumes e portas
/var/lib/sentry— data dir (MMDB GeoLite2, modelo ONNX, cache local)./var/log/nginx— access.log tailado pela source nginx (read-only).pgdata/sentrydata— volumes gerenciados pelo compose.
O compose não publica nenhuma porta do serviço sentry: o modo default é
passive (sem listener de rede). Para rodar a edge inline (WAF na frente
da aplicação), configure [deployment] mode = "inline" + [edge] no
sentry.toml e publique as portas:
services:
sentry:
ports:
- "80:80" # [edge] listen
- "443:443" # [edge] tls_listen (requer image com edge-tls)
- "127.0.0.1:8080:8080" # dashboard `sentry serve` / [server]
- "127.0.0.1:9100:9100" # /metrics Prometheus ([metrics])Config
Monte seu sentry.toml no container (padrão: /etc/sentry/sentry.toml, via
SENTRY_CONFIG) ou use só env vars. Exemplo de override do compose:
services:
sentry:
image: sentry:latest
environment:
SENTRY_STORAGE__POSTGRES__URL: postgres://sentry:secret@db/sentry
SENTRY_CF_TOKEN: ${SENTRY_CF_TOKEN}
volumes:
- ./sentry.toml:/etc/sentry/sentry.toml:ro
- /var/log/nginx:/var/log/nginx:ro
- sentry-data:/var/lib/sentry
depends_on:
- postgres
postgres:
image: postgres:16
environment:
POSTGRES_USER: sentry
POSTGRES_PASSWORD: secret
POSTGRES_DB: sentry
volumes:
- pg-data:/var/lib/postgresql/data
volumes:
sentry-data:
pg-data:Logs
O Sentry usa tracing para structured logging (RUST_LOG=info,sentry=debug
no compose). Veja os logs do container:
docker compose -f deploy/docker/docker-compose.yml logs -f sentry