Skip to Content
OpenETL
Reference

openetld settings

Every setting of openetld, as a flag and an environment variable, with its default.

Every setting of openetld is a flag and an environment variable: --database-url is also OPENETL_DATABASE_URL. A flag overrides the variable, and the variable overrides the default. Every role takes every setting and uses the ones that concern it. openetld ROLE -h lists them, with the defaults the environment gives.

openetld dev has defaults of its own: --auth is none, --checkpoints is .openetl/checkpoints and --log-format is text.

This page is generated from internal/platform/config/config.go, where the settings are defined.

Database and API

The server and the orchestrators keep OpenETL's records in the metadata database, which openetld bootstrap-key writes to as well. Runners don't connect to it: they reach the API at --api-url.

FlagVariableDefaultWhat it sets
--database-urlOPENETL_DATABASE_URLpostgres://openetl:openetl@localhost:5432/openetlmetadata database URL
--listenOPENETL_LISTENlocalhost:8080API listen address
--api-urlOPENETL_API_URLhttp://localhost:8080API URL, for runners
--data-planeOPENETL_DATA_PLANEdefaultdata plane ID

Orchestration

What runs workflows, for the server and the orchestrators: DBOS, which keeps them in Postgres, or Temporal.

FlagVariableDefaultWhat it sets
--orchestratorOPENETL_ORCHESTRATORdboswhat runs workflows: dbos, which needs nothing but Postgres, or temporal
--dbos-database-urlOPENETL_DBOS_DATABASE_URLthe database DBOS keeps workflows in, which it creates if it can; not through a transaction pooler (default: on the metadata database's server, named after it with _dbos)
--executor-idOPENETL_EXECUTOR_IDwhich orchestrator this is, unique among them and the same across restarts, such as its pod's name; on DBOS only (default: the host name)
--temporal-addressOPENETL_TEMPORAL_ADDRESSlocalhost:7233Temporal frontend host:port; on Temporal only
--temporal-namespaceOPENETL_TEMPORAL_NAMESPACEdefaultTemporal namespace; on Temporal only

Console and sign-in

The console the server serves, and how people sign in to it.

FlagVariableDefaultWhat it sets
--webOPENETL_WEBa directory holding the built UI (web/dist) for the API server to serve at /; empty: no UI
--authOPENETL_AUTHpasswordhow browsers sign in: password, or none, which makes every call without a credential an owner's (loopback only, unless --auth-none-allow-remote)
--auth-none-allow-remoteOPENETL_AUTH_NONE_ALLOW_REMOTEfalselet --auth none serve on an address that isn't loopback, such as a private network or behind an authenticating proxy, and answer to any Host
--public-urlOPENETL_PUBLIC_URLthe URL browsers use, which password links start with; an https one makes the session cookie Secure (default: http:// and the listen address)
--session-idle-timeoutOPENETL_SESSION_IDLE_TIMEOUT12hhow long a UI session lasts unused, as a Go duration
--session-max-ageOPENETL_SESSION_MAX_AGE168hhow long a UI session lasts in all, as a Go duration
--sign-in-rateOPENETL_SIGN_IN_RATE20sign-ins a minute each client address may make; behind a proxy, every user shares its address

Secrets and keys

The key that protects secrets, and the owner key the server writes when it creates the org.

FlagVariableDefaultWhat it sets
--secrets-keyOPENETL_SECRETS_KEY.openetl/secrets.keythe API server's key-encryption key for secrets: a file holding a base64-encoded 32-byte key, created if missing; or base64key://KEY, awskms://…, gcpkms://… or azurekeyvault://…
--bootstrap-key-fileOPENETL_BOOTSTRAP_KEY_FILE.openetl/admin.keywhere the server writes the owner key of the org it creates on first start, readable only by its owner; and where openetld bootstrap-key writes a new one

Events and the audit log

When a continuous pipeline counts as lagging, and how long the audit log keeps entries.

FlagVariableDefaultWhat it sets
--lagging-afterOPENETL_LAGGING_AFTER5mhow far behind its source a continuous pipeline's read gets before the server sends pipeline.lagging to webhooks
--audit-retention-daysOPENETL_AUDIT_RETENTION_DAYS90days the audit log keeps entries at least: a month's entries go once the month ended that long ago; 0 keeps every entry

Network and registries

What connectors, registries and webhooks may reach, and where connector packages come from.

FlagVariableDefaultWhat it sets
--egress-allowOPENETL_EGRESS_ALLOWcomma-separated CIDR prefixes connectors, registries and webhooks may reach besides public addresses, such as a hybrid data plane's own networks
--official-connectorsOPENETL_OFFICIAL_CONNECTORSoci://ghcr.io/openetl-io/openetl-connectorsthe official connectors' registry namespace, connected as a source of the catalog when the org is created; empty: none
--registry-plain-httpOPENETL_REGISTRY_PLAIN_HTTPcomma-separated registry hosts, host:port, reached over plain HTTP besides loopback ones
--github-apiOPENETL_GITHUB_APIGitHub's REST API, for connector sources and releases (default: https://api.github.com)

AWS credentials for connectors

The IAM roles a runner may assume for connectors, and what a connector gets when its source or destination names no role. Run on AWS explains both.

FlagVariableDefaultWhat it sets
--aws-assume-rolesOPENETL_AWS_ASSUME_ROLEScomma-separated IAM role ARNs, where * matches any characters, that a source or destination may name in aws.role; the runner assumes the role with its own AWS credentials and gives the connector that role's credentials only; empty: none
--connector-aws-credentialsOPENETL_CONNECTOR_AWS_CREDENTIALSnonethe AWS credentials a connector gets from the runner when its source or destination names no aws.role: none, or inherit, which passes the runner's AWS_ variables and leaves EC2's instance metadata reachable, so the connector has all of the runner's AWS access, every pipeline's checkpoints included

Runners

Where a runner keeps checkpoints and its cache, the programs it runs, the pool it serves, the room it has, and its token.

FlagVariableDefaultWhat it sets
--checkpointsOPENETL_CHECKPOINTScheckpoint store, which a runner needs (openetld dev: .openetl/checkpoints): a directory, which every runner and any Spark or Flink cluster must see at the same path, so a container needs it mounted, s3://bucket (with region=… to name the bucket's region rather than ask S3, endpoint=… for another S3-compatible store, and anonymous=true for unsigned requests), gs://bucket, or azblob://container?account=…&endpoint=…; a path after the bucket puts everything under it; the kubernetes launcher needs a bucket
--engineOPENETL_ENGINEopenetl-engine executable (default: next to openetld, then on PATH)
--connectorsOPENETL_CONNECTORSdirectory of external connector executables, named source-NAME and destination-NAME (default: connectors/ next to openetld)
--cacheOPENETL_CACHE.openetl/cachewhere runners cache artifacts, such as connector versions and dbt projects, and connectors' executables
--dbtOPENETL_DBTdbt executable for pipelines' post-sync steps, with the destinations' adapters installed (default: dbt on PATH)
--spark-submitOPENETL_SPARK_SUBMITSpark 3.5's spark-submit, for pipelines' Spark steps on self-managed clusters (default: spark-submit on PATH)
--bridge-listenOPENETL_BRIDGE_LISTENwhere the runner serves the bridge to pipelines' Flink jobs, such as :7710; empty: the runner doesn't run Flink pipelines
--bridge-advertiseOPENETL_BRIDGE_ADVERTISEthe host:port Flink jobs reach this runner's bridge at, which must reach this runner and not a load balancer (default: the listen address)
--poolOPENETL_POOLdefaultthe pool this runner serves
--capacityOPENETL_CAPACITYwhat this runner places on itself, as CPU,MEMORY such as 4,8Gi (default: its cgroup's or host's, less --reserve)
--reserveOPENETL_RESERVE0.5,512Miwhat this runner keeps for itself, as CPU,MEMORY
--cgroup-rootOPENETL_CGROUP_ROOTa cgroup v2 directory delegated to this runner alone, for a cgroup per job on Linux 5.7 or later, which holds a job to its size's CPU and memory; empty: its threads and a memory watchdog do
--report-intervalOPENETL_REPORT_INTERVAL10show often this runner reports what it runs to the API, as a Go duration; keep it well under its work's heartbeat timeouts
--token-fileOPENETL_RUNNER_TOKEN_FILEa file holding the runner's token, which openetl dataplane token create makes (default: the OPENETL_RUNNER_TOKEN variable)
OPENETL_RUNNER_TOKENthe runner's token, when --token-file names no file; it has no flag, so the token isn't in a process listing

Pod launchers

A runner with --launcher set is a pod launcher: it makes a pod, or a process, for each attempt placed on it, instead of running the attempt itself.

FlagVariableDefaultWhat it sets
--launcherOPENETL_LAUNCHERmakes this runner a pod launcher for its pool, which runs light operations itself and makes a pod for each attempt placed on it: kubernetes, or process, which runs each in a process of its own, for development and tests
--pod-min-sizeOPENETL_POD_MIN_SIZEma launcher's pool sends jobs this size or larger in CPU or memory to pods, and those no runner of the pool could take: xs to xl, or CPU,MEMORY such as 0,0 for every job
--pod-max-sizeOPENETL_POD_MAX_SIZEthe largest pod a launcher makes, as a preset or CPU,MEMORY (default: any size)
--max-podsOPENETL_MAX_PODS20how many pods a launcher has at once; 0: no limit
--max-pod-cpuOPENETL_MAX_POD_CPU64the vCPUs a launcher's pods may have between them; 0: no limit
--pod-templateOPENETL_POD_TEMPLATEthe pod the kubernetes launcher makes each attempt's from, in a YAML file or as podtemplate/NAME, a PodTemplate in the pods' namespace: its container runs openetld's image with the API's URL, the runner token and the checkpoint store, and the launcher sets the rest
--pod-namespaceOPENETL_POD_NAMESPACEthe namespace the kubernetes launcher makes pods in (default: the kubeconfig context's, or the launcher's own)
--kubeconfigOPENETL_KUBECONFIGa kubeconfig file for the kubernetes launcher (default: its service account; it never reads one it isn't given)
--pod-stream-spotOPENETL_POD_STREAM_SPOTpreferwhether the kubernetes launcher's stream pods keep off spot nodes: prefer, so they run on spot only where there's nothing else, or avoid, so they never do
--pod-scratchOPENETL_POD_SCRATCH10Gieach pod's ephemeral storage, for its runner's scratch; 0: none set
--attemptOPENETL_ATTEMPTthe one attempt this runner runs before it stops, as a pod launcher's pod; set by the launcher
--placementOPENETL_PLACEMENT0which placement of --attempt this pod is for; set by the launcher

Logs

What each role logs, and where.

FlagVariableDefaultWhat it sets
--log-levelOPENETL_LOG_LEVELinfodebug, info, warn or error
--log-formatOPENETL_LOG_FORMATjsonjson or text
--log-outputOPENETL_LOG_OUTPUTstderrstderr, stdout, or a file, rotated by size
--log-max-sizeOPENETL_LOG_MAX_SIZE100megabytes a log file reaches before it's rotated
--log-max-filesOPENETL_LOG_MAX_FILES5rotated log files kept

Traces and metrics

Traces and metrics are set with OpenTelemetry's standard variables rather than flags. A signal is exported only once its exporter (OTEL_TRACES_EXPORTER, OTEL_METRICS_EXPORTER) or an OTLP endpoint (OTEL_EXPORTER_OTLP_ENDPOINT, or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT and OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) is set, and OTEL_SDK_DISABLED=true turns both off. OTEL_METRICS_EXPORTER=prometheus serves a Prometheus endpoint instead, on OTEL_EXPORTER_PROMETHEUS_HOST and OTEL_EXPORTER_PROMETHEUS_PORT, localhost and 9464 unless they're set.

Each process reports as the service openetld, unless OTEL_SERVICE_NAME names another, with its role and data plane as openetl.role and openetl.data_plane, and OTEL_RESOURCE_ATTRIBUTES adds to them.

On this page