Self-host Miniflux
A deliberately minimalist RSS reader — a single Go binary backed by Postgres, opinionated, fast, and almost maintenance-free.
Key facts
Pick Miniflux when you want a reader that will still look the same in five years: an Apache-2.0 Go binary that upstream calls "minimalist and opinionated", with PostgreSQL 11+ as the only supported database, a REST API, OPML import/export, passkey/OAuth2 login and 25+ third-party integrations. Two containers is the whole stack, and the config surface is a flat list of environment variables. The trade-off is that Postgres is not optional and there are no plugins, themes or page scrapers — if you want those, FreshRSS runs on SQLite and does all three.
What you need
- Any VPS with at least 256 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Paid link — we earn a commission if you shop through it.
Install with Docker Compose
Save this as compose.yml and run docker compose up -d:
# Miniflux + Postgres — the official Docker Compose example (miniflux.app/docs/docker.html)
# Upstream recommends pinning a version tag instead of :latest to avoid unexpected updates
services:
miniflux:
image: miniflux/miniflux:latest
ports:
- "80:8080"
depends_on:
db:
condition: service_healthy
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
db:
image: postgres:18
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=miniflux
volumes:
# Postgres 18 uses /var/lib/postgresql; 17 and below use /var/lib/postgresql/data
- miniflux-db:/var/lib/postgresql
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
# docker compose up -d → http://SERVER_IP — log in as admin/test123, change both, then drop the CREATE_ADMIN/ADMIN_* linesWhat you take on
Miniflux is genuinely low-maintenance once it is up, but the upgrade page and our own compose snippet both need reading first: