---
title: "Deploy NewsBlur"
description: "RSS reader that learns which stories you want to read"
category: "Other"
url: https://railway.com/deploy/newsblur
---

# Deploy NewsBlur

RSS reader that learns which stories you want to read

**[Deploy NewsBlur on Railway](https://railway.com/template/newsblur)**

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

- **Creator:** A3A
- **Category:** Other
- **Total deploys:** 1

## Template content

### newsblur https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/newsblur.svg

- **Source:** https://github.com/gridalpha/newsblur-railway
- **Health check:** /_proxychk
- **Public domain:** Yes

### mongodb https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mongodb.svg

- **Image:** mongo:5.0
- **Start command:** `/bin/sh -c 'mkdir -p /data/db/mongo; exec docker-entrypoint.sh mongod --dbpath /data/db/mongo --ipv6 --bind_ip ::,0.0.0.0 --wiredTigerCacheSizeGB 1'`

### imageproxy https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/golang-light.svg

- **Image:** ghcr.io/willnorris/imageproxy:latest
- **Start command:** `/app/imageproxy`

### tasks https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/celery.png

- **Source:** https://github.com/gridalpha/newsblur-railway
- **Start command:** `/usr/bin/tini -s -- /usr/local/bin/newsblur-entrypoint tasks`

### Postgres https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### elasticsearch https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/elasticsearch.svg

- **Image:** elasticsearch:7.17.28

### web https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/django-light.svg

- **Source:** https://github.com/gridalpha/newsblur-railway
- **Health check:** /_haproxychk

### node https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/nodejs.svg

- **Source:** https://github.com/gridalpha/newsblur-railway
- **Health check:** /rss_feeds/original_text_fetcher

### redis https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg

- **Image:** redis:8-alpine
- **Start command:** `/bin/sh -c 'rm -rf /data/lost+found; mkdir -p /data/redis; exec redis-server --port 6579 --requirepass "$REDIS_PASSWORD" --appendonly yes --dir /data/redis --save 900 1 --maxmemory-policy noeviction'`

## Documentation

# Deploy and Host NewsBlur on Railway

NewsBlur is a personal news reader that learns what you want to read. It pulls your RSS and Atom subscriptions, shows each story in the original site's layout, and lets you train it on the authors, tags and titles you like or dislike. Developed in the open by Samuel Clay since 2009, it powers newsblur.com and its free mobile apps, and the server is MIT licensed. Self-host NewsBlur for unlimited feeds, a reading history nobody else mines, and a social layer inside your own account.

Deploy NewsBlur on Railway and you get the full production shape. The `newsblur` service is the public origin, splitting one hostname across three backends: `web` runs Django under gunicorn, `node` serves favicons, article extraction and the Socket.IO stream that pushes new stories into an open tab, and `imageproxy` resizes remote images behind an HMAC signature. `tasks` runs the Celery worker that fetches your feeds on a timer. Four data services hold the state: `Postgres` for accounts and subscriptions, `mongodb` for stories and read states, `redis` for unread counts, sessions and the queue, and `elasticsearch` for search.

![Diagram of the NewsBlur services deployed on Railway](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789254260/newsblur-architecture.webp)

## Getting Started with NewsBlur on Railway

Deploy the template, then open the public URL on the `newsblur` service. One administrator account is created from `NEWSBLUR_ADMIN_USERNAME` and `NEWSBLUR_ADMIN_PASSWORD` — the username defaults to `admin` and the password is generated at deploy time, so read it from the `web` service's variables before logging in. It is both a Django administrator (at `/admin/`) and an ordinary reader account.

The first useful thing to do is add a feed. Click **Add + Discover Sites** in the sidebar, paste a site or feed URL, and save. Within a minute or two the worker fetches the feed and its recent archive and the story list fills in. Adding two or three sites is the quickest end-to-end health check: a story only appears once PostgreSQL, MongoDB, Redis and the worker have each done their part. Then open a story and use the **Train** control, or switch between the Feed, Text and Story views.

Registration is open by default, which is what makes NewsBlur's social side work. To approve people yourself, set `NEWSBLUR_AUTO_ENABLE_NEW_USERS` to `false` on `web` and `tasks`; accounts are then inactive until enabled in the Django admin.

![NewsBlur dashboard listing Hacker News stories and account statistics](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789254263/newsblur-reader-stories.webp)

![Split-view reader showing a Hacker News story beside the feed list](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789254265/newsblur-story-reading.webp)

![NewsBlur Intelligence Trainer explaining how story filtering is trained](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789254266/newsblur-intelligence-trainer.webp)

## About Hosting NewsBlur

Most feed readers give you headlines and stop there. NewsBlur's idea is training: a thumbs-up or thumbs-down on any author, tag or title teaches a per-feed classifier, and over a few weeks the intelligence slider becomes a real filter.

Key features:

- **Intelligence training** on titles, authors, tags and feeds
- **Original site view** rendering the publisher's page beside the text
- **Full-text search** across every story in every feed you subscribe to
- **Saved stories and tags**, plus saved searches that act like feeds
- **Shared stories and blurblogs** with per-story privacy
- **Story change tracking**, showing how a post was edited after publishing
- **Email newsletters and YouTube channels** as real subscriptions
- **A documented HTTP API** and free iOS, macOS and Android apps

The multi-service shape matters: feed fetching is expensive and runs on its own schedule, so it belongs on `tasks` rather than inside a request, and article extraction and favicons are Node programs upstream ships separately — a slow crawl never blocks a reader.

## Why Deploy NewsBlur on Railway

Railway runs the whole topology from one template, with no manual wiring.

- Nine services, four volumes and the private network configured for you
- PostgreSQL, MongoDB, Redis and Elasticsearch come up alongside the app
- The public hostname is issued at deploy time and injected where needed
- Migrations, the site record and the first administrator run on first boot
- Scale the web and worker tiers without redeploying

## Common Use Cases

- A private reader for a few hundred feeds, with no per-feed pricing
- A shared team reader, with blurblogs as an internal link digest
- A research archive of tagged saved stories, searchable for years
- A programmable feed backend for dashboards or alerts, through the HTTP API

## Dependencies for NewsBlur

- **newsblur** — `caddy:2-alpine`, the public origin routing one hostname to three backends
- **web** — Django on gunicorn, from `newsblur/newsblur_python3` plus the upstream source
- **tasks** — the same image running `celery worker -B`: fetching, indexing, scheduled jobs
- **node** — Node servers from `newsblur/newsblur_node`: favicons, text extraction, Socket.IO
- **imageproxy** — `ghcr.io/willnorris/imageproxy:latest`, signature-gated image resizing
- **Postgres** — accounts, feeds, subscriptions and classifiers
- **mongodb** — `mongo:5.0`, stories, read states, feed pages and site icons
- **redis** — `redis:8-alpine`, unread counts, story hashes, sessions, Celery broker
- **elasticsearch** — `elasticsearch:7.17.28`, the feed, story and discovery indices

### Environment Variables Reference

| Variable | Service | Purpose |
|---|---|---|
| `NEWSBLUR_URL` | web, tasks | Public base URL; drives cookies and links |
| `SECRET_KEY` | web, tasks | Django signing key; changing it logs everyone out |
| `IMAGES_SECRET_KEY` | web, tasks | HMAC key for proxied images; matches `IMAGEPROXY_SIGNATUREKEY` |
| `NEWSBLUR_ADMIN_USERNAME` / `_PASSWORD` | web | First administrator, created once |
| `NEWSBLUR_AUTO_ENABLE_NEW_USERS` | web, tasks | `false` makes new signups inactive |
| `NEWSBLUR_DAYS_OF_UNREAD` | web, tasks | How long unread stories are retained |
| `GUNICORN_WORKERS` | web | Web worker processes; raise with memory |
| `OPENAI_API_KEY` | web, tasks | Optional; related-site discovery and AI summaries |
| `EMAIL_HOST` | web, tasks | Optional SMTP relay for password resets |

### Deployment Dependencies

- Source: [samuelclay/NewsBlur](https://github.com/samuelclay/NewsBlur) (MIT)
- Base images: [newsblur_python3](https://hub.docker.com/r/newsblur/newsblur_python3), [newsblur_node](https://hub.docker.com/r/newsblur/newsblur_node)
- Runtime: Python 3.9 / Django 3.1, Node 22, Celery 4
- API docs: [newsblur.com/api](https://www.newsblur.com/api)

## Hardware Requirements for Self-Hosting NewsBlur

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 vCPU total | 4+ vCPU |
| RAM | 4 GB total | 8 GB total (Elasticsearch wants 1 GB) |
| Storage | 5 GB per volume | 10 GB+ for MongoDB as the archive grows |
| Runtime | Python 3.9, Node 22 | Same, pinned by the images |

MongoDB grows fastest, since every story body lives there for the retention window. Elasticsearch sets the memory floor; its heap is capped at 1 GB, raised with `ES_JAVA_OPTS`.

## Self-Hosting NewsBlur

Upstream ships a Docker Compose environment; running it gives a local instance at `https://localhost`:

```
git clone https://github.com/samuelclay/NewsBlur.git
cd NewsBlur
make
```

Configuration is a Python settings file, not a `.env`. Create `newsblur_web/local_settings.py` to override the shipped `docker_local_settings.py`:

```
NEWSBLUR_URL = "https://reader.example.com"
SESSION_COOKIE_DOMAIN = None
AUTO_ENABLE_NEW_USERS = False
DAYS_OF_UNREAD = 60
```

The Railway template does the same from environment variables, so no file needs editing.

## Is NewsBlur Free to Self-Host?

NewsBlur's server is MIT licensed and free to run, with no feature gates, seat limits or licence key in the self-hosted build. The hosted newsblur.com service is free for 64 sites with paid tiers above that; none of that applies to your instance, where the template puts every account on the premium feature level. On Railway you pay only for the compute and storage the nine services use.

## FAQ

**What is NewsBlur?**
An open-source RSS and Atom reader with intelligence training, full-text search, an original-site view and a social layer of shared stories and blurblogs. MIT licensed.

**What does this Railway template deploy?**
Nine services: a Caddy origin, the Django app, a Celery worker, NewsBlur's Node servers, an image proxy, PostgreSQL, MongoDB, Redis and Elasticsearch — with volumes, networking and the first administrator configured.

**Why does NewsBlur need four different databases?**
Each holds something different: PostgreSQL for accounts and subscriptions, MongoDB for story bodies and read states (which grow far faster), Redis for unread counts, sessions and the queue, Elasticsearch for search. Upstream runs the same four in production.

**How do I log in the first time after deploying NewsBlur?**
Open the public URL and sign in with `NEWSBLUR_ADMIN_USERNAME` and `NEWSBLUR_ADMIN_PASSWORD` from the `web` service's variables.

**Can I stop other people from registering on my instance?**
Yes. Set `NEWSBLUR_AUTO_ENABLE_NEW_USERS` to `false` on `web` and `tasks`; new signups are then inactive until you enable them from `/admin/`. To import an existing OPML file, use **Import sites** in the account menu.

**Do I need an OpenAI API key to run self-hosted NewsBlur?**
No. Reading, training, search and sharing all work without one. `OPENAI_API_KEY` additionally enables the related-sites recommender and AI summaries.


## 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/newsblur
