r3dr: retire the Go service and its serving stack (#1359 chunk 3) - #1434
Conversation
v2 has soaked behind api.muchq.com and i.iili.uk answers the short links, so the Go shortener retires whole: the compose service and its image, the /var/www/r3dr webroot and r3dr_web source behind it, the /etc/r3dr host config that carried the Neon credential, the ssh deploy script, and the service itself. TestR3drGoServiceStackIsRetired pins each of those surfaces out of compose, both Caddyfiles, and the three deploy scripts, with r3dr_v2 spellings exempted so the replacement never trips it. The Caddyfile.local, initialize_host.sh and local_deploy.sh it reads join the go_test data — absent there, a runfiles error, not a silent pass. Host-side leftovers the repo can't reach are in the PR description; the Neon database was never migrated and its credential wants revoking. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ST7XLGWstRE4CfUF84ijKD
Panel sweep follow-ups. r3dr_v2's README still introduced itself as running "beside the Go binary (which keeps r3dr.net until deprecation)" — both gone as of the previous commit. The migrations floor rationale said r3dr.net "dies with v1" in the future tense. scripts/test-deploy built its throwaway git fixture under domains/r3dr/apps/r3dr_web, a path this change deletes; the content is arbitrary filler for three commits, so it moves to a neutral fixture/ directory. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ST7XLGWstRE4CfUF84ijKD
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
1d4-web | 87f4bb2 | Commit Preview URL Branch Preview URL |
Aug 22 2026, 01:01 PM |
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
iili | 87f4bb2 | Commit Preview URL Branch Preview URL |
Aug 22 2026, 01:01 PM |
ReviewVerdict: Approve. This is a clean, complete retirement of the Go r3dr stack. The diff removes every surface — compose service, OCI image, static frontend, deploy scripts, host provisioning, and docs — and adds a guard test so none of it can creep back unnoticed. What looks goodScope is thorough. The Go service (
No coverage lost. Deploy plumbing drops out dynamically. Removing the compose service is enough — Host steps are documented honestly. The PR description's post-merge checklist (full deploy with Non-blocking notes
Post-merge reminderDon't |
Comments and READMEs were narrating the retirement instead of describing the deploy surface as it stands. The compose comment, both r3dr READMEs, the migrations floor rationale, the BUILD data note and the guard test now state the rule and the mechanism; the guard reads as TestNoDeployConfigNamesTheGoR3drStack, which is the invariant it actually checks. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ST7XLGWstRE4CfUF84ijKD
The compose comment repeated the service's own description label, and the BUILD note glossed an ordinary test data entry. What's left is the two things the code doesn't say: why the host guard matches on Contains, and why r3dr_v2 is rewritten away before the token scan. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ST7XLGWstRE4CfUF84ijKD
Closes the last chunk of #1359. v2 has soaked behind
api.muchq.comandi.iili.ukhas answered the short links since #1432, so the Go shortener retires whole rather than in pieces.Retired
domains/r3dr/apis/r3dr— the Go service and itsssh ubuntu@r3dr.netdeploy script.domains/r3dr/apps/r3dr_web— the old static frontend, plus ther3dr-assetsscp and/var/www/r3drcopy that put it on the host (deploy.sh,local_deploy.sh).r3drcompose service and itsghcr.io/muchq/r3drimage pin.initialize_host.sh'sdb_configargument and/etc/r3drprovisioning — the Neon credential's only surface in this repo. The script now takes no arguments.Docs follow: the deploy README (inventory, init steps, deploy step numbering, rollback config list,
/etclist, and the "Go r3dr is the exception" paragraph under Database URLs), the domain README, the root README's project table (r3dr.net→iili.uk),mucks's example pointing at the deleted package, and the hardening plan's r3dr sections.Test
TestNoDeployConfigNamesTheGoR3drStackpins each surface out ofcompose.yaml, both Caddyfiles, and the three deploy scripts — service key, image ref,/var/www/r3dr,r3dr-assets,r3dr_web,/etc/r3dr— withr3dr_v2spellings rewritten away first so the replacement never trips it. Mutation-checked against the pre-changecompose.yaml: it fails on all three surfaces there and passes here.The three files it newly reads (
Caddyfile.local,initialize_host.sh,local_deploy.sh) joined thego_testdatalist. That is not incidental —go testreads the working tree and passed, while Bazel reads the runfiles tree and failed on the missing file. The guard reads named files rather than globbing so an absent one is a runfiles error, not a silent pass.No coverage is lost with the deleted Go tests:
r3dr_v2/encoding_test.cccarries all five ofencoding_test.go's slug vectors plus five more at the width transitions andint64max, andANegativeIdIsRefusedcovers the negative-input rejection.Verified
bazel test //deploy/... //domains/r3dr/... //bazel/rules:rules_test— 22 targets green (the deploy target red first, per above).scripts/test-deploypasses, which executesdeploy.shend-to-end including the edited ssh heredoc.bash -nclean on all three scripts;docker compose configvalid on both the plain and the merged observability form;gofmt/buildifierclean.Review panel ran three lenses. The ops lens confirmed
deploy.shenumerates services and pin variables dynamically out ofcompose.yaml, sor3drdrops out of--services, the image pre-flight, and pin rewriting without a hardcoded list to edit; the only&caddy_ipanchor is defined in the caddy service well above the deletion site and all four consumers still resolve; nothing haddepends_on: r3dr. The completeness lens turned up three stale references — r3dr_v2's README introducing itself as running beside the Go binary, the migrations floor rationale saying r3dr.net "dies with v1", andscripts/test-deploybuilding its git fixture under the now-deletedr3dr_webpath.The last two commits are comment work only: the retirement had been narrated in the config and READMEs rather than described, and then over-explained. What survives is the two things the code doesn't say — why the host guard matches on
Contains, and whyr3dr_v2is rewritten away before the token scan.Host steps this PR cannot do
--service.deploy.shpasses--remove-orphansonly on a full deploy; the old container isrestart: alwayson port 8085 and keeps running until then.sudo rm -rf /etc/r3dr— holdsdb_config, the live Neon connection string.sudo rm -rf /var/www/r3drandrm -rf ~/r3dr-assets.R3DR_SHA=line from the host~/.env(the pin-clearing loop only iterates variables the currentcompose.yamlreads), and prune cachedghcr.io/muchq/r3drimages. Future publishes stop on their own —publish.ymlenumeratesoci_pushtargets by query, and r3dr's died with its BUILD file.Left for the #373 sweep and the parked follow-ups (per-op rate budgets, the Cloudflare-KV edge idea) as the issue describes.
hashicorp/golang-lru/v2andlib/pqstay ingo.mod— nothing else in the repo imports them now, but pruning them is a dependency change that wants its own PR.🤖 Generated with Claude Code
https://claude.ai/code/session_01ST7XLGWstRE4CfUF84ijKD