# miniflux A Helm chart for Miniflux, a minimalist and open source RSS reader. ## TL;DR ```bash helm install miniflux oci://git.roboces.dev/catalin/fukuops/miniflux --version 1.0.1 -n apps-roboces ``` ## Prerequisites - Kubernetes 1.19+ - Helm 3+ - An existing `Secret` containing: - `DATABASE_URL` - PostgreSQL connection string - `ADMIN_USERNAME` - Admin username (optional if oauth2 is configured) - `ADMIN_PASSWORD` - Admin password (optional if oauth2 is configured) ## Configuration All values are nested under the `miniflux:` key. Example: ```yaml miniflux: service: type: LoadBalancer config: database: url: "postgres://user:pass@host:5432/miniflux" general: createAdmin: true runMigrations: true workerPoolSize: 1 pollingFrequency: 60 oauth2: enabled: true provider: oidc redirectUrl: https://feeds.example.com/oauth2/oidc/callback oidcDiscoveryEndpoint: https://auth.example.com/application/o/miniflux/ userCreation: true metrics: enabled: true allowedNetworks: 10.0.0.0/8 secret: existingSecretName: miniflux ``` ## Values Reference ### Main Settings | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.replicaCount` | int | `1` | Number of replicas | | `miniflux.image.repository` | string | `miniflux/miniflux` | Image repository | | `miniflux.image.pullpolicy` | string | `always` | Image pull policy | | `miniflux.image.tag` | string | `.Chart.AppVersion` | Image tag | | `miniflux.service.type` | string | `ClusterIP` | Service type | | `miniflux.service.port` | int | `8888` | Service port | | `miniflux.service.targetPort` | int | `8080` | Container port | | `miniflux.ingress.enabled` | bool | `false` | Enable ingress | | `miniflux.resources` | object | `{}` | Container resources | | `miniflux.livenessProbe` | object | `{}` | Liveness probe | | `miniflux.readinessProbe` | object | `{}` | Readiness probe | | `miniflux.secret.existingSecretName` | string | `""` | Existing secret name | | `miniflux.debug.enabled` | bool | `false` | Enable debug mode (adds init container for troubleshooting) | | `miniflux.nodeSelector` | object | `{}` | Node selector | | `miniflux.tolerations` | array | `[]` | Tolerations | | `miniflux.affinity` | object | `{}` | Affinity rules | | `miniflux.autoscaling.enabled` | bool | `false` | Enable autoscaling | | `miniflux.autoscaling.minReplicas` | int | `1` | Minimum replicas | | `miniflux.autoscaling.maxReplicas` | int | `3` | Maximum replicas | | `miniflux.autoscaling.targetCPUUtilizationPercentage` | int | `80` | Target CPU utilization for HPA | | `miniflux.autoscaling.targetMemoryUtilizationPercentage` | int | `80` | Target memory utilization for HPA | ### Database Configuration | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.config.database.url` | string | `""` | PostgreSQL connection URL | ### General Configuration | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.config.general.createAdmin` | bool | `false` | Create admin user on startup | | `miniflux.config.general.runMigrations` | bool | `false` | Run database migrations | | `miniflux.config.general.workerPoolSize` | int | `1` | Number of worker threads | | `miniflux.config.general.pollingFrequency` | int | `60` | Feed refresh interval (minutes) | | `miniflux.config.general.batchSize` | int | `10` | Number of feeds to refresh per batch | ### OAuth2 Configuration | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.config.oauth2.enabled` | bool | `false` | Enable OAuth2 authentication | | `miniflux.config.oauth2.provider` | string | `oidc` | OAuth2 provider | | `miniflux.config.oauth2.redirectUrl` | string | `""` | OAuth redirect URL | | `miniflux.config.oauth2.oidcDiscoveryEndpoint` | string | `""` | OIDC discovery endpoint URL | | `miniflux.config.oauth2.userCreation` | bool | `false` | Allow OAuth users to create accounts | ### Metrics Configuration | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.config.metrics.enabled` | bool | `false` | Enable metrics endpoint | | `miniflux.config.metrics.allowedNetworks` | string | `""` | Networks allowed to access metrics (CIDR) | ### YouTube Configuration | Key | Type | Default | Description | |-----|------|---------|-------------| | `miniflux.config.youtube.fetchWatchTime` | bool | `false` | Fetch YouTube watch time data | ## Secret Management The chart looks for an existing `Secret` with the name specified in `miniflux.secret.existingSecretName`. Required secret keys: - `DATABASE_URL` - PostgreSQL connection string - `ADMIN_USERNAME` - Admin username (if `config.general.createAdmin=true`) - `ADMIN_PASSWORD` - Admin password (if `config.general.createAdmin=true`) ## Troubleshooting ### Debug Mode Enable debug mode to troubleshoot issues by adding an init container with a shell: ```yaml miniflux: debug: enabled: true ``` This adds an `alpine:3.19` init container with `sleep infinity` that mounts all volumes and inherits env vars. You can exec into it to inspect the environment: ```bash kubectl exec -it -c debug -- sh ``` When debug mode is enabled, liveness and readiness probes are disabled to prevent restarts. ### Check logs ```bash kubectl logs miniflux-0 -n apps-roboces ``` ### Verify configmap ```bash kubectl get configmap miniflux-config -n apps-roboces -o yaml ```