Repository navigation
feat(tenants): opt-in nachtelijke demo-reset per tenant - #147
rubenvdlinde wants to merge 4 commits into
Conversation
…en momentopname Nieuwe opt-in component tenant.components.demoReset. Een eigen ApplicationSet (nextcloud-tenant-demo-reset) met een post-selector op enabled: true rendert charts/tenant-demo-reset in de namespace van de tenant; voor de rest van de vloot levert hij niets op en de bestaande tenant-Applications veranderen niet. De chart levert een ServiceAccount met alleen pods get/list en pods/exec, een ConfigMap met het script, een nachtelijke CronJob (04:15 Europe/Amsterdam, paused zet hem stil) en een CronJob demo-reset-golden die nooit vanzelf draait en die een mens afvuurt met kubectl create job --from. De momentopname is een template-database binnen de eigen Postgres (<db>_demo_golden) plus een kopie van de datamap naar /var/www/demo-reset op dezelfde PVC. Terugzetten is CREATE DATABASE ... TEMPLATE en een rename, daarna de datamap; logs, config/ en custom_apps blijven van de draaiende tenant. Daarna occ upgrade als de app-code nieuwer is, memcache:distributed:clear (alleen de sleutels van deze instantie in de gedeelde Redis) en occ openregister:example-set:install per set. confirmWipe moet de tenantnaam herhalen, anders rendert de chart niet en wist het script niets. Een S3 primary objectstore, een andere instanceid of een database en map van verschillende momenten stoppen de reset voordat er iets gewist is. Faalt hij daarna, dan blijft de onderhoudsmodus aan.
…ectl validate-values.sh kent tenant.components en weigert er onbekende sleutels. Voor demoReset: enabled en paused zijn echte booleans, confirmWipe is de tenantnaam, alleen dbType postgres, niet op een canary-tenant (S3), schedule is een cron-schema met vijf velden, exampleSets vraagt openregister. Vijftien nieuwe cases. run-demo-reset-tests.sh rendert de chart (uit leeg, aan zes geldige resources, verkeerde confirmWipe faalt), het values-blok van de ApplicationSet via Helm, en draait demo-reset.sh tegen een nep-kubectl met echte bestandsoperaties op een nep-boom: momentopname nemen, terugzetten, falen voor en na de eerste onomkeerbare stap, een wissel die halverwege stopte, het wachtwoord via stdin. verify.sh draait de suite mee.
docs/DEMO-RESET.md beschrijft hoe de reset werkt, wat de momentopname is en wat er niet wordt teruggezet, aanzetten, de momentopname nemen, controleren, falen en herstarten, uitzetten en weghalen, de voorwaarden op het cluster en waarom niet CNPG, pg_dump, VolumeSnapshots of S3. docs/agents.md krijgt twee regels: demoReset aanzetten is voorstel-eerst, een momentopname nemen of een reset met de hand starten is mensenwerk. docs/index.md, docs/TENANT-OPERATIONS.md, CLAUDE.md en een changelog- fragment verwijzen ernaar.
…oor medewerkers Een demo-tenant met inwoners-accounts toont anders elke werkplek-app aan een inwoner. Nieuw optioneel blok tenant.components.demoReset.limitApps (apps + exceptGroups): na de voorbeeldsets zet de reset elke app aan voor alle groepen behalve exceptGroups, per app apart. Een app die Nextcloud niet tot groepen laat beperken, gaat aan voor iedereen met een WARN. Groeps- en app-namen gaan door occ in een sh -c-string, dus de validator en het script accepteren alleen veilige namen. Validator: zes fixtures. Suite: chart-env, appset-values en vijf scriptcases. De openregister-check in de validator leest yq nu helemaal uit: onder pipefail gaf grep -q af en toe een SIGPIPE-fout op een geldig bestand.
WatEén commit bovenop #147 ( tenant:
components:
demoReset:
limitApps:
apps: [dashboard, contacts, calendar, deck, mail, launchpad, dossiq, pipelinq, decidiq, shillinq, filinq, stackiq, buildiq, keepiq, hermiq, versioniq]
exceptGroups: [inwoners]Na Aanleiding: in de generale repetitie van Zuiddrecht zag een vers Veiligheid
Ook in deze commitDe openregister-check van #147 in Gedraaid
Niet gedraaid: niets tegen een cluster. Een tenant zonder Te beslissen
Platformwijziging (nieuwe ApplicationSet en chart via #147), label 🤖 Generated with Claude Code |
Wat
Een openbare demo-tenant vult zich met wat bezoekers maken. Nieuwe opt-in
component
tenant.components.demoResetzet zo'n tenant elke nacht terug naareen gouden momentopname en laadt daarna de voorbeeldsets opnieuw. Aanleiding:
de demogemeente Zuiddrecht (
zuiddrecht-prod).Nieuwe lokale chart
charts/tenant-demo-reseten een aparte ApplicationSetnextcloud-tenant-demo-resetmet een post-selector optenant.components.demoReset.enabled. Zelfde afweging alsnextcloud-tenant-routes: geen vierde source innextcloud-tenants, dus debestaande tenant-Applications veranderen niet.
De chart levert een ServiceAccount met alleen
podsget/list enpods/exec,het script als ConfigMap, een nachtelijke CronJob en een CronJob
demo-reset-goldendie een mens afvuurt. Alles loopt viakubectl execin debestaande pods. De momentopname is een template-database in de eigen Postgres
plus een kopie van de datamap op dezelfde PVC.
Veiligheid:
confirmWipemoet de tenantnaam herhalen (validator, chart enscript). De reset stopt voordat er iets gewist is bij een S3 primary
objectstore, een andere instanceid, of een database en map van verschillende
momenten. Faalt hij daarna, dan blijft de onderhoudsmodus aan. Redis wordt
alleen voor deze instantie geleegd (
occ memcache:distributed:clear).Validator: vijftien nieuwe cases. Nieuwe suite
nextcloud-platform/tests/run-demo-reset-tests.sh, gedraaid doorscripts/verify.sh. Docs:docs/DEMO-RESET.md.Openstaand: de ApplicationSet komt pas na een handmatige sync van
nextcloud-platform-bootstrap. Het imagealpine/k8s:1.29.2is op taggepind, niet op digest. Nooit op een cluster gedraaid.
Gecontroleerd
Lokaal:
scripts/verify.sh,nextcloud-platform/tests/run-tests.shenpre-commit run --all-files --hook-stage pre-pushgeven exit 0. Alle 89 bestaande tenants renderen byte-identiek (values en manifests). Niet gedraaid: niets tegen een cluster.Opt-in per tenant; platformwijziging, dus mergen ma tot do na 17:00 en daarna
nextcloud-platform-bootstrapsyncen. Eerste gebruiker: tenantzuiddrecht-prod(#145).🤖 Generated with Claude Code