Files
esh-pfi-infrastructure/stacks/miniflux/README.md
T
vh 6c96ffef01 stacks/miniflux: self-hosted RSS reader + News group on homepage
Adds Miniflux on ana-docker as the unified inbox for tech blogs,
Hacker News, lobste.rs, and selected subreddits. Reddit serves clean
RSS for any sub at https://reddit.com/r/<sub>/.rss, so subreddit
follows fold into the same inbox as everything else — no Reddit
account needed, no manual polling.

Stack:
  stacks/miniflux/
    compose.yaml          — miniflux + bundled postgres:16
    .env.example          — placeholders for DB password + admin user
    starter-feeds.opml    — initial subscriptions (HN, Lobste.rs,
                            r/selfhosted, r/homelab, r/LocalLLaMA, r/nba)
    README.md             — deploy / OPML import / r/nba spoiler
                            block-list / backup / update flow

Postgres bundled with the stack (not pfi-postgres) — single-user RSS
DB is tiny and the bundle keeps the dependency graph flat.

Homepage gets a new 'News' group at the TOP of the Main tab (above
Monitoring) so the Miniflux card sits prominently. The card itself
auto-discovers via the homepage.* labels on the miniflux container.

Per-feed block-list rule for r/nba documented in README — Reddit's
RSS titles for game threads include scores ("Lakers 108 - Warriors
102 [Final]") which spoil the game; a regex catches the score
patterns and skips those entries while keeping discussion/highlights.

Deploy:
  scripts/elway ana-docker --playbook playbooks/deploy-miniflux.yaml

Then edit /opt/docker/compose/miniflux/.env on the host to fill in
the two CHANGE_ME passwords and `docker compose up -d` again.
2026-04-26 11:52:50 -07:00

3.7 KiB
Raw Blame History

Miniflux

Minimal self-hosted RSS reader (miniflux.app, Apache 2.0, ~30 MB Go single-binary). One unified inbox for tech blogs, Hacker News, Lobste.rs, and selected subreddits.

Why this stack

The fleet doesn't have a feed reader yet. Reddit subreddits expose clean RSS feeds at https://reddit.com/r/<sub>/.rss, so subscribing to your relevant subs alongside HN / blogs gives you a single place to scan recent activity — no Reddit account needed, no polling multiple sites by hand.

Self-hosted on ana-docker (10.250.50.70). Postgres bundled in the stack rather than sharing pfi-postgres — keeps the dependency graph flat and the DB is tiny (single-user).

Deploy

scripts/elway ana-docker --playbook playbooks/deploy-miniflux.yaml

Cold deploy budget: ~250 MB image pull (postgres:16 + miniflux), ~10 s startup, ~1 s warmup.

After deploy, the .env on ana-docker still has placeholder passwords — edit those before first start succeeds:

ssh ana-docker '
  cd /opt/docker/compose/miniflux
  sed -i "s|^MINIFLUX_DB_PASSWORD=.*|MINIFLUX_DB_PASSWORD=$(openssl rand -base64 24)|" .env
  sed -i "s|^MINIFLUX_ADMIN_PASSWORD=.*|MINIFLUX_ADMIN_PASSWORD=$(openssl rand -base64 18)|" .env
  grep ^MINIFLUX_ADMIN_PASSWORD .env  # one-time copy this for first login
  docker compose up -d
'

Then login at http://10.250.50.70:8080 with the username from .env (lkraven by default) and the printed admin password.

Initial feed setup — OPML import

A starter OPML at stacks/miniflux/starter-feeds.opml covers:

  • Hacker News + Lobste.rs
  • r/selfhosted, r/homelab, r/LocalLLaMA
  • r/nba (with spoiler caveat — see below)

Import via Miniflux UI: Settings → Import → Choose File → select the OPML → Submit. All feeds appear in their categories; first refresh fetches the most recent posts within seconds.

r/nba spoiler block-list

Subreddit-RSS titles for game-day threads include final scores (e.g. Lakers 108 - Warriors 102 [Final]). Miniflux supports per-feed regex block rules to skip these.

After importing the OPML:

  1. Go to Feeds → click r/nbaEdit Feed

  2. In the Block Filter field, paste:

    \b\d{2,3}\s*[-]\s*\d{2,3}\b|\[Final|Final Score|Game Thread.*\d{2,3}
    
  3. Save. Past matching entries stay (they were already fetched); future fetches skip score-bearing headlines. Discussion threads, highlights, and meta-content still come through.

If a real post slips through with a score in the title, refine the regex.

Adding subreddits later

Reddit RSS URL patterns:

URL Returns
https://reddit.com/r/<sub>/.rss Newest posts (firehose)
https://reddit.com/r/<sub>/top/.rss?t=day Top-of-day (less spam)
https://reddit.com/r/<sub>/top/.rss?t=week Top-of-week
https://reddit.com/r/<sub>/hot/.rss Currently hot

top/.rss?t=day is the lowest-noise option for high-volume subs where you want highlights only.

In Miniflux: Feeds → New Feed → URL, paste, pick a category.

Backup

Miniflux state lives in the named volume miniflux-db-data. To include in restic, add a pre-backup.sh step on ana-docker that dumps the DB to a stage path:

docker exec miniflux-db pg_dump -U miniflux miniflux \
  > /var/lib/restic/stage/miniflux.sql

Then restic's regular sweep picks up the SQL file. Subscriptions and read-state are tiny (~MB even with months of history); the dump is fast.

Updating

ssh ana-docker '
  cd /opt/docker/compose/miniflux
  sed -i "s|^MINIFLUX_VERSION=.*|MINIFLUX_VERSION=<new>|" .env
  docker compose pull miniflux
  docker compose up -d
'

Migrations run automatically on container start (RUN_MIGRATIONS=1 in compose.yaml).