→
Hvorfor Miniflux
Bevidst minimalistisk: ingen sociale funktioner, ingen oppustet UI, ekstremt let at drive. Den læser feeds, gemmer dem i PostgreSQL og eksponerer et rent API — hvilket gør den ideel som datakilde for en threat intelligence-pipeline frem for blot en læser.
Til din pipeline: Miniflux fungerer som RSS-motoren der samler dine security-feeds; n8n trækker derefter nye artikler via API'et til screening/enrichment. Forudsætning: Docker installeret.
→
Compose-stack
PostgreSQLMiniflux kræver PostgreSQL — der er ingen SQLite-mulighed. Stack med isoleret database og admin oprettet ved første start.
compose.yaml
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: miniflux
volumes:
- mf_db:/var/lib/postgresql/data
networks: [ internal ]
healthcheck:
test: [ "CMD", "pg_isready", "-U", "miniflux" ]
interval: 10s
retries: 5
miniflux:
image: miniflux/miniflux:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://miniflux:${DB_PASSWORD}@db/miniflux?sslmode=disable
RUN_MIGRATIONS: 1
CREATE_ADMIN: 1
ADMIN_USERNAME: ${ADMIN_USERNAME}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
BASE_URL: https://rss.defencia.dk/
ports:
- "127.0.0.1:8080:8080"
networks: [ internal, web ]
volumes:
mf_db:
networks:
internal:
internal: true
web:
RUN_MIGRATIONS opretter/opdaterer skemaet automatisk. CREATE_ADMIN laver admin-brugeren ved første opstart fra env-værdierne.
.env
DB_PASSWORD=# openssl rand -base64 24
ADMIN_USERNAME=lars
ADMIN_PASSWORD=# vælg et stærkt password
→
Første start
Start stacken
docker compose up -d
docker compose logs -f miniflux
Opret ekstra admin manuelt (valgfrit)
docker compose exec miniflux \
miniflux -create-admin
Login: Når proxyen er på plads, gå til
https://rss.defencia.dk og log ind med admin-brugeren. Tilføj feeds enkeltvis eller importér en hel OPML-fil under Settings → Import.→
Reverse-proxy (Nginx)
/etc/nginx/sites-available/rss.defencia.dk
server {
listen 443 ssl;
server_name rss.defencia.dk;
# ssl_certificate ... (Certbot indsætter)
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Miniflux har ikke websockets — proxy-blokken er enklere end n8n's. BASE_URL i compose skal matche dette hostname.
Cert:
sudo certbot --nginx -d rss.defencia.dk eller dit wildcard for *.defencia.dk.→
API til automatisering
REST + FeverDet er her Miniflux skinner som pipeline-komponent. Generér en API-token under Settings → API Keys og kald REST-API'et fra n8n.
| Endpoint | Funktion |
|---|---|
GET /v1/entries?status=unread | Hent ulæste artikler (til screening i n8n) |
GET /v1/feeds | Liste alle abonnerede feeds |
POST /v1/feeds | Tilføj et nyt feed programmatisk |
PUT /v1/entries | Markér artikler som læst/ulæst i bulk |
GET /v1/entries?search=TERM | Fuldtekst-søgning på tværs af feeds |
GET /v1/me | Verificér token / brugerinfo |
Eksempel — hent ulæste via curl
curl -H "X-Auth-Token: DIN_TOKEN" \
"https://rss.defencia.dk/v1/entries?status=unread&limit=50"
Pipeline-mønster: n8n schedule-trigger → kald
/v1/entries?status=unread → screen med Mistral → enrich → markér som læst via PUT /v1/entries. Token sættes som n8n-credential, så den aldrig ligger i klartekst i workflowet.→
Drift
Opdatér
docker compose pull
docker compose up -d
Migrations køres automatisk ved opstart pga. RUN_MIGRATIONS=1.
Backup database
docker compose exec db \
pg_dump -U miniflux miniflux > mf_$(date +%F).sql
Eksportér feeds (OPML)
# i UI: Settings → Export → OPML
# eller via API: GET /v1/export
Tjek status
docker compose ps
docker compose logs --tail=50 miniflux
Til din backup-stack: Tag et OPML-eksport (dine ~71 kuraterede feeds, portabelt) plus et
pg_dump (læste/ulæste states, stjernemarkeringer). OPML alene er nok til at genopbygge abonnementerne hvis databasen går tabt.→
Hærdning
| Kontrol | Anbefaling |
|---|---|
| Eksponering | Bind til 127.0.0.1:8080, kun via Nginx + HTTPS |
| Database | Postgres på internal-netværk, ingen værts-port |
| API-token | Brug token, ikke basic-auth, til automatisering; roter ved behov |
| Login | Stærkt admin-password; Fail2ban-jail på login |
| Feed-proxy | Overvej FETCH_*-timeouts mod langsomme/ondsindede feeds |
| Brugere | Opret separat ikke-admin-bruger til API hvis muligt |
| Opdatering | Hold imaget opdateret — Go-binæren er lille, opgraderinger er hurtige |
Husk Docker+UFW-fælden: Bind til
127.0.0.1:8080 — aldrig 0.0.0.0 for interne tjenester. Se Docker-guiden.