Perspective V Docs

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 DevOps pv-ng feed.
    • Verdaccio: empty (nothing to migrate).
  • WUD reconfigured to read from Gitea (wud-monitor read-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 applicable

Verify: 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 login on 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 deploy

Phase 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 the registry_* / baget_api_key / npm_feed_api_key entries in swarm/secrets/create-all-secrets.sh + secrets-map.md.
  • Update .claude/settings.local.json health checks that point at proget.perspective-v.com.
  • Update legacy docs (docs/runtime/stacks/{registry,feeds}.mdx, service READMEs) or mark them superseded by docs/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.

On this page