---
title: "Deploy Firecrawl"
description: "Self-hosted web scraping and crawling API for LLMs, behind an API key"
category: "AI/ML"
url: https://railway.com/deploy/firecrawl-3
---

# Deploy Firecrawl

Self-hosted web scraping and crawling API for LLMs, behind an API key

**[Deploy Firecrawl on Railway](https://railway.com/template/firecrawl-3)**

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

- **Creator:** Agaz Self-Host
- **Category:** AI/ML

## Template content

### Firecrawl

- **Image:** caddy:2.11.9-alpine@sha256:0bbb055bda6793c999bde78b1b5ce3e89f829fb031af2cf50056ea1246559fee
- **Start command:** `/bin/sh -c "echo c2V0IC1lOyBmb3IgdiBpbiBGSVJFQ1JBV0xfQVBJX0tFWSBCVUxMX0FVVEhfS0VZOyBkbyBldmFsICJ4PVwkeyR2Oi19IjsgWyAkeyN4fSAtZ2UgMjAgXSB8fCB7IGVjaG8gIiR2IG11c3QgYmUgc2V0ICgyMCsgY2hhcmFjdGVycykiID4mMjsgZXhpdCAxOyB9OyBkb25lOyBbIC1uICIke0ZJUkVDUkFXTF9BUElfVVJMOi19IiBdIHx8IHsgZWNobyAiRklSRUNSQVdMX0FQSV9VUkwgaXMgbm90IHNldCIgPiYyOyBleGl0IDE7IH07IGVjaG8gZXdvSllXUnRhVzRnYjJabUNnbGhkWFJ2WDJoMGRIQnpJRzltWmdvSmNHVnljMmx6ZEY5amIyNW1hV2NnYjJabUNuMEtDanA3SkZCUFVsUjlJSHNLQ1VCb1pXRnNkR2dnY0dGMGFDQXZhR1ZoYkhSb0NnbG9ZVzVrYkdVZ1FHaGxZV3gwYUNCN0Nna0pjbVYzY21sMFpTQXFJQzhLQ1FseVpYWmxjbk5sWDNCeWIzaDVJSHNrUmtsU1JVTlNRVmRNWDBGUVNWOVZVa3g5Q2dsOUNnb0pRR0ZrYldsdUlIQmhkR2dnTDJGa2JXbHVMM3NrUWxWTVRGOUJWVlJJWDB0RldYMHZLZ29KYUdGdVpHeGxJRUJoWkcxcGJpQjdDZ2tKY21WMlpYSnpaVjl3Y205NGVTQjdKRVpKVWtWRFVrRlhURjlCVUVsZlZWSk1mUW9KZlFvS0NVQmhkWFJvYjNKcGVtVmtJSHNLQ1Fsb1pXRmtaWElnUVhWMGFHOXlhWHBoZEdsdmJpQWlRbVZoY21WeUlIc2tSa2xTUlVOU1FWZE1YMEZRU1Y5TFJWbDlJZ29KZlFvSlFIZHpZWFYwYUc5eWFYcGxaQ0I3Q2drSmFHVmhaR1Z5SUZObFl5MVhaV0pUYjJOclpYUXRVSEp2ZEc5amIyd2dleVJHU1ZKRlExSkJWMHhmUVZCSlgwdEZXWDBLQ1gwS0NXaGhibVJzWlNCQVlYVjBhRzl5YVhwbFpDQjdDZ2tKY21WMlpYSnpaVjl3Y205NGVTQjdKRVpKVWtWRFVrRlhURjlCVUVsZlZWSk1mUW9KZlFvSmFHRnVaR3hsSUVCM2MyRjFkR2h2Y21sNlpXUWdld29KQ1hKbGRtVnljMlZmY0hKdmVIa2dleVJHU1ZKRlExSkJWMHhmUVZCSlgxVlNUSDBLQ1gwS0NnbG9ZVzVrYkdVZ2V3b0pDV2hsWVdSbGNpQkRiMjUwWlc1MExWUjVjR1VnWVhCd2JHbGpZWFJwYjI0dmFuTnZiZ29KQ1dobFlXUmxjaUJYVjFjdFFYVjBhR1Z1ZEdsallYUmxJQ0pDWldGeVpYSWlDZ2tKY21WemNHOXVaQ0JnZXlKemRXTmpaWE56SWpwbVlXeHpaU3dpWlhKeWIzSWlPaUpWYm1GMWRHaHZjbWw2WldRNklITmxibVFnUVhWMGFHOXlhWHBoZEdsdmJqb2dRbVZoY21WeUlEeEdTVkpGUTFKQlYweGZRVkJKWDB0RldUNGlmV0FnTkRBeENnbDlDbjBLIHwgYmFzZTY0IC1kID4gL2V0Yy9jYWRkeS9DYWRkeWZpbGU7IGV4ZWMgY2FkZHkgcnVuIC0tY29uZmlnIC9ldGMvY2FkZHkvQ2FkZHlmaWxlIC0tYWRhcHRlciBjYWRkeWZpbGUK | base64 -d > /tmp/start.sh && exec sh /tmp/start.sh"`
- **Health check:** /health
- **Public domain:** Yes

### Playwright

- **Image:** ghcr.io/firecrawl/playwright-service:latest@sha256:eacaf2c256a6ff7fd1869e470d2969e97a037ff6c75ac01d38784d138a33f8eb
- **Start command:** `/bin/sh -c 'export PORT="${PORT:-8080}" MAX_CONCURRENT_PAGES="${MAX_CONCURRENT_PAGES:-10}"; exec docker-entrypoint.sh pnpm start'`
- **Health check:** /health

### Redis https://cdn.sanity.io/images/sy1jschh/production/0ce0bfdcfbdbf69662b1116671f97c2dd788b655-157x157.svg

- **Image:** redis:8.2
- **Start command:** `/bin/sh -c "rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH"`

### API

- **Image:** ghcr.io/firecrawl/firecrawl:2.11.723@sha256:0f1cfc844176f536e618ab0545223c234f7e538c8e264d19622652e4e5c7f218
- **Start command:** `/bin/sh -c "echo ZXhwb3J0IEhPU1Q9IiR7SE9TVDotOjp9IiBQT1JUPSIke1BPUlQ6LTgwODB9IiBFWFRSQUNUX1dPUktFUl9QT1JUPSIke0VYVFJBQ1RfV09SS0VSX1BPUlQ6LTMwMDR9IiBXT1JLRVJfUE9SVD0iJHtXT1JLRVJfUE9SVDotMzAwNX0iIEVOVj0iJHtFTlY6LWxvY2FsfSIgVVNFX0RCX0FVVEhFTlRJQ0FUSU9OPWZhbHNlIFBPU1RHUkVTX1VTRVI9IiR7UE9TVEdSRVNfVVNFUjotcG9zdGdyZXN9IiBQT1NUR1JFU19EQj0iJHtQT1NUR1JFU19EQjotcG9zdGdyZXN9IiBQT1NUR1JFU19QT1JUPSIke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9IiBOVU1fV09SS0VSU19QRVJfUVVFVUU9IiR7TlVNX1dPUktFUlNfUEVSX1FVRVVFOi04fSIgQ1JBV0xfQ09OQ1VSUkVOVF9SRVFVRVNUUz0iJHtDUkFXTF9DT05DVVJSRU5UX1JFUVVFU1RTOi0xMH0iIE1BWF9DT05DVVJSRU5UX0pPQlM9IiR7TUFYX0NPTkNVUlJFTlRfSk9CUzotNX0iIEJST1dTRVJfUE9PTF9TSVpFPSIke0JST1dTRVJfUE9PTF9TSVpFOi01fSIgSEFSTkVTU19TVEFSVFVQX1RJTUVPVVRfTVM9IiR7SEFSTkVTU19TVEFSVFVQX1RJTUVPVVRfTVM6LTYwMDAwfSIgTE9HR0lOR19MRVZFTD0iJHtMT0dHSU5HX0xFVkVMOi1JTkZPfSI7IG5vZGUgLWUgJ2NvbnN0IG5ldD1yZXF1aXJlKCJuZXQiKSx1PXJlcXVpcmUoInVybCIpO2NvbnN0IHQ9RGF0ZS5ub3coKTtjb25zdCB3PShoLHApPT5uZXcgUHJvbWlzZSgob2ssbm8pPT57Y29uc3QgZj0oKT0+e2NvbnN0IHM9bmV0LmNvbm5lY3Qoe2hvc3Q6aCxwb3J0OitwfSk7cy5vbigiY29ubmVjdCIsKCk9PntzLmVuZCgpO2NvbnNvbGUubG9nKCJyZWFkeSAiK2grIjoiK3ApO29rKCl9KTtzLm9uKCJlcnJvciIsKCk9PntzLmRlc3Ryb3koKTtpZihEYXRlLm5vdygpLXQ+MzAwMDAwKW5vKG5ldyBFcnJvcigidGltZW91dCAiK2gpKTtlbHNlIHNldFRpbWVvdXQoZiwyMDAwKX0pfTtmKCl9KTtjb25zdCBtPW5ldyB1LlVSTChwcm9jZXNzLmVudi5OVVFfUkFCQklUTVFfVVJMfHwiYW1xcDovL3g6NTY3MiIpO1Byb21pc2UuYWxsKFt3KHByb2Nlc3MuZW52LlBPU1RHUkVTX0hPU1QscHJvY2Vzcy5lbnYuUE9TVEdSRVNfUE9SVCksdyhtLmhvc3RuYW1lLnJlcGxhY2UoL15cW3xcXSQvZywiIiksbS5wb3J0fHw1NjcyKV0pLnRoZW4oKCk9PnByb2Nlc3MuZXhpdCgwKSxlPT57Y29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO3Byb2Nlc3MuZXhpdCgxKX0pJyAmJiBleGVjIGRvY2tlci1lbnRyeXBvaW50LnNoIG5vZGUgZGlzdC9zcmMvaGFybmVzcy5qcyAtLXN0YXJ0LWRvY2tlcgo= | base64 -d > /tmp/start.sh && exec sh /tmp/start.sh"`
- **Health check:** /

### RabbitMQ

- **Image:** rabbitmq:3.13.7-management@sha256:e582c0bc7766f3342496d8485efb5a1df782b5ce3886ad017e2eaae442311f69
- **Start command:** `/bin/sh -c 'export RABBITMQ_DEFAULT_USER="${RABBITMQ_DEFAULT_USER:-firecrawl}" RABBITMQ_NODENAME="${RABBITMQ_NODENAME:-rabbit@localhost}"; exec docker-entrypoint.sh rabbitmq-server'`

### NUQ-Postgres

- **Image:** ghcr.io/firecrawl/nuq-postgres:latest@sha256:d719b36160eac2fcbe16dc7e7360ddb9c82c40ea5da183d07bf4a755c6a0b2ae
- **Start command:** `/bin/sh -c 'export PGDATA=/var/lib/postgresql/data/pgdata POSTGRES_USER=postgres POSTGRES_DB=postgres; exec docker-entrypoint.sh postgres'`

## Documentation

# Deploy and Host Firecrawl on Railway

Firecrawl is an open-source API that turns websites into clean markdown or structured data for LLMs and AI agents. It scrapes single pages, crawls whole sites, maps links and renders JavaScript-heavy pages in a headless browser. You call it over REST or with the official Python and JavaScript SDKs.

## About Hosting Firecrawl

Self-hosting Firecrawl means running several cooperating services. The API process starts the HTTP API plus queue workers. A Playwright service renders JavaScript pages. Redis handles rate limits and job state, RabbitMQ carries queue messages, and a Postgres build with `pg_cron` stores the job queue. Self-hosted Firecrawl has no API-key check of its own, so this template keeps the API private and puts a small Caddy gateway in front of it. The gateway needs a generated bearer key. Postgres, Redis and RabbitMQ keep their data on volumes. Every image is pinned by digest, and LLM features stay optional.

## Common Use Cases

* Turn documentation sites and blogs into markdown for RAG pipelines and AI agents
* Crawl a site on a schedule and feed the pages into a search index or vector database
* Scrape JavaScript-rendered pages from your own backend without paying per request

## Dependencies for Firecrawl Hosting

* Redis (Railway's Redis) for rate limiting and job state
* RabbitMQ and Firecrawl's NuQ Postgres (Postgres 17 with `pg_cron`) for the job queue
* Firecrawl's Playwright service for JavaScript rendering

### Deployment Dependencies

* [Firecrawl on GitHub](https://github.com/firecrawl/firecrawl) and its [self-hosting guide](https://github.com/firecrawl/firecrawl/blob/main/SELF_HOST.md)
* [Firecrawl v2.11 release notes](https://github.com/firecrawl/firecrawl/releases/tag/v2.11.0) and [API reference](https://docs.firecrawl.dev/api-reference/introduction)
* [Start scripts and gateway config for this template](https://github.com/aalfath/firecrawl-railway-template)

### Implementation Details

After the deploy, copy `FIRECRAWL_API_KEY` from the **Firecrawl** service's variables and call the public domain:

```bash
curl -X POST https://YOUR-DOMAIN.up.railway.app/v2/scrape \
  -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com","formats":["markdown"]}'
```

With the SDKs, set `api_url` to your domain and `api_key` to the same key. Requests without the key get `401`. The queue dashboard is at `/admin/BULL_AUTH_KEY/queues`, with `BULL_AUTH_KEY` replaced by its value from the **API** service. To turn on LLM extraction, add `OPENAI_API_KEY` (and optionally `OPENAI_BASE_URL` and `MODEL_NAME`) to the **API** service.

## Why Deploy Firecrawl 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 Firecrawl 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

- [Chat Chat](https://railway.com/deploy/-WWW5r) — Chat Chat, your own unified chat and search to AI platform.
- [Weaviate](https://railway.com/deploy/weaviate-1) — Vector database with hybrid search and an API key-protected API
- [Möbius Personal AI OS](https://railway.com/deploy/mobius-v01-personal-ai-os) — Self-hosted AI agent that builds and runs apps for you, with memory.

Open this page in a browser: https://railway.com/deploy/firecrawl-3
