Skip to content

Homarr

Deploy Homarr on Kubernetes — a modern application dashboard with real-time status monitoring, Docker/Kubernetes integration, and a drag-and-drop widget editor. Connects to media servers (Plex, Jellyfin), *arr apps (Sonarr, Radarr), and many other services.

encryption.existingSecret protects all integration credentials — losing the key invalidates every integration

Homarr uses SECRET_ENCRYPTION_KEY to encrypt the API keys and passwords stored for every dashboard integration (Plex, Sonarr, Radarr, etc.). Without encryption.existingSecret, a reinstall generates a new key and permanently invalidates all saved integration credentials. Always provide a stable encryption.existingSecret before the first deployment.

Key Features

  • Embedded Redis — no separate Redis required (external Redis optional for multi-instance)
  • Three database backends — SQLite (default), PostgreSQL, MySQL with auto-detection
  • Integration encryption — all service credentials encrypted via SECRET_ENCRYPTION_KEY
  • Kubernetes workload discovery — optional live workload status in the dashboard
  • Auth providers — local credentials, LDAP, and OIDC
  • Database-aware backuptar for SQLite (/appdata), pg_dump/mysqldump for SQL databases

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install homarr helmforge/homarr -f values.yaml

OCI registry:

helm install homarr oci://ghcr.io/helmforgedev/helm/homarr -f values.yaml

Deployment Examples

# values.yaml — Homarr with SQLite (zero database configuration)
homarr:
  authProviders: credentials
  logLevel: info

encryption:
  existingSecret: homarr-encryption-key # key: secret-encryption-key
  existingSecretKey: secret-encryption-key # Generate: openssl rand -hex 32

persistence:
  enabled: true
  size: 1Gi

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: dash.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: homarr-tls
      hosts:
        - dash.example.com
# values.yaml — Homarr with bundled PostgreSQL
homarr:
  authProviders: credentials

encryption:
  existingSecret: homarr-encryption-key

postgresql:
  enabled: true
  auth:
    database: homarr
    username: homarr
    password: 'strong-db-password'
  primary:
    persistence:
      enabled: true
      size: 10Gi

persistence:
  enabled: true
  size: 1Gi

backup:
  enabled: true
  schedule: '0 3 * * *'
  s3:
    endpoint: https://s3.amazonaws.com
    bucket: homarr-backups
    existingSecret: homarr-s3-credentials

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: dash.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Homarr with Kubernetes workload discovery enabled
# Requires cluster RBAC access; configure serviceAccount if needed
homarr:
  enableKubernetes: true # live workload status in the dashboard
  authProviders: credentials

encryption:
  existingSecret: homarr-encryption-key

persistence:
  enabled: true
  size: 1Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: dash.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Homarr with OIDC authentication (e.g. Keycloak, Authelia)
homarr:
  authProviders: oidc # or: credentials,oidc for both
  extraEnv:
    - name: AUTH_OIDC_ISSUER
      value: 'https://auth.example.com/realms/myrealm'
    - name: AUTH_OIDC_CLIENT_ID
      value: homarr
    - name: AUTH_OIDC_CLIENT_SECRET
      valueFrom:
        secretKeyRef:
          name: homarr-oidc-credentials
          key: client-secret
    - name: AUTH_OIDC_CALLBACK_URL
      value: 'https://dash.example.com/api/auth/callback/oidc'

encryption:
  existingSecret: homarr-encryption-key

persistence:
  enabled: true
  size: 1Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: dash.example.com
      paths:
        - path: /
          pathType: Prefix

Configuration Reference

Core

ParameterTypeDefaultDescription
replicaCountinteger1Pod replicas. SQLite supports 1 only.
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.

Image

ParameterTypeDefaultDescription
image.repositorystringghcr.io/homarr-labs/homarrHomarr image.
image.tagstring"v1.61.0"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.

Homarr Configuration

ParameterTypeDefaultDescription
homarr.logLevelstringinfoLog level: trace, debug, info, warn, error, fatal.
homarr.authProvidersstringcredentialsAuth providers (comma-separated): credentials, ldap, oidc.
homarr.enableKubernetesbooleanfalseEnable Kubernetes workload discovery (requires cluster RBAC).
homarr.extraEnvarray[]Extra environment variables (OIDC settings, custom certs, etc.).

Encryption Key

ParameterTypeDefaultDescription
encryption.keystring""32-byte hex encryption key. Auto-generated if empty.
encryption.existingSecretstring""Existing secret with the encryption key.
encryption.existingSecretKeystringsecret-encryption-keyKey for the encryption key in the existing secret.

Database

Auto-detection precedence (database.mode: auto):

PriorityConditionResult
1database.external.host or external.existingSecretExternal DB
2postgresql.enabled: truePostgreSQL subchart
3mysql.enabled: trueMySQL subchart
4None of the aboveSQLite (default)
ParameterTypeDefaultDescription
database.modestringautoDatabase mode: auto, sqlite, external, postgresql, mysql.
database.sqlite.pathstring/appdata/db/db.sqliteSQLite file path inside the data volume.
database.external.vendorstringpostgresExternal DB vendor: postgres or mysql.
database.external.hoststring""External database hostname.
database.external.existingSecretstring""Existing secret with database password.

Subcharts

ParameterTypeDefaultDescription
postgresql.enabledbooleanfalseDeploy the bundled PostgreSQL subchart.
postgresql.auth.passwordstring""Password. Auto-generated if empty.
postgresql.primary.persistence.sizestring8GiPVC size for PostgreSQL.
mysql.enabledbooleanfalseDeploy the bundled MySQL subchart.
mysql.primary.persistence.sizestring8GiPVC size for MySQL.

Redis

Homarr includes embedded Redis — no external Redis required for single-instance deployments

Homarr ships with an embedded Redis process. External Redis is only needed if you are running multiple Homarr replicas sharing a common cache (requires PostgreSQL or MySQL, not SQLite).

ParameterTypeDefaultDescription
redis.externalbooleanfalseUse an external Redis instead of the embedded one.
redis.hoststring""External Redis hostname.
redis.portinteger6379External Redis port.
redis.existingSecretstring""Existing secret with external Redis password.
redis.existingSecretKeystringredis-passwordKey for the password in the existing secret.

Persistence

ParameterTypeDefaultDescription
persistence.enabledbooleantrueEnable PVC for /appdata (SQLite DB + dashboard config + themes).
persistence.sizestring1GiPVC size.
persistence.storageClassstring""StorageClass for the PVC.
persistence.existingClaimstring""Use an existing PVC.

Service and Ingress

ParameterTypeDefaultDescription
service.typestringClusterIPService type.
service.portinteger7575Service port (non-standard).
service.ipFamilyPolicystringnullService IP family policy.
service.ipFamiliesarray[]Ordered Service IP families.
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestring""Ingress class name.
ingress.annotationsobject{}Ingress annotations.
ingress.hostsarray[]Host and path rules.
ingress.tlsarray[]TLS configuration.

Gateway API

Use gatewayAPI.enabled to render a native Kubernetes Gateway API HTTPRoute for Homarr. Ingress stays disabled by default and can coexist with the route when a migration needs both objects.

gatewayAPI:
  enabled: true
  parentRefs:
    - name: shared-gateway
      namespace: gateway-system
      sectionName: https
  hostnames:
    - dash.example.com
  paths:
    - type: PathPrefix
      value: /
ParameterTypeDefaultDescription
gatewayAPI.enabledbooleanfalseRender an HTTPRoute.
gatewayAPI.parentRefsarray[]Parent Gateway references.
gatewayAPI.hostnamesarray[]HTTPRoute hostnames.
gatewayAPI.pathsarray/HTTPRoute path matches.
gatewayAPI.annotationsobject{}HTTPRoute annotations.

Dual-Stack Networking

Homarr’s Service supports Kubernetes dual-stack networking through optional service.ipFamilyPolicy and service.ipFamilies values. Defaults omit both fields so existing installs inherit cluster defaults.

service:
  ipFamilyPolicy: PreferDualStack

Backup

Database-aware backup: SQLite archives the full /appdata directory (tar). PostgreSQL uses pg_dump. MySQL uses mysqldump.

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled S3 backup CronJob.
backup.schedulestring"0 3 * * *"Cron schedule.
backup.archivePrefixstringhomarrPrefix for backup archive filenames.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.existingSecretstring""Existing secret with S3 credentials.
backup.database.postgresDumpArgsstring""Extra arguments for pg_dump.
backup.database.mysqlDumpArgsstring--single-transaction ...Extra arguments for mysqldump.
extraManifestsarray[]Extra Kubernetes manifests.

External Secrets

Homarr can render an External Secrets Operator ExternalSecret that projects SECRET_ENCRYPTION_KEY and AUTH_SECRET into the Kubernetes Secret configured by encryption.existingSecret.

encryption:
  existingSecret: homarr-encryption

externalSecrets:
  enabled: true
  secretStoreRef:
    name: platform-secrets
    kind: ClusterSecretStore
  data:
    - secretKey: secret-encryption-key
      remoteRef:
        key: homarr/credentials
        property: secret-encryption-key
    - secretKey: auth-secret
      remoteRef:
        key: homarr/credentials
        property: auth-secret
ParameterTypeDefaultDescription
externalSecrets.enabledbooleanfalseRender an ExternalSecret.
externalSecrets.secretStoreRef.namestring""SecretStore or ClusterSecretStore.
externalSecrets.secretStoreRef.kindstringSecretStoreSecret store kind.
externalSecrets.refreshIntervalstring"0"ExternalSecret refresh interval.
externalSecrets.dataarray[]Remote key mappings for Secret data.

More Information