From 6d21ea9ba33fd64c31bc06b3de09a21a9315e734 Mon Sep 17 00:00:00 2001 From: Timo <24251362+timo95@users.noreply.github.com> Date: Tue, 21 Nov 2023 04:27:19 +0100 Subject: [PATCH] Enhancement: Add service discovery labels support for multiple homepage instances (#2340) --- docs/configs/docker.md | 16 ++++++++++++++++ docs/configs/settings.md | 10 ++++++++++ src/utils/config/service-helpers.js | 17 +++++++++++------ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/docs/configs/docker.md b/docs/configs/docker.md index cc9ec465c..ea70897ac 100644 --- a/docs/configs/docker.md +++ b/docs/configs/docker.md @@ -201,6 +201,22 @@ In order to detect every service within the Docker swarm it is necessary that se ... ``` +## Multiple Homepage Instances + +The optional field `instanceName` can be configured in [settings.md](settings.md#instance-name) to differentiate between multiple homepage instances. + +To limit a label to an instance, insert `.instance.{{instanceName}}` after the `homepage` prefix. + +```yaml +labels: + - homepage.group=Media + - homepage.name=Emby + - homepage.icon=emby.png + - homepage.instance.internal.href=http://emby.lan/ + - homepage.instance.public.href=https://emby.mydomain.com/ + - homepage.description=Media server +``` + ## Ordering As of v0.6.4 discovered services can include an optional `weight` field to determine sorting such that: diff --git a/docs/configs/settings.md b/docs/configs/settings.md index 1f84d36a3..ac137d234 100644 --- a/docs/configs/settings.md +++ b/docs/configs/settings.md @@ -404,6 +404,16 @@ or per-service (`services.yaml`) with: If you have both set, the per-service settings take precedence. +## Instance Name + +Name used by automatic docker service discovery to differentiate between multiple homepage instances. + +For example: + +```yaml +instanceName: public +``` + ## Hide Widget Error Messages Hide the visible API error messages either globally in `settings.yaml`: diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 8da39e18a..d82b56cb7 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -6,7 +6,7 @@ import Docker from "dockerode"; import { CustomObjectsApi, NetworkingV1Api, ApiextensionsV1Api } from "@kubernetes/client-node"; import createLogger from "utils/logger"; -import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config"; +import checkAndCopyConfig, { CONF_DIR, getSettings, substituteEnvironmentVars } from "utils/config/config"; import getDockerArguments from "utils/config/docker"; import getKubeConfig from "utils/config/kubernetes"; import * as shvl from "utils/config/shvl"; @@ -59,6 +59,8 @@ export async function servicesFromDocker() { return []; } + const { instanceName } = getSettings(); + const serviceServers = await Promise.all( Object.keys(servers).map(async (serverName) => { try { @@ -82,6 +84,13 @@ export async function servicesFromDocker() { Object.keys(containerLabels).forEach((label) => { if (label.startsWith("homepage.")) { + let value = label.replace("homepage.", ""); + if (instanceName && value.startsWith(`instance.${instanceName}.`)) { + value = value.replace(`instance.${instanceName}.`, ""); + } else if (value.startsWith("instance.")) { + return; + } + if (!constructedService) { constructedService = { container: containerName.replace(/^\//, ""), @@ -89,11 +98,7 @@ export async function servicesFromDocker() { type: "service", }; } - shvl.set( - constructedService, - label.replace("homepage.", ""), - substituteEnvironmentVars(containerLabels[label]), - ); + shvl.set(constructedService, value, substituteEnvironmentVars(containerLabels[label])); } });