---
title: "Deploy Apache Airflow"
description: "Apache Airflow is an open-source platform."
category: "Other"
url: https://railway.com/deploy/apache-airflow
---

# Deploy Apache Airflow

Apache Airflow is an open-source platform.

**[Deploy Apache Airflow on Railway](https://railway.com/template/apache-airflow)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/apache-airflow/manifest.json

- **Creator:** André Lademann's Projects
- **Category:** Other
- **Total deploys:** 6

## Template content

### railwayapp-airflow https://raw.githubusercontent.com/vergissberlin/railwayapp-airflow/main/railwayapp-airflow.svg

- **Source:** vergissberlin/railwayapp-airflow
- **Health check:** /api/v2/monitor/health
- **Public domain:** Yes

## Documentation

# Deploy and Host Apache Airflow on Railway

![Template Header](./template-header.svg)


[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/9jXQaO?referralCode=2_sIT9&utm_medium=integration&utm_source=template&utm_campaign=generic)

Apache Airflow is an open-source platform for authoring, scheduling, and monitoring workflows as code. You define pipelines in Python (DAGs), and Airflow runs them on a schedule or on demand, with a web UI for logs, retries, and task dependencies. It is widely used for data engineering, ETL, and orchestrating jobs across databases, APIs, and cloud services.

## 🏗️ Architecture

```mermaid
flowchart LR
    Client(["🌐 Client"]) -->|HTTPS| Domain["Railway Public Domain"]
    Domain -->|"$PORT"| Entry["railway-entrypoint.sh"]
    Entry --> App["Container\napache/airflow (standalone mode)"]
    App --> Volume[("Volume\n/opt/airflow/data")]
```

Single-process **standalone** mode: webserver and scheduler run together in one container.

## About Hosting Apache Airflow

Airflow 3 uses `LocalExecutor` with SQLite WAL mode for this standalone evaluation setup. `SequentialExecutor` was removed in Airflow 3 and must not be configured. The published template mounts `/opt/airflow/data`, generates an HTTP domain, and seeds the administrator login using a generated password.

Hosting Airflow means running the webserver, scheduler, and—depending on your setup—workers and a metadata database. You configure environment variables for secrets and database connections, attach persistent storage for DAGs and state, and expose the web UI on a port your platform can route to. Health checks help the host restart unhealthy processes automatically. Production deployments often split components and use PostgreSQL with Celery or Kubernetes executors; this template uses **standalone** mode for a simpler single-process layout suited to evaluation and lighter workloads. Railway runs the container, wires networking and volumes, and lets you scale or add services as your orchestration needs grow.

## Common Use Cases

- **Data pipelines and ETL** — Ingest, transform, and load data between warehouses, lakes, and operational systems on a schedule or event-driven triggers.
- **ML and analytics orchestration** — Chain training, validation, batch scoring, and reporting steps with clear dependencies and observability.
- **Ops and integration workflows** — Run backups, syncs, API-driven jobs, and cross-system automation with retries and alerting via the Airflow UI.

## Dependencies for Apache Airflow Hosting

- **Container runtime** — Airflow is deployed as a container (this template uses the official [`apache/airflow`](https://hub.docker.com/r/apache/airflow) image).
- **Persistent storage** — A volume for DAGs and local metadata paths so restarts and redeploys do not wipe your workflows and data.

### Deployment Dependencies

- [Apache Airflow documentation](https://airflow.apache.org/docs/) — Concepts, configuration, and executors.
- [Running Airflow in Docker](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html) — Official Docker-oriented guidance (useful context even when deploying to Railway).
- [Railway volumes](https://docs.railway.com/guides/volumes) — Attaching persistent disks to your service.
- [Railway environment variables](https://docs.railway.com/guides/variables) — Managing secrets and configuration.

### Implementation Details

**Files in this template**

- `Dockerfile` — Uses the official `apache/airflow` image and installs any packages listed in `requirements.txt`.
- `docker-entrypoint.sh` — Starts Airflow in standalone mode on Railway `$PORT`.
- `railway.toml` — Health check, restart policy, and required volume mount.
- `requirements.txt` — Add extra PyPI packages your DAGs need here, then redeploy to rebuild the image.

**Environment variables**

```bash
AIRFLOW_UID=50000
AIRFLOW__CORE__LOAD_EXAMPLES=False
_AIRFLOW_WWW_USER_USERNAME=admin
_AIRFLOW_WWW_USER_PASSWORD=replace-with-strong-password
```

Setting `_AIRFLOW_WWW_USER_USERNAME` and `_AIRFLOW_WWW_USER_PASSWORD` seeds a fixed
admin login for Airflow 3's SimpleAuthManager, and the entrypoint stores its
password file on the persistent volume so the login survives restarts and
redeploys instead of Airflow generating a new random password each time. If you
leave these unset, Airflow auto-generates a random `admin` password on first boot
and logs it once to stdout.

**Persistent storage**

Attach a Railway volume and mount it to:

- `/opt/airflow/data`

The template enforces this with `requiredMountPath` in `railway.toml`. Task logs
and the SimpleAuthManager credentials file are also stored there so they survive
restarts and redeploys.

**Notes**

- Standalone mode is suited to evaluation and light workloads.
- For production at scale, split webserver, scheduler, and workers, and use PostgreSQL with a Celery or Kubernetes executor.
- SimpleAuthManager (Airflow 3's default auth manager, used by this template) is
  intended by upstream for development, testing, and small teams — not full
  RBAC/SSO. For production deployments that need that, switch
  `AIRFLOW__CORE__AUTH_MANAGER` to the FAB auth manager or the Keycloak auth
  manager (each requires adding its provider package to `requirements.txt`).
- The health check hits `/api/v2/monitor/health`, Airflow 3's documented
  monitoring endpoint. Railway only evaluates the HTTP status code, not the JSON
  body's per-component detail, so a `200` confirms the API server is responding
  but not that every component (e.g. the triggerer) is fully healthy.

## Why Deploy Apache Airflow on Railway?

<!-- Recommended: Keep this section as shown below -->
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Apache Airflow on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.
<!-- End recommended section -->

<!-- footer -->
---

[![Airbyte](https://img.shields.io/badge/Airbyte-615EFF?style=for-the-badge&logo=airbyte&logoColor=white)](https://github.com/vergissberlin/railwayapp-airbyte) [![Apache Airflow](https://img.shields.io/badge/Apache%20Airflow-017CEE?style=for-the-badge&logo=apacheairflow&logoColor=white)](https://github.com/vergissberlin/railwayapp-airflow) [![CloudBeaver](https://img.shields.io/badge/CloudBeaver-382923?style=for-the-badge&logo=dbeaver&logoColor=white)](https://github.com/vergissberlin/railwayapp-cloudbeaver-ce) [![CodiMD](https://img.shields.io/badge/CodiMD-0F766E?style=for-the-badge&logo=markdown&logoColor=white)](https://github.com/vergissberlin/railwayapp-codimd) [![Django](https://img.shields.io/badge/Django-092E20?style=for-the-badge&logo=django&logoColor=white)](https://github.com/vergissberlin/railwayapp-django) [![Email Service](https://img.shields.io/badge/Email%20Service-2563EB?style=for-the-badge&logo=maildotru&logoColor=white)](https://github.com/vergissberlin/railwayapp-email) [![FastAPI](https://img.shields.io/badge/FastAPI-009688?style=for-the-badge&logo=fastapi&logoColor=white)](https://github.com/vergissberlin/railwayapp-fastapi) [![Flask](https://img.shields.io/badge/Flask-3fad48?style=for-the-badge&logo=flask&logoColor=white)](https://github.com/vergissberlin/railwayapp-flask) [![Flowise](https://img.shields.io/badge/Flowise-4F46E5?style=for-the-badge&logo=nodedotjs&logoColor=white)](https://github.com/vergissberlin/railwayapp-flowise) [![GitLab CE](https://img.shields.io/badge/GitLab%20CE-FC6D26?style=for-the-badge&logo=gitlab&logoColor=white)](https://github.com/vergissberlin/railwayapp-gitlab) [![Grafana](https://img.shields.io/badge/Grafana-F46800?style=for-the-badge&logo=grafana&logoColor=white)](https://github.com/vergissberlin/railwayapp-grafana) [![Home Assistant](https://img.shields.io/badge/Home%20Assistant-18BCF2?style=for-the-badge&logo=homeassistant&logoColor=white)](https://github.com/vergissberlin/railwayapp-homeassistant) [![InfluxDB](https://img.shields.io/badge/InfluxDB-22ADF6?style=for-the-badge&logo=influxdb&logoColor=white)](https://github.com/vergissberlin/railwayapp-influxdb) [![MJML](https://img.shields.io/badge/MJML-F45E43?style=for-the-badge&logo=mjml&logoColor=white)](https://github.com/vergissberlin/railwayapp-mjml) [![MongoDB](https://img.shields.io/badge/MongoDB-47A248?style=for-the-badge&logo=mongodb&logoColor=white)](https://github.com/vergissberlin/railwayapp-mongodb) [![Mosquitto MQTT](https://img.shields.io/badge/Mosquitto%20MQTT-3C5280?style=for-the-badge&logo=eclipsemosquitto&logoColor=white)](https://github.com/vergissberlin/railwayapp-mqtt) [![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white)](https://github.com/vergissberlin/railwayapp-mysql) [![n8n](https://img.shields.io/badge/n8n-EA4B71?style=for-the-badge&logo=n8n&logoColor=white)](https://github.com/vergissberlin/railwayapp-n8n) [![Node.js](https://img.shields.io/badge/Node.js-339933?style=for-the-badge&logo=nodedotjs&logoColor=white)](https://github.com/vergissberlin/railwayapp-nodejs) [![Node-RED](https://img.shields.io/badge/Node-RED-8F0000?style=for-the-badge&logo=nodered&logoColor=white)](https://github.com/vergissberlin/railwayapp-nodered) [![OpenSearch](https://img.shields.io/badge/OpenSearch-005EB8?style=for-the-badge&logo=opensearch&logoColor=white)](https://github.com/vergissberlin/railwayapp-opensearch) [![Open WebUI](https://img.shields.io/badge/Open%20WebUI-D68E42?style=for-the-badge&logo=ollama&logoColor=white)](https://github.com/vergissberlin/railwayapp-openwebui) [![Operately](https://img.shields.io/badge/Operately-3185FF?style=for-the-badge&logo=operately&logoColor=white)](https://github.com/vergissberlin/railwayapp-operately) [![Outerbase Studio](https://img.shields.io/badge/Outerbase%20Studio-000000?style=for-the-badge&logo=outerbase&logoColor=white)](https://github.com/vergissberlin/railwayapp-outerbase-studio) [![PostgreSQL](https://img.shields.io/badge/PostgreSQL-4169E1?style=for-the-badge&logo=postgresql&logoColor=white)](https://github.com/vergissberlin/railwayapp-postgresql) [![Redis](https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white)](https://github.com/vergissberlin/railwayapp-redis) [![TYPO3 CMS](https://img.shields.io/badge/TYPO3%20CMS-FF8700?style=for-the-badge&logo=typo3&logoColor=white)](https://github.com/vergissberlin/railwayapp-typo3)


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/apache-airflow
