SentrySentry
Deploy

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 -d

O compose faz o build a partir da raiz do repo e sobe dois serviços:

  • postgres — postgres:16-alpine com healthcheck (pg_isready); a porta 5432 fica publicada (conveniência de dev — feche em produção).
  • sentry — o daemon (sentry run), dependendo do healthcheck do Postgres, com o sentry.example.toml montado read-only em /etc/sentry/sentry.toml e volume sentrydata em /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 -d

Diferenç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

On this page