Deploy NewsBlur
RSS reader that learns which stories you want to read
newsblur
Just deployed
mongodb
Just deployed
/data/db
imageproxy
Just deployed
Just deployed
Just deployed
/var/lib/postgresql/data
elasticsearch
Just deployed
/usr/share/elasticsearch/data
Just deployed
Just deployed
redis
Just deployed
/data
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.

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.



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_python3plus 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 (MIT)
- Base images: newsblur_python3, newsblur_node
- Runtime: Python 3.9 / Django 3.1, Node 22, Celery 4
- API docs: 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.
Template Content
newsblur
gridalpha/newsblur-railwaymongodb
mongo:5.0imageproxy
ghcr.io/willnorris/imageproxy:latestelasticsearch
elasticsearch:7.17.28redis
redis:8-alpine