Files
esh-pfi-infrastructure/stacks/miniflux/compose.yaml
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

86 lines
2.8 KiB
YAML

# Miniflux — minimal self-hosted RSS reader (Go single-binary, ~30 MB image).
# Apache 2.0. https://miniflux.app/
#
# Use case: unified inbox across tech blogs, Hacker News, lobste.rs,
# and selected subreddits (Reddit serves an .rss feed for any sub at
# https://reddit.com/r/<sub>/.rss). Subreddits with score-spoiler
# headlines (e.g. r/nba) get a per-feed block-list rule — see README.
#
# Architecture: this stack bundles its own Postgres rather than using
# the shared pfi-postgres at 10.250.50.80. Single-user RSS DB is tiny
# (~MB scale per year) and the bundle reduces cross-host coupling.
# Backup: postgres data lives in the named volume miniflux-db-data;
# capture via `docker exec miniflux-db pg_dump -U miniflux miniflux`
# in restic's pre-backup hook (separate stack — TODO).
#
# All tunables live in .env — edit that, not this file.
services:
miniflux:
image: miniflux/miniflux:${MINIFLUX_VERSION}
container_name: miniflux
restart: unless-stopped
depends_on:
miniflux-db:
condition: service_healthy
ports:
- "${MINIFLUX_BIND:-0.0.0.0}:${MINIFLUX_PORT}:8080"
environment:
- DATABASE_URL=postgres://miniflux:${MINIFLUX_DB_PASSWORD}@miniflux-db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=${MINIFLUX_ADMIN_USERNAME}
- ADMIN_PASSWORD=${MINIFLUX_ADMIN_PASSWORD}
- LOG_LEVEL=${MINIFLUX_LOG_LEVEL:-info}
- HTTPS=0
- LISTEN_ADDR=0.0.0.0:8080
healthcheck:
# Miniflux ships with a built-in healthcheck command.
test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
networks:
- miniflux-net
- tnet
labels:
- homepage.group=News
- homepage.name=Miniflux
- homepage.icon=mdi-rss
- homepage.description=RSS reader (subreddits, blogs, HN)
- homepage.href=http://10.250.50.70:${MINIFLUX_PORT}
miniflux-db:
image: postgres:16
container_name: miniflux-db
restart: unless-stopped
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=${MINIFLUX_DB_PASSWORD}
- POSTGRES_DB=miniflux
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
volumes:
- miniflux-db-data:/var/lib/postgresql/data
networks:
- miniflux-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U miniflux"]
interval: 10s
timeout: 5s
retries: 5
volumes:
miniflux-db-data:
networks:
# Internal — only miniflux talks to miniflux-db. DB is not on tnet
# so it's not reachable from elsewhere on traefik-net.
miniflux-net:
name: miniflux-net
# Shared external — homepage's docker auto-discovery scans this
# network for the homepage.* labels above.
tnet:
name: traefik-net
external: true