IR-20261112: feat(monitoring): enable Loki multi-tenancy and name every reader's tenant (R39 PR-A) #961
Open
pi-landing
wants to merge 1 commit from
plane/R39-forgejo-access-log-auth into live
pull from: plane/R39-forgejo-access-log-auth
merge into: Homelab:live
Homelab:main
Homelab:live
Homelab:sso/zitadel-guest-users
Homelab:sso/argocd-readonly-groups
Homelab:lr-20261111-025/amendment-4
Homelab:ld/IR-20261112-phase1guard
Homelab:ld/IR-20261112-kimipool
Homelab:lr-20261111-017-a24
Homelab:plane/IR-20261112-relayalert
Homelab:plane/IR-20261112-sbxdisk
Homelab:lr-20261111-025/seat-template
Homelab:plane/IR-20261112-mgmtdns
Homelab:plane/IR-20261112-r10-openbao-loki
Homelab:plane/f-r2-d6-sbx-reviewer-out
Homelab:plane/R39-forgejo-access-log-sink
Homelab:plane/IR-20261111-extdel-v2
Homelab:plane/f-r2-d6-gits-reviewer-removal
Homelab:plane/R39-forgejo-access-log
Homelab:plane/R1-localbin
Homelab:plane/IR-20261111-r25offdisk
Homelab:plane/IR-20261112-runners8
Homelab:plane/EXTDEL-4918-forgejo-ext
Homelab:plane/IR-20261112-npmcache
Homelab:lr-20261111-016-launchcap
Homelab:plane/IR-20261111-runners10
Homelab:plane/IR-20261111-c8brief
Homelab:IR-20261111-runnercap
Homelab:plane/IR-20261111-baohelper
Homelab:plane/IR-20261111-gitsemu
Homelab:plane/IR-20261111-runnerlock
Homelab:plane/IR-20261111-c8grants
Homelab:lr-20261111-017-n9
Homelab:lr-20261111-025/seatpost
Homelab:ld/LR-20261111-024-seat-ban
Homelab:lr-20261111-017-seatlookup
Homelab:spec-014-skill-sync
Homelab:ld-spec-009/relay-fixforward
Homelab:ld/spec-016-launch-cap
Homelab:ld-spec-009/relay-a3
Homelab:plane/LR-20261111-018-seat-posting
Homelab:plane/LR-20261111-012-sbx-lab-transcripts
Homelab:spec-010-fit2
Homelab:ld-spec-009/relay
Homelab:plane/HOMELAB-C3C-epic-supervisor
Homelab:plane/dircfg-c3b-work-pointer
Homelab:plane/HOMELAB-2479-sbx-ffmpeg
Homelab:plane/dircfg-c5-epic-supervisor
Homelab:plane/dircfg-c4-opening
Homelab:plane/dircfg-c3-work-md
Homelab:plane/dircfg-c2-brief-metodo
Homelab:plane/dircfg-c6-sbx-sendrast-skills
Homelab:plane/HOMELAB-2479-zitadel-display-name
Homelab:plane/dircfg-c1-director-gitinit
Homelab:plane/HOMELAB-2479-sbx-sendrast-9gi
Homelab:plane/HOMELAB-2479-invite-list-reader
Homelab:plane/HOMELAB-2479-sbx-lab-wk02-affinity
Homelab:plane/HOMELAB-2479-wk02-sbx-lab-limit
Homelab:plane/HOMELAB-2479-zitadel-user-drift
Homelab:plane/HOMELAB-2479-zitadel-h2c
Homelab:spec-008-b-sbxlab-pin
Homelab:spec-008-a-sbxfleet-base-bump
Homelab:spec-007-ld-implement-skill
Homelab:archive/plane/HOMELAB-2658-omniroute-containment-wip-20261110
Homelab:archive/plane/HOMELAB-2446-wk01-requests-wip-20261110
Homelab:plane/HOMELAB-2479-gits-fixture-vendor
Homelab:ld-spec-004
Homelab:plane/HOMELAB-2479-plane-smtp-chart
Homelab:ld-spec-003
Homelab:plane/HOMELAB-2479-aaron-site-zitadel
Homelab:plane/HOMELAB-2479-runner-requests
Homelab:plane/ld-stopnow-gits-pin
Homelab:plane/ld-stopnow-alias-retire
Homelab:plane/HOMELAB-2479-sbx-gits-probe-tmp
Homelab:plane/HOMELAB-2479-gits-toolcache
Homelab:plane/ld-stopnow-sbxlab-pin
Homelab:plane/ld-stopnow-sbxfleet-base2
Homelab:plane/ld-stopnow-sbxfleet-base
Homelab:plane/ld-stopnow-item2-skill-rule
Homelab:plane/HOMELAB-88-cm-ssa-syncopt
Homelab:plane/HOMELAB-88-sandbox-telemetry
Homelab:plane/HOMELAB-88-sbx-gits-16g
Homelab:plane/HOMELAB-88-whisper-cuda
Homelab:plane/HOMELAB-2479-secretscan-fixture-allowlist
Homelab:plane/HOMELAB-2479-registry-backup
Homelab:plane/HOMELAB-2682-sandbox-init-tmpfix
Homelab:plane/HOMELAB-2479-fix-port-gate
Homelab:plane/HOMELAB-2479-emulator-gate
Homelab:plane/HOMELAB-2479-fixture-resync
Homelab:plane/HOMELAB-2682-forgejo-ext-pin-cd50fbc6
Homelab:plane/HOMELAB-2479-openbao-raft-verify
Homelab:plane/HOMELAB-2682-forgejo-ext-pin-96437d4a
Homelab:plane/HOMELAB-2479-moore-disk-alert
Homelab:plane/HOMELAB-2479-harbor-pin-secrets
Homelab:plane/HOMELAB-2682-relief-threshold-p1
Homelab:archive/plane/HOMELAB-2682-relief-threshold-20261109
Homelab:plane/HOMELAB-2682-relief-threshold
Homelab:plane/HOMELAB-2682-sbx-gits-seed-pin
Homelab:plane/HOMELAB-2479-ci-trim
Homelab:plane/HOMELAB-2682-ok0
Homelab:plane/HOMELAB-2479-liveness-window-120s
Homelab:plane/HOMELAB-2682-seed-bump
Homelab:plane/HOMELAB-2682-transcripts
Homelab:plane/HOMELAB-2682-pin-bump
Homelab:plane/HOMELAB-2682-declaration
Homelab:plane/HOMELAB-2682-gradle-daemon-gen
Homelab:plane/HOMELAB-2682-tools-pin
Homelab:plane/HOMELAB-2479-harbor-db-backup
Homelab:plane/HOMELAB-2682-suite-relpath
Homelab:plane/HOMELAB-2682-revert-859-delivery
Homelab:plane/HOMELAB-2479-volume-floor
Homelab:plane/HOMELAB-2682-check-anchor
Homelab:dev/cockpit
Homelab:plane/HOMELAB-2479-nic-roster
Homelab:plane/HOMELAB-2479-nic-roster-rehome
Homelab:ld-1/truth-fixes
Homelab:ld-1/remove-open-chat
Homelab:ld-1/gate-cut
Homelab:plane/HOMELAB-2479-nic-critical
Homelab:plane/HOMELAB-2479-startup-probe
Homelab:ld-1/dev-route-1
Homelab:plane/HOMELAB-2479-factory-token
Homelab:plane/HOMELAB-2682-evidence-fixes
Homelab:ld-1/gate-dev-route
Homelab:plane/HOMELAB-2479-sbx-resources
Homelab:plane/HOMELAB-2479-factory-pr-series
Homelab:plane/HOMELAB-2682-preclean-optout
Homelab:plane/HOMELAB-2479-measurement
Homelab:plane/sbx-gits-resources-20261105
Homelab:plane/sbx-lab-resources-20261105
Homelab:plane/HOMELAB-2682-emu-proof
Homelab:plane/HOMELAB-2682-sbxgits-pin
Homelab:plane/HOMELAB-2682-ssh-image
Homelab:archive/plane/HOMELAB-2694-sandbox-mem-page-20261110
Homelab:plane/HOMELAB-2694-sandbox-mem-page
Homelab:plane/HOMELAB-2537-jvm-proof-mode
Homelab:plane/HOMELAB-2694-sbx-lab-memory
Homelab:plane/HOMELAB-2694-psi-memory-alert
Homelab:plane/HOMELAB-2682-lab-env
Homelab:plane/HOMELAB-2694-sandbox-oom-alerts
Homelab:plane/HOMELAB-2682-quote-rule
Homelab:plane/HOMELAB-2481-sandbox-log-reader
Homelab:plane/HOMELAB-2682-sbx-lab-ext
Homelab:plane/HOMELAB-2688-longhorn-alerts
Homelab:plane/HOMELAB-2682-sbx-lab-idents
Homelab:plane/HOMELAB-2682-ct-skills
Homelab:plane/GITS-492-tablet-build-delivery
Homelab:epic/ld-1
Homelab:plane/HOMELAB-2680-sandbox-redact
Homelab:plane/HOMELAB-2683-sbx-lab-pin
Homelab:plane/HOMELAB-2685-outage-alerts
Homelab:plane/HOMELAB-2683-gcc-sbx-lab
Homelab:plane/HOMELAB-2658-omniroute-containment
Homelab:plane/HOMELAB-2440-sbx-lab-cpu
Homelab:plane/HOMELAB-2673-ci-pending-paging
Homelab:plane/HOMELAB-2675-sbx-gits-alerts
Homelab:plane/HOMELAB-2440-sbx-lab-request
Homelab:plane/HOMELAB-2445-sbx-lab-offpve
Homelab:plane/HOMELAB-2445-wk06-requests
Homelab:plane/HOMELAB-2658-liveness
Homelab:plane/HOMELAB-2655-sbx-sendrast-pin-54c78dd
Homelab:plane/HOMELAB-2655-sbx-sendrast-t7
Homelab:plane/HOMELAB-2626-h9-voz-sandbox
Homelab:plane/HOMELAB-2636-android-emu-b
Homelab:plane/GITS-401-drain-envelope
Homelab:plane/HOMELAB-2492-volume-attach-alerts
Homelab:plane/HOMELAB-2626-h8e-skill-hipervisor
Homelab:plane/HOMELAB-2488-io-psi-alerts
Homelab:plane/HOMELAB-2626-h8d-skills-pi
Homelab:plane/HOMELAB-2626-h8c-skills-pi-pulido
Homelab:plane/HOMELAB-2626-h8b-skills-pi-fixes
Homelab:plane/HOMELAB-2489-longhorn-tgtd-alerts
Homelab:plane/HOMELAB-2626-h8-skills-pi
Homelab:plane/HOMELAB-2618-h3-checklist
Homelab:plane/HOMELAB-2547-sbx-sendrast-pin7
Homelab:plane/HOMELAB-2618-h7-sbx-sendrast-kubectl
Homelab:plane/HOMELAB-2618-h6-sbx-lab-viewer
Homelab:plane/HOMELAB-2547-sbx-sendrast-pin6
Homelab:plane/HOMELAB-2614-etcd-leader-alert
Homelab:plane/HOMELAB-2547-sbx-sendrast-r59
Homelab:plane/HOMELAB-2618-h4-ci-reader
Homelab:plane/HOMELAB-2618-h2v3-sbx-sendrast
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin5
Homelab:plane/HOMELAB-2547-sbx-sendrast-pidir
Homelab:plane/HOMELAB-2547-sbx-sendrast-pooldir
Homelab:plane/HOMELAB-2618-h5c-bump
Homelab:plane/HOMELAB-2547-sbx-sendrast-credhelper
Homelab:plane/HOMELAB-2618-h1fix-kustomize
Homelab:plane/HOMELAB-2618-h5-sbx-fleet
Homelab:plane/HOMELAB-2618-h1-fuente-unica
Homelab:plane/HOMELAB-2618-h2-sendrast
Homelab:plane/HOMELAB-2547-sbx-sendrast-rbac
Homelab:plane/HOMELAB-2618-h0-ondelete
Homelab:plane/HOMELAB-2446-wk01-requests
Homelab:plane/HOMELAB-2570-idle-liveness
Homelab:plane/HOMELAB-2511-step-alert
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin4
Homelab:plane/HOMELAB-2546-sbx-sendrast-health2
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin3
Homelab:plane/HOMELAB-2546-sbx-sendrast-health
Homelab:plane/HOMELAB-2546-sbx-sendrast-gotoolchain
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin2
Homelab:plane/HOMELAB-2546-sbx-sendrast-r43
Homelab:plane/HOMELAB-2445-descheduler-repause
Homelab:plane/HOMELAB-2546-sbx-sendrast-psa
Homelab:plane/HOMELAB-2537-sbx-gits-post-humo
Homelab:plane/HOMELAB-2546-sbx-sendrast-wk03
Homelab:plane/HOMELAB-2537-sbx-gits-fix-perm
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin
Homelab:plane/HOMELAB-2546-sbx-sendrast-platform
Homelab:plane/HOMELAB-2546-sbx-sendrast
Homelab:plane/HOMELAB-2537-sbx-gits
Homelab:plane/HOMELAB-2481-dind-gc-tightening
Homelab:archive/plane/HOMELAB-2481-node-local-dind-20261110
Homelab:plane/HOMELAB-2481-node-local-dind
Homelab:plane/HOMELAB-2535-sbx-lab-gitops
Homelab:plane/HOMELAB-2483-volume-usage-alert
Homelab:plane/HOMELAB-2482-slice-B-prepare
Homelab:plane/HOMELAB-2482-slice-C-ephemeral-ceilings
Homelab:plane/HOMELAB-2483-retention
Homelab:plane/HOMELAB-2483-alerts
Homelab:plane/GITS-395-emulator-adb-v2
Homelab:plane/GITS-395-emulator-adb
Homelab:plane/HOMELAB-2472-dor-newtest
Homelab:plane/GITS-403-emu-env-drift
Homelab:plane/HOMELAB-2467-gitleaks-scan
Homelab:plane/GITS-401-dind-digest
Homelab:plane/GITS-371-android-emu-prestop-command
Homelab:plane/GITS-371-android-emu-dind-drain
Homelab:plane/GITS-371-android-emu-shutdown-grace
Homelab:plane/HOMELAB-2196-speed-batch
Homelab:plane/HOMELAB-2442-android-ci-raise
Homelab:plane/HOMELAB-2442-runner-pool
Homelab:plane/HOMELAB-2442-mem-rightsize
Homelab:plane/HOMELAB-2443-ldpush-memory
Homelab:plane/HOMELAB-2444-fpr
Homelab:plane/GITS-364-emu-drift-fix
Homelab:plane/GITS-362-release-upload-mount
Homelab:plane/HOMELAB-2432-alerts
Homelab:plane/HOMELAB-1945-landing-step
Homelab:plane/HOMELAB-2421-dashboard
Homelab:plane/HOMELAB-2417-baseline
Homelab:plane/HOMELAB-2418-runners
Homelab:plane/HOMELAB-2415-budget-kill-scope
Homelab:plane/GITS-33-e0r-t3-android-release-lane
Homelab:plane/HOMELAB-2412-pernode-cap
Homelab:plane/GITS-281-android-ci-pin
Homelab:plane/HOMELAB-2407-gate-creation-exempt
Homelab:plane/GITS-281-android-ci-image-emulator
Homelab:plane/HOMELAB-2406-panel-artifact
Homelab:plane/GITS-22-e0-t13
Homelab:plane/HOMELAB-2402-node-keys
Homelab:plane/GITS-21-e0-t12
Homelab:plane/GITS-19-e0-t10
Homelab:plane/GITS-18-e0-t9
Homelab:plane/HOMELAB-1941-b13-slice2
Homelab:plane/HOMELAB-2400-active-rows
Homelab:plane/HOMELAB-2395-trim-manage-key
Homelab:plane/HOMELAB-1944-panel-gateway
Homelab:plane/HOMELAB-2392-diff-fetch
Homelab:plane/HOMELAB-1940-caps-accounting
Homelab:plane/HOMELAB-2390-diff-git
Homelab:plane/HOMELAB-1944-panel-runtime
Homelab:plane/HOMELAB-2329-gate-decision
Homelab:plane/HOMELAB-2381-claim-retry
Homelab:plane/record-sql-test-fix
Homelab:plane/HOMELAB-2373-tailscale-1.104.4
Homelab:plane/HOMELAB-2357-resume-inflight
Homelab:plane/HOMELAB-2372-fail-closed
Homelab:plane/HOMELAB-2278-freshness
Homelab:plane/HOMELAB-2356-runtime-verdicts
Homelab:plane/HOMELAB-2281-objectlock
Homelab:plane/HOMELAB-2340-pane-loss
Homelab:plane/HOMELAB-1943-frozen-charters
Homelab:plane/HOMELAB-2348-replay-refusal
Homelab:plane/HOMELAB-1944-review-panel
Homelab:plane/HOMELAB-2341-reauthorize-anchor
Homelab:plane/HOMELAB-1942-workflow-knobs
Homelab:plane/HOMELAB-2327-signing-dispatch
Homelab:plane/HOMELAB-2280-pacing
Homelab:plane/HOMELAB-2195-f9-dor
Homelab:plane/HOMELAB-2249-orphan-alert
Homelab:plane/HOMELAB-2311-runbook
Homelab:plane/HOMELAB-2302-argocd-reader
Homelab:plane/HOMELAB-2273-etcd-snapshot-b2
Homelab:plane/HOMELAB-2298-eso-repo-password
Homelab:plane/HOMELAB-2274-raft-b2
Homelab:plane/HOMELAB-2249-alerts
Homelab:plane/HOMELAB-2258-xhost-sc
Homelab:plane/HOMELAB-2259-strict-local
Homelab:plane/HOMELAB-2195-f4-workflow-id
Homelab:plane/HOMELAB-2260-node-labels
Homelab:plane/HOMELAB-2257-zone-labels
Homelab:plane/HOMELAB-2195-b2-drain-rule
Homelab:plane/HOMELAB-2195-b3-records
Homelab:plane/HOMELAB-2195-b5-fragility
Homelab:plane/HOMELAB-2195-b1-dor-pickup
Homelab:plane/HOMELAB-1939-bumpupdate
Homelab:plane/HOMELAB-1939-mergedecode
Homelab:plane/HOMELAB-1939-agentwait
Homelab:plane/HOMELAB-2240-lane
Homelab:plane/HOMELAB-2246-runner-1rep
Homelab:plane/HOMELAB-1980-b11-pane-hold
Homelab:plane/HOMELAB-2235-argocd-memory
Homelab:plane/HOMELAB-2232-proxmox-module
Homelab:plane/HOMELAB-gitops-atlantis
Homelab:plane/HOMELAB-2210-docker-config-seed2
Homelab:plane/HOMELAB-2210-runner-pin
Homelab:plane/HOMELAB-2210-runner-buildx
Homelab:plane/HOMELAB-1932-ld-runners
Homelab:plane/HOMELAB-2200-snapshot-retain
Homelab:plane/HOMELAB-2199-cnpg-backup-stale
Homelab:plane/HOMELAB-2201-runner-gc
Homelab:plane/HOMELAB-1926-plane-rabbitmq-resources
Homelab:plane/HOMELAB-1905-cnpg-ha-docs
Homelab:plane/HOMELAB-1906-cronjob-ttl-rules
Homelab:plane/HOMELAB-1904-longhorn-fixes
Homelab:plane/HOMELAB-1908-annotation-fix
Homelab:plane/HOMELAB-1904-cnpg-ha-rules
Homelab:plane/HOMELAB-1904-recyclarr-netpol
Homelab:plane/HOMELAB-1904-cpu-rightsize
Homelab:plane/HOMELAB-1893-alertintake-plane-storm
Homelab:plane/HOMELAB-1878-retention
Homelab:epic/LD4
Homelab:plane/HOMELAB-1885-cockpit-e2e
Homelab:plane/HOMELAB-1727-skillhealth
Homelab:plane/HOMELAB-1728-signals
Homelab:plane/HOMELAB-1731-fitness
Homelab:plane/HOMELAB-1859-gateway
Homelab:plane/HOMELAB-1847-oncall
Homelab:plane/HOMELAB-1690-l7
Homelab:plane/HOMELAB-1850-tempo
Homelab:plane/HOMELAB-1850-attribution
Homelab:plane/HOMELAB-1686-meetings
Homelab:epic/LD3
Homelab:plane/HOMELAB-1684-derived-state
Homelab:plane/HOMELAB-1871-oidc-entrypoint-fix
Homelab:plane/HOMELAB-1871-oidc-sync
Homelab:plane/HOMELAB-1865-atlantis-leg
Homelab:plane/HOMELAB-1730-readiness
Homelab:plane/HOMELAB-1681b-image-dispatch
Homelab:plane/HOMELAB-1682-gates-backend
Homelab:plane/HOMELAB-1848-alert-audit
Homelab:plane/HOMELAB-1729-planfresh
Homelab:plane/HOMELAB-1848-contract-demo
Homelab:plane/HOMELAB-1854-longhorn-guard
Homelab:plane/HOMELAB-1685-intake
Homelab:plane/HOMELAB-1688-routines
Homelab:plane/HOMELAB-1687-el-director
Homelab:plane/HOMELAB-1827-prepull
Homelab:plane/HOMELAB-1827-livez
Homelab:plane/HOMELAB-1835-alert-rule
Homelab:plane/HOMELAB-1831-plane-vendor
Homelab:plane/HOMELAB-1746-es-newt-next
Homelab:plane/HOMELAB-1841-kubeprism
Homelab:plane/HOMELAB-1825-sandbox-pullsecrets
Homelab:plane/HOMELAB-1828-outline-minio
Homelab:plane/HOMELAB-1828-cnpg-alert
Homelab:plane/HOMELAB-1711-compile-before-claim
Homelab:plane/HOMELAB-1711-image-smoke
Homelab:epic/ld2
Homelab:plane/HOMELAB-1711-dispatcher-deploy
Homelab:plane/HOMELAB-1711-sweep-heart
Homelab:plane/HOMELAB-1824-omni-liveness
Homelab:plane/HOMELAB-1746-idp-redirect
Homelab:plane/HOMELAB-1711-sweep-control
Homelab:plane/HOMELAB-1711-raceprobe
Homelab:plane/HOMELAB-1711-dispatcher-image
Homelab:plane/HOMELAB-1720-identity
Homelab:plane/HOMELAB-1678-bashguard-fix
Homelab:plane/HOMELAB-1746-pangolin-oidc
Homelab:plane/HOMELAB-1680-custodian
Homelab:plane/HOMELAB-1678-scheduler
Homelab:plane/HOMELAB-1676-sentinel
Homelab:plane/HOMELAB-1677-rcbridge
Homelab:plane/HOMELAB-1796-teardown
Homelab:plane/HOMELAB-1794-spawn
Homelab:plane/HOMELAB-1797-claims
Homelab:plane/HOMELAB-1808-1809-fixes
Homelab:plane/HOMELAB-1791-sandbox-init
Homelab:plane/HOMELAB-1795-watch
Homelab:plane/HOMELAB-1798-compiler
Homelab:plane/HOMELAB-1674-claude-image
Homelab:plane/HOMELAB-1672-job-contract
Homelab:plane/HOMELAB-1698-meet-ai-namespace
Homelab:plane/HOMELAB-1635-cp01-pins
Homelab:plane/HOMELAB-1585-argocd-repo-creds
Homelab:plane/HOMELAB-1766-gateway-alerts
Homelab:epic/LD1
Homelab:plane/HOMELAB-1735-env-fix
Homelab:plane/HOMELAB-1735-harbor-robot
Homelab:plane/HOMELAB-1666-agent-sandbox
Homelab:plane/HOMELAB-1665-pi-image
Homelab:archive/epic/LD0-20261109
Homelab:plane/HOMELAB-1634-dind-harbor-auth
Homelab:plane/HOMELAB-1634-runner-cleanup
Homelab:plane/HOMELAB-1634-review-followups
Homelab:homelab/HOMELAB-1630-runner-resources
Homelab:plane/HOMELAB-1621-cpu-barchart
Homelab:plane/HOMELAB-1619-mgmt-vm-dashboard
Homelab:plane/HOMELAB-1598-oidc
Homelab:plane/HOMELAB-1574-plane-image-bump
Homelab:plane/HOMELAB-1535-outline-prestop
Homelab:plane/HOMELAB-1535-outline-ha
Homelab:plane/HOMELAB-1534-reviewer-fetch-auth
Homelab:plane/HOMELAB-1518-longhorn-rule-fix
Homelab:plane/HOMELAB-1527-tempo-pipeline
Homelab:plane/HOMELAB-1526-mqttx-web
Homelab:plane/HOMELAB-1511-prowlarr-qbit
No reviewers
Labels
No labels
operator-review
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
Homelab/infra-core!961
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "plane/R39-forgejo-access-log-auth"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Scope — R39 FIX7, PR-A of the split (the tenancy flip, no sink)
This is PR-A of the FIX7 split of
Homelab/infra-core#953(review-cd-r6B9 / BLOCK-1). It lands the Loki multi-tenancy flip and names every
pre-existing writer/reader's tenant, and carries nothing that can ship the
audit trail — no Vector forgejo source/sink, no CNP, no audit alerts. Those
live in PR-B (
plane/R39-forgejo-access-log-sink), which must not mergeuntil this PR is live and the unlabeled-401 proof holds.
What this PR does
loki.auth_enabled: false → trueatcore/charts/platform/loki/values.yaml:55— every request without anX-Scope-OrgID(or Basic-auth) tenant becomes HTTP 401, writer and reader alike.runtimeConfig.overrides.audit-forgejo(45 d retention +deletion_mode: disabled) and the canaryself-monitoringpin at the root path the chart actually reads.Lokidatasource header (main,kube-prometheus-stack/values.yaml), the otel-collectorotlphttp/lokiheader (main), and the LD dispatcher'sX-Scope-OrgID: main(DefaultLokiOrgID).check-loki-tenant-pin.sh(PR-A trim: pin +deletion_mode; no CNP section) wired into the newloki-auth-pin-testCI job.r6 findings this closes
kubectl scale dscannot run; single revert replays the leak) — closed by the two-commit rollback below.vecgateremoved — and whyThe FIX6 "vecgate=wave" claim is dropped. Sync waves order nothing here:
they only order root's apply of the Application CRs (
apps-root/root.yaml),and an infra-core
livemerge changes no CR in prod.git, so root does not evensync — each child Application (
loki,kube-prometheus-stack,opentelemetry-collector,monitoring-log-metrics) auto-syncs independently onits own refresh of infra-core
live, and nothing orders those syncs. A manualauto-sync pause on
monitoring-log-metricsis likewise reverted by rootselfHealwithin seconds (root re-applies theautomatedblock). The split isthe git-native fix that survives selfHeal.
Rollback — TWO commits (stop the writer BEFORE auth goes off)
No
kubectl scale dsanywhere (DaemonSets have no scale subresource).forgejo_pod_logssource, theloki_forgejo_auditsink, and the checkpoint hostPath together (they live in one manifest,vector-longhorn.yaml). Auth stays ON throughout R1.kubectl -n monitoring rollout status ds/vector-longhorn-log-metrics --timeout=5m, then wait forsum(rate(loki_distributor_lines_received_total{tenant="audit-forgejo"}[5m])) == 0.Checkpoint / e2e-ack replay (BLOCK-2): the hostPath
/var/lib/vector-longhorn-log-metricscarries checkpoint state only(fingerprints/offsets) — never a disk buffer (memory is the buffer). R1 removes
source + sink + checkpoint hostPath together, so there is no reader and no sink
left to replay anything, and end-to-end acks mean no acked line is ever re-sent.
The sink's
tenant_id: audit-forgejoheader is NOT the control (once auth is offin R2, Loki ignores headers and files everything under
fake) — removing thewriter is.
Delete probe (NIT-1) — run BEFORE Vector ships
Right after the 401 proof (step 3 of the landing order), while the audit tenant
is still empty, probe the delete refusal with a probe selector, never
{job="forgejo-access"}:On any 2xx, cancel at once with
DELETE /loki/api/v1/delete?request_id=<id>(inside the 24 h cancel period) and stop. The expected refusal is "not 2xx"
(4xx). A delete against the real
{job="forgejo-access"}must never be issued.NIT-2 — isolating promtool case
Add T4b:
0+1x16onreason="credential", eval 15 m, value15— theisolating increase-leg case that turns red if
rules:193(theForgejoAuditCredentialRedactedincrease leg) is deleted, mirroring the T2coverage that already protects
ForgejoAuditLogPartial.Landing order (why PR-A alone is safe to merge)
logvalues:DISABLE_ROUTER_LOG,LOGGER_ACCESS_MODE: console, safeACCESS_LOG_TEMPLATE) — already separate.{job="forgejo-access"}query returns 401,X-Scope-OrgID: mainreturns 200.Follow-ups (listed, not fixed here)
audit-forgejo) — needs the separate GRAFANA-LIST credential job; until it runs, treataudit-forgejoas readable by any org-1 Admin / Admin-role SA token.values/loki/values.yaml; live read-back stays mandatory), NIT-4 (sentinel scope), NIT-5 (add an unlabeled push 401 to the 2b proof), NIT-6 (runbook staleness vs FIX6), NIT-7 (main/self-monitoring/fakekeepfilter-and-delete) — tracked, out of R39 scope.LD-VERDICT APPROVED head=7f3581e8970e3a7774def99f1fa342d6b938e7c3 session=IR-20261112-r39a-seatA-20261112T1323Z
model: omniroute/deepseek-flash
session: IR-20261112-r39a-seatA-20261112T1323Z
Seat A, run IR-20261112-r39a (head trailer
Lab-Run: IR-20261112-r39a, last trailer, matches). Judgedgit diff 2d837e9bc0e199f14cc5f4927efbaea59edec0de...7f3581e8in my own clone (10 files, +300/-6), the chart itself, and the new check. I did not list or read this PR's comments/reviews; I did not run verdict-cli; this comment is posted once, by the sanctioned tool.LOADING CHECK (the thing that voided the first pair): exactly FOUR extensions and no others —
/etc/ld/pi/extensions/pi-session-tagplus private copies offorgejo(9 files),redact(6 files) andherdr-agent-state.ts(1). Tool set exactly read/bash/grep/find/ls/forgejo_comment_as. Nothing under/home/ld/work/pi-agent/extensions/auto-loaded. One detail I am recording rather than hiding: both private copy paths in my launch command resolve to/home/ld/work/transcripts/c961A.LQNvs4w8x4/(another run's 0700 folder), not under my owns961A...folder; counts and modes match the brief and I read nothing there but a directory listing./home/ld/.localabsent at launch and at stop.loki/values.yaml:55setsauth_enabled: trueINSIDE theloki:block; the chart's embedded config template rendersauth_enabled: {{ .Values.loki.auth_enabled }}(chartvalues.yaml:146), so it reaches the running Loki config. Correct path.loki/values.yaml:92-102loki.runtimeConfig.overrides.audit-forgejo-> charttemplates/runtime-configmap.yamlrenders ConfigMaploki-runtimewithtoYaml .Values.loki.runtimeConfigverbatim, and the chart already shipsruntime_config.file: /etc/loki/runtime-config/runtime-config.yaml(chartvalues.yaml:194-195) with the ConfigMap mounted in SingleBinary mode (templates/single-binary/statefulset.yaml:187-188,230). So the 45 dretention_periodanddeletion_mode: disableddo reach the single-binary Loki this repo deploys — they are not values-file decoration. (Loki 3.4.2 is 3.x, sodeletion_modereally does default tofilter-and-deletewhen unpinned, i.e. the guard is not hypothetical.)templates/loki-canary/daemonset.yaml:51-54renders-user=/-tenant-id=from$.Values.monitoring.selfMonitoring.tenant.name, ONLY whenloki.auth_enabled— i.e. this pin becomes load-bearing precisely because of this diff — and nothing in the chart readsloki.monitoring.*. The pin atmonitoring.selfMonitoring.tenant.name: self-monitoring(values.yaml:140-141) is therefore at the read path, not the inert one.Lokidatasource:kube-prometheus-stack/values.yaml:72-75,jsonData.httpHeaderName1: X-Scope-OrgID+secureJsonData.httpHeaderValue1: main(the documented Grafana pairing). Tempo'stracesToLogsV2.datasourceUid: lokireuses that same datasource, so it inherits the header.otlphttp/loki:opentelemetry-collector/values.yaml:117-119headers: X-Scope-OrgID: main, and that exporter really is in thelogspipeline (:134-137) — a named writer, not a dead exporter.signalintake/logsource.go:113-115sets the header fromsettings.LokiOrgID, defaultmain(settings.go:45-49,82,DefaultLokiOrgID), config/env wired inarms_signals.go:44-46,73-79andconfig/config.go:717-719. It cannot degrade to an empty header.Sweep for anything else:
grep -rn "type: loki"-> exactly one datasource;grep -rl ":3100"-> those three paths plusconfig/example.go(doc text only); no promtail/alloy/fluent/grafana-agent in the tree;core/manifests/monitoring/log-metrics/vector-longhorn.yamlwrites NOTHING to Loki (its only sink isprometheus_exporter), so it is not an unnamed pre-existing writer; the only other Loki traffic is Prometheus/metricsscrapes, which are not tenant-guarded. The canary (chart defaultlokiCanary.enabled: true) is the pre-existing writer the body names, and it lands inself-monitoring. Caveat I cannot close from this repo: prod-repo App manifests and the dispatcher Deployment env are outside the tree; the in-tree default (main) covers the dispatcher even if no env is set.SPLIT CLAIM CONFIRMED.
git diff --name-only live...HEAD: 10 files, and the only manifest touched iscore/manifests/monitoring/rule-tests/check-loki-tenant-pin.sh. No Vector sink/source, no CiliumNetworkPolicy/NetworkPolicy, no PrometheusRule/audit alert.audit-forgejoand "Vector" appear only in comments and in the check's own assertion. PR-A carries the flip and the guards only, as claimed.THE CHECK IS FAIL-CLOSED AND ON THE LIVE GATE.
.forgejo/workflows/ci.yaml:90-104addsloki-auth-pin-testtoci.yaml, which triggers onpull_requesttolive(ci.yaml:3-7) — sameruns-on: k8sashelm-validate, so helm exists there. The script isset -euo pipefail, accumulatesFAIL=1and ends inexit 1; missing helm -> exit 1; chart pull failure -> exit 1 (no|| true); the PyYAML block is|| FAIL=1. It is not print-and-pass. It asserts the pin, proves the assertion is non-vacuous by sentinel-overriding the SAME path, proves the oldloki.monitoring.*path stays inert, and provesdeletion_mode: disabledfrom the renderedloki-runtimeConfigMap plus a sentinel override of that path. That is the right PR-A trim (no N11/CNP canary-scrape check, correctly deferred to PR-B).WHAT I RAN IN MY CLONE (no cluster, no image harness, no kubectl — the binary is present but never invoked):
go test ./config/... ./signalintake/... ./cmd/...inlab-director/dispatcher— all pass, including the newTestLokiSourceNamesItsTenant(it would fail on an empty/absent header, so the guard is live);bash -non the new script — clean. shellcheck, promtool, kustomize and helm are NOT installed in this sandbox, so I could not render; I substituted reading the pinned 6.29.0 templates directly, which answers the path questions but not the rendered output.NON-BLOCKING DEFECTS (named, not holds — none of them can produce a false green, and none change the post-flip tenant of any named writer/reader):
a)
check-loki-tenant-pin.shrender helper uses--set monitoring.lokiCanary.enabled=trueand the comment above it says "The canary is OFF in the shipped values ... so it is switched ON for the render". In chart 6.29.0 the DaemonSet is gated on the TOP-LEVELlokiCanary.enabled(templates/loki-canary/daemonset.yaml:1-2), whose chart default istrue;monitoring.lokiCanarydoes not exist in that chart. So that--setis inert, the canary renders because of the chart default, and the repo's ownmonitoring.lokiCanary.enabled: false(loki/values.yaml:142-143, pre-existing, unchanged here) is likewise inert. The assertions are still correct and still fail closed (if the canary ever stops rendering, section 1 goes red), but the stated "switch it on" mechanism does not work, and the values line claims a disable that never happens. Worth a follow-up commit; it also means the rule-tests comment about "no self-monitoring in this cluster" is wrong on both counts.b) The check needs CI egress (grafana.github.io index + the GitHub release URL it resolves to). I found no other CI job in this repo that depends on outbound fetch (helm-validate lints only local charts;
run-vector-tests.shdownloads but is not wired into CI), so runner egress is unproven. If it is blocked the job goes red, i.e. fails closed, not silently green.c) Cosmetic: the script's sections number 1,2,3,5 (no 4) and
grep -A3 'name: loki-canary$' ... || trueis dead code.NOT VERIFIED (stated plainly): the comment's claim that
CHART_VERSION=6.29.0is "the same pin the ArgoCD Application renders" — the ArgoCD Application manifests are not in this repo (core/manifests/argocddoes not exist), so if prod renders a different chart version the canary tenant path could differ; the CI check would only catch that drift at 6.29.0. I also did not verify Loki's runtime behaviour of per-tenantdeletion_mode/retention_periodon a live cluster (out of scope and forbidden here), only that the override reaches the ConfigMap the config points at.No hold: every reader and writer that would 401 after the flip is named with a tenant in this same diff, the two guards are real and fail-closed, and PR-A is sink-free.
APPROVE — ld-reviewer — head
7f3581e897Seat B, run IR-20261112-r39a. Judged
git diff 2d837e9bc0e199f14cc5f4927efbaea59edec0de...7f3581e8970e3a7774def99f1fa342d6b938e7c3in my own clone only. Head trailerLab-Run: IR-20261112-r39ais the LAST trailer (checked with%(trailers)), so the census pin holds. Tools used: read, bash, grep, find, ls, forgejo_comment_as — nothing else; no extension or tool beyond the four declared was observable.WHAT I RAN
git diff --name-only live...HEAD(10 files: ci.yaml, 3 chart values, the new check script, 5 dispatcher Go files). No cluster, no kubectl, no image harness.loki-6.29.0.tgzand readvalues.yaml+templates/. Also pulledkube-prometheus-stack(93.2.2) andgrafana(10.5.15) to confirm the datasource passthrough.bash -n core/manifests/monitoring/rule-tests/check-loki-tenant-pin.sh→ OK.go test ./signalintake/... ./config/...inlab-director/dispatcher→okfor both packages (includes the newTestLokiSourceNamesItsTenant).X-Scope-OrgID,loki.monitoring.svc, every file mentioning loki, every Vector config, every dashboard.THE FLIP IS AT THE PATH THE CHART READS.
loki.auth_enabledis exactly what the chart interpolates into the Loki config:loki.configcarriesauth_enabled: {{ .Values.loki.auth_enabled }}(chart values.yaml:150; default true at :329). Soauth_enabled: trueunderloki:is live, not inert. (gateway.enabled: false, so no nginx tenant gate in the way; clients talk to the :3100 service directly.)runtimeConfig.overrides.audit-forgejoLANDS WHERE THE CHART LOOKS.templates/runtime-configmap.yamlrenders.Values.loki.runtimeConfiginto ConfigMap<loki.name>-runtime→loki-runtimeat release nameloki, and the chart already pointsruntime_config.fileat/etc/loki/runtime-config/runtime-config.yaml(chart values.yaml:194-195) and mounts that ConfigMap in the single-binary StatefulSet (statefulset.yaml:187-188, 230-232). Soretention_period: 1080handdeletion_mode: disabledare read, not decorative. Cross-check on B10's premise: Loki's own flag doc says deletion modedisabled("When set to 'filter-only' or 'filter-and-delete', and if retention_enabled is true, then the log entry deletion API endpoints are available") — i.e.disabledkills the delete API only; compactor retention (globallimits_config.retention_period: 30d,compactor.retention_enabled: true) still enforces the tenant's 45 d. The stated intent and the mechanism agree.THE CANARY PIN IS AT THE ROOT PATH, AND IS NON-DEFAULT-ONLY-IN-NAME.
templates/loki-canary/daemonset.yaml:51-54emits-user={{ .Values.monitoring.selfMonitoring.tenant.name }}/-tenant-id=…only when$.Values.loki.auth_enabled— so after this flip the canary (the ONE pre-existing writer, the measuredtenant="fake"series) writesself-monitoringand cannot 401. Rootmonitoring.selfMonitoring.tenant.nameis the right path; note the chart default is already"self-monitoring"(chart values.yaml:3675-3680), so the pin's value is explicitness, which is what 3c N12 asked for.READER CENSUS — I found no unnamed fourth reader or writer. The three that need a header get one in this same diff, and each is at the right path:
jsonData.httpHeaderName1: X-Scope-OrgID+secureJsonData.httpHeaderValue1: main(kube-prometheus-stack/values.yaml:73-76). kube-prometheus-stack rendersgrafana.additionalDataSourcesverbatim (toYamlpassthrough, configmaps-datasources.yaml:94-95) and the operator path is not enabled in these values, sosecureJsonDatareaches Grafana's provisioning file — this is the documented custom-header shape.otlphttp/loki.headers.X-Scope-OrgID: main(opentelemetry-collector/values.yaml:117-118); the exporter is the only Loki exporter, and nothing else in that config writes to Loki.Signals.lokiOrgID→Settings.LokiOrgID→LokiSourceConfig.OrgID, defaulting toDefaultLokiOrgID = "main"; the header is set on the only HTTP pathLokiSource.Series(logsource.go:112-115 —Seriesis the sole method that builds a request). Unset config can never produce an empty header.core/manifests/monitoring/log-metrics/vector-longhorn.yaml, sinks toprometheus_exporterONLY ("writes nothing to Loki" is literally its design note) — so PR-B's sink really is the first Loki writer besides the canary, and there is no pre-existing unnamed writer hiding in the tree. No dashboard incore/manifests/monitoring/dashboards/queries Loki. Loki's own alert rules (loki-storage.rules) read Prometheus metrics, not the log API, so they are unaffected by tenancy.THE GUARD IS FAIL-CAPABLE AND WIRED.
set -euo pipefail; missing helm →exit 1(no silent skip); a missingloki-runtimeConfigMap →sys.exit(1); wrongdeletion_mode→sys.exit(1); the sentinel overrides prove each assertion is not vacuous (a sentinel on the pinned path changes the render; a sentinel on the OLDloki.monitoring.*path changes nothing); and the accumulator ends in a realexit 1. It is wired as its own jobloki-auth-pin-testonpull_requesttolive/epic/**(ci.yaml:4-7, 90-104), in the sameruns-on: k8spool whosehelm-validatejob already proveshelmandpython3+PyYAML exist there (ci.yaml:34, 19). Itsdeletion_modesentinel also proves the runtime-config path itself.THE SPLIT CLAIM HOLDS.
git diff --name-onlycontains no Vector manifest/config, no CiliumNetworkPolicy, no alert rule; grepping the added lines forvector|CiliumNetworkPolicy|promtail|sink|prometheus_remote_write|alert:returns exactly one hit, and it is a comment in loki/values.yaml that describes the future Vector writer. Nothing sink-shaped ships here.NON-BLOCKING DEFECTS (fix in PR-B or a follow-up; neither defeats the flip)
a)
core/manifests/monitoring/rule-tests/check-loki-tenant-pin.sh:40-42— the comment "The canary is OFF in the shipped values (no self-monitoring in this cluster), so it is switched ON for the render" is false, and the--set monitoring.lokiCanary.enabled=trueis an inert no-op. The chart's switch is ROOTlokiCanary.enabled(chart values.yaml:747-748, default true; template guard{{- with .Values.lokiCanary -}}{{- if .enabled -}}), and the repo'smonitoring.lokiCanary.enabled: false(loki/values.yaml:145) is at a path nothing reads. That is exactly why the canary is running and why the PR body's own census measures afake-tenant writer — the facts are consistent, the comment is not. Importantly this does NOT weaken the guard: it passes only because the chart default is true, and if the chart ever flipped that default the section-1/2/3 assertions would FAIL loudly (no canary rendered, no-tenant-id=), not pass quietly. The stalemonitoring.lokiCanary.enabled: falseline predates this PR; I did not hold this PR for it, but the new comments should not assert the opposite of measured behaviour.b)
check-loki-tenant-pin.shnumbers its sections 1,2,3,5 — there is no section 4 (leftover from the N11 CNP check that moved to PR-B). Cosmetic only.c) The script's
CHART_VERSION=6.29.0is "the same pin the ArgoCD Application renders" — the Application lives in Homelab/prod, so that equality is asserted, not verifiable from this repo. If prod's pin moves, the guard keeps testing 6.29.0 until someone bumps the literal; the pin should ideally be read from the same place prod reads it.WHAT I COULD NOT VERIFY (stated plainly): no
helmin my environment, so I did not execute the render myself — I verified every path it asserts by reading the pinned chart's templates instead, and I did not install a helm binary (R37: leave the image/agent dirs alone). I could not confirm theruns-on: k8srunner has egress to grafana.github.io forhelm pull; that failure mode is loud (job red), never a silent green. I could not check Homelab/prod overlay values, so an override there that drops the otel-collectorotlphttp/lokiheaders or the Grafana datasource header would be outside this diff. ThetracesToLogsV2: datasourceUid: lokiin the Tempo datasource still has no matchinguid:on the Loki datasource entry — pre-existing, unrelated to tenancy, not a 401.ENVIRONMENT / RULES: LD_SESSION_TAG was set to the full gateway tag; the comment carries the bare sid only.
/home/ld/.localand/home/ld/.local/bindo not exist (checked at launch and again at stop). I read no credential file, no /proc/*/environ, and no PR/issue comment or review. I started no background process;psbefore posting showed nothing of mine still running (one unrelated shell in another run's directory, pid 1272058, was already running and I did not touch it). Scratch chart downloads were under /tmp and are deleted.model: omniroute/deepseek-flash
session: IR-20261112-r39a-seatB-20261112T1323Z
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.