craft-connector.yml examples¶
craft-connector.yml is written by you and only ever read by etl-craft. Each file here is a
complete, working example of one choice. Copy the closest one to craft-connector.yml beside
your project and change the values. tests/unit/test_config_examples.py loads every file, for every
profile it declares, so none of them can drift from the loader.
Every file follows the same layout, in this order (the loader refuses any other):
- Secrets: where the variable names below are looked up, and the default profile.
- Orchestration: execution mode, limits, the
generate-ymlDAG defaults, and the Email relay, per profile. - Engine: the Engine DB, one block per profile.
- Warehouse: the one warehouse, one block per profile.
- Cloning (optional): mirror Engine DB tables into the warehouse.
docs/craft-connector.example.yml is the annotated reference that explains every key.
Variables and values¶
Every setting is either a variable or a value, and each line in these files is marked
with a # variable or # value comment:
- A setting whose text names a variable that the secrets source defines takes that variable's
value. The source is the process environment, or the
.env-style fileSecretspoints at. - Anything else is used exactly as written.
Profile: devis the profiledev.Profile: ETL_CRAFT_PROFILEis whateverETL_CRAFT_PROFILEholds, and if that variable is not set, the text itself. - A secret (
secret,token,s3_secret) must always name a variable that is set. A secret is never taken as written. Every command checks this when it loads the file, for the selected profile only, and stops with a "not set" or "empty" error naming the variable. Missing variables include suggestions for similarly named keys; values are never shown.
etl-craft doctor lists every value that was used as written but looks like a variable name,
which is how a missing variable shows up.
Secrets files use UTF-8, with or without a byte-order mark, and accept export KEY=VALUE.
All project paths start beside the config, including when it is a symbolic link. Duplicate
YAML keys are errors, with both source lines named. Numeric settings accept whole numbers or
ASCII decimal digits: Max_parallel_tasks is at least 1, TCP ports are 1 to 65535, and timeouts,
retry counts and delays are at least 0.
Start here¶
| File | Engine | Warehouse | Mode | Shows |
|---|---|---|---|---|
minimal-local.yml |
SQLite | DuckDB file | local | Nothing to install or set: one dev profile |
Secrets¶
| File | Engine | Warehouse | Mode | Shows |
|---|---|---|---|---|
secrets-environment.yml |
PostgreSQL | PostgreSQL | local | Values from the process environment, and profile-specific names (ENGINE_PROD_SECRET) |
secrets-file.yml |
PostgreSQL | PostgreSQL | local | Values from a .env-style file (secrets-file.env), resolved relative to the config |
Orchestration¶
| File | Engine | Warehouse | Mode | Shows |
|---|---|---|---|---|
orchestration-local.yml |
SQLite | DuckDB file | local | etl-craft dispatches ready tasks; per-profile DAG defaults for previewing generate-yml |
orchestration-remote.yml |
PostgreSQL | PostgreSQL | remote | Airflow runs each task; Allow_schedule: false outside prod, Email per profile, Global_dag in prod |
Engine DB¶
| File | Engine | Warehouse | Mode | Shows |
|---|---|---|---|---|
engine-sqlite.yml |
SQLite | PostgreSQL | local | One SQLite file per profile; nothing to authenticate |
engine-postgres.yml |
PostgreSQL | PostgreSQL | remote | password or key_file auth |
Warehouse¶
One file per warehouse dialect, meaning each database paired with each table format it supports.
| File | Dialect | Table format | Connection |
|---|---|---|---|
warehouse-postgres.yml |
postgres |
native (always) | JDBC URL + password |
warehouse-duckdb.yml |
duckdb |
native | a local file, no auth |
warehouse-duckdb-iceberg.yml |
duckdb_iceberg |
iceberg | in-memory DuckDB attached to an Iceberg REST catalog |
warehouse-trino-iceberg.yml |
trino_iceberg |
iceberg (the catalog decides) | JDBC URL, none or password |
warehouse-databricks.yml |
databricks |
native (Delta) | separate fields + personal access token |
warehouse-databricks-iceberg.yml |
databricks_iceberg |
iceberg (Delta + UniForm) | separate fields + personal access token |
warehouse-snowflake.yml |
snowflake |
native | separate fields + Programmatic Access Token |
warehouse-snowflake-iceberg.yml |
snowflake_iceberg |
iceberg (Snowflake-managed storage) | separate fields + PAT, with Cloning's volume |
warehouse-snowflake-key-pair.yml |
snowflake |
native | JDBC URL + RSA key pair |
There is no postgres_iceberg. PostgreSQL has no Iceberg tables without a third-party
extension that this project neither ships nor tests, so Table_format: iceberg on a Postgres
warehouse is refused rather than silently ignored.
Authentication¶
One file per target, with one profile per authentication type. Set ETL_CRAFT_AUTH to the
profile you want. Types marked verified have run against a live service in this project. The
others follow the vendor's documentation and are untested here: they can be used, but success
is not guaranteed, and etl-craft doctor warns about them.
| File | Types (verified in bold) |
|---|---|
auth-postgres.yml |
password, key_file, token, oauth (e.g. Entra ID), sso (libpq 18 OAuth), sts (AWS RDS IAM), for the Engine DB and a Postgres warehouse |
auth-snowflake.yml |
password, token (PAT), key_file, oauth (client credentials), sso (external browser), sts (AWS workload identity) |
auth-databricks.yml |
token (PAT), oauth (service principal, M2M), sso (browser U2M) |
auth-trino.yml |
none, password, token (JWT), oauth, sso (OAuth 2.0 redirect), key_file (client certificate) |
auth-duckdb-iceberg.yml |
none, token, oauth: the Iceberg REST catalog's login |
auth-email.yml |
none, password, oauth (SMTP XOAUTH2) |
sso is interactive: someone completes a browser or device login. It suits a person running
etl-craft, not an unattended scheduler. sts needs pip install etl-craft[aws] on PostgreSQL.
Cloning¶
| File | Shows |
|---|---|
cloning.yml |
Enabled/Scope per profile, including Scope: none |
docs-site.yml |
Docs_site: when the catalog site is written again, where, and how it is published |
Profiles¶
The environment examples declare dev, sit, uat and prod, and select one with
Secrets.Profile: ETL_CRAFT_PROFILE, a variable each environment sets (minimal-local.yml has
only dev). A section's own Profile overrides Secrets.Profile for that section; either
can be a value or a variable.
Every profile names the same variables (ENGINE_JDBC_URL, WAREHOUSE_SECRET, ...). Each
environment sets those names to its own values. When one shell or .env file has to hold
several tiers at once, a profile-specific name (WAREHOUSE_PROD_SECRET) is used over the plain
one for that profile.