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

121 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Miniflux
Minimal self-hosted RSS reader ([miniflux.app](https://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
```bash
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**:
```bash
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/nba****Edit 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:
```bash
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
```bash
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).