SPRINT-3 Gate S3-4 Report — Tunnel + Config (no DNS)¶
Status: STOP — Ryan review before S3-5 DNS cutover
Date: 2026-08-28
Scope: S3-1 through S3-4 only (per Ryan: SPRINT-3 go through S3-4 only)
Summary¶
realoutcomes-edge tunnel created and connected from VM 116. cloudflared installed and active. Ingress validated for realoutcomes.app + www.realoutcomes.app → app on :5000. BWS + app env updated for prod PUBLIC_URL and OAuth callback. Stripe webhook signing secret rotated (new endpoint, same URL). DNS not touched. Railway + hosted Supabase untouched.
S3-1 — Tunnel created¶
| Item | Value |
|---|---|
| Name | realoutcomes-edge |
| UUID | 643ea255-19c7-4cef-a154-7a2fd6154275 |
| CNAME target (Ryan S3-5) | 643ea255-19c7-4cef-a154-7a2fd6154275.cfargotunnel.com |
| Created via | cloudflared tunnel create on lastvet-edge (account cert only; no lastvet-edge ingress change) |
| BWS | REALOUTCOMES_APP_EDGE_TUNNEL_ID, REALOUTCOMES_APP_EDGE_TUNNEL_CNAME, REALOUTCOMES_APP_EDGE_CLOUDFLARED_TUNNEL_CREDENTIALS |
S3-2 — cloudflared on VM 116¶
| Check | Result |
|---|---|
| Host | realoutcomes-app (192.168.1.99) |
| Package | cloudflared 2026.8.2 |
| systemd | cloudflared.service active (running), enabled |
| Config | /etc/cloudflared/config.yml |
| Credentials | /etc/cloudflared/643ea255-19c7-4cef-a154-7a2fd6154275.json |
| Script | scripts/realoutcomes/install-realoutcomes-edge-cloudflared.sh |
S3-3 — Ingress validated¶
ingress:
- hostname: realoutcomes.app
service: http://192.168.1.99:5000
- hostname: www.realoutcomes.app
service: http://192.168.1.99:5000
- service: http_status:404
| Check | Result |
|---|---|
cloudflared tunnel ingress validate |
OK |
| Connector on VM 116 | 1 active (lax + san edge) |
lastvet-edge config |
Unchanged (0 realoutcomes routes) |
last1id-edge |
Untouched |
Anomaly (fixed): Initial install used 127.0.0.1:5000 but Docker binds 192.168.1.99:5000. Origin updated to LAN bind; local app returns 200.
Note: Tunnel will not serve public traffic until Ryan points DNS (S3-5).
S3-4 — App config + Stripe prep¶
BWS / env (VM 116 realoutcomes-app)¶
| Variable | Value |
|---|---|
PUBLIC_URL |
https://realoutcomes.app |
LAST1_OAUTH_REDIRECT_URI |
https://realoutcomes.app/auth/callback |
STRIPE_WEBHOOK_SECRET |
Rotated (new whsec_… in BWS; not logged here) |
OAuth (auth.last1.id)¶
app_clients for realoutcomes already includes prod callback from Gate A plus LAN + localhost allow-list. No change required for S3-4.
Stripe webhook (GG 29615730)¶
| Item | Value |
|---|---|
| Old endpoint | we_1TLT7MJBZ5q5XOPpe8rF3Ukn (deleted) |
| New endpoint | we_1U9Y7mJBZ5q5XOPp4iRBYUfp |
| Dashboard URL | https://realoutcomes.app/api/stripe/webhook (unchanged) |
| Events | checkout.session.completed, customer.subscription.* |
| BWS | REALOUTCOMES_APP_PROD_STRIPE_WEBHOOK_SECRET updated; REALOUTCOMES_APP_PROD_STRIPE_WEBHOOK_ENDPOINT_ID added |
Stripe dashboard URL: NOT changed (still realoutcomes.app → currently Railway until DNS cutover).
Anomaly (expected): Secret rotation invalidates the old signing secret. Railway still holds the old secret until teardown; Stripe webhooks to realoutcomes.app will fail signature verification on Railway until S3-5 DNS cutover routes traffic to R940 (which has the new secret). Acceptable in sprint mode (pre-user); no Stripe dashboard URL edit needed at S3-4.
At S3-5/S3-6: No Stripe URL change required (URL already correct). Verify webhook deliveries hit R940 after DNS.
Deploy¶
deploy-realoutcomes-app.sh re-run after env render. LAN smoke: GET / 200, GET /api/auth/user 401.
Constraints verified¶
| Constraint | Status |
|---|---|
| No DNS changes | PASS |
| No Railway teardown | PASS |
| No hosted Supabase changes | PASS |
| lastvet-edge ingress untouched | PASS |
| last1id-edge untouched | PASS |
| cloudflared on VM 116 only | PASS |
| VM 117 Kong LAN-only | PASS (no tunnel route added) |
Ready for S3-5 (Ryan action)¶
When approved for DNS cutover:
- Cloudflare DNS (proxied CNAME):
realoutcomes.app→643ea255-19c7-4cef-a154-7a2fd6154275.cfargotunnel.comwww.realoutcomes.app→ same (if www is used)- Reply
S3-5 goorDNS ready - Cursor runs PF checks + browser smoke on
https://realoutcomes.app
Rollback before DNS: stop cloudflared on VM 116; prod traffic unchanged on Railway.
END S3-4 report