---
title: "Deploy Kestra | (Just Updated) Workflow Orchestration, Shell and Python Tasks Work"
description: "Kestra workflow engine. Login set at deploy, data on volumes, healthcheck"
category: "Other"
url: https://railway.com/deploy/kestra-or-just-updated-workflow-orchestr
---

# Deploy Kestra | (Just Updated) Workflow Orchestration, Shell and Python Tasks Work

Kestra workflow engine. Login set at deploy, data on volumes, healthcheck

**[Deploy Kestra | (Just Updated) Workflow Orchestration, Shell and Python Tasks Work on Railway](https://railway.com/template/kestra-or-just-updated-workflow-orchestr)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/kestra-or-just-updated-workflow-orchestr/manifest.json

- **Creator:** SuperSlowSloth
- **Category:** Other

## Template content

### postgres

- **Image:** postgres:17.10-trixie

### kestra

- **Image:** kestra/kestra:v1.3.41@sha256:9f47a6fc9172aa388f40140feebecca3f7efe1df1cbc66467af9b29cf6883059
- **Start command:** `/bin/sh -c 'export KESTRA_CONFIGURATION="{datasources: {postgres: {url: \"jdbc:postgresql://$PGHOST:5432/postgres\", driverClassName: org.postgresql.Driver, username: postgres, password: \"$PGPASSWORD\"}}, kestra: {server: {basic-auth: {username: \"admin@kestra.io\", password: \"$KESTRA_PASSWORD\"}}, queue: {type: postgres}, repository: {type: postgres}, storage: {type: local, local: {basePath: /app/storage}}, plugins: {defaults: [{type: io.kestra.plugin.scripts.shell.Commands, forced: false, values: {taskRunner: {type: io.kestra.plugin.core.runner.Process}}},{type: io.kestra.plugin.scripts.shell.Script, forced: false, values: {taskRunner: {type: io.kestra.plugin.core.runner.Process}}},{type: io.kestra.plugin.scripts.python.Commands, forced: false, values: {taskRunner: {type: io.kestra.plugin.core.runner.Process}}},{type: io.kestra.plugin.scripts.python.Script, forced: false, values: {taskRunner: {type: io.kestra.plugin.core.runner.Process}}}]}}}"; echo "[railway] cores=$(nproc) storage=$(test -w /app/storage && echo writable || echo READONLY) uid=$(id -u)"; exec docker-entrypoint.sh server standalone'`
- **Health check:** /ping
- **Public domain:** Yes

## Documentation

# Deploy and Host Kestra on Railway

Kestra is an open-source workflow orchestration engine. Flows are declared in YAML and triggered by
schedules, webhooks or events, and tasks can run shell commands, Python scripts, SQL, HTTP calls
and several hundred plugins.

This template runs Kestra 1.3 from a digest-pinned official image together with a PostgreSQL 17
service, with the web UI and API on a public Railway domain and both services on volumes.

## About Hosting Kestra

- **The UI and API are behind a login from the first request.** An admin password is generated per
  deploy (`KESTRA_PASSWORD`, user `admin@kestra.io`). An anonymous API call returned 401; the
  same call with the generated credentials returned 200.
- **Shell and Python tasks run without Docker.** Kestra's default task runner starts a container,
  which needs a Docker socket that Railway does not provide. Here the shell and Python task types
  default to the in-process runner, and a `Commands` flow ran to SUCCESS on a fresh deploy.
- **State survives redeploys.** Flows, executions and logs live in PostgreSQL on a volume, and
  task outputs live in Kestra's internal storage on a second volume. A flow created before a
  redeploy and its execution history were both present after it.
- **Storage is writable.** Railway mounts volumes as root, and Kestra's image runs as a non-root
  user, so a plain mount is read-only to it. The template runs the service as root so the storage
  directory can be written.
- **A healthcheck is set** on `/ping`, so a deploy that does not start is reported as failed
  instead of looking live.

## Common Use Cases

- Scheduled data pipelines and ETL jobs defined as YAML
- Cron replacement with retries, logs and a UI
- Event and webhook driven automation across APIs
- Orchestrating Python and shell scripts without a separate scheduler

## Dependencies for Kestra Hosting

- A PostgreSQL service (created by the template) for the queue and repository
- One volume for Kestra's internal storage and one for PostgreSQL (created by the template)

### Deployment Dependencies

- Kestra documentation: https://kestra.io/docs
- Official image: https://hub.docker.com/r/kestra/kestra

### Implementation Details

| Variable | Purpose |
| --- | --- |
| `KESTRA_PASSWORD` | Password for the `admin@kestra.io` user, generated per deploy. |
| `PGPASSWORD` | Password for the bundled PostgreSQL service. |
| `PGHOST` | Private hostname of the bundled PostgreSQL service. |

Open the service's public domain and sign in with `admin@kestra.io` and `KESTRA_PASSWORD`. The
API accepts the same credentials with HTTP basic auth.

## Why Deploy Kestra on Railway?

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 Kestra 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.


## 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/kestra-or-just-updated-workflow-orchestr
