---
title: "Deploy Wallabag"
description: "Saves web articles to read later, with tags, search and export"
category: "Other"
url: https://railway.com/deploy/wallabag-app
---

# Deploy Wallabag

Saves web articles to read later, with tags, search and export

**[Deploy Wallabag on Railway](https://railway.com/template/wallabag-app)**

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

- **Creator:** A3A
- **Category:** Other

## Template content

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

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

### Redis https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.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"`

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

- **Source:** https://github.com/gridalpha/wallabag-railway
- **Health check:** /api/info
- **Public domain:** Yes

## Documentation

# Deploy and Host Wallabag on Railway

Wallabag is an open-source read-it-later application: give it a URL and it fetches the page, strips the navigation, ads and cookie banners, and keeps the readable article in your own database with its tags and annotations. It has been the standard self-hosted answer to Pocket and Instapaper for a decade, and since Mozilla closed Pocket in July 2025 it is where many of those libraries ended up — an archive that does not vanish when a page 404s.

Deploy Wallabag on Railway and you get the production shape rather than a single container: the **wallabag** service running nginx and PHP-FPM behind a public HTTPS domain, a managed **Postgres** service holding entries, tags and users, and a managed **Redis** service backing the asynchronous importers that move large libraries out of Pocket or Instapaper. A persistent volume keeps downloaded images, sessions and the encryption key for stored site credentials, so upgrades leave your data alone. The administrator account is created on first boot from the values you supply, and public registration is off, so the instance is private from the first request.

![Diagram of the wallabag, Postgres and Redis services on Railway](https://res.cloudinary.com/rroe4rtk/image/upload/v1788880013/wallabag-architecture.png)

## Getting Started with Wallabag on Railway

Set `WALLABAG_ADMIN_PASSWORD` (and optionally `WALLABAG_ADMIN_USER`, default `wallabag`) when you deploy, then open the generated domain and sign in — there is no setup wizard and no default password left in place. The first useful action is saving something: click **+** in the top bar, paste an article URL and save. Wallabag fetches the page server-side and the entry appears in *Unread* with the extracted text, a reading-time estimate and the source domain. Open it to confirm the body rendered, then tag, star or archive it from the sidebar icons; the counters update immediately, which is the quickest check that the deployment is healthy. To bring an existing library across, open **Import**, pick your previous service and upload its export — the page reports *the current service is Redis*, meaning a background worker writes the entries while you keep browsing. Point a browser extension or mobile client at your domain; the REST API is enabled under `/api`.

![Wallabag unread list holding five saved and tagged articles](https://res.cloudinary.com/rroe4rtk/image/upload/v1788880015/wallabag-unread-list.png)
![Saved blog post open in wallabag's distraction-free reading view](https://res.cloudinary.com/rroe4rtk/image/upload/v1788880017/wallabag-article-reading.png)
![Wallabag import page reporting Redis as its asynchronous worker](https://res.cloudinary.com/rroe4rtk/image/upload/v1788880018/wallabag-async-import.png)

## About Hosting Wallabag

Wallabag is a Symfony application published under the AGPL-3.0 by a French non-profit. What it stores is a record of what you read, and the copy is only useful if it outlives the source — which is why running your own instance is the point.

- Full-text extraction with per-site rules, so most articles parse cleanly
- Tags, automatic tagging rules, annotations and highlights
- Search and filters by reading time, domain, language and status
- Export to EPUB, MOBI, PDF, JSON, CSV, XML and text
- RSS/Atom feeds for unread, starred and archived entries
- A REST API, Firefox and Chrome extensions, Android and iOS apps
- Importers for Pocket, Instapaper, Readability, Pinboard, Delicious and Omnivore
- Two-factor authentication, multiple users, per-user settings

**wallabag** serves the UI and API and does the fetching and extraction. **Postgres** stores every entry, tag, annotation and user, and with the volume it is all you need to back up. **Redis** is the queue: without it a 4,000-article Pocket import would run inside one HTTP request and time out.

## Why Deploy Wallabag on Railway

Railway removes the parts of self-hosting wallabag that are not about reading:

- HTTPS, certificates and a public domain, provisioned for you
- Managed Postgres and Redis with backups and private networking
- A persistent volume for images, sessions and encryption keys
- Schema migrations on every boot, so upgrades are a redeploy
- Scaling and metrics without a server to run

## Common Use Cases

- **A permanent research archive** — save sources as you find them, tag by project, keep the text after the original goes
- **Offline reading on an e-reader** — pull the unread feed into a Kobo or Kindle, or export as EPUB
- **A team reading list** — several accounts on one instance, each with its own tags and feeds
- **A Pocket or Instapaper migration** — upload the export and let the workers replay years of links

## Dependencies for Wallabag

- `wallabag/wallabag:latest` — the official image: nginx, PHP-FPM and the import workers
- `ghcr.io/railwayapp-templates/postgres-ssl:18` — entries, tags, annotations and users
- `redis:8.2` — the queue the asynchronous importers consume

### Environment Variables Reference

| Variable | Purpose |
|---|---|
| `WALLABAG_ADMIN_USER` | Administrator username created on first boot |
| `WALLABAG_ADMIN_PASSWORD` | Administrator password; set this before deploying |
| `SYMFONY__ENV__DOMAIN_NAME` | Public base URL, used in feeds, share links and emails |
| `SYMFONY__ENV__SECRET` | Signing key for sessions and tokens; keep it stable |
| `SYMFONY__ENV__FOSUSER_REGISTRATION` | Public signup; `false` keeps the instance private |
| `SYMFONY__ENV__MAILER_DSN` | SMTP relay for password reset and two-factor codes |
| `WALLABAG_IMPORT_WORKERS` | Which import queues get a worker |
| `PHP_MEMORY_LIMIT` | PHP memory ceiling; raise for large imports |

### Deployment Dependencies

- Source repository: [github.com/gridalpha/wallabag-railway](https://github.com/gridalpha/wallabag-railway)
- Upstream: [github.com/wallabag/wallabag](https://github.com/wallabag/wallabag) · [wallabag.org](https://www.wallabag.org/) · [doc.wallabag.org](https://doc.wallabag.org/)
- Image: [hub.docker.com/r/wallabag/wallabag](https://hub.docker.com/r/wallabag/wallabag)

## Hardware Requirements for Self-Hosting Wallabag

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| Storage | 5 GB volume | 10 GB+ with image downloading on |
| Runtime | PHP 8.1, PostgreSQL 13+, Redis 6+ | PHP 8.1+, PostgreSQL 18, Redis 8 |

A few thousand articles sit inside the minimum. Storage grows with entry count and, if you enable *Download images*, with every image in every article.

## Self-Hosting Wallabag with Docker

The quickest local run uses SQLite and nothing else:

```
docker run -p 80:80 \
  -e SYMFONY__ENV__DOMAIN_NAME=http://localhost \
  -v wallabag-data:/var/www/wallabag/data \
  wallabag/wallabag
```

For anything real, point it at PostgreSQL:

```
docker run -p 80:80 \
  -e SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql \
  -e SYMFONY__ENV__DATABASE_HOST=db \
  -e SYMFONY__ENV__DATABASE_PORT=5432 \
  -e SYMFONY__ENV__DATABASE_NAME=wallabag \
  -e SYMFONY__ENV__DATABASE_USER=wallabag \
  -e SYMFONY__ENV__DATABASE_PASSWORD=change-me \
  -e SYMFONY__ENV__DOMAIN_NAME=https://read.example.com \
  wallabag/wallabag
```

A stock image's default login is `wallabag` / `wallabag`. The Railway template replaces it at boot from `WALLABAG_ADMIN_PASSWORD`, so that pair is never live on a public URL.

## How Much Does Wallabag Cost to Self-Host?

Wallabag is free and open source under the AGPL-3.0 — no paid tier, seat limits or feature gates, and the code you deploy is the whole product. The project also runs a hosted instance, wallabag.it, from €11 a year with a 14-day trial — that is the comparison point. Self-hosting on Railway costs only the compute, database and storage the three services use, and a personal instance is small. Readeck, Karakeep and Linkding are the alternatives worth knowing; wallabag has the widest export formats and the most clients.

## FAQ

**What is Wallabag?**
A free, open-source read-it-later application that saves the readable content of any web page to your own server, so you can read, tag, annotate and search it later — offline, and after the original has changed or gone.

**What does this Railway template deploy?**
Three services: wallabag on a public HTTPS domain with a persistent volume, a managed PostgreSQL database, and a managed Redis instance as the import queue. The schema is created on the first deploy and migrated on later ones.

**Why does the template include Postgres and Redis?**
PostgreSQL holds every entry, tag, annotation and user; SQLite works for one person but does not survive container recreation gracefully. Redis backs the asynchronous importers, so migrating thousands of articles happens in background workers, not in a web request that times out.

**How do I import my Pocket or Instapaper library into self-hosted Wallabag?**
Export from the old service, open **Import**, choose the matching importer and upload the file. The job is queued in Redis and a worker writes the entries in the background; refresh the list to watch them arrive.

**Can I let other people register on my Wallabag instance?**
Set `SYMFONY__ENV__FOSUSER_REGISTRATION` to `true`. It ships as `false`, which disables the registration route entirely, so a fresh deploy is private until you decide otherwise. Set `SYMFONY__ENV__MAILER_DSN` too, so confirmation mail is sent.

**How do I use the Wallabag API from my own scripts?**
Sign in, open **API clients management**, create a client, and exchange the ID and secret for an OAuth token at `/oauth/v2/token`. Endpoints under `/api` then accept that bearer token for creating, reading, tagging and deleting entries — which is how the official extensions and mobile apps talk to your instance.


## 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/wallabag-app
