Miniflux¶
Miniflux is a minimalist, self-hosted RSS/Atom feed reader available at miniflux.hdhomelab.com. All state lives in PostgreSQL — there are no persistent volumes to manage.
Deployment¶
Miniflux runs in Kubernetes (media namespace) as a single-replica Deployment. It authenticates users via Authentik OIDC and stores all data in an external PostgreSQL database.
graph LR
User -->|HTTPS| Gateway[Cilium Gateway]
Gateway --> Miniflux[Miniflux Deployment]
Miniflux -->|DATABASE_URL| PostgreSQL[(PostgreSQL NAS)]
Miniflux -->|OIDC| Authentik[Authentik SSO]
Vault -->|ExternalSecret| K8sSecret[K8s Secret]
K8sSecret -->|env vars| Miniflux
-
URL
-
Namespace
media -
Database
PostgreSQL on NAS — role
miniflux, dbminiflux -
Auth
Authentik OIDC
-
Image
ghcr.io/miniflux/miniflux -
Config
flux/apps/noah/media/miniflux/
Secrets¶
Secrets are pulled from Vault and assembled by the ExternalSecrets operator. The DATABASE_URL is constructed via a template — only atomic credentials are stored in Vault.
| Vault path | Key | Used as |
|---|---|---|
psql/miniflux |
username |
Interpolated into DATABASE_URL |
psql/miniflux |
password |
Interpolated into DATABASE_URL |
miniflux/oidc |
client-id |
OAUTH2_CLIENT_ID |
miniflux/oidc |
client-secret |
OAUTH2_CLIENT_SECRET |
The ExternalSecret template constructs the connection string at sync time:
template:
data:
database-url: "postgres://{{ .db_username }}:{{ .db_password }}@nas:5432/miniflux?sslmode=disable"
No manual secret required
After running tofu apply for the psql module, the credentials are stored in Vault automatically. The ExternalSecret handles constructing the full DATABASE_URL — no manual secret writing needed.
OIDC Configuration¶
Miniflux authenticates users via Authentik using OpenID Connect.
| Setting | Value |
|---|---|
OAUTH2_PROVIDER |
oidc |
OAUTH2_OIDC_PROVIDER_NAME |
Authentik |
OAUTH2_REDIRECT_URL |
https://miniflux.hdhomelab.com/oauth2/oidc/callback |
OAUTH2_OIDC_DISCOVERY_ENDPOINT |
https://auth.hdhomelab.com/application/o/miniflux/.well-known/openid-configuration |
The OIDC application and provider are managed via OpenTofu. The entry in tofu/tf-deploy/authentik/locals.tf:
miniflux = {
name = "Miniflux"
type = "oidc"
groups = {
miniflux_user = {
user_names = distinct(concat(local.admin_users, local.power_users, local.family_power_users))
bind_order = 10
}
}
redirect_uris = [{
matching_mode = "strict"
url = "https://miniflux.hdhomelab.com/oauth2/oidc/callback"
}]
}
Client credentials are written to Vault at apps/miniflux/oidc automatically after apply.
PostgreSQL Setup¶
The miniflux role and database are provisioned via the psql module. See PostgreSQL Provisioning for the full pattern.
The entry in tofu/tf-deploy/psql/locals.tf:
cd tofu/tf-deploy/psql
tofu init -backend-config=backend.pg.tfbackend
tofu plan -out plan.out
tofu apply plan.out
Tip
After applying, credentials are stored in Vault at apps/psql/miniflux. The ExternalSecret picks them up automatically on the next sync cycle.
Key Environment Variables¶
| Variable | Value |
|---|---|
DATABASE_URL |
Constructed by ExternalSecret template |
BASE_URL |
https://miniflux.hdhomelab.com |
RUN_MIGRATIONS |
1 — auto-run DB migrations on startup |
OAUTH2_PROVIDER |
oidc |
OAUTH2_CLIENT_ID |
From Vault via ExternalSecret |
OAUTH2_CLIENT_SECRET |
From Vault via ExternalSecret |
OAUTH2_REDIRECT_URL |
https://miniflux.hdhomelab.com/oauth2/oidc/callback |
OAUTH2_OIDC_DISCOVERY_ENDPOINT |
Authentik discovery URL |
OAUTH2_OIDC_PROVIDER_NAME |
Authentik |