# sample-pipeline/airflow — Airflow stack for Module 2

Single-node LocalExecutor Airflow 2.9 setup for course labs (lessons 04-06).

## Quick start

```
docker compose up -d
open http://localhost:8080   # admin / admin
```

## State across the module

| Lesson | DAG state |
|---|---|
| 04 | `gharchive_hourly` with `schedule=None`, hardcoded hour 2026-05-01-12 |
| 05 | Same DAG, `schedule="@hourly"`, data-interval-aware (uses `context["data_interval_start"]`) |
| 06 | Same DAG, transactional load via staging dir + atomic rename, retries with backoff, dedupe via run-key |

## NOT production-grade

- No secret rotation, no TLS, no resource limits.
- `_PIP_ADDITIONAL_REQUIREMENTS` is convenient for course but slow on startup; real deployments build a custom image.
