Skip to content

Self-host Miniflux

updated Sep 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

A deliberately minimalist RSS reader — a single Go binary backed by Postgres, opinionated, fast, and almost maintenance-free.

Key facts

CategoryRSS reader
LicenseApache-2.0
StackGo, PostgreSQL
Min RAM256 MB
Official imageyes
Measured idle RAM49 MB
Difficulty
Our recommendation

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
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

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_* lines

What 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:

non-negotiableOur compose snippet's db service is postgres:16 with no environment and no volume. The Postgres image says POSTGRES_PASSWORD "is required ... It must not be empty or undefined", so expect the db container not to come up as written, and nothing creates the miniflux role or database that DATABASE_URL names. Upstream's contrib/docker-compose/basic.yml sets POSTGRES_USER=miniflux, POSTGRES_PASSWORD=secret, POSTGRES_DB=miniflux and mounts miniflux-db:/var/lib/postgresql — copy that.
non-negotiableNo user exists unless you set CREATE_ADMIN=1 with ADMIN_USERNAME and ADMIN_PASSWORD, or run miniflux -create-admin inside the container, which prompts for a username and password. Our snippet does neither.
non-negotiableThe upgrade page is blunt: "Please do not update the software blindly without reading the release notes." The procedure is -flush-sessions, stop, back up the database and verify the backup, update, then migrate (RUN_MIGRATIONS=1 or miniflux -migrate). Recent breaking notes: 2.2.16 requires TRUSTED_REVERSE_PROXY_NETWORKS when AUTH_PROXY_HEADER is used, 2.2.17 removed FILTER_ENTRY_MAX_AGE_DAYS, and 2.2.18 blocks private networks unless FETCHER_ALLOW_PRIVATE_NETWORKS=1 / INTEGRATION_ALLOW_PRIVATE_NETWORKS=1. The Docker docs recommend pinning a version tag rather than latest.
non-negotiableBehind a proxy set BASE_URL (default http://localhost) to your public URL and HTTPS=1 so cookies get the secure flag and HSTS is sent; LISTEN_ADDR defaults to 127.0.0.1:8080. Since 2.3.3 Unix sockets are created 0660, so a proxy talking over a socket must share the Miniflux group.
non-negotiablePostgreSQL 11 or newer is the requirement (the hstore extension has not been needed since 2.0.27). The 256 MB floor is our estimate for the Miniflux container alone — the requirements page lists OS, database and browser but no hardware — and Postgres adds its own.

An alternative to

Head-to-head

More self-hosted tools

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.