fix(pipeline): migrate to Airflow 3 API server and SimpleAuthManager
All checks were successful
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 34s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 1m12s
Build and Push Docker Images / Build Integrator (push) Successful in 58s
Build and Push Docker Images / Build Kestra Init (push) Successful in 31s
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Successful in 31s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s
All checks were successful
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 34s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 1m12s
Build and Push Docker Images / Build Integrator (push) Successful in 58s
Build and Push Docker Images / Build Kestra Init (push) Successful in 31s
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Successful in 31s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s
Airflow 3 replaced `airflow webserver` with `airflow api-server` and removed the `airflow users` CLI. Auth is now via SimpleAuthManager configured through AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_USERS env var. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
# ADMIN_API_KEY — Backend admin API key
|
# ADMIN_API_KEY — Backend admin API key
|
||||||
# TYPESENSE_API_KEY — Typesense admin API key
|
# TYPESENSE_API_KEY — Typesense admin API key
|
||||||
# TYPESENSE_SEARCH_KEY — Typesense search-only key (exposed to frontend)
|
# TYPESENSE_SEARCH_KEY — Typesense search-only key (exposed to frontend)
|
||||||
# AIRFLOW_ADMIN_PASSWORD — Airflow web UI admin password
|
# AIRFLOW_ADMIN_USER — Airflow admin username (password auto-generated, see api-server logs)
|
||||||
# KESTRA_USER — Kestra UI username (optional)
|
# KESTRA_USER — Kestra UI username (optional)
|
||||||
# KESTRA_PASSWORD — Kestra UI password (optional)
|
# KESTRA_PASSWORD — Kestra UI password (optional)
|
||||||
|
|
||||||
@@ -184,11 +184,11 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
start_period: 15s
|
start_period: 15s
|
||||||
|
|
||||||
# ── Airflow Webserver (UI at :8080) ──────────────────────────────────
|
# ── Airflow API Server + UI (at :8080) ────────────────────────────────
|
||||||
airflow-webserver:
|
airflow-api-server:
|
||||||
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
||||||
container_name: schoolcompare_airflow_webserver
|
container_name: schoolcompare_airflow_api
|
||||||
command: airflow webserver --port 8080
|
command: airflow api-server --port 8080
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
environment:
|
environment:
|
||||||
@@ -196,7 +196,7 @@ services:
|
|||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
||||||
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
||||||
AIRFLOW__WEBSERVER__EXPOSE_CONFIG: "false"
|
AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_USERS: "${AIRFLOW_ADMIN_USER:-admin}:admin"
|
||||||
PG_HOST: sc_database
|
PG_HOST: sc_database
|
||||||
PG_PORT: "5432"
|
PG_PORT: "5432"
|
||||||
PG_USER: ${DB_USERNAME}
|
PG_USER: ${DB_USERNAME}
|
||||||
@@ -229,7 +229,7 @@ services:
|
|||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
||||||
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
||||||
AIRFLOW__WEBSERVER__EXPOSE_CONFIG: "false"
|
AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_USERS: "${AIRFLOW_ADMIN_USER:-admin}:admin"
|
||||||
PG_HOST: sc_database
|
PG_HOST: sc_database
|
||||||
PG_PORT: "5432"
|
PG_PORT: "5432"
|
||||||
PG_USER: ${DB_USERNAME}
|
PG_USER: ${DB_USERNAME}
|
||||||
@@ -250,23 +250,12 @@ services:
|
|||||||
airflow-init:
|
airflow-init:
|
||||||
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
||||||
container_name: schoolcompare_airflow_init
|
container_name: schoolcompare_airflow_init
|
||||||
command: >
|
command: airflow db migrate
|
||||||
bash -c "
|
|
||||||
airflow db migrate &&
|
|
||||||
airflow users create
|
|
||||||
--username admin
|
|
||||||
--password $${AIRFLOW_ADMIN_PASSWORD:-admin}
|
|
||||||
--firstname Admin
|
|
||||||
--lastname User
|
|
||||||
--role Admin
|
|
||||||
--email admin@localhost || true
|
|
||||||
"
|
|
||||||
environment:
|
environment:
|
||||||
AIRFLOW__CORE__EXECUTOR: LocalExecutor
|
AIRFLOW__CORE__EXECUTOR: LocalExecutor
|
||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${DB_USERNAME}:${DB_PASSWORD}@sc_database:5432/${DB_DATABASE_NAME}
|
||||||
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
||||||
AIRFLOW_ADMIN_PASSWORD: ${AIRFLOW_ADMIN_PASSWORD:-admin}
|
|
||||||
depends_on:
|
depends_on:
|
||||||
sc_database:
|
sc_database:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
@@ -96,11 +96,11 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
|
||||||
# Apache Airflow — workflow orchestrator (UI at http://localhost:8080)
|
# Apache Airflow — API server + UI (http://localhost:8080)
|
||||||
airflow-webserver:
|
airflow-api-server:
|
||||||
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
||||||
container_name: schoolcompare_airflow_webserver
|
container_name: schoolcompare_airflow_api
|
||||||
command: airflow webserver --port 8080
|
command: airflow api-server --port 8080
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
environment: &airflow-env
|
environment: &airflow-env
|
||||||
@@ -108,7 +108,7 @@ services:
|
|||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://schoolcompare:schoolcompare@db:5432/schoolcompare
|
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://schoolcompare:schoolcompare@db:5432/schoolcompare
|
||||||
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
AIRFLOW__CORE__DAGS_FOLDER: /opt/pipeline/dags
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
|
||||||
AIRFLOW__WEBSERVER__EXPOSE_CONFIG: "false"
|
AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_USERS: "admin:admin"
|
||||||
PG_HOST: db
|
PG_HOST: db
|
||||||
PG_PORT: "5432"
|
PG_PORT: "5432"
|
||||||
PG_USER: schoolcompare
|
PG_USER: schoolcompare
|
||||||
@@ -149,11 +149,7 @@ services:
|
|||||||
airflow-init:
|
airflow-init:
|
||||||
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
image: privaterepo.sitaru.org/tudor/school_compare-pipeline:latest
|
||||||
container_name: schoolcompare_airflow_init
|
container_name: schoolcompare_airflow_init
|
||||||
command: >
|
command: airflow db migrate
|
||||||
bash -c "
|
|
||||||
airflow db migrate &&
|
|
||||||
airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@localhost || true
|
|
||||||
"
|
|
||||||
environment: *airflow-env
|
environment: *airflow-env
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
|
|||||||
@@ -34,4 +34,4 @@ RUN cd transform && dbt deps --profiles-dir . 2>/dev/null || true
|
|||||||
ENV AIRFLOW_HOME=/opt/airflow
|
ENV AIRFLOW_HOME=/opt/airflow
|
||||||
ENV PYTHONPATH=/opt/pipeline
|
ENV PYTHONPATH=/opt/pipeline
|
||||||
|
|
||||||
CMD ["airflow", "webserver"]
|
CMD ["airflow", "api-server"]
|
||||||
|
|||||||
Reference in New Issue
Block a user