What changed, and why
Same move as glassbox (zo#20), second verse. 2ls.tech leaves the zo-k8s cluster for Vercel, and Terraform keeps only what it already owned: the DNS zone. The apex A record re-points from the ingress load balancer to Vercel's anycast address, the www record flips from A to CNAME, and the infra/k8s/2ls stack is retired. As before there is deliberately no vercel provider. The project and both domains live in the Vercel dashboard. Deploys ride the GitHub integration. Terraform stays out of it.
The zone is more than the website. Its iCloud-mail and verification records (two MX, SPF, apple-domain, google-site-verification, DKIM) are untouched by this PR — only the two records that pointed at the cluster move.
The app-repo half is mseeks/2ls.tech#1.
dns.tf: apex re-pointed in place, www replaced
The two records part ways mechanically. The apex stays an A record, so its change is an in-place update: value and TTL, nothing destroyed, no gap of any kind. www is different. It changes type, and a type change forces replacement. Both records trade the live-LB data-source lookup for fixed values, and both TTLs rise from 300 to 3600, since the targets no longer churn when the LB is recreated.
The rewritten zone tail: comment, apex A, www CNAME. The mail records above line 288 are untouched.
infra/dns.tf · 405 lines
⋯ 287 lines hidden (lines 1–287)
⋯ 91 lines hidden (lines 315–405)
The k8s stack, retired
Five files under infra/k8s/2ls/ disappear. The census reads the same as it did for glassbox, one directory earlier:
| file | what it did | replaced by |
|---|---|---|
manifests/00-namespace.yaml | the 2ls namespace | nothing to isolate |
manifests/10-deployment.yaml | one nginx pod serving ghcr.io/mseeks/2ls.tech:latest and its Service | Vercel's edge serves public/ |
manifests/20-ingress.yaml | routed both hosts through the DO LB; cert-manager filled 2ls-tech-tls (one cert, both names) via letsencrypt-prod | Vercel terminates TLS itself |
install.sh | context preflight, kubectl apply, rollout restart + status wait | git push — the integration deploys |
README.md | how the stack was wired | the app repo's Serving section |
One doc reference rides along: the everwhen README compared itself to "static/2ls (prebuilt static bundles)", and with 2ls gone the comparison slims to static alone.
Verification, and the cutover runbook
terraform fmt -check, init, and validate pass, and a plan targeted at the two records shows exactly their changes and nothing else:
_2ls_tech_apexwill be updated in-place —value: "174.138.116.75" -> "216.198.79.1",ttl: 300 -> 3600._2ls_tech_wwwmust be replaced —type: "A" -> "CNAME"(forces replacement),value -> "bae588b1e31b34e9.vercel-dns-017.com.". Plan: 1 to add, 1 to change, 1 to destroy.
The untargeted plan still carries the known unrelated drift (the DOKS 1.36.0-do.2 patch bump), which stays excluded here exactly as it was for glassbox.
The cutover, in order:
1. Create the Vercel project (import mseeks/2ls.tech; vercel.json already names public/ as the output, so no dashboard build config), let it deploy, then add both domains and set www to redirect to the apex via the dashboard's Redirect-to setting (a config choice, not automatic; apex as canonical matches playeverwhen.com). The dashboard issued per-project DNS values at that moment; the committed ones are what it issued. 2. Merge both PRs; apply the two targeted record changes. 3. Verify: apex serves the page from Vercel, www redirects to the apex, /site.webmanifest keeps its MIME type, /index.html 308s to /. 4. kubectl delete namespace 2ls, then prune branches and the ghcr package.