6c96ffef01
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.
121 lines
3.7 KiB
Markdown
121 lines
3.7 KiB
Markdown
# 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).
|