Skip to content

Configuration

BoilStream uses a YAML configuration file for all settings. On first run, it generates a config.yaml with defaults.

Configuration File

bash
# Uses config.yaml from current directory
./boilstream

# Use a specific configuration file
./boilstream --config /etc/boilstream/config.yaml

# Or use environment variable
CONFIG_FILE=/etc/boilstream/config.yaml ./boilstream

Settings priority (later overrides earlier):

  1. Built-in defaults
  2. Configuration file (YAML)
  3. Environment variables

Complete Configuration Reference

yaml
# =============================================================================
# AWS Configuration
# =============================================================================
aws:
  region: "eu-west-1"
  access_key_id: null # Optional - uses AWS SDK credential chain
  secret_access_key: null # Optional - uses AWS SDK credential chain
  https_conn_pool_size: 100

# =============================================================================
# Storage Configuration
# =============================================================================
storage:
  backends:
    # S3 Backend (Primary)
    - name: "primary-s3"
      backend_type: "s3"
      enabled: true
      primary: true
      endpoint: "https://s3.eu-west-1.amazonaws.com"
      bucket: "my-bucket"
      prefix: ""
      region: "eu-west-1"
      access_key: null # Optional - uses AWS SDK credential chain
      secret_key: null
      use_path_style: false # true for MinIO
      max_concurrent_uploads: 10
      max_retries: 3
      initial_backoff_ms: 100
      max_retry_attempts: 3

    # Azure Blob Storage Backend
    # - name: "azure-backup"
    #   backend_type: "azure"
    #   enabled: false
    #   primary: false
    #   azure_account: "mystorageaccount"
    #   azure_container: "mycontainer"
    #   azure_access_key: null           # Optional - uses Azure SDK credential chain
    #   prefix: ""

    # Google Cloud Storage Backend
    # - name: "gcs-backup"
    #   backend_type: "gcp"
    #   enabled: false
    #   primary: false
    #   bucket: "my-gcs-bucket"
    #   prefix: ""
    #   gcp_service_account_key: null    # Path to service account JSON
    #   gcp_project_id: null

    # Filesystem Backend
    # - name: "local-backup"
    #   backend_type: "filesystem"
    #   enabled: false
    #   primary: false
    #   prefix: "/data/backup"

# =============================================================================
# Server Configuration
# =============================================================================
server:
  tokio_worker_threads: null # null = system CPU count
  flight_thread_count: 1
  flight_base_port: 50050
  admin_flight_port: 50160
  consumer_flight_port: 50250
  router:
    spsc_queue_capacity: 2 # Queue capacity per processing thread
    batch_size: 500 # Messages per batch
    retry_delay_ms: 1 # Retry delay when threads busy

# =============================================================================
# Processing Configuration
# =============================================================================
processing:
  data_processing_threads: 8
  buffer_pool_max_size: 50
  window_queue_capacity: 30000
  max_flush_latency_ms: 10000 # Max time before flush (ms)
  max_part_size_mb: 32 # Size threshold for early flush
  max_file_size_mb: 1024 # Max file size before completion
  snapshot_interval_minutes: 10 # Wall-clock aligned file completion (1-60)
  enable_5mb_part_padding: false # Pad to 5MB for S3 multipart
  include_metadata_columns: true
  schema_validation_enabled: true
  parquet:
    compression: "ZSTD"
    dictionary_enabled: true

# =============================================================================
# DuckDB Persistence Configuration
# =============================================================================
duckdb_persistence:
  enabled: true
  storage_path: "./data/duckdb/topics"
  max_writers: 10
  total_databases: 10 # Database instances for DataChunk API
  commit_interval_ms: 1000 # Transaction commit interval

# =============================================================================
# Embedded PostgreSQL Configuration
# =============================================================================
embedded_postgres:
  enabled: true
  port: 5433
  databases:
    - ducklake_catalog
    - ducklake_analytics
    - ducklake_default

# =============================================================================
# Rate Limiting Configuration
# =============================================================================
rate_limiting:
  disabled: false
  max_requests: 15000000 # Per producer
  burst_limit: 20000000
  global_limit: 150000000
  base_size_bytes: 4096

# =============================================================================
# TLS Configuration (FlightRPC)
# =============================================================================
tls:
  disabled: false
  cert_path: "/etc/ssl/certs/server.crt"
  key_path: "/etc/ssl/private/server.key"
  cert_pem: null # Alternative to cert_path
  key_pem: null # Alternative to key_path
  grpc_default_ssl_roots_file_path: null

# =============================================================================
# Authentication Configuration (FlightRPC JWT)
# =============================================================================
auth:
  providers: ["cognito"] # cognito, azure, gcp, auth0, okta
  authorization_enabled: true
  admin_groups: ["admin"]
  read_only_groups: ["viewers"]
  max_sessions_per_hour: 1000
  max_concurrent_sessions: 20
  max_session_ttl_hours: 8
  cognito:
    user_pool_id: "us-east-1_example"
    region: "us-east-1"
    audience: "client-id"
  azure:
    tenant_id: null
    client_id: null
    allow_multi_tenant: false
  gcp:
    client_id: null
    project_id: null
    require_workspace_domain: false
  auth0:
    tenant: null
    audience: null
    groups_namespace: null
  okta:
    org_domain: null
    audience: null
    auth_server_id: null

# =============================================================================
# Metrics Configuration
# =============================================================================
metrics:
  port: 8081
  flush_interval_ms: 1000

# =============================================================================
# Logging Configuration
# =============================================================================
logging:
  rust_log: "info"

# =============================================================================
# PGWire Configuration (PostgreSQL Protocol)
# =============================================================================
pgwire:
  enabled: true
  port: 5432
  refresh_interval_seconds: 5
  initialization_sql: |
    SET threads = 8;
    SET memory_limit = '24GB';
    SET max_temp_directory_size = '16GB';
    SET allowed_directories = ['/tmp'];
    SET allow_unredacted_secrets = false;
    INSTALL json;
    LOAD json;
    INSTALL httpfs;
    LOAD httpfs;
    INSTALL ducklake; 
    LOAD ducklake;
    INSTALL boilstream FROM community;
    LOAD boilstream;
    SET allow_unsigned_extensions = false;
    SET lock_configuration = true;
  metadata_db_path: "./metadata.duckdb"
  query_timeout_seconds: 300 # 5 minutes
  max_connections: 100
  idle_timeout_seconds: 900 # 15 minutes
  connection_timeout_seconds: 1800 # 30 minutes
  tenant_data_base_path: "/tmp/boilstream/tenants"
  metadata_backup_backend: null # Storage backend name
  metadata_backup_interval_seconds: 60
  metadata_backup_path: "pgwire/metadata-backup.tar.gz"
  tls:
    enabled: true
    cert_path: "/etc/ssl/certs/pgwire.crt"
    key_path: "/etc/ssl/private/pgwire.key"
    cert_pem: null
    key_pem: null

# =============================================================================
# Kafka Configuration
# =============================================================================
kafka:
  enabled: true
  port: 9092
  bind_address: "0.0.0.0"
  tls:
    enabled: true
    cert_path: "/etc/ssl/certs/kafka.crt"
    key_path: "/etc/ssl/private/kafka.key"
    cert_pem: null
    key_pem: null
  rate_limiting:
    disabled: false
    max_requests_per_second: 10000
    burst_limit: 15000
    global_limit: 100000

# =============================================================================
# HTTP/2 Ingestion Configuration
# =============================================================================
http_ingestion:
  enabled: true
  port: 8443
  bind_address: "0.0.0.0"
  token_secret_key: ""                   # BLAKE3 MAC key for browser tokens (32 bytes, base64)
  max_request_size: 131072 # 128KB
  tls:
    cert_path: "/etc/ssl/certs/http.crt"
    key_path: "/etc/ssl/private/http.key"
    cert_pem: ""
    key_pem: ""
  cors:
    allowed_origins: []
    max_age_seconds: 3600
    allow_credentials: false
  rate_limiting:
    enabled: true
    global_requests_per_second: 10000
    tenant_requests_per_second: 1000
    tenant_burst_size: 5000
    tenant_overrides: {}
  http2:
    max_connections: 100000
    accept_threads: 0 # 0 = CPU cores
    initial_stream_window_size: 262144
    initial_connection_window_size: 1048576
    max_frame_size: 131072
    max_concurrent_streams: 50
    keep_alive_interval_secs: 20
    keep_alive_timeout_secs: 10
  memory_pool:
    buffer_size: 131072 # 128KB
    buffer_count: 2000

# =============================================================================
# Auth Server Configuration (Web Auth GUI)
# =============================================================================
auth_server:
  enabled: true
  port: 443
  tls_cert: "/etc/ssl/certs/auth.crt"
  tls_key: "/etc/ssl/private/auth.key"
  tls_auto_reload: true
  tls_reload_check_interval_seconds: 21600 # 6 hours
  session_ttl_hours: 8
  users_db_path: "data/users.duckdb"
  encryption_key_path: "/etc/boilstream/encryption.key"
  superadmin_password_path: null # For automated deployments
  superadmin_mfa_secret_path: null # Base32 TOTP secret
  app_domain: "app.example.com"
  webauthn_rp_id: "app.example.com"
  webauthn_rp_origin: "https://app.example.com"
  cors_allowed_origins: []
  grants_db_path: "data/grants.duckdb"
  default_user_role: "reader"
  admin_username: null
  users_backup_backend: "primary-s3"
  users_backup_interval_seconds: 60
  users_backup_path: "auth/users.duckdb"
  superadmin_backup_backend: null # Defaults to users_backup_backend
  superadmin_backup_interval_seconds: 60
  superadmin_backup_path: "auth/superadmin.duckdb"
  email_encryption_pgp_public_key_path: null
  email_encryption_pgp_public_key: null
  enable_ducklake: true
  auto_create_default_ducklake: true
  enable_hydration: true

# =============================================================================
# OAuth Providers Configuration
# =============================================================================
oauth_providers:
  github:
    client_id: "github-client-id"
    client_secret: "github-client-secret"
    redirect_uri: "https://app.example.com/auth/callback"
    allowed_orgs: ["mycompany"]
    team_role_mappings:
      "mycompany/admins": "admin"
      "mycompany/engineers": "write"
      "mycompany/analysts": "read"
    audit_org_teams: false

  google:
    client_id: "google-client-id.apps.googleusercontent.com"
    client_secret: "google-client-secret"
    redirect_uri: "https://app.example.com/auth/callback"
    allowed_domains: ["mycompany.com"]

  oauth2:
    - name: "custom-provider"
      client_id: "client-id"
      client_secret: "client-secret"
      auth_url: "https://provider.com/oauth/authorize"
      token_url: "https://provider.com/oauth/token"
      userinfo_url: "https://provider.com/oauth/userinfo"
      redirect_uri: "https://app.example.com/auth/callback"
      scopes: ["openid", "profile", "email"]

  saml:
    - name: "entra-id"
      enabled: true
      sp_entity_id: "https://app.example.com"
      sp_acs_url: "https://app.example.com/auth/saml/acs"
      sp_slo_url: "https://app.example.com/auth/saml/logout"
      idp_entity_id: "https://sts.windows.net/{tenant-id}/"
      idp_sso_url: "https://login.microsoftonline.com/{tenant-id}/saml2"
      idp_slo_url: null
      idp_certificate: |
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      sp_certificate: "/etc/ssl/saml/sp.crt"
      sp_private_key: "/etc/ssl/saml/sp.key"
      attribute_mappings:
        email: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
        username: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
        groups: "http://schemas.microsoft.com/ws/2008/06/identity/claims/groups"
        first_name: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"
        last_name: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"
        display_name: "http://schemas.microsoft.com/identity/claims/displayname"

# =============================================================================
# Audit Configuration
# =============================================================================
audit:
  enabled: true
  backend: ndjson # ndjson, duckdb, s3, disabled
  log_path: "/var/log/boilstream/audit.ndjson"
  buffer_size: 1000
  sample_rate: null # 0.0-1.0, null = no sampling
  include_query_text: true
  include_ip_address: true

# =============================================================================
# Cluster Mode Configuration
# =============================================================================
cluster_mode:
  enabled: false
  node_id_path: "./node_id"
  advertised_host: "node1.example.com"
  internal_api_port: 8443
  leader_heartbeat_interval_secs: 30
  leader_stale_threshold_secs: 120
  broker_heartbeat_interval_secs: 30
  broker_stale_threshold_secs: 120
  tls:
    enabled: true
    cert_path: "/etc/ssl/cluster/node.crt"
    key_path: "/etc/ssl/cluster/node.key"
    ca_cert_path: "/etc/ssl/cluster/ca.crt"
    require_client_cert: true

Configuration Sections

AWS Configuration

Global AWS settings. Per-backend credentials in storage.backends take precedence.

FieldTypeDefaultDescription
aws.regionstring"us-east-1"AWS region
aws.access_key_idstringnullAWS access key (optional)
aws.secret_access_keystringnullAWS secret key (optional)
aws.https_conn_pool_sizenumber100HTTP connection pool size

Storage Configuration

Multiple storage backends can be configured simultaneously for redundancy.

FieldTypeDefaultDescription
backends[].namestringrequiredUnique backend identifier
backends[].backend_typestringrequireds3, azure, gcp, filesystem, noop
backends[].enabledbooleanrequiredWhether backend is active
backends[].primarybooleanrequiredIf true, operations must succeed here

S3 Backend

FieldTypeDefaultDescription
endpointstringAWS regionalS3 endpoint URL
bucketstringrequiredS3 bucket name
prefixstring""Base prefix for object keys
regionstringrequiredAWS region
access_keystringnullS3 access key (uses SDK chain if null)
secret_keystringnullS3 secret key
use_path_stylebooleanautoPath-style addressing (auto-detects MinIO)
max_concurrent_uploadsnumber10Max concurrent uploads
max_retriesnumber3Max retry attempts
initial_backoff_msnumber100Initial backoff (ms)
max_retry_attemptsnumber3Max retry attempts

Azure Blob Storage Backend

FieldTypeDefaultDescription
azure_accountstringrequiredStorage account name
azure_containerstringrequiredContainer name
azure_access_keystringnullAccess key (uses SDK chain if null)
prefixstring""Base prefix for blob keys

Google Cloud Storage Backend

FieldTypeDefaultDescription
bucketstringrequiredGCS bucket name
prefixstring""Base prefix for object keys
gcp_service_account_keystringnullPath to service account JSON
gcp_project_idstringnullGCP project ID

Filesystem Backend

FieldTypeDefaultDescription
prefixstringrequiredBase directory path

Server Configuration

FieldTypeDefaultDescription
tokio_worker_threadsnumbernullTokio threads (null = CPU count)
flight_thread_countnumber1FlightRPC threads
flight_base_portnumber50050FlightRPC base port
admin_flight_portnumber50160Admin Flight port
consumer_flight_portnumber50250FlightSQL port

Router Configuration

FieldTypeDefaultDescription
router.spsc_queue_capacitynumber2Queue capacity per thread
router.batch_sizenumber500Messages per batch
router.retry_delay_msnumber1Retry delay (ms)

Processing Configuration

FieldTypeDefaultDescription
data_processing_threadsnumber8Processing threads
buffer_pool_max_sizenumber50Buffer pool size
window_queue_capacitynumber30000Window queue capacity
max_flush_latency_msnumber10000Max time before flush
max_part_size_mbnumber32Size threshold for flush
max_file_size_mbnumber1024Max file size
snapshot_interval_minutesnumber10File completion interval (1-60)
enable_5mb_part_paddingbooleanfalsePad to 5MB for S3
include_metadata_columnsbooleantrueInclude metadata columns
schema_validation_enabledbooleantrueEnable schema validation

Parquet Configuration

FieldTypeDefaultDescription
parquet.compressionstring"ZSTD"Compression algorithm
parquet.dictionary_enabledbooleantrueDictionary encoding

DuckDB Persistence Configuration

High-performance local DuckDB for hot tier storage.

FieldTypeDefaultDescription
enabledbooleantrueEnable DuckDB persistence
storage_pathstring"./data/duckdb/topics"Database directory
max_writersnumber10Concurrent writers
total_databasesnumber10Database instances
commit_interval_msnumber1000Commit interval

Embedded PostgreSQL Configuration

In-memory PostgreSQL for DuckLake metadata catalogs.

In-Memory Mode

Embedded PostgreSQL runs on tmpfs. Data relies on S3 backups for recovery.

FieldTypeDefaultDescription
enabledbooleantrueEnable embedded PostgreSQL
portnumber5433PostgreSQL port
databasesarraysee belowDatabases to create

Default databases: ducklake_catalog, ducklake_analytics, ducklake_default

Rate Limiting Configuration

FieldTypeDefaultDescription
disabledbooleanfalseDisable rate limiting
max_requestsnumber15000000Max requests/sec per producer
burst_limitnumber20000000Burst limit
global_limitnumber150000000Global limit
base_size_bytesnumber4096Base size for tokens

TLS Configuration

TLS for FlightRPC connections.

FieldTypeDefaultDescription
disabledbooleanfalseDisable TLS
cert_pathstringnullCertificate path
key_pathstringnullPrivate key path
cert_pemstringnullCertificate as PEM
key_pemstringnullPrivate key as PEM
grpc_default_ssl_roots_file_pathstringnullCA roots file

Auth Configuration (FlightRPC JWT)

JWT authentication for FlightRPC/DuckDB Airport connections.

FieldTypeDefaultDescription
providersarray[]Auth providers: cognito, azure, gcp, auth0, okta
authorization_enabledbooleanfalseEnable authorization
admin_groupsarray[]Admin group names
read_only_groupsarray[]Read-only group names
max_sessions_per_hournumber1000Session rate limit
max_concurrent_sessionsnumber20Max concurrent sessions
max_session_ttl_hoursnumber8Session TTL

Metrics Configuration

FieldTypeDefaultDescription
portnumber8081Prometheus metrics port
flush_interval_msnumber1000Flush interval

Logging Configuration

FieldTypeDefaultDescription
rust_logstring"info"Log level (trace, debug, info, warn, error)

PGWire Configuration

PostgreSQL wire protocol server for BI tools and SQL clients.

FieldTypeDefaultDescription
enabledbooleantrueEnable PGWire server
portnumber5432PostgreSQL port
refresh_interval_secondsnumber5Instance refresh interval
initialization_sqlstring""SQL to run on init
metadata_db_pathstring"./metadata.duckdb"Metadata database path
query_timeout_secondsnumber300Query timeout (5 min)
max_connectionsnumber100Max connections
idle_timeout_secondsnumber900Idle timeout (15 min)
connection_timeout_secondsnumber1800Connection timeout (30 min)
tenant_data_base_pathstring"/tmp/boilstream/tenants"Tenant data directory
metadata_backup_backendstringnullBackup backend name
metadata_backup_interval_secondsnumber60Backup interval
metadata_backup_pathstring"pgwire/metadata-backup.tar.gz"Backup path

PGWire TLS Configuration

FieldTypeDefaultDescription
tls.enabledbooleanfalseEnable TLS
tls.cert_pathstringnullCertificate path
tls.key_pathstringnullPrivate key path
tls.cert_pemstringnullCertificate as PEM
tls.key_pemstringnullPrivate key as PEM

Kafka Configuration

Kafka-compatible server for Kafka producers.

Built-in Schema Registry

BoilStream includes a Confluent-compatible Schema Registry at /schema-registry on the auth server (port 443). No additional configuration needed - it's automatically enabled when the auth server is running. See Schema Registry API for details.

FieldTypeDefaultDescription
enabledbooleantrueEnable Kafka server
portnumber9092Kafka port
bind_addressstring"0.0.0.0"Bind address

Kafka TLS Configuration

FieldTypeDefaultDescription
tls.enabledbooleanfalseEnable TLS (SASL_SSL)
tls.cert_pathstringnullCertificate path
tls.key_pathstringnullPrivate key path
tls.cert_pemstringnullCertificate as PEM
tls.key_pemstringnullPrivate key as PEM

Kafka Rate Limiting

FieldTypeDefaultDescription
rate_limiting.disabledbooleanfalseDisable rate limiting
rate_limiting.max_requests_per_secondnumber10000Max requests/sec
rate_limiting.burst_limitnumber15000Burst limit
rate_limiting.global_limitnumber100000Global limit

HTTP/2 Ingestion Configuration

HTTP/2 Arrow ingestion server for browser-based data collection.

FieldTypeDefaultDescription
enabledbooleanfalseEnable HTTP/2 server
portnumber8443Server port
bind_addressstring"0.0.0.0"Bind address
token_secret_keystring""BLAKE3 MAC key for browser tokens (see below)
max_request_sizenumber131072Max request size (128KB)

Token Secret Key

The token_secret_key is a master secret used to generate and validate BLAKE3-authenticated tokens for browser-based ingestion. Tokens bind requests to domain, tenant, topic, and expiry time.

Requirements:

  • Exactly 32 bytes (256 bits), base64 encoded
  • Generate with: openssl rand -base64 32

Token formats:

  • Standard (64 hex chars): 128-bit data + 128-bit BLAKE3 MAC
  • Extended (128 hex chars): Standard + nonce + encrypted user_id (ChaCha20Poly1305)

Security

If empty or invalid, falls back to an insecure default key. Always configure in production.

HTTP TLS Configuration

FieldTypeDefaultDescription
tls.cert_pathstring""Certificate path
tls.key_pathstring""Private key path
tls.cert_pemstring""Certificate as PEM
tls.key_pemstring""Private key as PEM

HTTP CORS Configuration

FieldTypeDefaultDescription
cors.allowed_originsarray[]Allowed origins
cors.max_age_secondsnumber3600Preflight cache max age
cors.allow_credentialsbooleanfalseAllow credentials

HTTP Rate Limiting

FieldTypeDefaultDescription
rate_limiting.enabledbooleantrueEnable rate limiting
rate_limiting.global_requests_per_secondnumber10000Global limit
rate_limiting.tenant_requests_per_secondnumber1000Per-tenant limit
rate_limiting.tenant_burst_sizenumber5000Per-tenant burst
rate_limiting.tenant_overridesmap{}Per-tenant overrides

HTTP/2 Settings

FieldTypeDefaultDescription
http2.max_connectionsnumber100000Max connections
http2.accept_threadsnumber0Accept threads (0 = CPU)
http2.initial_stream_window_sizenumber262144Stream window
http2.initial_connection_window_sizenumber1048576Connection window
http2.max_frame_sizenumber131072Max frame size
http2.max_concurrent_streamsnumber50Max streams/connection
http2.keep_alive_interval_secsnumber20Keep-alive interval
http2.keep_alive_timeout_secsnumber10Keep-alive timeout

HTTP Memory Pool

FieldTypeDefaultDescription
memory_pool.buffer_sizenumber131072Buffer size (128KB)
memory_pool.buffer_countnumber2000Buffer count

Auth Server Configuration (Web Auth GUI)

Web authentication server for browser-based access.

FieldTypeDefaultDescription
enabledbooleanfalseEnable auth server
portnumber443HTTPS port
tls_certstringnullTLS certificate path
tls_keystringnullTLS private key path
tls_auto_reloadbooleantrueAuto-reload certificates
tls_reload_check_interval_secondsnumber21600Reload check interval (6h)
session_ttl_hoursnumber8Session TTL
users_db_pathstring"data/users.duckdb"Users database path
encryption_key_pathstringnullEncryption key file path
superadmin_password_pathstringnullSuperadmin password file
superadmin_mfa_secret_pathstringnullMFA TOTP secret file (base32)
app_domainstringnullApplication domain
webauthn_rp_idstring"localhost"WebAuthn RP ID
webauthn_rp_originstring"https://localhost"WebAuthn origin
cors_allowed_originsarray[]CORS allowed origins
grants_db_pathstring"data/grants.duckdb"Grants database path
default_user_rolestring"reader"Default role for new users
admin_usernamestringnullAdmin username
users_backup_backendstringnullUsers backup backend
users_backup_interval_secondsnumber60Users backup interval
users_backup_pathstring"auth/users.duckdb"Users backup path
superadmin_backup_backendstringnullSuperadmin backup backend
superadmin_backup_interval_secondsnumber60Superadmin backup interval
superadmin_backup_pathstring"auth/superadmin.duckdb"Superadmin backup path
email_encryption_pgp_public_key_pathstringnullPGP public key path
email_encryption_pgp_public_keystringnullPGP public key (inline)
enable_ducklakebooleantrueEnable DuckLake manager
auto_create_default_ducklakebooleantrueAuto-create default DuckLake
enable_hydrationbooleantrueEnable hydration API

OAuth Providers Configuration

OAuth/SAML providers for Web Auth GUI.

GitHub OAuth

FieldTypeDefaultDescription
client_idstringrequiredGitHub OAuth client ID
client_secretstringrequiredGitHub OAuth client secret
redirect_uristringnullOAuth callback URL
allowed_orgsarray[]Allowed organizations
team_role_mappingsmap{}Team to role mappings
audit_org_teamsbooleanfalseAudit org/team membership

Google OAuth

FieldTypeDefaultDescription
client_idstringrequiredGoogle OAuth client ID
client_secretstringrequiredGoogle OAuth client secret
redirect_uristringnullOAuth callback URL
allowed_domainsarray[]Allowed email domains

Generic OAuth2

FieldTypeDefaultDescription
namestringrequiredProvider identifier
client_idstringrequiredOAuth client ID
client_secretstringrequiredOAuth client secret
auth_urlstringrequiredAuthorization endpoint
token_urlstringrequiredToken endpoint
userinfo_urlstringrequiredUser info endpoint
redirect_uristringnullOAuth callback URL
scopesarrayrequiredOAuth scopes

SAML SSO

FieldTypeDefaultDescription
namestringrequiredProvider identifier
enabledbooleanfalseEnable provider
sp_entity_idstringrequiredSP entity ID
sp_acs_urlstringrequiredAssertion Consumer Service URL
sp_slo_urlstringnullSingle Logout URL
idp_entity_idstringrequiredIDP entity ID
idp_sso_urlstringrequiredIDP SSO endpoint
idp_slo_urlstringnullIDP logout endpoint
idp_certificatestringrequiredIDP certificate (PEM)
sp_certificatestringrequiredSP certificate path or PEM
sp_private_keystringrequiredSP private key path or PEM

Audit Configuration

Audit logging for compliance (SOC2/ISO).

FieldTypeDefaultDescription
enabledbooleanfalseEnable audit logging
backendstring"ndjson"Backend: ndjson, duckdb, s3, disabled
log_pathstringnullLog file path (null = stdout)
buffer_sizenumber1000Event buffer size
sample_ratenumbernullSampling rate 0.0-1.0
include_query_textbooleantrueInclude SQL in logs
include_ip_addressbooleantrueInclude IP addresses

Cluster Mode Configuration

Horizontal scaling with S3-based leader election. See Cluster Mode for architecture.

Cluster Identity

Nodes belong to the same cluster when they share the same primary storage backend (S3 bucket/prefix).

FieldTypeDefaultDescription
enabledbooleanfalseEnable cluster mode
node_id_pathstringnullPersistent node ID file
advertised_hoststring"localhost"Externally reachable hostname
internal_api_portnumber8443Inter-node communication port
leader_heartbeat_interval_secsnumber30Leader heartbeat interval
leader_stale_threshold_secsnumber120Leader stale threshold
broker_heartbeat_interval_secsnumber30Broker heartbeat interval
broker_stale_threshold_secsnumber120Broker stale threshold

Cluster TLS Configuration (mTLS)

FieldTypeDefaultDescription
tls.enabledbooleanfalseEnable mTLS
tls.cert_pathstringnullServer certificate path
tls.key_pathstringnullServer private key path
tls.ca_cert_pathstringnullCA certificate path
tls.require_client_certbooleantrueRequire client certificates

Validation

BoilStream validates configuration on startup and exits with an error if:

  • Required fields are missing
  • Invalid values are provided
  • Referenced files don't exist (TLS certificates, etc.)
  • Storage backend validation fails

Check logs for detailed validation error messages.