mirror of
https://github.com/gethomepage/homepage.git
synced 2026-09-29 15:31:16 -07:00
Performance: fetch all docker container statuses in one request (#7092)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
@@ -60,6 +60,46 @@ export async function servicesFromConfig() {
|
||||
return parseServicesToGroups(services);
|
||||
}
|
||||
|
||||
function flattenServices(groups, services = []) {
|
||||
groups.forEach((group) => {
|
||||
(group.services ?? []).forEach((service) => services.push(service));
|
||||
flattenServices(group.groups ?? [], services);
|
||||
});
|
||||
return services;
|
||||
}
|
||||
|
||||
function dockerWidgets(service) {
|
||||
const widgets = service.widget ? [service.widget, ...(service.widgets ?? [])] : (service.widgets ?? []);
|
||||
return widgets.filter((widget) => widget?.type === "docker");
|
||||
}
|
||||
|
||||
export async function containersFromConfig(server) {
|
||||
const target = server || "";
|
||||
const services = flattenServices(await servicesFromConfig());
|
||||
// services and docker widgets both carry container + server
|
||||
const refs = services.flatMap((service) => [service, ...dockerWidgets(service)]);
|
||||
const matching = refs.filter((ref) => ref.container && (ref.server || "") === target);
|
||||
|
||||
return new Set(matching.map((ref) => ref.container));
|
||||
}
|
||||
|
||||
// homepage.foo -> foo, homepage.instance.<this instance>.foo -> foo, another instance -> null
|
||||
export function homepageLabelValue(label, instanceName) {
|
||||
if (!label.startsWith("homepage.")) return null;
|
||||
|
||||
const value = label.replace("homepage.", "");
|
||||
if (!value.startsWith("instance.")) return value;
|
||||
if (instanceName && value.startsWith(`instance.${instanceName}.`)) {
|
||||
return value.replace(`instance.${instanceName}.`, "");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function hasHomepageLabels(labels, instanceName) {
|
||||
return Object.keys(labels ?? {}).some((label) => homepageLabelValue(label, instanceName) !== null);
|
||||
}
|
||||
|
||||
export async function servicesFromDocker() {
|
||||
checkAndCopyConfig("docker.yaml");
|
||||
|
||||
@@ -95,29 +135,23 @@ export async function servicesFromDocker() {
|
||||
const containerLabels = isSwarm ? shvl.get(container, "Spec.Labels") : container.Labels;
|
||||
const containerName = isSwarm ? shvl.get(container, "Spec.Name") : container.Names[0];
|
||||
|
||||
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;
|
||||
}
|
||||
Object.keys(containerLabels ?? {}).forEach((label) => {
|
||||
const value = homepageLabelValue(label, instanceName);
|
||||
if (value === null) return;
|
||||
|
||||
if (!constructedService) {
|
||||
constructedService = {
|
||||
container: containerName.replace(/^\//, ""),
|
||||
server: serverName,
|
||||
weight: 0,
|
||||
type: "service",
|
||||
};
|
||||
}
|
||||
let substitutedVal = substituteEnvironmentVars(containerLabels[label]);
|
||||
if (value === "widget.version" || /^widgets\[\d+\]\.version$/.test(value)) {
|
||||
substitutedVal = parseVersionForUrl(substitutedVal);
|
||||
}
|
||||
shvl.set(constructedService, value, substitutedVal);
|
||||
if (!constructedService) {
|
||||
constructedService = {
|
||||
container: containerName.replace(/^\//, ""),
|
||||
server: serverName,
|
||||
weight: 0,
|
||||
type: "service",
|
||||
};
|
||||
}
|
||||
let substitutedVal = substituteEnvironmentVars(containerLabels[label]);
|
||||
if (value === "widget.version" || /^widgets\[\d+\]\.version$/.test(value)) {
|
||||
substitutedVal = parseVersionForUrl(substitutedVal);
|
||||
}
|
||||
shvl.set(constructedService, value, substitutedVal);
|
||||
});
|
||||
|
||||
if (constructedService && (!constructedService.name || !constructedService.group)) {
|
||||
|
||||
Reference in New Issue
Block a user