Domains, DNS & Hosting
Single source of truth for "where does each domain live, who's the registrar, who's authoritative for DNS, what's served from each one." Use this when:
- A domain isn't resolving and you need to know whose console to open
- Adding a new subdomain
- Migrating a domain (we did this for ka-26.com on 2026-04-17)
- Renewing a domain registration
All three domains at a glance
| Domain | What's served | Registrar | DNS authority | Hosting |
|---|---|---|---|---|
| ka26.shop | Application (web + API) | GoDaddy | GoDaddy | GCP Cloud Run + Load Balancer |
| ka-26.com | Public landing + APK download | Hostinger | Cloudflare (since 2026-04-17) | GitHub Pages |
| docs.ka-26.com | Internal Docusaurus docs portal (THIS site) | (subdomain of above) | Cloudflare | Cloudflare Workers Static Assets |
Tip: when something breaks, the FIRST question is "is the domain resolving?" Run
dig <domain> +shortfrom a terminal. If it returns the right IP/CNAME, the issue is downstream.
ka26.shop — the application
Registrar
- Provider: GoDaddy
- Account: siddugkattimani@gmail.com
- Registration expiry: check at https://account.godaddy.com (TBD — if forgotten, watch for renewal email)
DNS authority
- Nameservers:
ns23.domaincontrol.com+ns24.domaincontrol.com(GoDaddy's defaults) - Records:
| Type | Name | Content | TTL | Purpose |
|---|---|---|---|---|
| A | @ | 34.8.146.193 | default | Apex → GCP Load Balancer |
| A | www | 34.8.146.193 | default | www → same LB |
Note: NO MX records here. Email for the company is on ka-26.com, not ka26.shop.
Hosting
- GCP Load Balancer (forwarding rule
ka26-marketplace-https-rule) → Cloud Run serviceka26-marketplacein us-central1 - SSL: managed by GCP Load Balancer (Google-managed certificate)
- (Scheduled change): replace the LB with native Cloud Run domain mapping. Saves ~€18/mo. See
MEMORY.mdTODO. When done, GoDaddy DNS will be updated to point at Google's IPs directly (4 A records + 1 CNAME for www).
Common ops
# Check the LB is responding
curl -sI https://ka26.shop/api/health
# Check Cloud Run logs
gcloud run services logs read ka26-marketplace --region us-central1 --project school-mgmt-saas --limit 20
# Roll back to a previous Cloud Run revision
gcloud run revisions list --service ka26-marketplace --region us-central1 --project school-mgmt-saas
gcloud run services update-traffic ka26-marketplace --region us-central1 --project school-mgmt-saas \
--to-revisions ka26-marketplace-00XXX-yyy=100
ka-26.com — the landing page + email
Registrar
- Provider: Hostinger
- Account: siddugkattimani@gmail.com
- Registration expiry: ~yearly renewal at Hostinger
- ⚠️ Hostinger's DNS panel is now READ-ONLY for this domain (we moved authoritative DNS to Cloudflare on 2026-04-17). Any DNS change must go through Cloudflare, NOT Hostinger.
DNS authority — Cloudflare (since 2026-04-17)
- Cloudflare account: siddugkattimani@gmail.com (free plan)
- Nameservers:
anahi.ns.cloudflare.com+elmo.ns.cloudflare.com - All 11 records set to "DNS only" (gray cloud) — never set to Proxied (orange) for the records below; Cloudflare's proxy breaks GitHub Pages SSL and breaks SMTP/SPF/DKIM/DMARC
| Type | Name | Content | Proxy | Purpose |
|---|---|---|---|---|
| A | @ | 185.199.108.153 | DNS only | Landing → GitHub Pages |
| A | @ | 185.199.109.153 | DNS only | Landing → GitHub Pages |
| A | @ | 185.199.110.153 | DNS only | Landing → GitHub Pages |
| A | @ | 185.199.111.153 | DNS only | Landing → GitHub Pages |
| CNAME | www | sidgk.github.io | DNS only | www → Pages |
| Worker route | docs | (Worker ka26-docs) | n/a | Docs portal |
| MX | @ | smtp.google.com (priority 1) | n/a | Google Workspace email |
| TXT | @ | v=spf1 include:_spf.google.com ~all | n/a | SPF |
| TXT | google._domainkey | (DKIM key) | n/a | DKIM |
| TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:siddugkattimani@gmail.com; adkim=s; aspf=s | n/a | DMARC |
| TXT | @ | google-site-verification=... | n/a | Google Workspace ownership proof |
Hosting (landing + APK download)
- Provider: GitHub Pages (free tier — requires public repo)
- Source:
sidgk/ka26-website(public repo) - Deploy:
.github/workflows/deploy.yml— auto-builds on push to main, ~2 min - APK URL: https://ka-26.com/downloads/ka26-latest.apk (stable URL, swap binary in
/tmp/ka26-website/public/downloads/)
Email (Google Workspace)
- Sender: noreply@ka-26.com
- Auth: SPF + DKIM + DMARC all PASS, strict alignment
- Aliases: grievance@ka-26.com (alias on support@ user)
- Library:
src/lib/email.ts - Audit log:
EmailLogtable in Postgres - See Email Infrastructure for the full setup
docs.ka-26.com — internal docs portal (THIS site)
DNS
- Subdomain of ka-26.com (managed in Cloudflare)
- Worker route (NOT a CNAME) — Cloudflare auto-creates this when you attach a custom domain to a Worker
Hosting
- Provider: Cloudflare Workers Static Assets (the new unified Pages + Workers product)
- Project name:
ka26-docs - Source:
sidgk/ka26-docs(PRIVATE repo) - Framework: Docusaurus 3
- Build command:
npm run build - Output directory:
build - Deploy command:
npx wrangler deploy⚠️ NOTversions upload— see Cloudflare ops doc for the gotcha - Default URL: https://ka26-docs.siddu-9fe.workers.dev (still works as a fallback)
- Custom domain: docs.ka-26.com
- SSL: Cloudflare Universal SSL (auto-renewing, currently valid through 2026-07-16)
Why we moved off GitHub Pages for docs
GitHub Pages free tier requires public repos. We wanted the docs source private (it documents internal architecture, secret names, incident playbooks). Cloudflare Workers Static Assets supports private repos for free.
Access control
- Currently the deployed site is publicly readable at https://docs.ka-26.com
- We considered this acceptable because: source repo is private, docs reference secret NAMES not values, no PII
- If we want to email-gate later: enable Cloudflare Access (free for ≤50 users), ~10 min setup, see Cloudflare Access Setup
DNS verification commands
Useful for checking what's resolving from where:
# Confirm authoritative nameservers
dig ka26.shop NS +short # → ns23.domaincontrol.com / ns24.domaincontrol.com (GoDaddy)
dig ka-26.com NS +short # → anahi.ns.cloudflare.com / elmo.ns.cloudflare.com (Cloudflare)
# Apex resolution
dig ka26.shop +short # → 34.8.146.193 (GCP LB)
dig ka-26.com +short # → 4× 185.199.108-111.153 (GitHub Pages)
# Subdomains
dig www.ka26.shop +short # → 34.8.146.193
dig www.ka-26.com +short # → sidgk.github.io. + Pages IPs
dig docs.ka-26.com +short # → Cloudflare edge IPs (104.21.x.x / 172.67.x.x)
# Email routing
dig MX ka-26.com +short # → 1 smtp.google.com.
dig TXT ka-26.com +short # → SPF, DKIM, DMARC, Google verify
If any of these return unexpected results, DNS is the issue (not the application).
Disaster recovery — domain edition
If Cloudflare goes down
- Impact: ka-26.com landing + docs portal + email all unreachable
- Fix: change nameservers at Hostinger back to Hostinger defaults (
ns1.dns-parking.com/ns2.dns-parking.com), then re-create all 11 DNS records in Hostinger using the table above. Email recovers within ~30 min after MX records are re-created. - 2FA recovery codes: Cloudflare account is on siddugkattimani@gmail.com — recovery codes should be in 1Password (verify before disaster strikes)
If GoDaddy goes down
- Impact: ka26.shop unreachable
- Fix: GoDaddy is mostly stable; rare. If it does happen and persists, can transfer the domain to Cloudflare DNS (60-day ICANN transfer lock) — but that's a multi-day process. Better to wait it out.
If GitHub Pages goes down
- Impact: ka-26.com landing + APK download fail (but docs.ka-26.com is on Cloudflare, not affected)
- Fix: build the website locally (
cd /tmp/ka26-website && npm run build), serve/outfrom any static host (Cloudflare Pages, Netlify, even an S3 bucket). DNS at Cloudflare → swap A records to the new host's IPs.
If GCP Cloud Run goes down
- Impact: ka26.shop returns 503; the entire app is unreachable
- Fix: roll back to the previous revision (1 command,
gcloud run services update-traffic ... --to-revisions=...). If GCP regional outage, no quick fix — wait for Google.
Renewal calendar
| Service | Renewal cadence | Cost | Auto-renew? |
|---|---|---|---|
| GoDaddy ka26.shop | yearly | check status in account | |
| Hostinger ka-26.com | yearly | ~₹1500 | check status in account |
| Google Workspace | monthly | $6/user/mo | yes (linked to credit card) |
| Cloudflare | n/a (free) | $0 | n/a |
| GitHub | n/a (free) | $0 | n/a |
| GCP | monthly | ~€20 | yes (linked to credit card) |
Action item: confirm auto-renew is enabled on both GoDaddy and Hostinger before they expire. Domain expiration → site-down outage with no recovery if it lapses too long.
Related docs
- External Services — every external dependency
- Cloudflare ops doc — deep dive on the DNS migration + Workers Static Assets
- Email infrastructure — SMTP setup details
- Deploy — Cloud Run deployment pipeline