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", }, "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
| 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. 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:61016" | "0.0.0.0:61016” | 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.mode | ”stderr_terminal" | "stderr_terminal” | Sim | Controla 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” | 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. |
| data_store.service | ”aws_s3” | --- | Não | Especifica 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_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. |
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 | ”[email protected]” | --- | 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. |
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.
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 localpath: Caminho para replicar
sftp: Replicar via SFTPhost: Nome do host do sistema de destinoport: Número da porta do sistema de destinouser: Nome de usuário no sistema de destinopassword: (Opcional) Senha no sistema de destinopath: (Opcional) Caminho no sistema de destinokey_path: (Opcional) Caminho para a chave SSH
s3: Replicar para qualquer armazenamento de blob compatível com S3bucket: Nome do bucketpath: (Opcional) Caminho no bucketendpoint: (AWS: Opcional | Não-AWS: Obrigatório) Endpoint de replicaçãoregion: (Opcional) Região do bucketaccess_key_id: Chave de acesso do S3secret_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 errosdatabase is lockedsob 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 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 S3access_key_id: ID da chave de acesso AWSsecret_access_key: Chave de acesso secreta AWSaccess_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.
| Nome | Exemplo | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
| url | ”https://registry.bencher.example.com" | "http://localhost:61016” | Não | A URL externamente acessível do servidor API para acesso ao registro OCI. |
| data_store | { … } | --- | Não | Especifica o backend de armazenamento OCI. Local se omitido. |
| data_store.service | ”local” ou “aws_s3” | --- | Sim | Especifica o tipo de serviço de armazenamento. |
| data_store.access_key_id | ”AKIAIOSFODNN7EXAMPLE” | --- | apenas aws_s3 | ID da chave de acesso AWS. |
| data_store.secret_access_key | ”wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY” | --- | apenas aws_s3 | Chave de acesso secreta AWS. |
| data_store.access_point | ”arn:aws:s3:us-east-1:123456789012:accesspoint/my-access-point/registry” | --- | apenas aws_s3 | ARN do ponto de acesso S3. Prefixo de caminho opcional após o nome do ponto de acesso. |
| data_store.chunk_size | 5242880 | 5242880 | apenas aws_s3 | Tamanho mínimo do fragmento em bytes para armazenamento em buffer dos dados de upload antes de salvar no S3. Padrão: 5 MB. |
| 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 falhado. |
| 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. |
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. |
| oci_bandwidth | { … } | --- | Não | Especifica os limites diários de largura de banda do registro OCI por nível de organização. |
| oci_bandwidth.unclaimed | 1073741824 | 1073741824 | Não | Bytes máximos por dia para organizações não reivindicadas (0 membros). Padrão de 1 GiB. |
| oci_bandwidth.free | 10737418240 | 10737418240 | Não | Bytes máximos por dia para organizações gratuitas (reivindicadas, sem plano pago). Padrão de 10 GiB. |
| oci_bandwidth.plus | 107374182400 | 107374182400 | Não | Bytes 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.
| 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. |