SentrySentry
Configuração

Referência de Configuração (sentry.toml)

Todas as seções do sentry.toml — campos, tipos, valores padrão e exemplos, conforme o schema em crates/sentry-core/src/config.rs.

Referência de Configuração (sentry.toml)

Toda a configuração do Sentry vive em um único arquivo TOML. O schema tipado é o struct SentryConfig em crates/sentry-core/src/config.rs — esta página documenta cada seção com campos, tipos e valores padrão extraídos dele. O arquivo config/sentry.example.toml é o exemplo canônico pronto para copiar.

Índice

Carregamento e overlay de ambiente

O arquivo é carregado com figment: o TOML é a base e qualquer campo pode ser sobrescrito por variável de ambiente no formato SENTRY_<SEÇÃO>__<CHAVE> (maiúsculas, __ separa níveis de aninhamento). Segredos nunca vão no arquivo commitado — só em env.

VariávelSobrescreve / alimenta
SENTRY_STORAGE__POSTGRES__URL[storage.postgres] url
SENTRY_CF_TOKENtoken da API Cloudflare (sources/actions CF)
SENTRY_CF_ZONEzone ID da Cloudflare (action challenge)
SENTRY_CF_ACCOUNTaccount ID da Cloudflare (IP Lists /64)
SENTRY_LLM_KEYchave da API do provedor LLM
SENTRY_ABUSEIPDB_KEYchave da AbuseIPDB ([ip_lookup], action report, feeds)
SENTRY_SESSION_SECRETchave HMAC das sessões do dashboard
SENTRY_WEBHOOK_SECRETsegredo de assinatura HMAC dos webhooks
SENTRY_EDGE_CHALLENGE_SECRETsegredo do PoW do challenge da edge

[core]

Runtime principal: buffers de filas e tuning do caminho quente de ingest. Sob sobrecarga a fila de actions enche primeiro — o Sentry descarta actions, nunca eventos.

CampoTipoPadrãoDescrição
data_dirstring (caminho)/var/lib/sentryDiretório de dados (arquivos MMDB, modelos, cache).
channel_bufferinteiro4096Tamanho do buffer do canal de eventos entre sources e daemon.
action_bufferinteiro4096Capacidade da fila de actions postergadas (workers de pós-processamento).
action_workersinteiro1Workers paralelos que executam actions de rede. 1 preserva a ordem estrita das actions.
persist_bufferinteiro2048Capacidade da fila de persistência em lote (um multi-INSERT por lote).
dedupe_ttl_secsinteiro10Janela de dedupe de ingest: eventos idênticos (ip, method, path) dentro da janela caem fora antes do pipeline.
[core]
data_dir = "/var/lib/sentry"
action_workers = 1
dedupe_ttl_secs = 10

[overload]

Resposta a sobrecarga: pressão medida (ocupação de filas, latência de INSERT no Postgres) liga a degradação em tiers de telemetria. Detecção (pipeline) e contenção (block table, actions) nunca degradam.

CampoTipoPadrãoDescrição
enabledbooltrueLiga a detecção de pressão e os tiers de degradação.
queue_pressurefloat0.8Ocupação de fila (0.0–1.0) que liga a pressão.
release_pressurefloat0.5Ocupação abaixo da qual a pressão desliga (histerese).
release_secsinteiro30Segundos de alívio sustentado antes de limpar a pressão.
pg_insert_budget_msinteiro250EMA de latência de INSERT (ms) que liga a pressão sozinha.
sample_keepfloat0.1Fração de eventos de baixa prioridade (Allow < High) mantida sob pressão — determinística por IP de origem.
coalesce_benignbooltrueColapsa requisições benignas repetidas (Allow, GET, sem sinais) por (ip, path).
coalesce_window_secsinteiro60Janela de coalescência benigna: só o primeiro hit persiste.
coalesce_capinteiro4096Máximo de buckets (ip, path) rastreados; o mais antigo é evictado.

[deployment]

Posicionamento do Sentry relativo à aplicação.

CampoTipoPadrãoDescrição
modestringpassivepassive lê logs/tráfego espelhado e age ex-post via actions; inline roda o reverse proxy da [edge] na frente do app e aplica vereditos antes da requisição chegar ao backend.
instance_idstring(hostname)Rótulo de instância para métricas em deployments multi-nó (gauge sentry_instance_info). Vazio = deriva do hostname.

[runtime]

Tuning do runtime tokio (F14): quantidade de workers, pinning de CPU e prioridade de thread, aplicados quando o binário constrói o runtime — antes de qualquer comando. Tudo opcional; seção vazia = comportamento stock do tokio (um worker por core, placement do SO, prioridade padrão). Útil quando o daemon de proteção divide a máquina com o app que protege: dedique cores em vez de deixar o scheduler brigando com a aplicação.

CampoTipoPadrãoDescrição
worker_threadsinteiro0Workers async do tokio (0 = um por core).
pin_coresarray de inteiro[]Fixa os workers nesses ids de core em ordem (workers ciclam a lista); vazio deixa o SO posicionar.
thread_prioritystringnormalidle | below_normal | normal | above_normal | high — mapeado para nice/priority-class por plataforma; níveis acima do normal exigem privilégio no unix (falha loga warn e segue).

[storage.postgres]

Conexão de persistência (Postgres via sqlx).

CampoTipoPadrãoDescrição
urlstring(vazio)String de conexão postgres://user:pass@host:port/db. Prefira SENTRY_STORAGE__POSTGRES__URL.
max_connectionsinteiro10Tamanho do pool de conexões.
acquire_timeout_secsinteiro5Segundos esperando por uma conexão livre antes de falhar rápido (default do sqlx é 30).
statement_timeout_secsinteiro30Segundos de INSERT antes de cancelar e descartar o lote, evitando travar o worker de persistência.

[[source]]

Fontes de eventos: cada entrada declara um plugin type e um mapa options próprio do plugin. Tipos implementados: nginx, syslog, cloudflare e tcp (tipo desconhecido é ignorado com um log).

type = "nginx" — tail de access.log do nginx com parser de log_format e resolução automática do IP real.

OptionTipoPadrãoDescrição
pathstring/var/log/nginx/access.logCaminho do arquivo de log.
formatstringformato combinedMesma string do log_format do nginx. Tokens $http_* viram headers do evento (usáveis em regras DSL como header.cf-connecting-ip).
[[source]]
type = "nginx"
[source.options]
path = "/var/log/nginx/access.log"
format = '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'

type = "syslog" — receptor RFC 5424 (fallback RFC 3164) para firewalls e equipamentos de rede; o endereço do peer vira o IP do cliente.

OptionTipoPadrãoDescrição
bindstring0.0.0.0:5140Endereço de escuta (portas < 1024 exigem root).
transportstringudpudp | tcp (TCP aceita framing newline e octet-counting RFC 6587).

type = "cloudflare" — polling da Logs API da Cloudflare (NDJSON); requer plano Enterprise e token com permissão Logs:Read via env.

OptionTipoPadrãoDescrição
zone_idstring(obrigatório)Zone ID da Cloudflare.
token_envstringSENTRY_CF_TOKENVariável de ambiente com o API token.
poll_secsinteiro30Intervalo entre polls.
startstring (RFC 3339)(agora)Cursor da primeira consulta.
api_basestringhttps://api.cloudflare.com/client/v4Base da API.

type = "tcp" — captura passiva de pacotes com fingerprinting de SYN (masscan/zmap/nmap). Exige o build feature pcap e privilégios (Npcap no Windows, CAP_NET_RAW no Linux).

OptionTipoPadrãoDescrição
interfacestring(obrigatório)Interface de captura.
portsstring (CSV)(vazio = todas)Filtro de portas de destino, ex. "80,443,8443".
payload_capinteiro8192Bytes reassemblados mantidos por flow.
flow_capinteiro65536Máximo de flows rastreados (eviction FIFO).
channel_bufferinteiro1024Fila entre o loop de captura e o daemon (mínimo 64).
syn_window_msinteiro100Janela de coalescência de SYN por IP (0 = off); a rajada vira 1 evento com TcpData.syn_count.

[geo]

Enriquecimento Geo/ASN com os bancos GeoLite2 da MaxMind. Arquivos ausentes = enriquecimento vira no-op silencioso.

CampoTipoPadrãoDescrição
city_dbstring (caminho)/var/lib/sentry/GeoLite2-City.mmdbBanco GeoLite2-City.
asn_dbstring (caminho)/var/lib/sentry/GeoLite2-ASN.mmdbBanco GeoLite2-ASN.

[routes]

Rotas que sua aplicação realmente serve. Requisições fora do conjunto (ou com método não permitido) geram o sinal UnknownRoute.

CampoTipoPadrãoDescrição
knownarray de [[routes.known]][]Cada entrada: path (exato ou glob /api/*) e methods (vazio = qualquer método).
[[routes.known]]
path = "/api/users/*"
methods = ["GET", "POST", "PATCH", "DELETE"]

[route_learner]

Aprendizado contínuo de rotas: task em background que infere shapes de rota estáveis a partir de eventos recentes no Postgres e faz hot-reload delas. Requer storage Postgres.

CampoTipoPadrãoDescrição
enabledboolfalseLiga o learner contínuo.
interval_secsinteiro300Frequência de cada passada de aprendizado.
window_secsinteiro3600Janela de look-back dos eventos.
min_hitsinteiro10Hits mínimos para um shape ser considerado estável.
min_ipsinteiro2Mínimo de IPs distintos que acessaram o shape.

[rules]

Motor de regras: packs padrão, regras estáticas inline, feeds de reputação e presets.

[[rules.pack]]

Packs padrão do motor de regras.

CampoTipoPadrãoDescrição
namestring—Nome do pack (lista abaixo).
modestringshadowshadow (só anota/loga) | enforce (age) | off.
paramstabela{}Parâmetros extras do pack (ex.: countries, domains), achatados como <pack>__<param>.

Packs disponíveis: vpn_proxy, tor, crawlers_bad, crawlers_good (divide-se em crawlers_good_verified / crawlers_good_unverified_ok com o bot verification ativo), sensitive_paths (único em enforce por padrão), empty_ua, http_anomaly, rate_scan, country_blocklist (params.countries) e host_allowlist (params.domains).

[[rules.pack]]
name = "country_blocklist"
mode  = "off"
[rules.pack.params]
countries = ["RU", "CN"]

[[rules.custom]]

Regras estáticas inline (além das gerenciadas pelo DB).

CampoTipoPadrãoDescrição
namestring—Nome legível da regra.
priorityinteiro0Menor = avaliada primeiro.
matchstring (DSL)—Expressão de match; parse falho derruba a carga da config.
actionstring—allow | block | challenge | rate_limit | log | tag.
tagsarray de string[]Tags livres para agrupamento.
log_levelstringinfoVerbosidade no console: silent | info | warn | error.
[[rules.custom]]
name = "allow internal monitoring"
priority = 1
match = 'ip=10.0.0.0/8'
action = "allow"
log_level = "silent"

[[rules.feeds]]

Feeds de reputação e datasets (listas uma-por-linha).

CampoTipoPadrãoDescrição
namestring—Nome da feed (prefixo da tag da regra sintética).
urlstring—URL http/https (hosts loopback/privados são rejeitados — guarda SSRF).
kindstringipip | user_agent | path | ja3 — listas uma-por-linha viram regra sintética.
refresh_hoursinteiro24Intervalo de refresh em horas.
tierstringmaliciousunknown | clean | suspicious | malicious | datacenter | vpn | tor | authorized | promiscuous (só para kind = "ip").
actionstring(vazio)Para ip: vazio = só enriquecimento; para user_agent/path: vazio = log. Valores: block | challenge | rate_limit | …
enabledbooltruePausa a feed sem removê-la.
headers_envtabela{}Mapa header → env var para feeds autenticadas (ex.: Key = "SENTRY_ABUSEIPDB_KEY").
[[rules.feeds]]
name = "spamhaus_drop"
url  = "https://www.spamhaus.org/drop/drop.txt"
tier = "malicious"
refresh_hours = 24
action = "block"

Datasets DB-backed (o equivalente Postgres das feeds user_agent/path/ja3) não têm entrada TOML — gerencie via sentry datasets import | list | enable | disable | delete | fetch.

feed_presets

Presets de feeds embutidos, expandidos em feeds na carga.

CampoTipoPadrãoDescrição
feed_presetsarray de string[]Nomes válidos: tor_exit, firehol_level1, proxy_list, open_source_vpn_ips, anti_vpn. Feeds de preset bloqueiam por padrão; uma feed manual com o mesmo nome vence.

[scorer]

Pesos dos sinais e bônus de repetição.

CampoTipoPadrãoDescrição
weightstabela nome → inteiro{}Sobrescreve o peso de um sinal pela chave snake_case (ex.: sql_injection = 35, random_scan = 25).
repetition_bonusbooltrueBônus de score para sinais repetidos na janela deslizante.
repetition_window_secsinteiro60Duração da janela de repetição.

[policy]

Política de vereditos: mapeia nível de risco → veredito. Sobrescritas ordenadas via [[policy.override]]: a primeira expressão DSL que casar força o veredito.

CampoTipoPadrãoDescrição
infostringallowVeredito para eventos Info.
lowstringallowVeredito para eventos Low.
mediumstringrate_limitVeredito para eventos Medium.
highstringchallengeVeredito para eventos High.
criticalstringblockVeredito para eventos Critical.
overridearray[]Cada entrada: match (DSL) e verdict (allow | rate_limit | challenge | block | quarantine).
[[policy.override]]
match = 'path ^/wp-admin$ AND NOT ip=10.0.0.0/8'
verdict = "block"

[escalation]

Escalonamento de reincidentes: todo evento com veredito não-Allow registra 1 strike para o IP. Strikes só sobem o veredito, nunca baixam, e a janela deve sobreviver ao TTL da action de edge (o reincidente volta do TTL já re-bloqueado no primeiro evento violador).

CampoTipoPadrãoDescrição
enabledbooltrueLiga o escalonamento por strikes.
window_secsinteiro604800Strikes expiram N segundos após a última violação (7 dias, maior que o TTL típico de 24h da edge).
challenge_atinteiro3Strikes para escalar para pelo menos challenge.
block_atinteiro5Strikes para escalar para block.
persistbooltrueEspelha strikes na tabela ip_state (Postgres) e pré-aquece o tracker no startup.

[scan]

Detecção comportamental de varreduras: janela deslizante por IP contando respostas 4xx — caminhos 4xx distintos → sinal RandomScan; total de 4xx → sinal ScanBehavior.

CampoTipoPadrãoDescrição
enabledbooltrueLiga os trackers de scan.
window_secsinteiro60Duração da janela deslizante.
distinct_pathsinteiro8Caminhos 4xx distintos por IP que disparam RandomScan.
not_foundinteiro10Total de 4xx por IP que dispara ScanBehavior.

[behavior]

Detecção comportamental de ataques de autenticação e diretório por janela deslizante por IP.

CampoTipoPadrãoDescrição
enabledbooltrueLiga os trackers de comportamento.
window_secsinteiro300Janela deslizante por IP.
auth_failuresinteiro10Falhas 401/403 em rotas de login que disparam AuthBruteForce.
distinct_uasinteiro3User-Agents distintos falhando auth que disparam CredentialStuffing.
wordlist_hitsinteiro5404s em paths de wordlist que disparam DirectoryBruteForce (bons crawlers são isentos).
suspicious_success_min_failuresinteiro3Falhas de auth que precisam preceder um 2xx em rota de login para disparar SuspiciousLoginSuccess (0 desliga).
login_patternsarray de string[]Substrings que identificam rotas de autenticação (vazio = lista embutida).
wordlist_pathsarray de string[]Paths conhecidos de probe (vazio = wordlist embutida).

[correlation]

Correlação scan→ataque cross-IP ("shot calling" entre nós observando a mesma superfície): um ataque do IP B correlaciona com um scan de um IP diferente no mesmo /24 (IPv4), /64 (IPv6) ou ASN observado na janela → sinal ScanAttackCorrelation em B.

CampoTipoPadrãoDescrição
enabledbooltrueLiga o tracker de correlação.
window_secsinteiro900Idade máxima do scan para correlacionar (15 minutos).

[rate_limit]

Backend de rate-limit para condições DSL de rate (RuleMatch::Rate).

CampoTipoPadrãoDescrição
backendstringmemorymemory (janela deslizante em processo, single-node) | redis (multi-nó; exige o build feature rate-redis).
redis_urlstringredis://127.0.0.1/URL do Redis (usada só com backend = "redis").

[real_ip]

Resolução do IP real do cliente, proxies confiáveis e conjuntos never-ban/never-allow.

CampoTipoPadrãoDescrição
trusted_proxiesarray de string[]CIDRs/IPs de peers autorizados a setar headers de client IP (CF-Connecting-IP, True-Client-IP, X-Real-IP, XFF). Headers de outros peers são ignorados (anti-spoof).
cloudflarebooltrueInclui as faixas Cloudflare embutidas (refresh diário de cloudflare.com/ips).
trusted_ipsarray de string[]Clientes nunca banidos/bloqueados/reportados (admins, uptime probes) — short-circuit do pipeline para Allow.
trusted_listsarray de string[]Presets embutidos aprovados por nome (ex.: paypal, stripe, googlebot, bingbot) — entram no conjunto never-ban.
whitelistarray de string[]Permite tudo, nunca bane — mesclado no mesmo conjunto never-ban.
blacklistarray de string[]Nega imediatamente — o pipeline short-circuita para Block antes de qualquer detector.
shadowarray de string[]Tráfego totalmente processado, mas o veredito é limitado (Block/Quarantine viram Challenge) — nunca bane.
refresh_secsinteiro86400Intervalo de refresh das faixas Cloudflare (0 desliga; as constantes embutidas permanecem).

[ip_lookup]

Reputação externa on-demand: IPs na "banda cinza" (score local elevado sem veredito, ou carregando um sinal listado) são consultados no provedor e a confiança retornada re-entra no pipeline (só pode elevar o veredito). Consome cota da API — off por padrão.

CampoTipoPadrãoDescrição
enabledboolfalseLiga o fork de lookup.
providerstringabuseipdbProvedor de reputação.
key_envstringSENTRY_ABUSEIPDB_KEYVariável de ambiente com a chave da API.
trigger_aboveinteiro25Score local mínimo (0–100) para consultar (veredito ainda não-Block).
on_signalsarray de string[]Gatilho adicional: sinais (snake_case) que disparam o lookup. Vazio = só banda de score.
cache_ttl_secsinteiro86400TTL do cache de resultado por IP.
max_per_hourinteiro500Cota máxima de lookups por hora contínua.
timeout_secsinteiro10Timeout por requisição.

[bot_verification]

Verificação de bots via rDNS forward-confirmado: UAs que alegam ser crawlers verificáveis (Googlebot, bingbot, Slurp, Baiduspider, YandexBot) são validados com PTR nos domínios do engine + forward-resolve de volta ao IP. Bots verificados bypassam o challenge da edge; alegação falsa gera o sinal SpoofedBot. DNS roda fora do caminho quente. Inspecione com sentry bots check <ip> --ua "Googlebot/2.1".

CampoTipoPadrãoDescrição
enabledboolfalseLiga a verificação (requer resolução DNS).
cache_ttl_secsinteiro3600TTL do resultado verificado, por IP.
failed_ttl_secsinteiro600TTL do resultado falsificado (curto, para bots recuperarem rápido de outage de DNS).
timeout_msinteiro2000Timeout de uma rodada PTR+A.
batch_sizeinteiro16Máximo de claims verificadas por ciclo de drain.

[ai]

Modelo local clássico de anomalia (ONNX) rodando como fork assíncrono do pipeline; o re-score só pode elevar. Requer o build feature onnx. Treino: sentry model export [--synthetic] + tools/train_model.py.

CampoTipoPadrãoDescrição
enabledboolfalseLiga o estágio de modelo.
model_pathstring (caminho)models/anomaly_v1.onnxArquivo do modelo ONNX.
thresholdfloat0.7Probabilidade de anomalia que emite o sinal AnomalousPayload (0.0–1.0).
signal_weightinteiro25Peso do sinal emitido (sobrescrevível via [scorer.weights]).
modestringforkfork (assíncrono) | inline (bloqueia antes das actions) | shadow (só loga).
triggerstringabove_scorealways | above_score | quarantine_only.
min_scoreinteiro20Score mínimo do caminho quente para trigger = "above_score".
concurrencyinteiro4Inferências concorrentes máximas (modo fork).
cache_ttl_secsinteiro300TTL do cache de resultados por hash do payload.

[llm]

LLM opcional para re-score de eventos (chave via SENTRY_LLM_KEY). Espelha o comportamento do [ai]: fork/shadow, cache por hash do payload, só eleva o score.

CampoTipoPadrãoDescrição
providerstring(vazio)openrouter | openai | ollama | jev | mock. Vazio ou nome desconhecido desabilita o stage de LLM com um warning.
modelstring(vazio)ID do modelo específico do provedor (ex.: meta-llama/llama-3.3-70b-instruct); vazio usa o default do provider.
base_urlstring(vazio)Override de base URL (Ollama self-hosted / servidores compatíveis com OpenAI).
modestringforkfork (re-score assíncrono + re-dispatch de actions) | shadow (loga a decisão, nunca age).
only_aboveinteiro30Só invoca o LLM acima deste score (ou em quarentena).
concurrencyinteiro4Requisições LLM concorrentes máximas.
cache_ttl_secsinteiro300TTL do cache de vereditos por hash do payload.

[edge]

Edge inline (obrigatória com [deployment] mode = "inline"). Cadeia: client → sentry-edge → backends. O health check de startup exige ≥1 servidor saudável por grupo de upstream (secundário morto só gera warn — o failover cobre); vereditos aplicam antes do proxy (Block→403, RateLimit→429, Challenge→página de challenge). IPs bloqueados são negados por fast-path antes do pipeline e o bloqueio sobrevive a restarts.

Upstreams podem ser IPs ou hostnames (http://web:3000 — nomes de container Docker resolvem via DNS do compose; service names do Kubernetes idem). Requisições são roteadas por Host header para grupos por site via [[edge.vhosts]].

CampoTipoPadrãoDescrição
listenstring0.0.0.0:80Endereço HTTP público. listen = "" desliga o listener plain (HTTPS-only).
upstreamstring(vazio)Upstream default (catch-all) (ex.: http://127.0.0.1:8080).
upstreamsarray de string[]Grupo default com N servidores — substitui o upstream e balanceia entre eles.
balancestringround_robinEstratégia de balanceamento do grupo: round_robin | least_conn | ip_hash.
max_failsinteiro2Falhas de conexão dentro da janela antes de ejectar o servidor (0 = nunca).
fail_timeout_secsinteiro30Janela de contagem de falhas E duração da ejeção.
response_bufferingbooltrueBufferiza respostas do upstream (habilita compressão). false faz stream — text/event-stream sempre faz stream.
upstream_timeout_secsinteiro300Orçamento total por request no upstream (conexão + leitura + escrita).
health_pathstring/Path do health check de startup (por grupo).
health_timeout_secsinteiro5Timeout do health check.
body_capture_kbinteiro0Bytes do corpo capturados para inspeção, em KiB (0 = off).
challenge_backendstringsentryQuem executa vereditos Challenge: sentry (PoW embutido) | cloudflare (vira regra CF via API; exige action com provider = "cloudflare").
tls_cert / tls_keystring (caminho)(vazio)Certificado e chave TLS (build feature edge-tls; ambos habilitam TLS) — também a chain default para hostnames sem cert de vhost.
tls_listenstring0.0.0.0:443Bind HTTPS usado junto com tls_cert/tls_key; o listen plain continua de pé (80 e 443 monitorados).
tls_redirect_httpsboolfalse301 de HTTP → HTTPS depois do pipeline (o tráfego da porta 80 segue monitorado/bloqueado).
tls_allowed_hostsarray de string[]Hostnames aceitos no SNI do ClientHello; vazio desliga o check. SNI ausente/desconhecido pontua como probe (TlsSniMismatch).
tls_handshake_eventsbooltrueEmite um evento TlsHandshake por handshake (SNI + JA3 + JA4); mismatches são sempre emitidos.
tcp_listen / tcp_upstreamstring(vazio)Listener TCP inline para serviços não-HTTP (ex.: 0.0.0.0:2222 → 127.0.0.1:22); veredito no connect.
forwarded_headersbooltrueRemove os X-Forwarded-*/X-Real-IP do cliente e seta a visão resolvida da edge (XFF = IP do cliente, proto, host). false restaura o pass-through.
http2booltrueNegocia HTTP/2 no listener TLS (ALPN h2 + http/1.1); false fixa HTTP/1.1.
upstream_connect_timeout_secsinteiro5Timeout de conexão do hop edge → upstream.
upstream_pool_idleinteiro32Conexões keepalive ociosas em pool por host de upstream.
max_concurrent_requestsinteiro1024Máximo de requisições simultâneas (0 = ilimitado); acima do teto, 503 imediato (error pages se aplicam).
reuseport_workersinteiro1Accept loops compartilhando a porta via SO_REUSEPORT (unix; Windows limita a 1).
tcp_backloginteiro0Backlog do listen (0 = máximo do kernel / somaxconn).
tcp_nodelaybooltrueTCP_NODELAY nas conexões de cliente.
tcp_keepalive_secsinteiro60Idle do keepalive de cliente (0 = off).
tcp_send_buffer_kb / tcp_recv_buffer_kbinteiro0SO_SNDBUF/SO_RCVBUF em KiB (0 = padrão do sistema).
[edge]
listen = "0.0.0.0:80"
upstream = "http://127.0.0.1:8080"

[edge.vhosts]
host = "app.example.com"
upstreams = ["http://web:3000"]

[[edge.vhosts]]

Virtual hosts estilo nginx (F14): requisições cujo Host header casa roteiam para o grupo de upstream do próprio vhost, com balancer e health checks passivos próprios. host casa case-insensitive (o sufixo :porta é ignorado); *.dominio casa qualquer subdomínio (multi-label) mas não o domínio nu — semântica nginx de wildcard. Campos omitidos herdam os globals do [edge]. Cada vhost pode declarar tls_cert/tls_key, servidos via SNI no listener HTTPS compartilhado (o cert global continua como chain default; exige edge-tls).

CampoTipoPadrãoDescrição
hoststring(obrigatório)Host header a casar, ex. app.example.com ou *.api.example.com.
upstreamsarray de string(obrigatório)URLs dos backends do site (IP ou hostname).
balancestring[edge] balanceround_robin | least_conn | ip_hash.
max_failsinteiro[edge] max_failsFalhas do health check passivo antes de ejectar.
fail_timeout_secsinteiro[edge] fail_timeout_secsJanela de falhas / duração da ejeção.
health_pathstring[edge] health_pathOverride do path do health check de startup.
tls_cert / tls_keystring (caminho)(vazio)Certificado do vhost servido via SNI (ambos juntos; exige o front TLS global).

Failover: falha de conexão (connect error/timeout) tenta o próximo servidor saudável do grupo (nginx proxy_next_upstream error timeout; resposta 5xx não é retryable) — sentry_edge_upstream_failovers_total{vhost} conta as retentativas, e um grupo com todos os servidores fora responde 502. Upstreams https:// SEMPRE verificam certificado; para backends self-signed use http:// puro na rede privada.

[edge.compress]

Compressão de resposta da edge: negociação por Accept-Encoding (zstd > brotli > gzip) sobre corpos já bufferizados. Nunca comprime: respostas com content-encoding, 206, no-transform, corpos abaixo de min_length e content-types fora da allowlist. Sob pressão de overload desliga sozinha. zstd exige o build feature edge-zstd.

CampoTipoPadrãoDescrição
enabledbooltrueLiga a compressão.
min_lengthinteiro256Corpos menores passam intocados.
level_brinteiro4Qualidade brotli 0..=11.
level_gzipinteiro6Nível gzip 0..=9.
level_zstdinteiro3Nível zstd 1..=22 (só com edge-zstd).

[edge.challenge]

Challenge interativo SHA-256 proof-of-work para vereditos Challenge (usado com challenge_backend = "sentry"). Stateless: compartilhe o segredo entre nós da edge. PoW nunca destrava um Block; crawlers verificados por rDNS bypassam.

CampoTipoPadrãoDescrição
enabledboolfalseLiga o challenge interativo.
secret_envstringSENTRY_EDGE_CHALLENGE_SECRETEnv com o segredo compartilhado (recomendado 32+ bytes aleatórios); obrigatório quando habilitado — sem ele o startup falha.
bucket_secsinteiro3600Duração do bucket — challenge rotaciona e cookies expiram com ele.
difficultyinteiro16Bits zero à esquerda do PoW (clampado 8..=28).
titlestringVerifying your browser...Título da página interstitial.
template_pathstring (caminho)(vazio)HTML alternativo da interstitial — re-lido a cada render (edita sem restart); precisa manter os marcadores {{…}} obrigatórios.

[edge.error_pages]

Páginas de erro HTML customizadas para toda resposta gerada pela edge.

CampoTipoPadrãoDescrição
dirstring (caminho)(vazio)Diretório com <status>.html (ex.: 403.html, 413.html, 429.html, 502.html) + default.html opcional. Placeholders {{SENTRY_STATUS}}, {{SENTRY_TITLE}}, {{SENTRY_MESSAGE}}, {{SENTRY_TRACE_ID}}, {{SENTRY_ICON}}; valores escapados. Lidas uma vez no startup (arquivos > 256 KiB são ignorados com warning).

[uploads]

Inspeção de corpo e uploads (só faz sentido inline): corpos são bufferizados, multipart/urlencoded/JSON parseados e os heurísticos de upload pontuam o que encontrarem (SQLi/XSS em filenames e campos, imagens poliglotas, executáveis disfarçados, flood). O teto de memória é ~requisições concorrentes × inspect_kb.

CampoTipoPadrãoDescrição
enabledboolfalseLiga a inspeção de uploads (exige modo inline).
modestringshadowshadow (detecta + loga, sinais com peso 0) | enforce (pesos plenos, bloqueia antes do upstream).
inspect_kbinteiro4096Teto de inspeção por requisição em KiB.
max_filesinteiro16Máximo de partes multipart parseadas por requisição.
scan_jsonbooltrueEscaneia corpos JSON como texto (SQLi/XSS em payloads de API).
blocked_extensionsarray de stringphp, phtml, php5, jsp, jspx, asp, aspx, exe, dll, sh, bat, ps1Extensões que sempre geram UploadExecutable (inclui dupla extensão shell.php.jpg).
allowed_extensionsarray de string[]Allowlist: quando não-vazia, extensão (ou dupla) fora da lista gera UploadDisallowed; arquivos sem extensão não são afetados; blocked_extensions vence.
oversizestringrejectreject (413) | skip (encaminha sem inspecionar) | flag (encaminha + sinal UploadOversize e conta no flood). Corpos maiores que inspect_kb.

[uploads.flood]

Limites de volume do flood de uploads por IP.

CampoTipoPadrãoDescrição
window_secsinteiro60Duração da janela deslizante por IP.
max_uploadsinteiro30Arquivos por IP na janela que disparam UploadFlood (0 = off).
max_total_mbinteiro50Total de MiB enviados por IP na janela que disparam UploadFlood.

[posture]

Advisories de postura de segurança web (só inline): respostas do upstream são checadas por headers de segurança ausentes/fracos (CSP, HSTS, COOP, frame protection, Trusted Types, nosniff, referrer policy). Findings viram sinais de peso 0 — nunca mudam score nem veredito, e nem [scorer.weights] muda isso.

CampoTipoPadrãoDescrição
enabledbooltrueLiga os advisories (impacto de enforcement zero).
modestringshadowshadow (só reporta) | enforce (reservado para injeção de headers — roadmap; rejeitado na carga).
dedupe_ttl_secsinteiro3600Período de dedupe por (host, check) antes de re-reportar.
hsts_min_max_ageinteiro31536000max-age do HSTS abaixo do qual o header conta como fraco (1 ano).
checksarray de string[] (todas)Ids habilitados: csp, hsts, coop, clickjacking, trusted_types, nosniff, referrer_policy. Lista explícita substitui o conjunto inteiro.
hostsarray de string[]Restringe os advisories a estes Hosts (vazio = qualquer; teto de 64 hosts).

[protocol]

Validação de protocolos: compila schemas YAML (*.protocol.yaml) e valida frames em portas não padrão na edge-tcp. Hot-reload ao vivo do diretório; compile falho mantém o set anterior.

CampoTipoPadrãoDescrição
enabledboolfalseLiga o validador de protocolos.
dirstring (caminho)schemasDiretório observado (add/modify/remove ao vivo).
safety_poll_secsinteiro60Rescan de segurança que cobre perdas de fs-events.
debounce_msinteiro500Janela de coalescência dos fs-events antes do rescan.
max_schemasinteiro64Máximo de schemas compilados aceitos do diretório.

[metrics]

Métricas Prometheus: serve /metrics e /api/events (eventos recentes, para o dashboard Grafana) no mesmo processo do daemon. Sem auth — mantenha a porta interna.

CampoTipoPadrãoDescrição
enabledbooltrueLiga o endpoint /metrics.
hoststring0.0.0.0Bind do servidor de métricas.
portinteiro9100Porta do servidor de métricas.

[server]

Dashboard web e API JSON (sentry serve) — processo separado do daemon; requer Postgres.

CampoTipoPadrãoDescrição
hoststring127.0.0.1Bind do servidor. Com auth desligada só loopback é seguro.
portinteiro8080Porta do servidor.
authtabela—Subtabela [server.auth] abaixo.
webhook_secret_envstringSENTRY_WEBHOOK_SECRETEnv com o segredo compartilhado: requisições com o header X-Sentry-Webhook-Secret correspondente podem ack/resolver incidentes.

[server.auth]

Auth + RBAC do dashboard/API.

CampoTipoPadrãoDescrição
modestringnonenone | password | token | both. Papéis: admin (mutações) e viewer (leitura).
usersarray[]Usuários do dashboard (modo password), cada um com username, password_hash (Argon2id via sentry auth hash-password), role (default viewer).
tokensarray[]API tokens estáticos (modo token), cada um com token_sha256 ou token_env + role (default viewer; hash via sentry auth token-hash).
session_secret_envstringSENTRY_SESSION_SECRETEnv com a chave HMAC de assinatura dos cookies de sessão.
session_ttl_secsinteiro43200Vida útil do cookie de sessão (12h).

[[action]]

Ações de resposta. Cada entrada tem type, provider opcional, dispatch opcional e um mapa options do plugin.

CampoTipoPadrãoDescrição
typestringlogDiscriminador type-safe: cloudflare (alias de challenge + CF) | challenge | webhook | blocklist | report | log. Typo falha na carga.
providerstring(vazio)Só para type = "challenge": cloudflare | firewall | nginx | opnsense | pfsense | … (extensível via trait ChallengeProvider).
dispatchstring(default natural)inline (contenção local, no hot loop) | deferred (I/O de rede nos workers). Defaults: blocklist/log/firewall = inline; cloudflare/nginx/opnsense/pfsense/webhook/report = deferred.
optionstabela{}Opções específicas do plugin (abaixo).

type = "blocklist" — blocklist em memória que alimenta a block table compartilhada; os mesmos blocks são espelhados em ip_state (visível no dashboard, restart-safe).

OptionPadrãoDescrição
ttl_secs86400TTL dos bloqueios de pipeline de ponta a ponta.

type = "challenge", provider = "cloudflare" — aplica vereditos como regras na Cloudflare (env: SENTRY_CF_TOKEN, SENTRY_CF_ZONE, opcional SENTRY_CF_ACCOUNT).

OptionPadrãoDescrição
modemanaged_challengeblock | js_challenge | managed_challenge | rate_limit.
ttl_secs86400TTL das regras de acesso (comentadas como sentry:<ts>:<ttl> para o reaper).
max_failures3Circuit breaker: desativa o provider após N falhas consecutivas (até restart).
ipv6_prefix(vazio)1..=128 — bloqueia IPv6 por /64 via IP List account-level (ip.src in $<list_name>); ausente/128 mantém regras de endereço exato.
list_namesentry_blocksNome da IP List (^[a-z0-9_]+$, máx 50 chars).

provider = "firewall" — bans de kernel (Linux only; auto-detect nftables → ipset+iptables → firewalld; requer root ou CAP_NET_ADMIN).

OptionPadrãoDescrição
backendautoauto | nftables | ipset | firewalld.
ttl_secs86400Duração dos bans Block/Challenge.
rate_limit_ttl_secs600TTL menor para vereditos RateLimit.
tablesentryNome da tabela nftables.
set_prefixsentry_blocksPrefixo dos sets (sentry_blocks_v4 / sentry_blocks_v6).

provider = "nginx" — gera includes de deny/challenge em um nginx co-localizado e recarrega (funciona com o Sentry em modo passive).

OptionPadrãoDescrição
conf_dir— (obrigatório)Diretório dos includes gerados (sentry-deny.conf, sentry-challenge.conf, …).
reload_cmdnginx -s reloadComando de reload (sem shell).
validatetrueRoda nginx -t antes de cada reload.
ttl_secs86400TTL dos denies (stamps # sentry:<ts>:<ttl>).
rate_limit_denyfalseTambém nega vereditos RateLimit.
provision_botstrueEmite o snippet bot_verifier (módulo opt-in).
geo_var$sentry_challenge_ipVariável geo do map de challenge.

provider = "opnsense" / provider = "pfsense" — drops no appliance de firewall (plataforma drop-only: Challenge/RateLimit são logados como unenforced).

OptionPadrãoDescrição
base_url— (OPNsense, obrigatório)Base URL da API REST do OPNsense.
api_key_env / api_secret_envSENTRY_OPN_API_KEY / SENTRY_OPN_API_SECRETEnvs com as credenciais (OPNsense).
tablesentry_blocksAlias/table dos bans.
pfctl_pathpfctlBinário pfctl (backend pfSense).
accept_invalid_certstrueAceita certificado self-signed do appliance.
ipv6_prefix(vazio)Entradas IPv6 como CIDR (sem isso, endereço exato).

type = "report" (provider = "abuseipdb" | "reportedip") — reporta IPs com veredito de enforcement para bancos de abuse comunitários.

OptionPadrãoDescrição
key_envdefault do provider (ex.: SENTRY_ABUSEIPDB_KEY)Env com a chave da API; chave ausente pula a action com warning.
min_verdictblockVeredito mínimo reportado: block | challenge | rate_limit.
dedupe_hours24Um report por IP por janela.
timeout_secs10Timeout por requisição.

type = "webhook" — POST JSON de alerta (Discord recebe embed rico automaticamente).

OptionPadrãoDescrição
url / url_env— (um dos dois é obrigatório)URL do webhook; prefira url_env (a URL é credencial). url_env vazio pula a action com warning.
on_levels["high", "critical"]Níveis de risco que disparam o POST.
timeout_secs10Timeout do POST.
secret_envSENTRY_WEBHOOK_SECRETQuando a env existe, requisições são assinadas com X-Sentry-Signature: sha256=<hmac> e o payload carrega incident_id/ack_url para callback.

type = "log" — embutida, emite linha de tracing no act.

[[action]]
type = "challenge"
provider = "cloudflare"
[action.options]
mode = "managed_challenge"
ttl_secs = 86400
max_failures = 3
ipv6_prefix = 64

Validação e segredos

sentry config validate   # valida schema, regras DSL e schemas de protocolo
sentry config show       # imprime a config resolvida (com overlay aplicado)

sentry config validate compila as regras custom (a DSL é parseada na carga), compila os schemas de protocolo quando [protocol] enabled, rejeita [posture] mode = "enforce" (ainda roadmap), avisa sobre ids desconhecidos em [posture] checks e imprime os advisories de topologia/performance da edge (TLS duplo, upstream http fora do loopback, compressão inerte fora do inline).

Regras de segurança:

  • Segredos (tokens Cloudflare/LLM/DB, chaves de API, segredos de sessão) nunca em config commitada — via env (SENTRY_*).
  • sentry.example.toml tem placeholders, não valores reais.
  • O pack sensitive_paths bloqueia .env, .git/, .ssh/, etc. por padrão — ao expor uma rota allowlistada, justifique no PR.

On this page