Install Miniflux RSS Reader
Install the Miniflux self-hosted RSS reader on Linux: single binary, PostgreSQL backend, Fever API for mobile clients, and OPML import in under 30 minutes.
Before you start
- ▸A Linux server with sudo access and a reachable hostname or IP
- ▸PostgreSQL 13 or newer installed (guide covers installation)
- ▸Outbound internet access from the server to fetch feeds
- ▸Basic familiarity with editing files and running systemctl commands
Miniflux is a minimalist, self-hosted RSS reader written in Go. It ships as a single static binary, stores everything in PostgreSQL, and exposes a clean web UI plus a Fever-compatible API so third-party apps can connect to it. Because there is no PHP, no Node, and no separate worker process, a working install takes under 30 minutes on any modern Linux server.
Prerequisites
- A Linux server with a public or LAN hostname (or IP) you can reach from a browser
- PostgreSQL 13 or newer installed and running
- A non-root user with
sudoaccess - Port 8080 (or your chosen port) reachable through your firewall
Step 1 — Install PostgreSQL and Create the Database
Install PostgreSQL
On Debian/Ubuntu:
sudo apt update && sudo apt install -y postgresql postgresql-contrib
On Fedora / RHEL / Rocky:
sudo dnf install -y postgresql-server postgresql-contrib
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
On Arch:
sudo pacman -S postgresql
sudo -u postgres initdb -D /var/lib/postgres/data
sudo systemctl enable --now postgresql
Create the Miniflux role and database
sudo -u postgres psql -c "CREATE USER miniflux WITH PASSWORD 'strongpassword';"
sudo -u postgres psql -c "CREATE DATABASE miniflux OWNER miniflux;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE miniflux TO miniflux;"
Replace strongpassword with a real secret. Miniflux also needs the hstore extension, but it creates it automatically on first run — no manual step required.
Step 2 — Download the Miniflux Binary
Miniflux publishes pre-built binaries for every release on GitHub. Find the latest version number at github.com/miniflux/v2/releases, then download the appropriate binary for your architecture.
MINIFLUX_VERSION=2.1.4
ARCH=linux-amd64 # use linux-arm64 for ARM servers
wget -O /tmp/miniflux "https://github.com/miniflux/v2/releases/download/${MINIFLUX_VERSION}/miniflux-${ARCH}"
sudo install -o root -g root -m 0755 /tmp/miniflux /usr/local/bin/miniflux
Verify the binary runs:
miniflux -version
Output will be something like Miniflux 2.1.4 (BuildDate: ..., Commit: ...).
Step 3 — Configure Miniflux
Miniflux reads configuration from environment variables or an .env-style config file. Create a dedicated config file at /etc/miniflux.conf:
sudo tee /etc/miniflux.conf <<'EOF'
LISTEN_ADDR=127.0.0.1:8080
DATABASE_URL=postgres://miniflux:strongpassword@localhost/miniflux?sslmode=disable
RUN_MIGRATIONS=1
CREATE_ADMIN=1
ADMIN_USERNAME=admin
ADMIN_PASSWORD=changeme123!
EOF
sudo chmod 600 /etc/miniflux.conf
Key options explained:
- LISTEN_ADDR — bind to localhost if you plan to reverse-proxy with nginx or Caddy; use
0.0.0.0:8080to expose directly. - RUN_MIGRATIONS=1 — applies schema migrations automatically on startup. Safe to leave enabled permanently.
- CREATE_ADMIN=1 — creates the admin account on first run only; ignored if the user already exists.
- sslmode=disable — acceptable for a local socket or loopback connection. Use
sslmode=requirefor remote PostgreSQL.
Change ADMIN_PASSWORD to something strong before continuing.
Step 4 — Create the systemd Service
sudo tee /etc/systemd/system/miniflux.service <<'EOF'
[Unit]
Description=Miniflux RSS Reader
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
EnvironmentFile=/etc/miniflux.conf
ExecStart=/usr/local/bin/miniflux
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now miniflux
Check the service started cleanly:
sudo systemctl status miniflux
You should see Active: active (running). If the database credentials are wrong, the service will fail immediately and journalctl -eu miniflux will show the PostgreSQL connection error.
Step 5 — Open the Firewall
Skip this step if Miniflux is bound to 127.0.0.1 and you are using a reverse proxy. If you are exposing it directly:
ufw (Debian/Ubuntu):
sudo ufw allow 8080/tcp
firewalld (Fedora/RHEL/Rocky):
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
nftables (any distro, manual config):
sudo nft add rule inet filter input tcp dport 8080 accept
Step 6 — First Login and UI Overview
Open http://your-server-ip:8080 in a browser. Log in with the admin credentials you set in /etc/miniflux.conf. The default theme is already clean and readable with good contrast — no configuration needed for a pleasant reading experience. Under Settings → Display you can switch between themes, adjust the time format, and enable a sans-serif or serif font.
Step 7 — Enable the Fever API
The Fever API lets clients like Reeder, NetNewsWire, Fluent Reader, and others connect to your Miniflux instance as if it were a Fever server. Enable it in the web UI under Settings → Integrations → Fever API. Set a dedicated Fever password (it does not have to match your login password). The API endpoint will be:
http://your-server-ip:8080/fever/
In your RSS client, enter that URL along with your Miniflux username and the Fever password you just set. Most clients that support Fever will auto-discover the feed list on first connect.
Step 8 — Import Feeds with OPML
If you are migrating from another reader, export an OPML file from it, then import it into Miniflux via Settings → Import/Export → Import OPML. Miniflux parses the OPML, creates feed categories from the OPML <outline> folders, and begins fetching all feeds immediately. A 200-feed import typically finishes within a few minutes depending on how fast remote servers respond.
To export your feeds later for backup or migration:
# Download your OPML via the API with basic auth
curl -u admin:changeme123! http://127.0.0.1:8080/v1/export -o miniflux-export.opml
Step 9 — Verify Everything Works
# Check the service is running
systemctl is-active miniflux
# Confirm it is listening on the expected address
ss -tlnp | grep miniflux
# Hit the health endpoint
curl -s http://127.0.0.1:8080/healthcheck
/healthcheck returns OK when the app and database connection are healthy. If it returns an error, check journalctl -eu miniflux --since '5 minutes ago'.
Troubleshooting
Service fails to start — connection refused / authentication failed
The most common cause is a wrong DATABASE_URL. Confirm the role and database exist, the password matches, and that pg_hba.conf allows password (md5 or scram-sha-256) auth for local connections. On RHEL-family systems the default pg_hba.conf uses ident auth — change the localhost entry to md5 or scram-sha-256 and reload PostgreSQL.
sudo systemctl reload postgresql
Feeds never update
Miniflux runs its own internal scheduler; no cron job is needed. If feeds show stale content, check whether the server can reach external hosts (curl https://feeds.feedburner.com) and that no firewall or proxy is blocking outbound HTTP/HTTPS.
Fever API returns 401 in third-party apps
The Fever protocol hashes credentials before sending them. Make sure you are entering the Miniflux account username paired with the Fever-specific password, not your login password. Regenerate the Fever password in Settings and retry.
Upgrading Miniflux
Download the new binary, overwrite the old one with sudo install as in Step 2, then restart the service. With RUN_MIGRATIONS=1 set, schema migrations run automatically on startup.
sudo systemctl restart miniflux
journalctl -eu miniflux -n 30Frequently asked questions
- Can I use SQLite instead of PostgreSQL with Miniflux?
- No. Miniflux only supports PostgreSQL. SQLite was never part of the project; the PostgreSQL requirement is by design for concurrency and correctness.
- How do I put Miniflux behind an nginx reverse proxy with HTTPS?
- Bind Miniflux to 127.0.0.1:8080, then create an nginx server block with proxy_pass http://127.0.0.1:8080. Use Certbot or Caddy to terminate TLS. Set BASE_URL in /etc/miniflux.conf to your public HTTPS URL so redirects and the Fever endpoint URL are correct.
- Does Miniflux support the Google Reader / Reeder API in addition to Fever?
- Yes. Miniflux also implements the Google Reader-compatible API (sometimes called the Fever+GReader API). Enable it under Settings → Integrations → Google Reader API with its own password, then point compatible clients to http://your-host:8080/greader.php.
- How often does Miniflux check feeds, and can I change the interval?
- By default Miniflux checks each feed every 60 minutes using its built-in scheduler. You can tune this with the POLLING_FREQUENCY (minutes) and BATCH_SIZE environment variables in your config file. Setting POLLING_FREQUENCY=15 checks feeds four times an hour.
- Is there a Docker install option if I prefer containers?
- Yes. The official image is miniflux/miniflux on Docker Hub. A two-container Docker Compose setup with the miniflux and postgres services is documented in the official Miniflux docs and is a good alternative if you already manage containerized services.
Related guides
Configure Prometheus Alertmanager
Configure Prometheus Alertmanager with routing trees, receivers, inhibition rules, grouping, Go templates, and PagerDuty/Slack on-call integrations.
Build an Intranet Server on Linux
Set up a complete small-office intranet on one Linux box: Nginx web server, dnsmasq local DNS, Samba file sharing, and a Wiki.js team wiki.
Build an nftables Firewall Script
Build a complete nftables firewall from scratch: tables, chains, sets, default-deny input policy, service allowlisting, and persistent systemd configuration.
Caddy as a Reverse Proxy
Set up Caddy as a reverse proxy with automatic HTTPS, load balancing, WebSocket passthrough, reusable snippets, and header control — no certbot required.