From a0b956b24285d8d4f925fd7b7fbc911b8057ed63 Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Sat, 6 Dec 2025 18:04:18 +0100 Subject: [PATCH] chore: rewriting airflow for railway --- docker-compose.yml | 18 ------------ docker/Airflow.dockerfile | 7 +++++ docker/Airflow.railway.dockerfile | 41 ++++++++++++++++++++++++++++ docker/airflow-railway-entrypoint.sh | 20 ++++++++++++++ 4 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 docker/Airflow.railway.dockerfile create mode 100644 docker/airflow-railway-entrypoint.sh diff --git a/docker-compose.yml b/docker-compose.yml index 86e882b..801b486 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -103,12 +103,6 @@ services: - _AIRFLOW_WWW_USER_PASSWORD=admin - REDIS_HOST=redis - REDIS_PORT=6379 - volumes: - - ./experiments/airflow/dags:/opt/airflow/dags - - ./experiments/airflow/logs:/opt/airflow/logs - - ./experiments/airflow/plugins:/opt/airflow/plugins - - ./experiments/procesing:/opt/airflow/procesing - - ./lib:/opt/airflow/lib command: version restart: "no" @@ -138,12 +132,6 @@ services: - REDIS_PORT=6379 ports: - "${AIRFLOW_WEBSERVER_PORT:-8085}:8080" - volumes: - - ./experiments/airflow/dags:/opt/airflow/dags:ro - - ./experiments/airflow/logs:/opt/airflow/logs - - ./experiments/airflow/plugins:/opt/airflow/plugins:ro - - ./experiments/procesing:/opt/airflow/procesing:ro - - ./lib:/opt/airflow/lib:ro command: webserver restart: unless-stopped healthcheck: @@ -177,12 +165,6 @@ services: - NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY} - REDIS_HOST=redis - REDIS_PORT=6379 - volumes: - - ./experiments/airflow/dags:/opt/airflow/dags:ro - - ./experiments/airflow/logs:/opt/airflow/logs - - ./experiments/airflow/plugins:/opt/airflow/plugins:ro - - ./experiments/procesing:/opt/airflow/procesing:ro - - ./lib:/opt/airflow/lib:ro command: scheduler restart: unless-stopped healthcheck: diff --git a/docker/Airflow.dockerfile b/docker/Airflow.dockerfile index 5b11cc9..9dd2bbe 100644 --- a/docker/Airflow.dockerfile +++ b/docker/Airflow.dockerfile @@ -21,3 +21,10 @@ RUN pip install --no-cache-dir \ # set airflow home ENV AIRFLOW_HOME=/opt/airflow + +COPY --chown=airflow:root experiments/airflow/dags ${AIRFLOW_HOME}/dags +COPY --chown=airflow:root experiments/procesing ${AIRFLOW_HOME}/procesing +COPY --chown=airflow:root lib ${AIRFLOW_HOME}/lib + +# create logs and plugins dirs (airflow expects them) +RUN mkdir -p ${AIRFLOW_HOME}/logs ${AIRFLOW_HOME}/plugins diff --git a/docker/Airflow.railway.dockerfile b/docker/Airflow.railway.dockerfile new file mode 100644 index 0000000..66f6ce3 --- /dev/null +++ b/docker/Airflow.railway.dockerfile @@ -0,0 +1,41 @@ +FROM apache/airflow:2.7.3-python3.11 + +USER root + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + supervisor \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +USER airflow + +COPY requirements.txt /tmp/requirements.txt +RUN pip install --no-cache-dir -r /tmp/requirements.txt + +RUN pip install --no-cache-dir \ + psycopg2-binary \ + apache-airflow-providers-postgres + +ENV AIRFLOW_HOME=/opt/airflow +ENV AIRFLOW__CORE__EXECUTOR=SequentialExecutor +ENV AIRFLOW__CORE__LOAD_EXAMPLES=false +ENV AIRFLOW__CORE__ENABLE_XCOM_PICKLING=true +ENV AIRFLOW__WEBSERVER__EXPOSE_CONFIG=true + +# copy all code into image (standalone - no volume mounts needed) +COPY --chown=airflow:root experiments/airflow/dags ${AIRFLOW_HOME}/dags +COPY --chown=airflow:root experiments/procesing ${AIRFLOW_HOME}/procesing +COPY --chown=airflow:root lib ${AIRFLOW_HOME}/lib + +RUN mkdir -p ${AIRFLOW_HOME}/logs ${AIRFLOW_HOME}/plugins + +# copy entrypoint script +COPY --chown=airflow:root docker/airflow-railway-entrypoint.sh /entrypoint.sh +USER root +RUN chmod +x /entrypoint.sh +USER airflow + +EXPOSE 8080 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/airflow-railway-entrypoint.sh b/docker/airflow-railway-entrypoint.sh new file mode 100644 index 0000000..f2d11d9 --- /dev/null +++ b/docker/airflow-railway-entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +# init db and create admin user on first run +airflow db migrate + +# create admin user if not exists +airflow users create \ + --username "${AIRFLOW_ADMIN_USER:-admin}" \ + --password "${AIRFLOW_ADMIN_PASSWORD:-admin}" \ + --firstname Admin \ + --lastname User \ + --role Admin \ + --email admin@example.com || true + +# start scheduler in background +airflow scheduler & + +# start webserver in foreground (Railway needs one foreground process) +exec airflow webserver --port ${PORT:-8080}