Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9847baf327 | |||
| c126b71852 | |||
| e89b88a513 | |||
| 8bb250220b |
@@ -35,14 +35,16 @@ services:
|
||||
image: ghcr.io/immich-app/immich-machine-learning:release@sha256:a2501141440f10516d329fdfba2c68082e19eb9ba6016c061ac80d23beadf7f3
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Workaround fuer gunicorn-25.1.0-Fork-Deadlock (Worker haengt in futex
|
||||
# nach "Control socket listening", erreicht nie "Application startup
|
||||
# complete"). mimalloc per LD_PRELOAD deaktiviert -> umgeht den Lock im
|
||||
# geforkten Worker. Reine Allocator-Optimierung, funktional unkritisch.
|
||||
# Upstream-Regression seit Immich 2.6 (immich#27228, #22317), kein
|
||||
# offizieller Fix. Re-check: bei Immich-/gunicorn-Update entfernen und
|
||||
# pruefen, ob der Worker wieder sauber bootet.
|
||||
LD_PRELOAD: ""
|
||||
# Workaround fuer gunicorn-25.1.0-Control-Socket-Bug: der Worker haengt
|
||||
# nach "Control socket listening at /usr/src/gunicorn.ctl" und erreicht
|
||||
# nie "Application startup complete" -> Container bleibt dauerhaft
|
||||
# unhealthy, ML (Gesichtserkennung/CLIP/Smart-Search) ist tot.
|
||||
# --no-control-socket deaktiviert das fehlerhafte Feature. immich-ml
|
||||
# startet gunicorn als Subprozess, der GUNICORN_CMD_ARGS aus der Env
|
||||
# liest und anhaengt. Bestaetigte Upstream-Regression seit Immich 2.6
|
||||
# (immich#27228, gunicorn#3510). Re-check: bei Immich-Update, das
|
||||
# gunicorn auf >25.1.0/<25.1.0 mit Fix bringt, wieder entfernen.
|
||||
GUNICORN_CMD_ARGS: "--no-control-socket"
|
||||
volumes:
|
||||
- model-cache:/cache
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
n8n:
|
||||
image: docker.n8n.io/n8nio/n8n:2.26.2@sha256:61ba01bc5e39304bbc928c9dbecd938c3a5cc1331b68affba6a34d0f654c43d9
|
||||
image: docker.n8n.io/n8nio/n8n:2.22.6@sha256:07138bb60aee990651e9c2090d7dde330cba3a5bd84fcc5cba63b2997243bc45
|
||||
container_name: n8n
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
nextcloud:
|
||||
image: nextcloud:33.0.5-apache@sha256:56bdc45109067500fd0832fa64832b7c77a167d9394cbf5f0f4b59740b94194d
|
||||
image: nextcloud:33.0.4-apache@sha256:caa40b8beaf0057ac213d8dfc515c36ce64f7a8f0825b6a287e6f7cf2f4a095d
|
||||
container_name: nextcloud
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
unbound:
|
||||
image: shaanmajid/unbound:1.25.1@sha256:f140db02a005904802bf5840093e95e675321aa060a00426fdffc2a3ac2eeb6b
|
||||
image: shaanmajid/unbound:1.25.1@sha256:96809ff052e8bd79bba30e067d8b27ed9a2f069b6b2a3484fe1d0eb45aba07c5
|
||||
container_name: unbound
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
|
||||
@@ -38,6 +38,19 @@
|
||||
"automerge": false,
|
||||
"labels": ["dependencies", "minor-patch"]
|
||||
},
|
||||
{
|
||||
"description": "Kritische Kerninfra (Traefik=Public-Entrypoint, Unbound=DNS, n8n, Nextcloud): nicht im Sammel-PR, eigene einzeln reviewbare PRs, kein Auto-Merge",
|
||||
"matchManagers": ["docker-compose", "dockerfile"],
|
||||
"matchPackageNames": [
|
||||
"traefik",
|
||||
"shaanmajid/unbound",
|
||||
"docker.n8n.io/n8nio/n8n",
|
||||
"nextcloud"
|
||||
],
|
||||
"groupName": null,
|
||||
"automerge": false,
|
||||
"labels": ["dependencies", "core-critical"]
|
||||
},
|
||||
{
|
||||
"description": "Stateful Tier-1 (Postgres, Mongo, Redis): keine Auto-Group, einzelne PRs, kein Auto-Merge",
|
||||
"matchPackageNames": [
|
||||
|
||||
@@ -29,6 +29,7 @@ TRAEFIK_ACME_PATH="${TRAEFIK_ACME_PATH:-/mnt/user/appdata/traefik/letsencrypt/ac
|
||||
NOISE_PATTERNS_FILE="${NOISE_PATTERNS_FILE:-/mnt/user/services/homelab-infra/services/posture-check/log-noise.patterns}"
|
||||
NORMALIZE_NOISE_SCRIPT="${NORMALIZE_NOISE_SCRIPT:-/mnt/user/services/homelab-infra/services/posture-check/lib/normalize-noise-patterns.sh}"
|
||||
NOISE_ESCALATION_THRESHOLD="${NOISE_ESCALATION_THRESHOLD:-500}"
|
||||
NOISE_ESCALATION_EXEMPT_FILE="${NOISE_ESCALATION_EXEMPT_FILE:-/mnt/user/services/homelab-infra/services/posture-check/noise-escalation-exempt.patterns}"
|
||||
NOISE_BREAKDOWN_TOP_N="${NOISE_BREAKDOWN_TOP_N:-10}"
|
||||
POSTURE_CHECK_FILE="${POSTURE_CHECK_FILE:-/mnt/user/services/posture-check/last.json}"
|
||||
LOCK_FILE="${LOCK_FILE:-/tmp/homelab-daily-report.lock}"
|
||||
@@ -880,12 +881,35 @@ collect_log_highlights() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# Threshold escalation: how many patterns produced more than the threshold?
|
||||
local noise_threshold_exceeded=0
|
||||
# Escalation-exempt patterns: known noise that is also permanently very loud
|
||||
# (e.g. Unraid mdadm parse spam). Without this, such a pattern would keep the
|
||||
# report stuck at >= WARNUNG forever and devalue the OK/WARNUNG/KRITISCH
|
||||
# signal. Exempt patterns are still counted/shown as noise, but do NOT count
|
||||
# toward noise_threshold_exceeded. New/unexpected loud patterns still escalate.
|
||||
local noise_exempt="$TMP_DIR/noise-escalation-exempt.normalized"
|
||||
: > "$noise_exempt"
|
||||
if [ -f "$NOISE_ESCALATION_EXEMPT_FILE" ]; then
|
||||
grep -Ev '^[[:space:]]*(#|$)' "$NOISE_ESCALATION_EXEMPT_FILE" 2>/dev/null \
|
||||
| sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//' \
|
||||
| grep -v '^$' > "$noise_exempt" || : > "$noise_exempt"
|
||||
fi
|
||||
|
||||
# Threshold escalation: how many NON-exempt patterns exceeded the threshold?
|
||||
local noise_threshold_exceeded=0 noise_threshold_exempt=0
|
||||
if [ -s "$noise_by_pattern" ]; then
|
||||
noise_threshold_exceeded="$(awk -v t="$NOISE_ESCALATION_THRESHOLD" '$1 > t { n++ } END { print n + 0 }' "$noise_by_pattern")"
|
||||
noise_threshold_exceeded="$(awk -F '\t' -v t="$NOISE_ESCALATION_THRESHOLD" '
|
||||
NR == FNR { exempt[$0] = 1; next }
|
||||
$1 > t && !($2 in exempt) { n++ }
|
||||
END { print n + 0 }
|
||||
' "$noise_exempt" "$noise_by_pattern")"
|
||||
noise_threshold_exempt="$(awk -F '\t' -v t="$NOISE_ESCALATION_THRESHOLD" '
|
||||
NR == FNR { exempt[$0] = 1; next }
|
||||
$1 > t && ($2 in exempt) { n++ }
|
||||
END { print n + 0 }
|
||||
' "$noise_exempt" "$noise_by_pattern")"
|
||||
fi
|
||||
set_summary "noise_threshold_exceeded" "$noise_threshold_exceeded"
|
||||
set_summary "noise_threshold_exempt" "$noise_threshold_exempt"
|
||||
|
||||
local hit_count attention_count known_noise_count
|
||||
hit_count="$(count_lines < "$hits")"
|
||||
@@ -906,6 +930,9 @@ collect_log_highlights() {
|
||||
if [ "$noise_threshold_exceeded" -gt 0 ]; then
|
||||
append "- WARNUNG: $noise_threshold_exceeded Pattern ueberschreit(en) die Schwelle - bitte pruefen ob noch wirklich Noise."
|
||||
fi
|
||||
if [ "${noise_threshold_exempt:-0}" -gt 0 ]; then
|
||||
append "- Hinweis: $noise_threshold_exempt laute(s) Pattern ist/sind als bewusst eskalations-befreit markiert (siehe \`$NOISE_ESCALATION_EXEMPT_FILE\`) und loesen keine WARNUNG aus."
|
||||
fi
|
||||
append ""
|
||||
|
||||
if [ "$attention_count" -eq 0 ]; then
|
||||
@@ -955,22 +982,32 @@ collect_log_highlights() {
|
||||
if [ -s "$noise_by_pattern" ]; then
|
||||
append "#### Pattern mit den meisten Treffern"
|
||||
append ""
|
||||
append "| Pattern | Anzahl |"
|
||||
append "|---|---:|"
|
||||
append "| Pattern | Anzahl | Hinweis |"
|
||||
append "|---|---:|---|"
|
||||
head -n "$NOISE_BREAKDOWN_TOP_N" "$noise_by_pattern" \
|
||||
| while IFS="$(printf '\t')" read -r cnt pat; do
|
||||
local short="$pat"
|
||||
local short="$pat" note=""
|
||||
# Mark patterns that are deliberately exempt from escalation.
|
||||
if [ -s "$noise_exempt" ] && grep -Fxq -- "$pat" "$noise_exempt"; then
|
||||
if [ "$cnt" -gt "$NOISE_ESCALATION_THRESHOLD" ]; then
|
||||
note="eskalations-befreit"
|
||||
fi
|
||||
elif [ "$cnt" -gt "$NOISE_ESCALATION_THRESHOLD" ]; then
|
||||
note="ueber Schwelle"
|
||||
fi
|
||||
if [ "${#short}" -gt 80 ]; then
|
||||
short="${short:0:77}..."
|
||||
fi
|
||||
# Escape pipe characters that would break the markdown table.
|
||||
short="${short//|/\\|}"
|
||||
append "| \`$short\` | $cnt |"
|
||||
append "| \`$short\` | $cnt | $note |"
|
||||
done
|
||||
append ""
|
||||
fi
|
||||
if [ "$noise_threshold_exceeded" -gt 0 ]; then
|
||||
append "Bewertung: $noise_threshold_exceeded Pattern ueberschreit(en) die Eskalations-Schwelle ($NOISE_ESCALATION_THRESHOLD). Bitte pruefen, ob die als Noise eingeordneten Meldungen noch fachlich Noise sind oder ob sich ein echter Vorfall darunter versteckt."
|
||||
append "Bewertung: $noise_threshold_exceeded nicht-befreite(s) Pattern ueberschreit(en) die Eskalations-Schwelle ($NOISE_ESCALATION_THRESHOLD). Bitte pruefen, ob die als Noise eingeordneten Meldungen noch fachlich Noise sind oder ob sich ein echter Vorfall darunter versteckt."
|
||||
elif [ "${noise_threshold_exempt:-0}" -gt 0 ]; then
|
||||
append "Bewertung: Kein nicht-befreites Pattern ueberschreitet die Eskalations-Schwelle ($NOISE_ESCALATION_THRESHOLD). $noise_threshold_exempt lautes Pattern ist bewusst eskalations-befreit und mit Begruendung dokumentiert."
|
||||
else
|
||||
append "Bewertung: Kein Pattern ueberschreitet die Eskalations-Schwelle ($NOISE_ESCALATION_THRESHOLD)."
|
||||
fi
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# noise-escalation-exempt.patterns - Daily Operations Report
|
||||
#
|
||||
# Pattern, die als Rauschen bekannt UND dauerhaft sehr laut sind, sollen die
|
||||
# Eskalations-Schwelle (NOISE_ESCALATION_THRESHOLD) nicht in eine WARNUNG
|
||||
# uebersetzen. Ohne diese Ausnahme haengt der Report-Status strukturell auf
|
||||
# >= WARNUNG fest (z. B. mdadm-Noise auf Unraid feuert dauerhaft > 5000/Tag),
|
||||
# was die OK/WARNUNG/KRITISCH-Ampel entwertet.
|
||||
#
|
||||
# Wirkung: Ein hier gelistetes Pattern wird weiterhin als Noise gezaehlt und
|
||||
# in der Breakdown-Tabelle gezeigt (mit Markierung "eskalations-befreit"),
|
||||
# zaehlt aber NICHT mehr zu noise_threshold_exceeded. Neue/unerwartete laute
|
||||
# Patterns loesen weiterhin eine WARNUNG aus.
|
||||
#
|
||||
# Format:
|
||||
# - Exakte Pattern-Zeile wie in log-noise.patterns (nach Normalisierung:
|
||||
# getrimmt, ohne Kommentar). Muss zeichengenau dem Eintrag entsprechen.
|
||||
# - Zeilen mit '#' sind Kommentare, Leerzeilen werden ignoriert.
|
||||
#
|
||||
# Eine Befreiung heisst NICHT "ignorieren", sondern "Volumen ist als Noise
|
||||
# akzeptiert; nur die ESKALATION ist abgeschaltet".
|
||||
#
|
||||
# Last reviewed: 2026-06-10
|
||||
|
||||
# node-exporter kann /proc/mdstat auf Unraid nicht parsen (eigener Array-
|
||||
# Treiber, kein Linux-mdadm). Dauerhaft > 5000/Tag, rein kosmetisch.
|
||||
# Re-check: nur bei Migration auf echtes mdadm-RAID.
|
||||
monitoring-node-exporter.*mdadm.*Cannot parse /host/proc/mdstat
|
||||
|
||||
# Fritz!Box sendet RFC-1035-widrige Multi-Question-SOA-Queries fuer
|
||||
# myfritz.net/myfritz.link; AdGuard lehnt sie ab. ~1000+/Tag, kein Impact.
|
||||
# Re-check: falls derselbe Fehler fuer Nicht-AVM-Domains auftaucht.
|
||||
adguard.*bad question section.*only 1 question allowed
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v3.7@sha256:fcdef599e6259359833dd2e1d49f9e964f66825d69bd3dd468f51102ce013d03
|
||||
image: traefik:v3.7@sha256:6b9cbca6fac42ab0075f5437d8dc1685cfd188626d8d515839ea94f8b6271c42
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
security_opt:
|
||||
|
||||
Reference in New Issue
Block a user