Terraform module to deploy the Homepage dashboard on Kubernetes with cluster mode enabled for Service discovery and healthchecks.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Go to file
RaviAnand Mohabir 283463dfe1
continuous-integration/drone/push Build is passing Details
Merge branch 'main' of https://gitea.ravianand.me/Dan6erbond/terraform-kubernetes-homepage
2 years ago
.drone.yml ci: 👷 add `git fetch --tags` to CI commands to fix semver 2 years ago
CHANGELOG.md chore(release): 1.4.0 [CI SKIP] 2 years ago
README.md docs: add README with usage guide and configuration 2 years ago
main.tf feat: update layout to use list to maintain ordering 2 years ago
variables.tf feat: add `user`, `token` and `salt` variables to widget options for Navidrome 2 years ago

README.md

Homepage on Kubernetes

Terraform module to deploy the Homepage dashboard on Kubernetes.

Features

  • Deploys Homepage to Kubernetes using standard conventions for Kubernetes labels and selectors.
  • Creates a ServiceAccount with the required permissions for service discovery.
  • Enables cluster mode in Homepage config to use the ServiceAccount.
  • Deploys an Ingress resource with user-configurable annotations (e.g. for Nginx/Traefik).
  • Automatically sets the Homepage base setting with https:// for common configurations.
  • Uses Types for all Homepage configs to improve DX.

Usage

The following variables can be configured:

  • host - Host under which Homepage is served.
  • namespace - Namesplace to deploy Homepage to. default is the standard.
  • volumes - Additional volumes to mount to the container. Can be useful to mount additional drives and display available storage.
  • ingress_annotations - Annotations to add to the ingress. Useful to configure Traefik/Nginx certificates or entrypoints.
  • services_config - List of groups and services to show in Homepage. Supports Kubernetes namespace, app and podSelector.
  • widgets_config - List of widgets to show in Homepage.
  • settings - Homepage settings configuration.
  • bookmarks - List of bookmarks to show in Homepage.
  • docker_config - Enabled for compatibility with a future Docker module.
  • kubernetes_config - Configuration for Kubernetes service discovery, using either Kubeconfig or default ServiceAccount with mode set to cluster.

Add the module like this:

module "homepage" {
  source = "Dan6erbond/homepage/kubernetes"
  version = "1.0.0"
  namespace = "homepage"
  volumes = [
    {
      name                    = "ssd"
      persistent_volume_claim = local.homepage_ssd_pvc
      mount_path              = "/mnt/ssd"
      read_only               = false
    },
    {
      name = "media"
      host_path = {
        path = "/mnt/media"
      }
      mount_path = "/mnt/media"
    }
  ]
  ingress_annotations = {
    "traefik.ingress.kubernetes.io/router.entrypoints"      = "websecure"
    "traefik.ingress.kubernetes.io/router.tls.certresolver" = "letsencrypt"
  }
  services_config = [
    { Admin = [
      { Grafana = {
        icon      = "grafana.png"
        href      = "https://grafana.ravianand.me"
        namespace = "monitoring"
        app       = "grafana"
      } },
    }
  ]
  widgets_config = [
    {
      resources = {
        label  = "System"
        cpu    = true
        memory = true
        disk   = "/mnt/ssd"
      }
    },
    {
      resources = {
        label = "Media"
        disk  = "/mnt/media"
      }
    },
    {
      datetime = {
        text_size = "xl"
        format = {
          timeStyle = "short"
          hour12    = false
        }
      }
    }
  ]
  settings = {
    title             = "Dan6erbond Homelab"
    background        = "https://images.unsplash.com/photo-1579567761406-4684ee0c75b6?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=987&q=80"
    backgroundOpacity = "0.15"
    theme             = "dark"
    layout = {
      Media = {
        icon    = "mdi-filmstrip"
        style   = "row"
        columns = 4
      }
    }
  }
}

Homepage Configuration

All the available Homepage configuration objects are stored under Homepage's /app/config directory as YAML files. For more about Homepage's configuration see their docs.

Kubernetes Integration

This module provisions a ServiceAccount with ClusterRoleBinding to allow Homepage to get and list ingresses, pods, namespaces, etc. You can configure the app and namespace properties in service_config widgets to automatically show the health status of a pod.

Homepage will look for pods in the configured namespace, with a app.kubernetes.io/name label matching the value of app.

If a more complex selector is required, this module also supports Homepage's podSelector.

For more about Homepage's Kubernetes integration see their docs.

Authors