Spike: Custom domain routing for palinks.app #25
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "15-custom-domain-spike"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
palinks.appto production*.ts.net), so two alternatives evaluated: GoDaddy 301 redirect vs Cloudflare Tunnel as canonical URLChanges
docs/custom-domain.md: new spike document with research findings, cost/complexity comparison table, mermaid diagrams for both network paths (redirect and canonical), phased recommendation, and follow-up ticket descriptionsTest Plan
docs/custom-domain.mdfor accuracy against current infrastructureReview Checklist
Related Notes
ldraney/palinks #15-- Spike: Route palinks.app domain to productionpalinks-- the project this work belongs toCloses #15
QA Review -- PR #25
Scope: Documentation-only spike. Single new file
docs/custom-domain.md(163 lines added, 0 deleted).Findings
No blocking issues found.
Research quality: strong. All four spike questions are answered with citations. The Tailscale Funnel limitation is correctly identified with a link to the upstream FR (tailscale/tailscale#11563) and the official docs. Cloudflare Tunnel recommendation is well-reasoned for this stack.
Phased recommendation is sound. Avoiding coupling the domain migration with the Keycloak integration (#16) is the right call -- changing redirect URIs twice would be unnecessary churn.
Mermaid diagrams are correct. Both Phase 1 (redirect) and Phase 2 (canonical) network paths accurately reflect the architecture described in
docs/infrastructure.md. The Phase 2 diagram correctly shows Cloudflare Tunnel and Tailscale Funnel coexisting on the same k8s Service.Follow-up tickets are well-scoped. Effort estimates are reasonable. The ticket descriptions have enough detail for implementation without over-specifying.
Minor note (non-blocking): The comparison table lists "Maintenance burden: Zero" for the GoDaddy redirect. This is accurate for the redirect itself, but worth noting that GoDaddy domain renewal is an ongoing cost (~$20/yr for
.appdomains). Not a doc fix needed -- just context for the reader.Consistency with existing docs: The document correctly references the same architecture (Puma on port 80, Tailscale Funnel TLS termination, k8s Service) as
docs/infrastructure.mdanddocs/architecture.md. No contradictions.SOP Compliance
Closes #15present15-custom-domain-spike)VERDICT: APPROVE
PR #25 Review
DOMAIN REVIEW
Tech stack: Documentation-only spike (Markdown). No application code changes. The document covers infrastructure topics (Tailscale Funnel, Cloudflare Tunnel, k8s ingress, DNS, TLS termination) so infrastructure domain expertise applies to content accuracy.
Content quality assessment:
The spike document is thorough and well-structured. Specific strengths:
*.ts.net, TLS cert mismatch on CNAME).docs/architecture.mdanddocs/infrastructure.md.Cross-reference with existing docs:
docs/infrastructure.mdline 168-169 already references this spike ("see Spike #15"), so the docs are internally consistent.User -> Cloudflare Edge -> Cloudflare Tunnel -> cloudflared pod -> k8s Service -> Rails Pod) is accurate for a Cloudflare Tunnel deployment.One technical observation (non-blocking): The spike recommends transferring DNS nameservers to Cloudflare while keeping GoDaddy as registrar. This is correct and standard practice. However, the Phase 1 GoDaddy 301 redirect will need to be removed/reconfigured when Phase 2 transfers DNS to Cloudflare, since domain forwarding is handled at the DNS level. This transition is implicitly covered by follow-up ticket #2 but could be called out more explicitly.
BLOCKERS
None. This is a documentation-only spike with no code changes. The standard blocker criteria (test coverage, input validation, secrets, DRY violations) do not apply to documentation PRs.
NITS
README not updated -- The README's Docs section does not list
docs/custom-domain.md. Consider adding it alongside the other doc links for discoverability. Example:- [Custom Domain](docs/custom-domain.md) -- routing palinks.app to productionIngress line in README -- The README Tech Stack section says
Ingress: Tailscale funnel (TLS termination). Once Phase 2 lands, this will need updating. Not blocking for this PR since the spike is research, not implementation.Minor wording -- "What started as a personal bookmarks page" in the README vs the spike doc referring to "portfolio site" -- these are consistent, just noting the terminology evolution is tracked.
SOP COMPLIANCE
15-custom-domain-spikefollows{issue-number}-{kebab-case-purpose}conventionldraney/palinks #15andCloses #15docs/custom-domain.md), 163 additions, 0 deletionsPROCESS OBSERVATIONS
VERDICT: APPROVED
PR #25 Review
DOMAIN REVIEW
Tech stack: Documentation-only spike (Markdown). No application code changes. The domain expertise applied here is infrastructure/networking (Tailscale, Cloudflare Tunnel, k8s ingress, DNS, TLS) since the spike evaluates infrastructure options.
Content accuracy verified against codebase:
docs/infrastructure.mdanddocs/architecture.md)docs/infrastructure.mdlines 56-78docs/infrastructure.mdconfig.hostsneeds updating is correct per Rails security defaultsSpike quality assessment:
BLOCKERS
None. This is a documentation-only spike with no code changes. No BLOCKER criteria are triggered:
NITS
Stale branch base: The PR branch appears to be based on a commit before PR #27 (Feature Flags guide) was merged. The README diff context around the insertion point does not include the
- [Feature Flags](docs/feature-flags.md)line that now exists on main (line 16). Forgejo reportsmergeable: true, so git should auto-merge cleanly, but verify after merge that the docs list ordering is correct (Custom Domain should appear after Pipeline and before Visibility, with Feature Flags also present).README ordering convention: The new entry is inserted between Pipeline and Visibility. This is alphabetically inconsistent with the existing list (Architecture, Infrastructure, Pipeline, then jumping to Custom Domain). Consider whether the docs list should be alphabetical or grouped by category. Currently it appears to be roughly grouped by topic area, in which case Custom Domain fits logically after Pipeline/Infrastructure. Not blocking.
Minor: "Custom Domain (Planned)" in infrastructure.md: The existing
docs/infrastructure.md(line 167) already has a "Custom Domain (Planned)" section that references Spike #15. After this spike merges, that section could be updated to link to the newdocs/custom-domain.mdinstead of pointing at the issue. This is out of scope for this PR but worth noting as follow-up.Source link verifiability: The community blog post source (
https://www.alif.web.id/posts/k3s-cluster-with-cloudflared-tailscale) may be ephemeral. The other five sources are official docs/GitHub -- solid. Consider noting that the community source is supplementary, not authoritative. Not blocking.SOP COMPLIANCE
15-custom-domain-spikefollows{issue-number}-{kebab-case-purpose}conventionldraney/palinks #15referenced,Closes #15presentCloses #15present in PR bodyPROCESS OBSERVATIONS
VERDICT: APPROVED