OctoWiki

Cloudflare Setup

Live inventory of the Cloudflare account — DNS, Pages, Workers, KV, D1 — reconciled against wrangler configs and deploy scripts.

Everything customer-facing is fronted by one Cloudflare account. This page was built from a live read-only query of the account (via the Cloudflare MCP) reconciled against the repo's wrangler configs and CI workflows.

Account: Vinglobal2026@gmail.com's Account · ID 285737ee5f719cb8bfbb037e4614bec4 · plan Free. Zone: octopuscards.io (8718c9d3d2679e723fa7f1417513275f), nameservers jocelyn/lennon.ns.cloudflare.com, registrar GoDaddy. Snapshot taken 2026-07-23.

DNS records

The two apex A-record IPs are the whole origin story: 65.109.119.112 = PROD, 94.130.137.222 = SANDBOX + telemetry.

RecordTypeTargetProxiedWhat it is
api.octopuscards.ioA65.109.119.112PROD Go API
app.octopuscards.ioA65.109.119.112PROD client portal
warden.octopuscards.ioA65.109.119.112PROD admin UI
sandbox-api.octopuscards.ioA94.130.137.222SANDBOX API
sandbox-app.octopuscards.ioA94.130.137.222SANDBOX client
sandbox-warden.octopuscards.ioA94.130.137.222SANDBOX admin
telemetry.octopuscards.ioA94.130.137.222SigNoz UI (→ :8080)
otel.octopuscards.ioA94.130.137.222OTLP ingest (→ :4318)
octopuscards.io, wwwCNAMEoctopus-website-8ce.pages.devMarketing site (Pages)
developer.octopuscards.ioCNAMEoctopus-docs.pages.devDeveloper docs (Pages)
claim.octopuscards.ioAAAA 100::(Worker route)Grasshopper claim worker
sandbox-claim.octopuscards.ioAAAA 100::(Worker route)Grasshopper sandbox worker
mocky-balboa.octopuscards.ioAAAA 100::(Worker route)Mock API worker

Email (Google Workspace + SendGrid)

MX → smtp.google.com (Google Workspace). SendGrid handles transactional/marketing mail: CNAMEs em8947, s1/s2._domainkey, url1147, 106188436sendgrid.net. DMARC is p=quarantine; Google DKIM present. Keep these when touching DNS or deliverability breaks.

Cloudflare Pages (2 projects)

ProjectProduction domainsRepo sourceBuild
octopus-websiteoctopuscards.io, www.octopuscards.io (+ octopus-website-8ce.pages.dev)frontend/octopus-websiteGHA → wrangler pages deploy out
octopus-docsdeveloper.octopuscards.io (+ octopus-docs.pages.dev)frontend/octopus-docsGHA → wrangler pages deploy out

Both are static Next.js exports (output: 'export'), production branch master, uses_functions: false. Deploys are CLI-driven from CI (no Pages Git integration, no wrangler.toml) — deploy-octopus-website.yml / deploy-octopus-docs.yml build with bun and push out/.

Cloudflare Workers (3 scripts)

WorkerRouteSourceBindings
grasshopperclaim.octopuscards.io/*frontend/grasshopperD1 DBgrasshopper, KV octopus_token, 5 rate-limiters, Turnstile/OTel vars, secrets
grasshopper-sandboxsandbox-claim.octopuscards.io/*same (--env sandbox)D1 grasshopper_sandbox, KV octopus_token_sandbox, isolated rate-limiters
mocky-balboa(no route; *.workers.dev / mocky-balboa.octopuscards.io)frontend/mocky-balboaD1 DBmocky

All use nodejs_compat, workers_dev: false for grasshopper (custom routes only), last deployed from wrangler via GHA. Deploy workflows apply remote D1 migrations before wrangler deploy.

KV namespaces

NamespaceIDUsed by
octopus_tokenbaef37073e854a2386877d34c379c265grasshopper (prod) — caches the Octopus JWT to cut /auth/login fan-out
octopus_token_sandboxda808b8fe6774da893745dd1dc64b57cgrasshopper-sandbox

D1 databases

The MCP token in use lacked D1/R2 read scope, so these IDs come from the repo's wrangler configs (reconciled, not live-verified). If you need to manage them, use a token with D1 permissions or the dashboard.

DatabaseIDBindingOwner
grasshopperd99ec4a1-5833-48ca-8eb6-49568a13d5fdDBgrasshopper (prod)
grasshopper_sandboxd0f8b860-… (see wrangler.jsonc)DBgrasshopper-sandbox
mocky6dad79fb-db2d-43df-b6eb-96d27b34b89eDBmocky-balboa

Grasshopper's D1 denormalizes some Octopus catalog data (octopus_voucher_product_id, etc.) but is an independent store with its own Drizzle migration lifecycle in frontend/grasshopper/drizzle/migrations/. Apply with bunx wrangler d1 migrations apply grasshopper [--remote|--local].

Caching & TLS posture

  • Edge caching is centralized in the Cloudflare dashboard (Cache Rules), not in nginx — the origin nginx is a dumb pass-through for the proxied hosts. Tune caching in the CF dashboard so it stays in one place.
  • All customer-facing records are proxied (orange cloud), so origin IPs are hidden behind Cloudflare and TLS terminates at the edge; origin certs are Let's Encrypt via certbot.
  • Certbot HTTP-01 caveat: grey-cloud a record temporarily to issue/renew an origin cert (see Infrastructure).

R2

R2 is not enabled on this account (the API returns "enable R2 in the dashboard"). No buckets are in use.

Managing Cloudflare going forward

  • Programmatic: CI uses CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID secrets; locally, bunx wrangler ... from each frontend/<app> dir.
  • Read-only introspection (what built this page) is available via the Cloudflare MCP — handy for auditing live state vs. wrangler config drift. Grant the token D1/R2 scopes if you need those enumerated too.

On this page