20240908-homepage.jpeg

<aside> đź“‹

This post details setting up HomePage as part of a docker compose stack to create a service dashboard with system and service monitors, automatic service discovery (using Docker labels) and keyboard service search for QuickLaunch.

</aside>

Revision: 20250317-0 (init: 20240908)

docker compose setup for HomePage with Dashdot and Watchtower widgets from Komodo or Dockge, including detailing the dashboard setup for a multi-tab layout with four sections of content: system metrics, static content, dynamic applications (docker service discovery), and service monitors.

Preamble

Services Map

Documentation is a crucial feature of a successful self-hosting methodology.

While migrating to Traefik and creating reverse proxies by adding dynamic configuration files or Docker labels, I documented the services’ map (on Notion, with multiple Table views).

A “Per Host” Table view (sorted by “Exposed Port”) for the services on one server is as follows:

Homepage-Notion_ServiceMap.png

Among the columns existing in the original Notion DataBase from which those views are created are:

Automatic Discovery

Automation is another relevant component when attempting to maintain this knowledge map.

It is challenging to keep multiple sources of truth synchronized. As such, it is practical to have some components automatically announce themselves.

In the same way that adding an entry to Traefik can be done using Docker labels, the dashboard solution we retained, Homepage, can also automatically register Docker service using labels.

Homepage

A modern, fully static, fast, secure fully proxied, highly customizable application dashboard with integrations for over 100 services and translations into multiple languages. Easily configured via YAML files or through docker label discovery.

r/homelab and r/selfhosted are great places to discover people showcasing their “homepage dashboard.”

For this setup, we are using multiple features of the tool:

Here is what our local setup provides (yours will likely differ):

HomePage-5columns.png

(Link to larger screenshot + link to background image on r/wallpaper)

Using docker labels

We will rely on homepage’s ability to perform Automatic Service Discovery using Docker labels. Those labels are homepage.group, homepage.name, homepage.icon, homepage.href, homepage.description, and instance-specific options.

The following are copy→adapt→paste options for a use-case with a single instance, multiple homepage instances, and an Unraid XML template filler. In each case:

Single Instance

		labels:
		  - homepage.name=ALIAS
		  - homepage.group=TAB_apps
		  - homepage.icon=SIGN.png
		  - homepage.href=https://SLUG.example.com/
		  - homepage.description=ALIAS (TAB)

Multiple homepage instances

    labels:
      - homepage.name=ALIAS
      - homepage.group=TAB_apps
      - homepage.icon=SIGN.png
      - homepage.instance.INSTANCE1.href=https://SLUG.example.com/
      - homepage.instance.INSTANCE2.href=https://SLUG.example.net/
      - homepage.description=ALIAS (TAB)

Unraid with multiple instances

Although the Unraid WebUI allows you to manually “Add” labels for each required label, you can also modify the Docker service’s XML file.

Those are in the /boot/config/plugins/dockerMan/templates-user folder and are named my-<SERVICE>.xml. Once the matching service entry is found, it can be edited by copying and adapting the following lines before the final </Container> line:

  <Config Name="homepage.name=ALIAS" Target="homepage.name" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false">ALIAS</Config>
  <Config Name="homepage.group=TAB_apps" Target="homepage.group" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false">TAB_apps</Config>
  <Config Name="homepage.icon=SIGN" Target="homepage.icon" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false">SIGN</Config>
  <Config Name="homepage.instance.INSTANCE1.href=https://SLUG.example.com/" Target="homepage.instance.INSTANCE1.href" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false"><https://SLUG.example.com/></Config>
  <Config Name="homepage.instance.INSTANCE2.href=https://SLUG.example.net/" Target="homepage.instance.INSTANCE2.href" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false"><https://SLUG.example.net/></Config>
  <Config Name="homepage.description=ALIAS (TAB)" Target="homepage.description" Default="" Mode="" Description="" Type="Label" Display="always" Required="false" Mask="false">ALIAS (TAB)</Config>

<aside> đź’ˇ

After modifying the XML file, from Unraid’s “Docker” tab, Edit the Service and undo any changes to enable the Save button. Save-ing will restart the updated service.

</aside>

Preliminary installations

We will deploy services using docker-compose. Although tools such as Dockge or Komodo are not a requirement, they provide a convenient method to deploy “stacks.” Please see the “Dockge” post for additional details on previous stack deployments.

Dockge (Rev: 20250322-0)

Our example configuration files, in particular, will show how to integrate Dashdot and Watchtower (with metric collection) as widgets and automatically discover Docker services. Both were installed following the instructions in that post.

We are sharing an example.com version of the compose.yaml files we are using for that configuration (follow the direct links to the files, or the content relative to this post is posted at https://github.com/mmartial/geekierblog-artifacts/tree/main/20240908-homepage):

Although we are not describing how to set reverse proxy configurations for those, in the further configuration steps, we will rely on the following two URLs for those services:

Please see the Traefik or Nginx Proxy Manager posts on some options to use for the reverse proxy.

Traefik Proxy (Rev: 20250210-0)

Reverse Proxy: Nginx Proxy Manager (Rev: 20240730-0)

Glances


Untitled

Untitled