Skip to main content

Configuration reference

Every scalar accepts the listed QOD_* / PROXY_* environment-variable override. Sensitive defaults (passwords, secrets, keys) are flagged; rotate them before any non-local deployment.

quack-flightsql

KeyEnv varDefaultSensitiveDescription
quack-flightsql.hostPROXY_HOST0.0.0.0FlightSQL edge bind address.
quack-flightsql.portPROXY_PORT31338FlightSQL edge port.
quack-flightsql.tlsEnabledPROXY_TLS_ENABLEDtrueEnable TLS on the FlightSQL edge.
quack-flightsql.tlsCertChainPROXY_TLS_CERT_CHAINcerts/server-cert.pemPath to the TLS certificate chain PEM (auto-generated if missing).
quack-flightsql.tlsPrivateKeyPROXY_TLS_PRIVATE_KEYcerts/server-key.pemPath to the TLS private key PEM (auto-generated if missing).
quack-flightsql.sessionTtlSecQOD_SESSION_TTL_SEC3600Edge session TTL in seconds before a fresh handshake is forced.
quack-flightsql.resumeHoldTimeoutSecPROXY_RESUME_HOLD_TIMEOUT_SEC60Max seconds the edge holds a statement while a suspended pool cold-starts.

quack-flightsql.acl

KeyEnv varDefaultSensitiveDescription
quack-flightsql.acl.enabledQOD_ACL_ENABLEDfalseEnable table-level RBAC (per-statement EffectiveSet check).
quack-flightsql.acl.dialectQOD_ACL_DIALECTduckdbStatement parser dialect for ACL extraction.

quack-flightsql.auth

KeyEnv varDefaultSensitiveDescription
quack-flightsql.auth.roleClaimQOD_AUTH_ROLE_CLAIMroleJWT claim that carries the user's role.
quack-flightsql.auth.database.enabledQOD_AUTH_DB_ENABLEDtrueEnable database (bcrypt) authentication for the FlightSQL edge.
quack-flightsql.auth.database.jdbcUrlQOD_AUTH_DB_JDBC_URLjdbc:postgresql://localhost:5432/qodJDBC URL for the auth-lookup database.
quack-flightsql.auth.database.usernameQOD_AUTH_DB_USERpostgresUsername for the auth-lookup JDBC connection.
quack-flightsql.auth.database.passwordQOD_AUTH_DB_PASSWORD***yesPassword for the auth-lookup JDBC connection.
quack-flightsql.auth.database.systemQueryQOD_AUTH_DB_SYSTEM_QUERYSELECT password_hash, role, enabled FROM qodstate_user WHERE tenant IS NULL AND username = ? LIMIT 1SQL template for AuthScope.System (empty tenant / superuser=true). Returns (password_hash, role) and accepts one ? placeholder for username; matches WHERE tenant IS NULL.
quack-flightsql.auth.database.tenantQueryQOD_AUTH_DB_TENANT_QUERYSELECT password_hash, role, enabled FROM qodstate_user WHERE tenant = ? AND username = ? LIMIT 1SQL template for AuthScope.Tenant. Returns (password_hash, role) and accepts two ? placeholders in order: tenant, username.
quack-flightsql.auth.keycloak.enabledQOD_AUTH_KEYCLOAK_ENABLEDfalseEnable the Keycloak OIDC bearer provider.
quack-flightsql.auth.keycloak.baseUrlQOD_AUTH_KEYCLOAK_BASE_URLhttps://keycloak.example.comKeycloak base URL (e.g. https://keycloak.example.com).
quack-flightsql.auth.keycloak.realmQOD_AUTH_KEYCLOAK_REALMquackKeycloak realm name.
quack-flightsql.auth.keycloak.clientIdQOD_AUTH_KEYCLOAK_CLIENT_ID(unset)Keycloak client ID for ROPC.
quack-flightsql.auth.keycloak.clientSecretQOD_AUTH_KEYCLOAK_CLIENT_SECRET***yesKeycloak client secret.
quack-flightsql.auth.keycloak.issuerQOD_AUTH_KEYCLOAK_ISSUER(unset)Override for the expected token issuer (the iss claim the bearer validator requires). Leave empty to derive it from baseUrl + realm. Set it when Keycloak's browser-facing issuer (KC_HOSTNAME_URL) differs from the in-cluster baseUrl used to fetch JWKS: tokens minted via an ingress carry iss=https://host/auth/realms/<realm> while the manager fetches JWKS in-cluster. JWKS is always derived from baseUrl, not this value.
quack-flightsql.auth.google.enabledQOD_AUTH_GOOGLE_ENABLEDfalseEnable the Google OIDC bearer provider.
quack-flightsql.auth.google.clientIdQOD_AUTH_GOOGLE_CLIENT_ID(unset)Google OAuth client ID.
quack-flightsql.auth.google.clientSecretQOD_AUTH_GOOGLE_CLIENT_SECRET***yesGoogle OAuth client secret.
quack-flightsql.auth.google.groupsLookupQOD_AUTH_GOOGLE_GROUPS_LOOKUPfalseResolve Google Workspace groups membership server-side.
quack-flightsql.auth.google.serviceAccountKeyPathQOD_AUTH_GOOGLE_SVC_ACCT_KEY_PATH(unset)Path to a Google service-account JSON used for groups lookup.
quack-flightsql.auth.google.groupsCacheTtlSecondsQOD_AUTH_GOOGLE_GROUPS_CACHE_TTL_SEC300Cache TTL for Google groups lookups in seconds.
quack-flightsql.auth.azure.enabledQOD_AUTH_AZURE_ENABLEDfalseEnable the Azure AD bearer provider.
quack-flightsql.auth.azure.tenantIdQOD_AUTH_AZURE_TENANT_ID(unset)Azure AD tenant ID.
quack-flightsql.auth.azure.clientIdQOD_AUTH_AZURE_CLIENT_ID(unset)Azure AD application (client) ID.
quack-flightsql.auth.azure.clientSecretQOD_AUTH_AZURE_CLIENT_SECRET***yesAzure AD application client secret.
quack-flightsql.auth.aws.enabledQOD_AUTH_AWS_ENABLEDfalseEnable the AWS Cognito bearer provider.
quack-flightsql.auth.aws.regionQOD_AUTH_AWS_REGIONus-east-1AWS region hosting the Cognito user pool.
quack-flightsql.auth.aws.userPoolIdQOD_AUTH_AWS_USER_POOL_ID(unset)Cognito user pool ID.
quack-flightsql.auth.aws.clientIdQOD_AUTH_AWS_CLIENT_ID(unset)Cognito app client ID.
quack-flightsql.auth.jwt.secretKeyJWT_SECRET_KEY***yesHMAC secret for HS256/HS512 external JWT verification.
quack-flightsql.auth.jwt.publicKeyPathJWT_PUBLIC_KEY_PATH(unset)Path to the RSA/ECDSA PEM public key for external JWT verification.
quack-flightsql.auth.jwt.issuerJWT_ISSUER(unset)Expected 'iss' claim value (empty = not checked).
quack-flightsql.auth.jwt.audienceJWT_AUDIENCE(unset)Expected 'aud' claim value (empty = not checked).
quack-flightsql.auth.oauthScopesQOD_AUTH_OAUTH_SCOPESopenid profile emailOAuth scopes requested at authorization time for the browser SQL-token flow.

quack-flightsql.validation

KeyEnv varDefaultSensitiveDescription
quack-flightsql.validation.enabledQOD_VALIDATION_ENABLEDtrueEnable per-statement SQL validation.
quack-flightsql.validation.allowByDefaultQOD_VALIDATION_ALLOW_BY_DEFAULTtrueWhen true, statements pass when no explicit rule matches.
quack-flightsql.validation.bypassUsersQOD_VALIDATION_BYPASS_USERSadmin@localhost.local,adminComma-separated usernames that skip SQL validation entirely.

quack-on-demand

KeyEnv varDefaultSensitiveDescription
quack-on-demand.hostQOD_ON_DEMAND_HOST0.0.0.0Manager REST bind address (0.0.0.0 to listen on all interfaces).
quack-on-demand.portQOD_ON_DEMAND_PORT20900Manager REST + admin UI port.
quack-on-demand.apiKeyQOD_API_KEY***yesStatic admin API key sent as X-API-Key. Unset = REST namespace is open.
quack-on-demand.runtimeTypeQOD_RUNTIME_TYPElocalQuack node runtime backend: 'local' (child processes) or 'kubernetes'.
quack-on-demand.minPortQOD_MIN_PORT21900Lower bound of the port range LocalQuackBackend allocates child nodes from.
quack-on-demand.maxPortQOD_MAX_PORT22500Upper bound of the port range LocalQuackBackend allocates child nodes from.
quack-on-demand.maxNodesTotalQOD_MAX_NODES_TOTAL50Hard cap on concurrent child nodes across all pools.
quack-on-demand.nativeClientQOD_NATIVE_CLIENTtrueUse the JNI-backed native Quack wire client. False falls back to the embedded path.
quack-on-demand.stampWritesQOD_STAMP_WRITEStrueStamp DuckLake snapshots created by FlightSQL DML/DDL with author and commit message (native wire bracket; fail-open). Off = writes are never bracketed.
quack-on-demand.nodeDisableSslQOD_NODE_DISABLE_SSLtrueDisable TLS on the embedded path's quack_query() call. Ignored on the native path.
quack-on-demand.spawnScriptQOD_SPAWN_SCRIPT./scripts/spawn-quack-node.shPath to spawn-quack-node.sh invoked by LocalQuackBackend on Unix.
quack-on-demand.spawnScriptWindowsQOD_SPAWN_SCRIPT_WINDOWS./scripts/spawn-quack-node.ps1Path to the PowerShell spawn script (spawn-quack-node.ps1) invoked by LocalQuackBackend on Windows.
quack-on-demand.drainTimeoutSecQOD_DRAIN_TIMEOUT_SEC60Seconds to wait for in-flight statements during graceful pool shutdown.
quack-on-demand.healthCheckIntervalSecQOD_HEALTH_CHECK_INTERVAL_SEC5Seconds between supervisor health checks against child nodes.
quack-on-demand.reconcileIntervalSecQOD_RECONCILE_INTERVAL_SEC30Seconds between supervisor reconcile passes that respawn dead nodes. 0 disables the periodic loop (reconcile still runs once at boot).
quack-on-demand.sessionIdleTtlSecQOD_SESSION_IDLE_TTL_SEC28800UI session idle TTL in seconds. A session unused for this long is dropped on the next access; each successful access slides the window. Manager restart still invalidates everything (sessions are heap-only).

quack-on-demand.admin

KeyEnv varDefaultSensitiveDescription
quack-on-demand.admin.usernameQOD_ADMIN_USERNAMEadmin@localhost.local,adminComma-separated admin usernames seeded into qodstate_user.
quack-on-demand.admin.passwordQOD_ADMIN_PASSWORD***yesBootstrap admin password (re-hashed on every boot).
quack-on-demand.admin.roleQOD_ADMIN_ROLEadminRole assigned to the bootstrap admin user.

quack-on-demand.auth

KeyEnv varDefaultSensitiveDescription
quack-on-demand.auth.management.identitySourceQOD_MGMT_IDENTITY_SOURCEdbSystem-scope (bare /ui/) admin-UI login mode: 'db' (password form) or 'oidc' (SSO). Per-tenant login mode is read from the tenant's authProvider, not this key.
quack-on-demand.auth.management.sessionJwtSecretQOD_SESSION_JWT_SECRET***yesHS256 secret used to sign UI session JWTs. Pin a stable value (>= 32 chars) to make sessions survive manager restart and to share session state across replicas. Empty = autogenerate a fresh 32-byte secret at boot (sessions die on restart, no horizontal scale).
quack-on-demand.auth.management.sessionCookieSecureQOD_SESSION_COOKIE_SECUREautoWhether the qod_session cookie carries the Secure flag. Accepts 'auto' (default, derives from the request's X-Forwarded-Proto -- https=Secure, http or absent=not Secure), 'true' (force Secure regardless of request scheme; use behind a TLS ingress that strips X-Forwarded-Proto), or 'false' (force not Secure).
quack-on-demand.auth.management.sessionCookiePathQOD_SESSION_COOKIE_PATH/apiPath attribute on the qod_session cookie. Default '/api'. Override when the manager sits behind a path-rewriting reverse proxy: the value must match the BROWSER-visible URL prefix, not the backend's. E.g. proxy at https://platform/quack/api/* -> QOD_SESSION_COOKIE_PATH=/quack/api.
quack-on-demand.auth.management.publicBaseUrlQOD_MGMT_PUBLIC_BASE_URL(unset)Externally visible manager base URL (e.g. https://qod.example.com). Used to build OIDC redirect_uri and post_logout_redirect_uri for admin-UI SSO. When empty, derived from X-Forwarded-Proto / X-Forwarded-Host / Host.
quack-on-demand.auth.management.oidc.issuerUrlQOD_MGMT_OIDC_ISSUER_URL(unset)OIDC issuer URL for admin-UI SSO (system scope), e.g. https://accounts.google.com or http://keycloak:8080/auth/realms/qod. Discovery reads ${issuerUrl}/.well-known/openid-configuration. Empty disables system-scope SSO.
quack-on-demand.auth.management.oidc.clientIdQOD_MGMT_OIDC_CLIENT_ID(unset)OIDC client id for admin-UI SSO (system scope).
quack-on-demand.auth.management.oidc.clientSecretQOD_MGMT_OIDC_CLIENT_SECRET***yesOIDC client secret for admin-UI SSO (system scope).
quack-on-demand.auth.management.oidc.scopesQOD_MGMT_OIDC_SCOPESopenid email profileOIDC scopes requested for admin-UI SSO. Default 'openid email profile'.

quack-on-demand.catalog

KeyEnv varDefaultSensitiveDescription
quack-on-demand.catalog.auditCatalogReadsQOD_AUDIT_CATALOG_READSfalseAudit catalog browser reads: one catalog.read event per gated GET. Off by default (reads are chatty; mutations are always audited).
quack-on-demand.catalog.previewMaxRowsQOD_CATALOG_PREVIEW_MAX_ROWS1000Hard cap on rows returned by the catalog data-preview endpoint.
quack-on-demand.catalog.previewTimeoutSecQOD_CATALOG_PREVIEW_TIMEOUT_SEC30Seconds before a catalog data-preview query is cancelled.
quack-on-demand.catalog.undropTimeoutSecQOD_CATALOG_UNDROP_TIMEOUT_SEC300Seconds before an undrop recovery CTAS is abandoned. Larger than the preview timeout because it is a mutation over potentially large tables; on timeout the handler probes whether the table was created anyway and reports accordingly.
quack-on-demand.catalog.restoreTimeoutSecQOD_CATALOG_RESTORE_TIMEOUT_SEC300Seconds before a restore CREATE OR REPLACE is abandoned. On timeout the handler probes whether the replace committed anyway and reports accordingly.

quack-on-demand.defaultMetastore

KeyEnv varDefaultSensitiveDescription
quack-on-demand.defaultMetastore.pgHostQOD_PG_HOSTlocalhostPostgres host for control plane + DuckLake catalog.
quack-on-demand.defaultMetastore.pgPortQOD_PG_PORT5432Postgres port.
quack-on-demand.defaultMetastore.pgUserQOD_PG_USERpostgresPostgres username used by the manager + Quack nodes.
quack-on-demand.defaultMetastore.pgPasswordQOD_PG_PASSWORD***yesPostgres password.
quack-on-demand.defaultMetastore.dbNameQOD_PG_DBNAMEqodControl-plane database name (default 'qod').
quack-on-demand.defaultMetastore.schemaNameQOD_PG_SCHEMAmainPostgres schema for control-plane tables.
quack-on-demand.defaultMetastore.dataPathQOD_DUCKLAKE_DATA_PATH./ducklake/tpchRoot path for DuckLake parquet data files.

quack-on-demand.federation

KeyEnv varDefaultSensitiveDescription
quack-on-demand.federation.secretStoreQOD_FEDERATION_SECRET_STOREdispatchFederation secret resolver: postgres | env | aws-sm | gcp-sm | azure-kv | vault.

quack-on-demand.ha

KeyEnv varDefaultSensitiveDescription
quack-on-demand.ha.enabledQOD_HA_ENABLEDfalseEnable active-active multi-replica manager mode (Kubernetes runtime only).
quack-on-demand.ha.leaderRetrySecQOD_LEADER_RETRY_SEC3Seconds between leader-lock acquisition attempts and LISTEN polls.
quack-on-demand.ha.topologyRefreshSecQOD_TOPOLOGY_REFRESH_SEC30Seconds between snapshot-refresh fallback passes in HA mode.

quack-on-demand.k8s

KeyEnv varDefaultSensitiveDescription
quack-on-demand.k8s.namespaceQOD_K8S_NAMESPACEdefaultKubernetes namespace KubernetesQuackBackend operates in.
quack-on-demand.k8s.imageQOD_K8S_IMAGEstarlakeai/quack-on-demand-node:latest-snapshotDocker image used for spawned Quack-node pods.
quack-on-demand.k8s.serviceAccountQOD_K8S_SERVICE_ACCOUNT(unset)ServiceAccount applied to spawned node pods (unset = default).
quack-on-demand.k8s.serviceTypeQOD_K8S_SERVICE_TYPEClusterIPKubernetes Service type fronting node pods.
quack-on-demand.k8s.quackPortQOD_K8S_QUACK_PORT8080Container port exposing each node's /quack endpoint.
quack-on-demand.k8s.startupTimeoutSecQOD_K8S_STARTUP_TIMEOUT_SEC120Seconds to wait for a spawned node pod to become ready.
quack-on-demand.k8s.podLabelQOD_K8S_POD_LABELmanaged-by=quack-on-demandLabel selector that identifies manager-owned node pods.
quack-on-demand.k8s.podTemplateEnabledQOD_POD_TEMPLATE_ENABLEDfalseAllow superusers to supply a full Pod-manifest YAML template for a pool's node pods. Off by default; raw manifests are cluster-level power.
quack-on-demand.k8s.runAsUserQOD_K8S_RUN_AS_USER1000Pod-level runAsUser/fsGroup applied to spawned node pods. A pod template's own securityContext.runAsUser (if set) wins over this default.

quack-on-demand.maintenance

KeyEnv varDefaultSensitiveDescription
quack-on-demand.maintenance.enabledQOD_MAINT_ENABLEDtrueEnable the maintenance scheduler + drain-loop fibers.
quack-on-demand.maintenance.tickSecQOD_MAINT_TICK_SEC60Seconds between maintenance scheduler ticks (cadence + threshold checks).
quack-on-demand.maintenance.maxConcurrentQOD_MAINT_MAX_CONCURRENT2Max maintenance runs executing concurrently across the manager.
quack-on-demand.maintenance.minIntervalMinQOD_MAINT_MIN_INTERVAL_MIN30Minimum minutes between non-manual maintenance runs of the same tenant-db.
quack-on-demand.maintenance.runTimeoutMinQOD_MAINT_RUN_TIMEOUT_MIN60Minutes without a heartbeat before a running maintenance run is swept as failed.
quack-on-demand.maintenance.nodeReadyTimeoutSecQOD_MAINT_NODE_READY_TIMEOUT_SEC180Seconds to wait for the ephemeral maintenance node to accept connections after spawn before the run is failed as 'node spawn failed'. Covers cold-start extension installs.

quack-on-demand.metrics

KeyEnv varDefaultSensitiveDescription
quack-on-demand.metrics.sinkQOD_METRICS_SINKprometheusActive metrics sink: prometheus | aws | azure | gcp | none.
quack-on-demand.metrics.aws.namespaceQOD_METRICS_AWS_NAMESPACEquack-on-demandCloudWatch namespace when metrics.sink=aws.
quack-on-demand.metrics.aws.stepSecondsQOD_METRICS_AWS_STEP_SEC60CloudWatch publish step in seconds.
quack-on-demand.metrics.azure.instrumentationKeyQOD_METRICS_AZURE_KEY***yesAzure Monitor instrumentation key.
quack-on-demand.metrics.azure.stepSecondsQOD_METRICS_AZURE_STEP_SEC60Azure Monitor publish step in seconds.
quack-on-demand.metrics.gcp.projectIdQOD_METRICS_GCP_PROJECT_ID(unset)GCP project ID when metrics.sink=gcp.
quack-on-demand.metrics.gcp.stepSecondsQOD_METRICS_GCP_STEP_SEC60GCP Cloud Monitoring publish step in seconds.

quack-on-demand.telemetry

KeyEnv varDefaultSensitiveDescription
quack-on-demand.telemetry.storeQOD_TELEMETRY_STOREpostgresTelemetry store backing audit log (and, later, history/usage): postgres | none (record nothing).
quack-on-demand.telemetry.auditRetentionDaysQOD_AUDIT_RETENTION_DAYS90Days to keep audit events before the hourly purge deletes them.
quack-on-demand.telemetry.journalCapacityQOD_TELEMETRY_JOURNAL_CAPACITY8192Bounded in-process telemetry journal capacity; overflow drops events (counted).
quack-on-demand.telemetry.stmtHistoryRetentionDaysQOD_STMT_HISTORY_RETENTION_DAYS7Days to keep statement-history rows before the periodic purge removes them.
quack-on-demand.telemetry.hourlyRollupRetentionDaysQOD_HOURLY_ROLLUP_RETENTION_DAYS90Days to keep hourly rollup buckets before the periodic purge removes them.
quack-on-demand.telemetry.rollupIntervalSecQOD_ROLLUP_INTERVAL_SEC300Seconds between rollup computation passes that aggregate raw statement history into rollup buckets.
quack-on-demand.telemetry.usageRetentionDaysQOD_USAGE_RETENTION_DAYS400Days to keep daily rollup buckets (the usage-accounting ledger) before the periodic purge removes them. 400 covers a full billing year.