Legacy Registry/Feeds Retirement Runbook
Cut over to Gitea and retire docker-registry, registry-admin, ProGet, BaGet and Verdaccio.
Runbook for retiring the five legacy package services after the Gitea package
registry (gitea.perspective-v.com, org perspective-v) is live. Follow in order;
each phase is reversible until Phase 4.
Status of prerequisites (as of migration)
- Gitea deployed, 1/1 healthy, public + sign-in required.
- Packages migrated into Gitea:
- NuGet: 45 versions (PerspectiveV.Common/EntityFramework/Primitives/Web) from BaGet.
- Docker: 20 tags across 11 repos from
registry.perspective-v.com. - npm:
@pv/core(14 versions) from the Azure DevOpspv-ngfeed. - Verdaccio: empty (nothing to migrate).
- WUD reconfigured to read from Gitea (
wud-monitorread-token); operations stack not yet deployed. - CI/CD pipeline templates + service image refs repointed to
gitea.perspective-v.com/perspective-v/<image>(files updated, not yet redeployed).
Phase 0 — Verify Gitea has everything (read-only)
TOKEN=<gitea write token>
# docker repos
curl -s -H "Authorization: token $TOKEN" "https://gitea.perspective-v.com/api/v1/packages/perspective-v?type=container&limit=100" | python3 -c 'import sys,json;print(sorted({p["name"] for p in json.load(sys.stdin)}))'
# nuget + npm counts
curl -s -H "Authorization: token $TOKEN" "https://gitea.perspective-v.com/api/v1/packages/perspective-v?type=nuget&limit=100" | python3 -c 'import sys,json;print(len(json.load(sys.stdin)),"nuget versions")'Phase 1 — Cut over CI/CD (per app repo)
For each app repo, set the CI secrets/variables to Gitea (see docs/runtime/stacks/gitea.mdx):
REGISTRY_USERNAME=Gitea CI user, REGISTRY_PASSWORD=Gitea write:package token,
NPM_FEED_URL/NUGET_FEED_URL/*_TOKEN=Gitea endpoints+token. Templates already
default REGISTRY_HOST=gitea.perspective-v.com + REGISTRY_NAMESPACE=perspective-v.
Run each pipeline once and confirm push to Gitea succeeds.
Phase 2 — Cut over running services (production redeploy)
The service stack files + env now reference gitea.perspective-v.com/perspective-v/<image>.
Redeploy each so it pulls from Gitea. Swarm nodes must be able to auth to Gitea for
private pulls — add the Gitea pull token on the node (or make the packages public):
echo "<token>" | docker login gitea.perspective-v.com -u <ci-user> --password-stdin
# then per service (examples):
./swarm/scripts/websites/dbskc.sh deploy
./swarm/scripts/websites/gorsistudio.sh deploy
./swarm/scripts/websites/nishatcolony.sh deploy
./swarm/scripts/websites/wcblahore.sh deploy
# perspective-v services (identity/graph/console) as applicableVerify: docker service ls shows the services 1/1 and
docker service ls --format '{{.Image}}' shows gitea.perspective-v.com/... (no
registry.perspective-v.com/ remaining). Confirm each site still serves.
Swarm pulls images on the node. For private Gitea packages, either grant the org package read to the pulling identity and
docker loginon the node, or set the relevant packages' visibility so nodes can pull. Test one service first.
Phase 3 — (optional) bring up WUD on Gitea
Only if you want update monitoring. Note Watchtower auto-restarts labelled services.
sh swarm/secrets/create-all-secrets.sh # ensures wud_registry_password (Gitea token)
./swarm/scripts/platform/platform.sh deployPhase 4 — Legacy stacks retired
infra-registry and infra-feeds were removed after Gitea and all package
consumers were validated. Their obsolete Swarm manifests, launchers, and
retirement helper have also been removed.
Phase 5 — Cleanup (after a confidence window)
- Remove old DNS records:
registry.,registry-admin.,nuget.,npm.,proget.perspective-v.com. - Prune legacy data volumes:
registry_registry_data,registry_registry_admin_data,registry_registry_admin_config,feeds_verdaccio_storage, and the proget/baget volumes. - Remove retained Compose-era artifacts under
runtime/environments/**/infrastructure/{registry,feeds}/, and theregistry_*/baget_api_key/npm_feed_api_keyentries inswarm/secrets/create-all-secrets.sh+secrets-map.md. - Update
.claude/settings.local.jsonhealth checks that point atproget.perspective-v.com. - Update legacy docs (
docs/runtime/stacks/{registry,feeds}.mdx, service READMEs) or mark them superseded bydocs/runtime/stacks/gitea.mdx.
Rollback
Legacy Swarm launchers are no longer retained. Recovery requires the prior repository revision plus the retained volumes and any recreated secrets.