Configuração do Servidor API


O Bencher API Server requer uma configuração JSON no momento da inicialização. A configuração pode ser fornecida de três maneiras:

  • Variável de ambiente BENCHER_CONFIG: O valor deve ser definido para a configuração JSON
  • Variável de ambiente BENCHER_CONFIG_PATH: O valor deve ser definido para o caminho de um arquivo que contenha a configuração JSON
  • Arquivo /etc/bencher/bencher.json: Um arquivo neste local contendo a configuração JSON

Se nenhuma configuração for encontrada, uma configuração padrão será carregada.

Exemplo de configuração JSON:

{
"console": {
"url": "https://bencher.example.com"
},
"security": {
"issuer": "https://api.bencher.example.com",
"secret_key": "UJu7Cpxb-zFaJYqXD-3mDDSDyj-ZvfxZFZs-X58xjxPy"
},
"server": {
"bind_address": "0.0.0.0:6610",
"request_body_max_bytes": 1048576,
"tls": {
"type": "as_file",
"cert_file": "/path/to/cert.pem",
"key_file": "/path/to/key.pem"
}
},
"logging": {
"name": "Bencher API",
"log": {
"stderr_terminal": {
"level": "info"
}
}
},
"database": {
"file": "/var/lib/bencher/data/bencher.db",
"busy_timeout": 5000,
"cache_size": 65536
},
"smtp": {
"hostname": "mailbonobo.com",
"port": 587,
"starttls": true,
"username": "bencher",
"secret": "WM3F2u9cqSNdBPLfy9sJ5kk9",
"from_name": "Bencher",
"from_email": "info@bencher.example.com"
},
"plus": {
"disaster_recovery": {
"replica": {
"scheme": "s3",
"bucket": "my-bucket",
"path": "path/to/replicate",
"access_key_id": "ABC123DoRemMiABC123",
"secret_access_key": "AA3Chr-JSF5sUQqKwayx-FvCfZKsMev-5BqPpcFC3m7"
}
},
"registry": {
"url": "https://registry.bencher.example.com",
"storage": {
"scheme": "s3",
"bucket": "my-bucket",
"path": "registry",
"endpoint": "https://s3.example.com",
"region": "auto",
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"chunk_size": 5242880
},
"upload_timeout": 3600,
"max_body_size": 1073741824
},
"runners": {
"heartbeat_timeout": 90,
"job_timeout_grace_period": 60,
"update_base_url": "https://github.com/bencherdev/bencher/releases/download/"
},
"rate_limiting": {
"window": 86400,
"unclaimed_limit": 255,
"claimed_limit": 65536,
"plus_limit": 1048576,
"public": {
"requests": {
"minute": 1024,
"hour": 4096,
"day": 8192
},
"attempts": {
"minute": 32,
"hour": 64,
"day": 128
},
"runs": {
"minute": 64,
"hour": 128,
"day": 256
}
},
"user": {
"requests": {
"minute": 2048,
"hour": 8192,
"day": 16384
},
"attempts": {
"minute": 2,
"hour": 4,
"day": 8
},
"credentials": {
"minute": 4,
"hour": 8,
"day": 16
},
"organizations": {
"minute": 2,
"hour": 4,
"day": 8
},
"invites": {
"minute": 8,
"hour": 16,
"day": 32
},
"runs": {
"minute": 64,
"hour": 1024,
"day": 4096
}
},
"project": {
"requests": {
"minute": 2048,
"hour": 8192,
"day": 16384
},
"runs": {
"minute": 64,
"hour": 1024,
"day": 4096
}
},
"runner": {
"requests": {
"minute": 16,
"hour": 256,
"day": 4096
}
},
"oci_bandwidth": {
"unclaimed": 1073741824,
"free": 10737418240,
"plus": 107374182400
}
},
"stats": {
"offset": 11242,
"enabled": true
},
"mcp": {
"openai_apps_challenge": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
},
"oauth": {
"issuer": "https://api.bencher.example.com",
"resources": [
"https://mcp.bencher.example.com/mcp",
"https://api.bencher.example.com/mcp"
],
"signing_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\n-----END PRIVATE KEY-----\n"
}
}
}

console

Nome Exemplo Padrão Obrigatório Descrição
url “https://bencher.example.com” “http://localhost:3000” Sim Indica a URL para o console do host do Bencher UI.

security

Nome Exemplo Padrão Obrigatório Descrição
issuer “https://api.bencher.example.com” “bencher.dev” Não Indica o emissor do JSON Web Token (JWT). ATENÇÃO Alterar este valor fará com que todos os JWTs gerados anteriormente não validem.
secret_key “UJu7Cpxb-zFaJYqXD-3mDDSDyj-ZvfxZFZs-X58xjxPy” UUID v4 aleatório Sim Indica a chave usada para gerar todos os tokens e para selar os callbacks pendentes. DEVE SER MUITO SEGURA! O valor padrão é um UUID v4 gerado aleatoriamente. Sempre que exibido, aparecerá ofuscado como ************.

server

Esta seção é baseada na configuração do servidor Dropshot.

Nome Exemplo Padrão Obrigatório Descrição
bind_address “0.0.0.0:6610” “0.0.0.0:6610” Sim Especifica que o servidor deve se ligar ao dado IP e porta TCP. Em geral, servidores podem se ligar a mais de um IP e porta, mas isso não é (ainda?) suportado.
request_body_max_bytes 1048576 1048576 Sim Especifica o número máximo de bytes permitidos em um corpo de requisição. Requisições maiores vão receber um erro 400.
tls.type “as_file” — Não Especifica se e como a informação do certificado e chave TLS são fornecidos. Valores válidos incluem “as_file” e “as_bytes”.
tls.cert_file “/path/to/cert.pem” — Se tls.type = as_file Indica o caminho para um arquivo PEM contendo uma cadeia de certificados para o servidor se identificar. O primeiro certificado é o certificado de entidade final, e os restantes são intermediários até um CA confiável. Se especificado, o servidor só aceitará conexões TLS.
tls.key_file “/path/to/key.pem” — Se tls.type = as_file Indica o caminho para um arquivo PKCS #8 codificado em PEM contendo a chave privada que o servidor usará. Se especificado, o servidor só aceitará conexões TLS.
tls.certs — — Se tls.type = as_bytes Idêntico a tls.cert_file, mas fornecido como um array de bytes dos dados de certificado.
tls.key — — Se tls.type = as_bytes Idêntico a tls.key_file, mas fornecido como um array de bytes dos dados da chave.

logging

Esta seção é baseada na configuração de logging do Dropshot.

Nome Exemplo Padrão Obrigatório Descrição
name “Bencher API” “Bencher API” Sim Especifica o nome do registrador.
log.level “info” “info” Sim Especifica qual a gravidade das mensagens de log que devem ser incluídas no log. Os valores válidos incluem “trace”, “debug”, “info”, “warn”, “error”, e “critical”, que estão em ordem crescente de gravidade. As mensagens de log no nível especificado e níveis mais graves serão incluídas no log.
log.path — — Apenas se log.mode = “file” Se log.mode é “file”, esta propriedade determina o caminho para o arquivo de log. Veja também log.if_exists.
log.if_exists — — Apenas se log.mode = “file” Se log.mode é “file”, esta propriedade especifica o que fazer se o arquivo de log de destino já existir. Os valores válidos incluem “append” (que anexa ao arquivo existente), “truncate” (que trunca o arquivo existente e então o utiliza como se ele acabasse de ser criado), e “fail” (que faz o servidor sair imediatamente com um erro).

database

Nome Exemplo Padrão Obrigatório Descrição
file “path/to/database.db” “/var/lib/bencher/data/bencher.db” Sim Controla para onde vai a base de dados do servidor.
busy_timeout 5000 5000 Não Especifica o tempo limite de ocupação para o banco de dados em milissegundos. Previne erros SQLITE_BUSY imediatos sob contenção de bloqueio.
cache_size 65536 65536 Não Especifica o tamanho do cache de páginas em KiB para a conexão de escrita do banco de dados. Um cache maior evita a releitura de páginas removidas durante ingestões e exclusões de relatórios grandes. Deve ser maior que 0.

smtp

Esta seção especifica uma configuração de serviço SMTP. Toda a seção é opcional. Se não for especificada, todas as mensagens serão enviadas para logging.

Nome Exemplo Padrão Obrigatório Descrição
hostname “mailbonobo.com” — Sim Especifica o nome do host SMTP.
port 587 587 Não Especifica a porta SMTP.
insecure_host — false Não Controla se a conexão SMTP pode permitir certificados TLS inválidos.
starttls true true Não Controla se a conexão SMTP usa o protocolo STARTTLS.
username “bencher” — Sim Especifica o nome de usuário no host SMTP.
secret “WM3F2u9cqSNdBPLfy9sJ5kk9” — Sim Especifica o segredo para o nome de usuário no host SMTP. Sempre que registrado, aparecerá ofuscado como ************.
from_name “Bencher” — Sim Especifica o nome que aparecerá na seção de remetente de todos os e-mails.
from_email “info@bencher.example.com” — Sim Especifica o e-mail que aparecerá na seção de remetente de todos os e-mails.

plus

Esta seção é para recursos que são cobertos pela Licença Bencher Plus.

plus.github

Esta seção especifica a configuração para um aplicativo GitHub usado para autenticação OAuth2. Você deve ter uma licença Enterprise válida do Bencher Plus para pelo menos uma organização no servidor. A seção inteira é opcional. Se não especificada, a autenticação com o GitHub não será ativada.

Nome Exemplo Padrão Obrigatório Descrição
client_id Iv1.12864abcd1232048 — Sim Especifica o ID do cliente para o seu aplicativo GitHub. O ID do cliente é diferente do ID do aplicativo. Você pode encontrar o ID do cliente na página de configurações do seu aplicativo. Para mais informações sobre como navegar até a página de configurações do seu aplicativo GitHub, veja Modificando um registro de aplicativo GitHub.
client_secret 00000abcd12345wxyz123456789abcdefgh0000 — Sim O segredo do cliente para o seu aplicativo GitHub. Você pode gerar um segredo do cliente na página de configurações do seu aplicativo.
app { … } — Não Especifica o aplicativo GitHub que cria o token de dispatch para o repositório vinculado de um projeto. Deve ser o mesmo aplicativo GitHub cujo ID de cliente está em client_id. O aplicativo precisa de acesso de leitura e escrita ao conteúdo do repositório. Se não especificado, nenhum projeto pode vincular um repositório.
app.slug my-bencher-app — Sim O nome do seu aplicativo GitHub nas URLs dele, como em https://github.com/apps/my-bencher-app. Ele indica a página onde um usuário instala o aplicativo.
app.private_key “—–BEGIN RSA PRIVATE KEY—–\n…” — Sim Uma chave privada para o seu aplicativo GitHub, no formato PEM. Você pode gerar uma chave privada na página de configurações do seu aplicativo.
app.webhook_secret 0123456789abcdef0123456789abcdef — Sim O segredo do webhook do seu aplicativo GitHub. Você pode definir o segredo do webhook na página de configurações do seu aplicativo.

plus.google

Esta seção especifica a configuração para um cliente Google usado para autenticação OAuth2. Você deve ter uma licença Bencher Plus Enterprise válida para pelo menos uma organização no servidor. Toda a seção é opcional. Se não for especificada, a autenticação com o Google não será ativada.

Nome Exemplo Padrão Obrigatório Descrição
client_id 0123456789-abcdefg0112358envs.apps.googleusercontent.com — Sim Especifica o ID do cliente para o seu cliente OAuth2 do Google.
client_secret GOCSPX-xyz987654321 — Sim O segredo do cliente para o seu cliente OAuth2 do Google.

plus.disaster_recovery

Esta seção especifica a configuração de recuperação de desastres. O Bencher suporta a replicação contínua de todas as alterações no banco de dados.

Existem dois schemes de replicação:

  • file: Replicar para um caminho de arquivo local
    • path: Caminho para replicar
  • s3: Replicar para qualquer armazenamento de blob compatível com S3
    • bucket: Nome do bucket
    • path: (Opcional) Caminho no bucket
    • endpoint: (AWS: Opcional | Não-AWS: Obrigatório) Endpoint de replicação
    • region: (Opcional) Região do bucket
    • access_key_id: Chave de acesso do S3
    • secret_access_key: Chave de acesso secreta do S3

Ambos os schemes de replicação têm as seguintes opções adicionais:

  • snapshot.interval: (Opcional) Especifica com que frequência novos snapshots serão criados. Isso é usado para reduzir o tempo de restauração, já que snapshots mais novos terão menos frames WAL para aplicar. A retenção ainda se aplica a esses snapshots. Se você não definir um intervalo de snapshot, um novo snapshot será criado sempre que a retenção for realizada. A retenção ocorre a cada 24 horas por padrão.
  • snapshot.retention: (Opcional) A quantidade de tempo que os arquivos de snapshot e WAL serão mantidos. Após o período de retenção, um novo snapshot será criado e o antigo será removido. Arquivos WAL que existirem antes do snapshot mais antigo também serão removidos. O padrão é 24h.
  • validation.interval: (Opcional) Quando especificado, o Bencher restaurará automaticamente e validará que os dados na réplica correspondem à cópia local. Desativado por padrão. Habilitar isso pode aumentar significativamente o custo de execução do Bencher, já que a maioria dos serviços em nuvem cobra pelos downloads.
  • sync_interval: (Opcional) Frequência com que os frames são enviados para a réplica. O padrão é 1s. Aumentar a frequência pode aumentar significativamente os custos de armazenamento em nuvem.
  • checkpoint.interval: (Opcional) Com que frequência o Litestream realiza um checkpoint PASSIVE não bloqueante independentemente da contagem de páginas. O Litestream pula o checkpoint se leitores ou escritores estiverem ativos. O padrão é 1m.
  • checkpoint.min_page_count: (Opcional) Número mínimo de páginas WAL antes de um checkpoint PASSIVE não bloqueante ser acionado (~4KB por página). O Litestream pula o checkpoint se leitores ou escritores estiverem ativos. O padrão é 1000 (~4MB).
  • checkpoint.truncate_page_n: (Opcional) Limite de páginas para um checkpoint TRUNCATE bloqueante. Quando este limite é atingido, o Litestream realiza um checkpoint bloqueante que aguarda a conclusão de todos os leitores e escritores, o que pode causar erros database is locked sob carga. O padrão é 0 (desativado). Defina um valor diferente de zero apenas se precisar de um limite superior no tamanho do arquivo WAL e compreender as implicações do bloqueio.
Nome Exemplo Padrão Obrigatório Descrição
replica { … } — Sim Especifica um objeto de réplica.
replica.scheme “s3” — Sim Especifica o esquema de replicação. Para todas as outras chaves de replica, consulte a lista acima.
snapshot.interval “1h” — Não Frequência de criação de novos snapshots. Reduz o tempo de restauração.
snapshot.retention “24h” 24h Não Quanto tempo os arquivos de snapshot e WAL são mantidos antes de serem substituídos.
validation.interval “6h” — Não Frequência de restauração e validação dos dados de réplica contra a cópia local. Desativado por padrão.
checkpoint.interval “1m” 1m Não Frequência de execução de checkpoint PASSIVE não bloqueante. Ignorado se leitores/escritores estiverem ativos.
checkpoint.min_page_count 1000 1000 Não Páginas WAL mínimas (~4KB cada) antes de um checkpoint PASSIVE. Ignorado se leitores/escritores estiverem ativos.
checkpoint.truncate_page_n 0 0 Não Limite de páginas para checkpoint TRUNCATE bloqueante. 0 desativa. Valores diferentes de zero podem causar database is locked sob carga.

plus.registry

Esta seção especifica a configuração de armazenamento do registro OCI (Open Container Initiative). O Bencher pode funcionar como um registro de contêineres/artefatos compatível com OCI.

Se esta seção não estiver configurada, o Bencher usará armazenamento em sistema de arquivos local em um diretório registry adjacente ao arquivo de banco de dados. Isso é adequado para desenvolvimento e implantações de instância única.

Para implantações de produção com múltiplas instâncias ou para durabilidade, configure o armazenamento compatível com S3.

Há dois schemes de armazenamento:

  • file: Armazenar artefatos OCI no sistema de arquivos local (padrão)
    • path: (Opcional) Diretório para os dados do registro. Por padrão, um diretório registry adjacente ao arquivo de banco de dados.
  • s3: Armazenar artefatos OCI em qualquer armazenamento de blob compatível com S3
    • bucket: Nome do bucket
    • path: (Opcional) Prefixo de chave no bucket. Barras iniciais, finais e repetidas são removidas, portanto registry, registry/ e /registry armazenam todos sob registry.
    • endpoint: (AWS: Opcional | Não-AWS: Obrigatório) Endpoint de armazenamento
    • region: (Opcional) Região do bucket. Obrigatório para AWS. Por padrão auto, que é o esperado pelos armazenamentos compatíveis com S3.
    • access_key_id: Chave de acesso do S3
    • secret_access_key: Chave de acesso secreta do S3
    • chunk_size: (Opcional) Tamanho mínimo do fragmento em bytes para armazenamento em buffer dos dados de upload antes de salvar. Padrão: 5 MB. Os corpos de requisição HTTP chegam como pequenos frames de rede (tipicamente 8 a 64 KB). Sem armazenamento em buffer, cada frame se torna um objeto separado, criando milhares de objetos por camada. Este valor também corresponde ao tamanho mínimo de parte para uploads multipart do S3.

Defina uma regra de ciclo de vida do bucket que aborte uploads multipart incompletos. Uma falha no meio da conclusão de um upload de blob deixa um, e o servidor não o aborta.

Se você configurou anteriormente um path que começava ou terminava com uma barra, mova os objetos existentes para o prefixo normalizado antes de atualizar. Um path de registry/ armazenava chaves sob registry//<project>/... e agora as armazena sob registry/<project>/.... Cada segmento de path também é codificado em porcentagem na chave armazenada quando contém um caractere de controle ASCII, um caractere não ASCII ou um de \ {` `^` `} % ` ] " > [ ~ < # | * ?, e um segmento que seja exatamente . ou .. é armazenado como %2E ou %2E%2E. Qualquer outro caractere, incluindo espaços, +, =, @ e :, é armazenado como está, portanto team#1 torna-se team%231 enquanto team+1 continua team+1. Os dados armazenados sob um prefixo que agora é codificado precisam da mesma mudança. Antes de mover qualquer dado, liste as chaves realmente armazenadas no bucket e compare-as com o novo prefixo.

Nome Exemplo Padrão Obrigatório Descrição
url “https://registry.bencher.example.com” “http://localhost:6610” Não A URL externamente acessível do servidor API para acesso ao registro OCI.
storage { … } — Não Especifica o backend de armazenamento do registro. Arquivos locais se omitido.
storage.scheme “s3” — Sim Especifica o scheme de armazenamento. Para todas as outras chaves de storage, veja a lista acima.
upload_timeout 3600 3600 Não Timeout da sessão de upload em segundos. Uploads obsoletos são limpos ao iniciar novos uploads.
max_body_size 1073741824 1073741824 Não Tamanho máximo do corpo em bytes para uploads de blobs e manifestos. Requisições que excedam este limite são rejeitadas com 413 Payload Too Large. Padrão: 1 GiB.

plus.runners

Esta seção configura o sistema de runners para execução de benchmarks em bare metal. Runners são agentes de escopo de servidor que reivindicam e executam trabalhos de benchmark.

Se esta seção não estiver configurada, o Bencher usará os valores padrão.

Nome Exemplo Padrão Obrigatório Descrição
heartbeat_timeout 90 90 Não Tempo em segundos sem um heartbeat antes de marcar um trabalho como desconhecido.
job_timeout_grace_period 60 60 Não Tempo extra em segundos além do timeout configurado de um trabalho antes que o servidor o cancele.
update_base_url https://example.com/downloads/ GitHub Releases Não URL base para downloads de autoatualização do runner. Por padrão, a URL de download do GitHub Releases do Bencher.

plus.rate_limiting

Esta seção especifica o limite de taxa para o servidor da API. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Para evitar que projetos unclaimed sejam criados, defina unclaimed_limit como 0.

Nome Exemplo Padrão Obrigatório Descrição
window 86400 86400 Não Especifica o limite de taxa em segundos. Configurado por padrão para um dia.
unclaimed_limit 255 255 Não Controla o limite de taxa para projetos unclaimed. Para evitar a criação de projetos unclaimed, defina este valor para 0.
claimed_limit 65536 65536 Não Controla o limite de taxa para projetos claimed.
plus_limit 1048576 1048576 Não Controla o limite de taxa de métricas para organizações com um plano Bencher Plus.

public

O limitador de taxa public se aplica por endereço IP para solicitações não autenticadas. Cada subcampo contém limites de minute, hour e day. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Nome Exemplo Padrão Obrigatório Descrição
requests { … } — Não Especifica limites de taxa de solicitações por IP.
requests.minute 1024 1024 Não Solicitações máximas por minuto por endereço IP.
requests.hour 4096 4096 Não Solicitações máximas por hora por endereço IP.
requests.day 8192 8192 Não Solicitações máximas por dia por endereço IP.
attempts { … } — Não Especifica limites de taxa de tentativas de autenticação por IP.
attempts.minute 32 32 Não Tentativas de autenticação máximas por minuto por endereço IP.
attempts.hour 64 64 Não Tentativas de autenticação máximas por hora por endereço IP.
attempts.day 128 128 Não Tentativas de autenticação máximas por dia por endereço IP.
runs { … } — Não Especifica limites de taxa de execuções de benchmark por IP para projetos não reivindicados.
runs.minute 64 64 Não Execuções de benchmark máximas por minuto por endereço IP.
runs.hour 128 128 Não Execuções de benchmark máximas por hora por endereço IP.
runs.day 256 256 Não Execuções de benchmark máximas por dia por endereço IP.

user

O limitador de taxa user se aplica por usuário autenticado. Cada subcampo contém limites de minute, hour e day. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Nome Exemplo Padrão Obrigatório Descrição
requests { … } — Não Especifica limites de taxa de solicitações por usuário.
requests.minute 2048 2048 Não Solicitações máximas por minuto por usuário.
requests.hour 8192 8192 Não Solicitações máximas por hora por usuário.
requests.day 16384 16384 Não Solicitações máximas por dia por usuário.
attempts { … } — Não Especifica limites de taxa de tentativas de autenticação por usuário.
attempts.minute 2 2 Não Tentativas de autenticação máximas por minuto por usuário.
attempts.hour 4 4 Não Tentativas de autenticação máximas por hora por usuário.
attempts.day 8 8 Não Tentativas de autenticação máximas por dia por usuário.
credentials { … } — Não Especifica limites de taxa de criação de credenciais por usuário.
credentials.minute 4 4 Não Criações de credenciais máximas por minuto por usuário.
credentials.hour 8 8 Não Criações de credenciais máximas por hora por usuário.
credentials.day 16 16 Não Criações de credenciais máximas por dia por usuário.
organizations { … } — Não Especifica limites de taxa de criação de organizações por usuário.
organizations.minute 2 2 Não Criações de organizações máximas por minuto por usuário.
organizations.hour 4 4 Não Criações de organizações máximas por hora por usuário.
organizations.day 8 8 Não Criações de organizações máximas por dia por usuário.
invites { … } — Não Especifica limites de taxa de convites por usuário.
invites.minute 8 8 Não Convites máximos por minuto por usuário.
invites.hour 16 16 Não Convites máximos por hora por usuário.
invites.day 32 32 Não Convites máximos por dia por usuário.
runs { … } — Não Especifica limites de taxa de execuções de benchmark por usuário.
runs.minute 64 64 Não Execuções de benchmark máximas por minuto por usuário.
runs.hour 1024 1024 Não Execuções de benchmark máximas por hora por usuário.
runs.day 4096 4096 Não Execuções de benchmark máximas por dia por usuário.

project

O limitador de taxa project se aplica por projeto. Cada subcampo contém limites de minute, hour e day. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Nome Exemplo Padrão Obrigatório Descrição
requests { … } — Não Especifica limites de taxa de solicitações por projeto.
requests.minute 2048 2048 Não Solicitações máximas por minuto por projeto.
requests.hour 8192 8192 Não Solicitações máximas por hora por projeto.
requests.day 16384 16384 Não Solicitações máximas por dia por projeto.
runs { … } — Não Especifica limites de taxa de execuções de benchmark por projeto.
runs.minute 64 64 Não Execuções de benchmark máximas por minuto por projeto.
runs.hour 1024 1024 Não Execuções de benchmark máximas por hora por projeto.
runs.day 4096 4096 Não Execuções de benchmark máximas por dia por projeto.

runner

O limitador de taxa runner se aplica por runner. Cada subcampo contém limites de minute, hour e day. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Nome Exemplo Padrão Obrigatório Descrição
requests { … } — Não Especifica limites de taxa de solicitações por runner.
requests.minute 16 16 Não Solicitações máximas por minuto por runner.
requests.hour 256 256 Não Solicitações máximas por hora por runner.
requests.day 4096 4096 Não Solicitações máximas por dia por runner.

oci_bandwidth

O oci_bandwidth especifica os limites diários de largura de banda do registro OCI por nível de organização. Toda a seção é opcional. Se não especificado, os valores padrão listados serão usados.

Nome Exemplo Padrão Obrigatório Descrição
unclaimed 1073741824 1073741824 Não Bytes máximos por dia para organizações não reivindicadas (0 membros). Padrão de 1 GiB.
free 10737418240 10737418240 Não Bytes máximos por dia para organizações gratuitas (reivindicadas, sem plano pago). Padrão de 10 GiB.
plus 107374182400 107374182400 Não Bytes máximos por dia para organizações Plus (Pro/Enterprise). Padrão de 100 GiB.

plus.stats

Esta seção especifica se e quando as estatísticas do servidor são coletadas. A seção inteira é opcional. Se não especificado, os valores padrão listados serão usados. Ou seja, as estatísticas do servidor são opt-out. Defina enabled como false para desabilitar as estatísticas do servidor.

Nome Exemplo Padrão Obrigatório Descrição
offset 11242 11242 Não Especifica o desvio da meia-noite em segundos para a coleta de estatísticas do servidor. Por padrão, roda às 03:07:22 UTC.
enabled true true Não Controla se as estatísticas do servidor são coletadas. Defina como false para optar por não participar.

plus.mcp

Esta seção configura o servidor MCP do Bencher. A seção inteira é opcional.

Nome Exemplo Padrão Obrigatório Descrição
openai_apps_challenge a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 — Não O token de verificação de domínio que a OpenAI emite quando você envia um aplicativo que usa este servidor MCP. O servidor da API o serve como texto simples em /.well-known/openai-apps-challenge. Se não for especificado, essa rota retorna 404 Not Found.

plus.oauth

Esta seção permite que clientes MCP, como o ChatGPT, o claude.ai e o Claude Code, entrem no Bencher MCP com OAuth. O servidor de API passa a ser o servidor de autorização OAuth deles, e os usuários aprovam cada aplicativo no Bencher Console em console.url. A seção inteira é opcional. Se não especificada, o OAuth fica desativado: seus endpoints retornam 404 Not Found, e o Bencher MCP só aceita chaves de API e requisições anônimas.

Nome Exemplo Padrão Obrigatório Descrição
issuer “https://api.bencher.example.com” — Sim A origem pública deste servidor de API, onde os aplicativos encontram seus endpoints OAuth: https, ou http apenas para um host de loopback como localhost. Deve ser uma origem sem caminho, ou o servidor não vai iniciar. ATENÇÃO Sem uma URL listada em resources, o recurso padrão segue este valor, então alterá-lo desconecta os aplicativos que entraram no recurso padrão anterior até que o valor anterior seja restaurado; com uma URL listada em resources, alterá-lo não desconecta nada enquanto a origem anterior ainda chegar a este servidor.
resources ["https://mcp.bencher.example.com/mcp", "https://api.bencher.example.com/mcp"] [<issuer>/mcp] Não As URLs do endpoint MCP deste servidor nas quais os aplicativos entram, a canônica primeiro: https, ou http apenas para um host de loopback. Um aplicativo que não indica nenhuma recebe a primeira. Remover uma URL desconecta os aplicativos que entraram nela até que ela volte a ser listada; sem nenhuma URL listada, o recurso padrão é servido.
clients [{ … }] — Não Os únicos aplicativos que podem entrar. Remover um aplicativo o desconecta até que ele volte a ser listado. Os aplicativos listados são marcados como verificados na página de consentimento. Se não especificado, qualquer aplicativo pode pedir para entrar, desde que o servidor de API consiga buscar um documento de metadados de cliente válido a partir do seu ID de cliente.
clients.id “https://app.example.com/oauth/client.json” — Sim O ID de cliente do aplicativo: a URL https do seu documento de metadados de cliente.
clients.metadata { … } — Não O documento de metadados de cliente do aplicativo, usado em vez de buscá-lo em id, por exemplo em um servidor sem acesso à internet. Ele deve ser um documento de metadados de cliente válido cujo client_id seja igual a id, ou o servidor não vai iniciar.
signing_key "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n" — Não Uma chave privada RSA de pelo menos 2048 bits, em formato PEM (PKCS #1 ou PKCS #8), que assina os ID tokens. Ela ativa o OpenID Connect: os escopos openid, email e profile, os ID tokens e os endpoints de UserInfo, JWKS e descoberta. Se não especificada, o OpenID Connect fica desativado. Se não for uma chave válida, o servidor não vai iniciar. DEVE SER MUITO SEGURA! Sempre que exibida, aparecerá ofuscada como ************.

Uma string JSON não pode conter quebras de linha, então escreva cada quebra de linha de signing_key como \n. Por exemplo, gere uma chave e imprima-a como uma string JSON, sem gravá-la em um arquivo:

Terminal window
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 | jq -Rs .

Para fazer a rotação da chave de assinatura, substitua-a. Isso não desconecta nenhum aplicativo.

O servidor de API serve seus endpoints e metadados OAuth na raiz de issuer. Se um proxy reverso servir o servidor de API sob um prefixo de caminho, como https://bencher.example.com/api, defina issuer como a origem (https://bencher.example.com) e liste a URL completa do endpoint MCP em resources (https://bencher.example.com/api/mcp). O proxy deve então rotear /oauth/, /.well-known/oauth-authorization-server e /.well-known/openid-configuration na origem para os mesmos caminhos no servidor de API, e rotear o caminho de metadados de cada recurso, aqui /.well-known/oauth-protected-resource/api/mcp, para /.well-known/oauth-protected-resource/mcp no servidor de API. Com mais de um recurso, o proxy também deve repassar o cabeçalho Host sem alterações, pois o servidor de API escolhe por ele qual recurso anunciar.



Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Fri, October 30, 2026 at 3:18:26 PM UTC