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:61016",
"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",
"data_store": {
"service": "aws_s3",
"access_key_id": "ABC123DoRemMiABC123",
"secret_access_key": "AA3Chr-JSF5sUQqKwayx-FvCfZKsMev-5BqPpcFC3m7",
"access_point": "arn:aws:s3:some-region-1:123456789:accesspoint/my-bucket/path/to/backup/dir"
},
"busy_timeout": 5000
},
"smtp": {
"hostname": "mailbonobo.com",
"port": 587,
"starttls": true,
"username": "bencher",
"secret": "WM3F2u9cqSNdBPLfy9sJ5kk9",
"from_name": "Bencher",
"from_email": "[email protected]"
},
"plus": {
"disaster_recovery": {
"replicas": [
{
"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",
"data_store": {
"service": "aws_s3",
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"access_point": "arn:aws:s3:us-east-1:123456789012:accesspoint/my-access-point/registry",
"chunk_size": 5242880
},
"upload_timeout": 3600,
"max_body_size": 1073741824
},
"runners": {
"heartbeat_timeout": 90,
"job_timeout_grace_period": 60
},
"rate_limiting": {
"window": 86400,
"unclaimed_limit": 255,
"claimed_limit": 65536,
"oci_bandwidth": {
"unclaimed": 1073741824,
"free": 10737418240,
"plus": 107374182400
}
},
"stats": {
"offset": 11242,
"enabled": true
}
}
}

console

NomeExemploPadrãoObrigatórioDescrição
urlhttps://bencher.example.com""http://localhost:3000SimIndica a URL para o console do host do Bencher UI.

security

NomeExemploPadrãoObrigatórioDescrição
issuerhttps://api.bencher.example.com""bencher.dev”NãoIndica 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órioSimIndica a chave usada para gerar todos os tokens. 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.

NomeExemploPadrãoObrigatórioDescrição
bind_address”0.0.0.0:61016""0.0.0.0:61016”SimEspecifica 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_bytes10485761048576SimEspecifica 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ãoEspecifica 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_fileIndica 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_fileIndica 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_bytesIdêntico a tls.cert_file, mas fornecido como um array de bytes dos dados de certificado.
tls.key------Se tls.type = as_bytesIdê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.

NomeExemploPadrãoObrigatórioDescrição
name”Bencher API""Bencher API”SimEspecifica o nome do registrador.
log.mode”stderr_terminal""stderr_terminal”SimControla para onde vai o registro do servidor. Os modos válidos são “stderr-terminal” e “file”. Se o modo for “stderr-terminal”, uma saída legível para humanos, com cores e outras formatações de terminal se possível, será enviada para stderr. Se o modo for “file”, a saída no formato Bunyan será enviada para o caminho do sistema de arquivos fornecido por log.path. Veja também log.if_exists, que controla o comportamento se o caminho de destino já existir.
log.level”info""info”SimEspecifica 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

NomeExemploPadrãoObrigatórioDescrição
file”path/to/database.db""/var/lib/bencher/data/bencher.db”SimControla para onde vai a base de dados do servidor.
data_store.service”aws_s3”---NãoEspecifica o serviço de armazenamento de dados remoto. Valores validos são “aws_s3”.
data_store.access_key_id”ABC123DoRemMiABC123”---Apenas se data_store.service = “aws_s3”Se data_store.service = “aws_s3”, esta propriedade especifica o ID da chave de acesso do AWS. Veja também data_store.service.
data_store.secret_access_key”AA3Chr-JSF5sUQqKwayx-FvCfZKsMev-5BqPpcFC3m7”---Apenas se data_store.service = “aws_s3”Se data_store.service = “aws_s3”, esta propriedade especifica a chave de acesso secreta do AWS. Veja também data_store.service. Quando registrada, ela aparecerá obfuscada como ************.
data_store.access_point”arn:aws:s3:some-region-1:123456789:accesspoint/my-bucket/path/to/backup/dir”---Apenas se data_store.service = “aws_s3”Se data_store.service = “aws_s3”, esta propriedade especifica o ponto de acesso do AWS S3. Veja também data_store.service.
busy_timeout50005000NãoEspecifica o tempo limite de ocupação para o banco de dados em milissegundos. Previne erros SQLITE_BUSY imediatos sob contenção de bloqueio.

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.

NomeExemploPadrãoObrigatórioDescrição
hostname”mailbonobo.com”---SimEspecifica o nome do host SMTP.
port587587NãoEspecifica a porta SMTP.
insecure_host---falseNãoControla se a conexão SMTP pode permitir certificados TLS inválidos.
starttlstruetrueNãoControla se a conexão SMTP usa o protocolo STARTTLS.
username”bencher”---SimEspecifica o nome de usuário no host SMTP.
secret”WM3F2u9cqSNdBPLfy9sJ5kk9”---SimEspecifica o segredo para o nome de usuário no host SMTP. Sempre que registrado, aparecerá ofuscado como ************.
from_name”Bencher”---SimEspecifica o nome que aparecerá na seção de remetente de todos os e-mails.
from_email[email protected]---SimEspecifica 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.

NomeExemploPadrãoObrigatórioDescrição
client_idIv1.12864abcd1232048---SimEspecifica 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_secret00000abcd12345wxyz123456789abcdefgh0000---SimO segredo do cliente para o seu aplicativo GitHub. Você pode gerar um segredo do cliente 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.

NomeExemploPadrãoObrigatórioDescrição
client_id0123456789-abcdefg0112358envs.apps.googleusercontent.com---SimEspecifica o ID do cliente para o seu cliente OAuth2 do Google.
client_secretGOCSPX-xyz987654321---SimO 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. Para backups sob demanda ou agendados, consulte a seção database.data_store da configuração.

Existem três schemes de replicação:

  • file: Replicar para um caminho de arquivo local
    • path: Caminho para replicar
  • sftp: Replicar via SFTP
    • host: Nome do host do sistema de destino
    • port: Número da porta do sistema de destino
    • user: Nome de usuário no sistema de destino
    • password: (Opcional) Senha no sistema de destino
    • path: (Opcional) Caminho no sistema de destino
    • key_path: (Opcional) Caminho para a chave SSH
  • 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

Todos os três 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.
NomeExemploPadrãoObrigatórioDescrição
replica{ … }---SimEspecifica um objeto de réplica.
replica.scheme”s3”---SimEspecifica o esquema de replicação. Para todas as outras chaves de replica, consulte a lista acima.
snapshot.interval”1h”---NãoFrequência de criação de novos snapshots. Reduz o tempo de restauração.
snapshot.retention”24h”24hNãoQuanto tempo os arquivos de snapshot e WAL são mantidos antes de serem substituídos.
validation.interval”6h”---NãoFrequência de restauração e validação dos dados de réplica contra a cópia local. Desativado por padrão.
checkpoint.interval”1m”1mNãoFrequência de execução de checkpoint PASSIVE não bloqueante. Ignorado se leitores/escritores estiverem ativos.
checkpoint.min_page_count10001000NãoPáginas WAL mínimas (~4KB cada) antes de um checkpoint PASSIVE. Ignorado se leitores/escritores estiverem ativos.
checkpoint.truncate_page_n00NãoLimite 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 oci 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 baseado em S3.

Há duas opções de service de armazenamento:

  • local: Armazenar artefatos OCI no sistema de arquivos local (padrão)
  • aws_s3: Armazenar artefatos OCI no AWS S3
    • access_key_id: ID da chave de acesso AWS
    • secret_access_key: Chave de acesso secreta AWS
    • access_point: ARN do ponto de acesso S3 com prefixo de caminho opcional. Formato: arn:aws:s3:<region>:<account-id>:accesspoint/<access-point-name>[/<path-prefix>]
    • chunk_size: Tamanho mínimo do fragmento em bytes para armazenamento em buffer dos dados de upload antes de salvar no S3 (padrão: 5 MB). Os corpos de requisição HTTP chegam como pequenos frames de rede (tipicamente 8–64 KB). Sem armazenamento em buffer, cada frame se torna um objeto S3 separado, criando milhares de objetos por camada. Este valor também corresponde ao tamanho mínimo de parte para uploads multipart do S3.
NomeExemploPadrãoObrigatórioDescrição
urlhttps://registry.bencher.example.com""http://localhost:61016NãoA URL externamente acessível do servidor API para acesso ao registro OCI.
data_store{ … }---NãoEspecifica o backend de armazenamento OCI. Local se omitido.
data_store.service”local” ou “aws_s3”---SimEspecifica o tipo de serviço de armazenamento.
data_store.access_key_id”AKIAIOSFODNN7EXAMPLE”---apenas aws_s3ID da chave de acesso AWS.
data_store.secret_access_key”wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY”---apenas aws_s3Chave de acesso secreta AWS.
data_store.access_point”arn:aws:s3:us-east-1:123456789012:accesspoint/my-access-point/registry”---apenas aws_s3ARN do ponto de acesso S3. Prefixo de caminho opcional após o nome do ponto de acesso.
data_store.chunk_size52428805242880apenas aws_s3Tamanho mínimo do fragmento em bytes para armazenamento em buffer dos dados de upload antes de salvar no S3. Padrão: 5 MB.
upload_timeout36003600NãoTimeout da sessão de upload em segundos. Uploads obsoletos são limpos ao iniciar novos uploads.
max_body_size10737418241073741824NãoTamanho 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.

NomeExemploPadrãoObrigatórioDescrição
heartbeat_timeout9090NãoTempo em segundos sem um heartbeat antes de marcar um trabalho como falhado.
job_timeout_grace_period6060NãoTempo extra em segundos além do timeout configurado de um trabalho antes que o servidor o cancele.

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.

NomeExemploPadrãoObrigatórioDescrição
window8640086400NãoEspecifica o limite de taxa em segundos. Configurado por padrão para um dia.
unclaimed_limit255255NãoControla o limite de taxa para projetos unclaimed. Para evitar a criação de projetos unclaimed, defina este valor para 0.
claimed_limit6553665536NãoControla o limite de taxa para projetos claimed.
oci_bandwidth{ … }---NãoEspecifica os limites diários de largura de banda do registro OCI por nível de organização.
oci_bandwidth.unclaimed10737418241073741824NãoBytes máximos por dia para organizações não reivindicadas (0 membros). Padrão de 1 GiB.
oci_bandwidth.free1073741824010737418240NãoBytes máximos por dia para organizações gratuitas (reivindicadas, sem plano pago). Padrão de 10 GiB.
oci_bandwidth.plus107374182400107374182400NãoBytes máximos por dia para organizações Plus (Team/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.

NomeExemploPadrãoObrigatórioDescrição
offset1124211242NãoEspecifica o desvio da meia-noite em segundos para a coleta de estatísticas do servidor. Por padrão, roda às 03:07:22 UTC.
enabledtruetrueNãoControla se as estatísticas do servidor são coletadas. Defina como false para optar por não participar.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Sun, September 7, 2025 at 6:14:00 PM UTC