Estado: 🟢 Operativo (MVP) | Rama:
main
Proyecto End-to-End que integra Infraestructura como Código (Terraform) + Base de Datos PostgreSQL + Orquestación con Apache Airflow para generar reportes automatizados desde una base de datos de negocio (CustomBikes).
Este repositorio levanta:
- una DB de negocio (Postgres) provisionada vía Terraform (Docker provider) con scripts SQL de inicialización,
- un stack de Airflow (webserver/scheduler/triggerer) en Docker Compose,
- un DAG que verifica conectividad y genera un reporte en
./reports/.
El flujo se divide en dos capas:
- Provisiona PostgreSQL de negocio como contenedor Docker.
- Monta scripts SQL (
./sql) para crear tablas y poblar datos. - Expone el puerto 5432.
- Levanta Postgres de metadatos de Airflow (interno, separado de la DB de negocio).
- Levanta Airflow y ejecuta un DAG que:
- valida conectividad a la DB de negocio,
- ejecuta lógica Python y exporta un CSV a
./reports.
- Infraestructura: Terraform + Docker Provider (IaC)
- Orquestación: Apache Airflow 2.8.1 (LocalExecutor)
- Base de datos: PostgreSQL 13
- Data/ETL: Python (
pandas,sqlalchemy,psycopg2-binary) - Contenerización: Docker Engine + Docker Compose v2
- Docker Engine + Docker Compose (v2)
- Terraform (v1.x)
- Git
- (Opcional) Python 3.8+ si ejecutas utilidades localmente
git clone https://github.com/diadasiachilensis/Bike-SQL-Python.git
cd Bike-SQL-PythonEsto crea el contenedor
custombikes_db_containery la redcustombikes_data_network.
cd infra
terraform init
terraform apply -auto-approvedocker ps | grep custombikes_db_container
docker network ls | grep custombikes_data_networkdocker exec -it custombikes_db_container psql -U custom_user -d custombike -c "\dt"Vuelve a la raíz del repo:
cd ..Crea el .env para permisos consistentes (recomendado):
echo "AIRFLOW_UID=50000" > .env
mkdir -p logs reports pluginsInicializa Airflow (DB metadatos + usuario admin):
docker compose up airflow-initLevanta todos los servicios:
docker compose up -d
docker compose ps| Servicio | URL Local | Credenciales | Descripción |
|---|---|---|---|
| Airflow Webserver | http://localhost:8080 |
admin / admin |
UI para DAGs, logs, ejecuciones y métricas |
- Entra a Airflow:
http://localhost:8080 - Busca el DAG:
custombikes_reporte_automatizado - Actívalo (Unpause)
- Ejecuta (Trigger DAG)
- Un archivo CSV generado en
./reports/(host) - Logs disponibles en la UI de Airflow por task
Verifica en tu máquina:
ls -l reportsBike-SQL-Python/
├── infra/
│ ├── main.tf # Terraform: red, imagen y contenedor Postgres (negocio)
│ └── variables.tf # Variables Terraform
├── sql/
│ ├── 00_init_db.sql
│ ├── 01_personas.sql
│ └── ... # Scripts SQL (DDL/DML)
├── dags/
│ └── reportes_bike_dag.py # DAG Airflow (verificación + reporte)
├── scripts/
│ └── etl_utils.py # Utilidades Python (query + export)
├── docker-compose.yml # Stack Airflow + Postgres metadatos
├── requirements.txt # Dependencias Python (útil para ejecución local)
├── logs/ # Logs (se ignoran, se conserva .gitkeep)
├── reports/ # Outputs (se ignoran, se conserva .gitkeep)
└── README.md
Ver logs:
docker compose logs -f airflow-scheduler
docker compose logs -f airflow-webserverDetener stack Airflow:
docker compose downReset total Airflow (incluye volumen metadatos):
docker compose down -vDestruir DB de negocio (Terraform):
cd infra
terraform destroy -auto-approve- DB de negocio provisionada con Terraform (Docker provider)
- Airflow contenerizado con Postgres de metadatos separado
- DAG funcional que genera reportes a
./reports - Parametrización por
.env.example(credenciales/hosts) - Reportes versionados por fecha y partición
- Calidad de datos: validaciones y alertas
- Exportación a almacenamiento (S3/GCS) + notificación
- Integración con dbt para transformaciones SQL avanzadas.* (Aunque no lo hagas todavía, mencionar dbt muestra que sabes cuál es el siguiente paso lógico en la industria).
Hecho con 💻 y ☕ en Chile.