From 196b8e1dc80604a90eee809860c983c0b9183293 Mon Sep 17 00:00:00 2001 From: librelad Date: Tue, 26 May 2026 01:07:14 +0100 Subject: [PATCH] refactor(traefik): per-app middleware hooks + moneyapp placeholder icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Last app-specific bits out of central infra (from the per-app audit): - traefik middleware: replace the hardcoded onlyoffice/owncloud exclude-list + onlyoffice-headers special-case (in traefik_middlewares.sh AND traefik_port_middlewares.sh) with two per-app hooks an app ships in containers//scripts/_traefik.sh: appTraefikSkipsDefaultMiddleware_ (marker: opt out of default@file) appTraefikExtraMiddlewares_ (echo extra middleware entries) onlyoffice defines both; owncloud defines the skip marker. Two narrow hooks (not one clever one) so behavior — incl. the different onlyoffice-headers ordering between the two files — is preserved exactly. Verified with stubs: identical middleware strings across normal/onlyoffice/owncloud × authelia/wl. - moneyapp: add a placeholder icon (geometric banknote SVG, 512x512) so it no longer falls back to default.svg in the WebUI. Central traefik/compose code is now app-agnostic. Co-Authored-By: Claude Opus 4.7 Signed-off-by: librelad --- containers/moneyapp/moneyapp.svg | 7 +++++++ .../onlyoffice/scripts/onlyoffice_traefik.sh | 12 +++++++++++ .../owncloud/scripts/owncloud_traefik.sh | 7 +++++++ .../network/traefik/traefik_middlewares.sh | 17 ++++++++------- .../traefik/traefik_port_middlewares.sh | 21 ++++++++++--------- 5 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 containers/moneyapp/moneyapp.svg create mode 100644 containers/onlyoffice/scripts/onlyoffice_traefik.sh create mode 100644 containers/owncloud/scripts/owncloud_traefik.sh diff --git a/containers/moneyapp/moneyapp.svg b/containers/moneyapp/moneyapp.svg new file mode 100644 index 0000000..dc0a61c --- /dev/null +++ b/containers/moneyapp/moneyapp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/containers/onlyoffice/scripts/onlyoffice_traefik.sh b/containers/onlyoffice/scripts/onlyoffice_traefik.sh new file mode 100644 index 0000000..b384ed1 --- /dev/null +++ b/containers/onlyoffice/scripts/onlyoffice_traefik.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# OnlyOffice traefik middleware hooks (consumed by traefikSetupLabelsMiddlewares +# and tagsProcessorPortMiddlewares). It serves the document editor with its own +# header requirements, so it opts out of the default chain and adds its own +# headers middleware. + +# Marker — presence means: don't attach default@file to this app's routers. +appTraefikSkipsDefaultMiddleware_onlyoffice() { :; } + +# Extra middleware entries appended for this app. +appTraefikExtraMiddlewares_onlyoffice() { echo "onlyoffice-headers"; } diff --git a/containers/owncloud/scripts/owncloud_traefik.sh b/containers/owncloud/scripts/owncloud_traefik.sh new file mode 100644 index 0000000..64388d3 --- /dev/null +++ b/containers/owncloud/scripts/owncloud_traefik.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# ownCloud traefik middleware hook. It does its own routing, so it opts out of +# the default middleware chain (no app-specific extras). + +# Marker — presence means: don't attach default@file to this app's routers. +appTraefikSkipsDefaultMiddleware_owncloud() { :; } diff --git a/scripts/network/traefik/traefik_middlewares.sh b/scripts/network/traefik/traefik_middlewares.sh index 43edf18..e8d42a5 100755 --- a/scripts/network/traefik/traefik_middlewares.sh +++ b/scripts/network/traefik/traefik_middlewares.sh @@ -5,16 +5,19 @@ traefikSetupLabelsMiddlewares() local app_name="$1" local middleware_entries=() - # List of app names to exclude from default middleware - local exclude_apps=("onlyoffice" "owncloud") - # Check if app_name is not in the list of excluded apps - if [[ ! " ${exclude_apps[@]} " =~ " $app_name " ]]; then + # Default chain unless the app opts out via its per-app hook + # (containers//scripts/_traefik.sh defines + # appTraefikSkipsDefaultMiddleware_). + if ! declare -F "appTraefikSkipsDefaultMiddleware_${app_name}" >/dev/null 2>&1; then middleware_entries+=("default@file") fi - # App Specific middlewears - if [[ "$app_name" == "onlyoffice" ]]; then - middleware_entries+=("onlyoffice-headers") + # App-specific extras (e.g. onlyoffice-headers) via the per-app hook. + if declare -F "appTraefikExtraMiddlewares_${app_name}" >/dev/null 2>&1; then + local _mw + while IFS= read -r _mw; do + [[ -n "$_mw" ]] && middleware_entries+=("$_mw") + done < <("appTraefikExtraMiddlewares_${app_name}") fi if [[ "$authelia_setup" == "true" && "$whitelist" == "true" ]]; then diff --git a/scripts/network/traefik/traefik_port_middlewares.sh b/scripts/network/traefik/traefik_port_middlewares.sh index 7cbcd23..9c57773 100644 --- a/scripts/network/traefik/traefik_port_middlewares.sh +++ b/scripts/network/traefik/traefik_port_middlewares.sh @@ -26,14 +26,12 @@ tagsProcessorPortMiddlewares() return 0 fi - # Excluded apps that historically opted out of the default middleware - # chain — keeps existing behavior for onlyoffice / owncloud which do - # their own routing. - local exclude_apps=("onlyoffice" "owncloud") + # Apps opt out of the default middleware chain via a per-app hook + # (containers//scripts/_traefik.sh defines + # appTraefikSkipsDefaultMiddleware_) — e.g. onlyoffice / owncloud, which + # do their own routing. local include_default="true" - if [[ " ${exclude_apps[@]} " =~ " $app_name " ]]; then - include_default="false" - fi + declare -F "appTraefikSkipsDefaultMiddleware_${app_name}" >/dev/null 2>&1 && include_default="false" local count=${#port_service_names[@]} local i=0 @@ -67,9 +65,12 @@ tagsProcessorPortMiddlewares() mw+=("crowdsec-bouncer@file") fi - # onlyoffice / mastodon / similar app-specific middlewares - if [[ "$app_name" == "onlyoffice" ]]; then - mw+=("onlyoffice-headers") + # App-specific extras (e.g. onlyoffice-headers) via the per-app hook. + if declare -F "appTraefikExtraMiddlewares_${app_name}" >/dev/null 2>&1; then + local _mw + while IFS= read -r _mw; do + [[ -n "$_mw" ]] && mw+=("$_mw") + done < <("appTraefikExtraMiddlewares_${app_name}") fi local joined; joined=$(IFS=,; echo "${mw[*]}")