┌──────────────┐
│ Airflow │ Orchestration
│ (Celery) │ Port 8081
└──────┬───────┘
│ triggers
┌──────▼───────┐
│ dbt │ Transformations
│ seed → run │ landing → staging → curated
└──────┬───────┘
│ SQL
┌──────▼───────┐
│ Trino │ Query Engine
│ coord + 2w │ Port 8080
└──────┬───────┘
│ reads/writes
┌─────────────┼─────────────┐
┌──────▼───────┐ ┌──────▼───────┐
│ Nessie │ │ MinIO │
│ Catalog │ │ Storage │
│ Port 19120 │ │ Port 9001 │
└──────────────┘ └──────────────┘
Iceberg table format on S3-compatible storage
- Airflow triggers the
dbt_pipelineDAG daily - dbt seed loads CSV files (AdventureWorks) into Iceberg
landingschema via Trino - dbt run transforms data through two layers:
staging— cleaned and typed models (stg_sales,stg_products, etc.)curated— business-ready models (fact_sale,dim_product,dim_country)
- Trino executes all SQL against Iceberg tables stored in MinIO
- Nessie tracks table metadata with git-like versioning (branches, commits)
| Component | Image | Port | Purpose |
|---|---|---|---|
| MinIO | minio/minio |
9000, 9001 | S3-compatible object storage |
| Nessie | projectnessie/nessie |
19120 | Iceberg catalog with versioning |
| Trino Coordinator | trinodb/trino |
8080 | Query planning and coordination |
| Trino Worker x2 | trinodb/trino |
— | Query execution |
| Airflow API Server | apache/airflow |
8081 | Web UI and REST API |
| Airflow Scheduler | apache/airflow |
— | DAG scheduling |
| Airflow Worker | apache/airflow |
— | Task execution (Celery) |
| PostgreSQL | postgres |
— | Airflow metadata |
| Redis | redis |
— | Celery message broker |
Three compose files manage isolated service groups:
docker-compose-lake.yaml— storage layer (MinIO + Nessie)docker-compose-trino.yaml— query engine (coordinator + workers)docker-compose-airflow.yaml— orchestration (full Airflow stack)
- Packer builds a VM image with Docker and pre-copied project files
- Terraform provisions the VM and runs cloud-init bootstrap
- Cloud-init generates credentials and starts all services automatically
- Helm chart deploys all components as Deployments/StatefulSets
- Secrets auto-generated with random passwords
- Init Jobs create MinIO bucket, Iceberg schemas, and Airflow DB/user
- PVCs provide persistent storage for MinIO data and PostgreSQL metadata
- Custom Airflow image with dbt + DAGs baked in (optional)