infra/stacks
Viktor Barzin f325b949be
All checks were successful
ci/woodpecker/push/default Pipeline was successful
ci/woodpecker/push/build-cli Pipeline was successful
keel: re-enable with policy=patch (semver-bounded) + fix CI deny-privileged
Re-enables Keel after the 2026-05-26 emergency stop, with a safer default.

Switch Kyverno-injected default from `force + match-tag=true` (proven
unreliable — it rewrote tag strings cluster-wide despite the design intent)
to `patch`, which is semver-parser-bounded:

  - Only patch bumps within current major.minor (1.2.3 → 1.2.4, never
    1.3.x or 2.x — the parser does the math, not string compare).
  - Non-semver tags (`:latest`, `:v4`, `:2`, SHA, `:nightly`) are
    IGNORED entirely. No tag rewriting under any code path.
  - 151 stale `force` annotations migrated to `patch` cluster-wide
    during this apply (anchor `+()` dropped, then re-added).

Live state after this commit:
  0 workloads on `force`, 209 on `patch`, 22 on `never`.
  Keel deployment back to 1/1 on `:0.21.1`.

Note: 22 workloads with `keel.sh/policy=never` LABEL had their annotation
mutated to `patch` during the migration despite Kyverno's
matchLabels-based exclude rule — appears to be a quirk of
`mutateExistingOnPolicyUpdate` not honoring `selector` excludes. Repatched
all 22 back to `annotation=never` via `kubectl annotate --overwrite`, then
restored the `+(keel.sh/policy)` anchor in the policy so future Kyverno
reconciles preserve them.

Also fixes CI build-cli workflow which was blocked by
`deny-privileged-containers` since wave 1 enforce flip on 2026-05-18:
woodpecker namespace added to the shared security_policy_exclude_namespaces
list (CI pipeline pods `wp-*` run privileged docker builds, legitimate use).

The `default` workflow (terragrunt apply) was already passing — only the
parallel `build-cli` workflow (which builds the infra-cli docker image) was
failing, but it took the overall pipeline status down with it.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 19:06:51 +00:00
..
_template
actualbudget
affine
authentik
beads-server
blog
broker-sync
calico
changedetection
chrome-service
city-guesser
claude-agent-service
claude-memory
cloudflared
cnpg
coturn
crowdsec
cyberchef
dashy
dawarich
dbaas
descheduler
diun
ebook2audiobook
ebooks
echo
excalidraw
external-secrets
f1-stream
fire-planner
foolery
forgejo
freedify
freshrss
frigate
grampsweb
hackmd
headscale
health
hermes-agent
homepage
immich
infra
infra-maintenance
insta2spotify
instagram-poster
isponsorblocktv
job-hunter
jsoncrack
k8s-dashboard
k8s-portal
k8s-version-upgrade
keel
kms
kured
kyverno
linkwarden
llama-cpp
local-path
mailserver
matrix
meshcentral
metallb
metrics-server
monitoring
n8n
navidrome
netbox
networking-toolbox
nextcloud
nfs-csi
nodelocal-dns
novelapp
ntfy
nvidia
onlyoffice
openclaw
osm_routing
owntracks
paperless-mcp
paperless-ngx
payslip-ingest
phpipam
platform
plotting-book
poison-fountain
postiz
priority-pass
privatebin
proxmox-csi
pvc-autoresizer
rbac
real-estate-crawler
recruiter-responder
redis
reloader
resume
reverse-proxy
rybbit
sealed-secrets
send
servarr
shadowsocks
speedtest
status-page
stirling-pdf
tandoor
technitium
terminal
tor-proxy
trading-bot
traefik
travel_blog
tuya-bridge
uptime-kuma
url
vault
vaultwarden
vpa
wealthfolio
webhook_handler
whisper
wireguard
woodpecker
xray
ytdlp