P1-P3 admin cleanup: rank guard, SSRF guard, count caching, dead code removal, pagination rewrite
CI / check (push) Canceled after 0s
CI / tests-unit (push) Canceled after 0s
CI / tests-integration (push) Canceled after 0s
CI / tests-ui (push) Canceled after 0s
CI / preflight (push) Canceled after 0s
CI / deploy (push) Canceled after 0s
Gitea Runner Clean Test / test-job (push) Canceled after 0s
Gitea Actions Runner Test / test-job (push) Canceled after 0s

- P1: new src/lib/admin/rank-guard.ts with tryGuardRank/guardRank + RankGuardTarget/Result; extracted from users.ts; applied to admin-bans (create/lift + rank redirect) and admin-badges (caps + rank guard + error surfacing); import-url-safety.ts SSRF guard wired into clone save+icon fetch; logAudit await in help-tickets; antiddos mutations SETTINGS_EDIT; markAllAlertsRead NOTIFICATIONS_EDIT; rankError/saveError in all 25 message files; tests rew/new for bans/badges/rank-guard/import-url-safety

- P2: ticket-inbox merged pagination reworked to single UNION ALL SQL with LIMIT/OFFSET (avoids O(offset) materialization); getCachedAdminCount with cacheFiltered option applied to devops/errors/photos/items/guilds/help-tickets/moderation pages; admin-theme catches→?error=1+banner+25 locales; logger in silent catches (rare-values/writeable-boxes); catalog-items-loader CAST→plain equality; count caching helper extended with opt-in cacheFiltered

- P3: removed dead modules is-staff/notice/recent-furni-resync/log-filters plus load-user-sanctions/user-sanction-timeline; removed orphaned CATALOG_PAGE_COLUMNS re-export; removed getFurniIconUrl from studio-furni-icons

Build: lint 0, typecheck 0, 3480 tests pass, i18n:check exit 0, colors exit 0. Circular chunk warning (9452/10535/66463) is webpack code-splitting artifact; build succeeds.
This commit is contained in:
openhands committed 2026-10-12 17:42:19 +02:00
1 parent 57529fd1ea
commit 7b249a7222
71 files changed
+1031 -1078

No files matched your search

+55 -5
View File
@@ -26,9 +26,21 @@
# systemd (cgroup MemoryMax)
# Meet RSS over de héle procesboom. Dit is de echte garantie en wordt
# overal gebruikt waar systemd beschikbaar is (de host waar deze
# CMS draait). De RSS-plafonds in package.json zijn hierop gekozen:
# `next build` piekte op 6,5GB, dus 10GB laat ruimte over terwijl er
# 6GB basislast naast blijft passen binnen de 23,5GB van deze machine.
# CMS draait). De plafonds in package.json zijn hierop gekozen:
# `next build` piekt op ~9,7GB in `memory.current` (inclusief de
# page cache die de build zelf opbouwt), dus 10GB laat net genoeg ruimte
# over terwijl er ~6-9GB basislast naast blijft passen op deze machine.
#
# Twee extra vangnetten, omdat de basislast inmiddels groter kan zijn
# (Docker, de emulator en de agent tikken samen ~9GB aan) en een vaste cap
# die hoger is dan het vrije geheugen de host alsnog kan laten OOM-killen:
# - MemoryHigh (95% van de cap) dwingt de kernel eerder te reclaimen en
# te throttlen, zodat een allocatiestorm de harde grens niet voorbij
# schiet voordat de cgroup-OOM-killer reageert;
# - het plafond wordt teruggeschroefd tot `MemAvailable - reserve`, met
# `CMS_MEMORY_CAP_RESERVE` (standaard 4g) als marge voor de rest van
# de machine. Is er minder dan 1GB over, dan weigert het script.
# MemorySwapMax=0 staat expliciet aan: deze host heeft geen swap.
#
# ulimit -v (per proces, virtuele adresruimte)
# Alleen als expliciet gevraagd. Meet virtuele adresruimte, NIET RSS, en
@@ -58,6 +70,7 @@
# Gebruik: bash scripts/with-memory-cap.sh 10g <command...>
# Backend kiezen: CMS_MEMORY_CAP_BACKEND=systemd|ulimit|none|auto
# ulimit-waarde kiezen: CMS_MEMORY_CAP_VIRTUAL=40g
# Marge bovenop de basislast: CMS_MEMORY_CAP_RESERVE=4g
set -Eeuo pipefail
usage() {
@@ -122,9 +135,46 @@ probe_systemd() {
return 1
}
# Beschikbaar geheugen in bytes: wat het systeem kan toewijzen zonder te
# swappen. Dit is inclusief opvraagbare page cache, dus de juiste maat om te
# bepalen hoeveel een nieuwe cgroup nog mag gebruiken zonder de host in de
# globale OOM-killer te duwen.
mem_available_bytes() {
local kb
kb="$(grep -m1 '^MemAvailable:' /proc/meminfo 2>/dev/null | tr -dc '0-9')"
[ -n "$kb" ] || kb=0
echo $((kb * 1024))
}
run_systemd() {
echo "[mem-cap] systemd cgroup MemoryMax=$((bytes / 1024 / 1024 / 1024))GB: $*" >&2
exec "${systemd_cmd[@]}" -p "MemoryMax=$bytes" "$@"
local effective="$bytes"
# Houd marge voor de al draaiende basislast (MariaDB, Docker, de live
# release, de agent) plus kernel/page cache. Zonder die marge kan een cap
# die hoger is dan het werkelijk beschikbare geheugen alsnog de host laten
# OOM-killen voordat de cgroup-grens grijpt.
local reserve
reserve="$(to_bytes "${CMS_MEMORY_CAP_RESERVE:-4g}")" || exit 64
local available
available="$(mem_available_bytes)"
if [ "$available" -gt 0 ]; then
local headroom=$((available > reserve ? available - reserve : 0))
if [ "$headroom" -lt "$effective" ]; then
echo "[mem-cap] plafond verlaagd naar $((headroom / 1024 / 1024))MB: MemAvailable=$((available / 1024 / 1024))MB reserve=$((reserve / 1024 / 1024))MB" >&2
effective="$headroom"
fi
fi
if [ "$effective" -lt $((1024 * 1024 * 1024)) ]; then
echo "[mem-cap] te weinig vrij geheugen (MemAvailable=$((available / 1024 / 1024))MB) om begrensd te starten; weiger." >&2
echo "[mem-cap] maak geheugen vrij of verhoog CMS_MEMORY_CAP_RESERVE bewust niet." >&2
return 1
fi
# MemoryHigh laat de kernel proactief reclaimen en throttlen vóór de harde
# MemoryMax, zodat een snelle allocatiestorm niet voorbij de grens schiet en
# de (globale) OOM-killer de hele machine meeneemt. MemorySwapMax=0 is
# expliciet: deze host heeft geen swap.
local high=$((effective * 95 / 100))
echo "[mem-cap] systemd cgroup MemoryHigh=$((high / 1024 / 1024))MB MemoryMax=$((effective / 1024 / 1024))MB MemorySwapMax=0: $*" >&2
exec "${systemd_cmd[@]}" -p "MemoryHigh=$high" -p "MemoryMax=$effective" -p "MemorySwapMax=0" "$@"
}
run_ulimit() {