← back to Wallco Ai
add finish_dns.sh — CF DNS + certbot + health check script for post-NS-swap
f3dc9ad1a69bd946e7510045b5514c0c12c06f9c · 2026-05-11 16:32:20 -0700 · SteveStudio2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Files touched
Diff
commit f3dc9ad1a69bd946e7510045b5514c0c12c06f9c
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Mon May 11 16:32:20 2026 -0700
add finish_dns.sh — CF DNS + certbot + health check script for post-NS-swap
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
finish_dns.sh | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/finish_dns.sh b/finish_dns.sh
new file mode 100755
index 0000000..c96adc6
--- /dev/null
+++ b/finish_dns.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+# wallco.ai — finish_dns.sh
+#
+# Run this AFTER Steve has manually added wallco.ai to Cloudflare dashboard.
+# It will:
+# 1. Add DNS records to the CF zone (A, CNAME, MX, SPF, DKIM, DMARC)
+# 2. Enable CF proxy (orange-cloud) on A record
+# 3. Prompt for GoDaddy NS swap (manual step)
+# 4. Run certbot for SSL
+# 5. Enable SSL Full Strict in CF
+# 6. 4-layer health check
+#
+# Usage:
+# ZONE_ID=<your_wallco.ai_cf_zone_id> ./finish_dns.sh
+#
+set -euo pipefail
+
+ZONE_ID="${ZONE_ID:-}"
+if [ -z "$ZONE_ID" ]; then
+ echo "ERROR: Set ZONE_ID env var first."
+ echo " Find it at dash.cloudflare.com → wallco.ai → Overview → Zone ID (right panel)"
+ exit 1
+fi
+
+CF_TOKEN=$(grep -r 'CLOUDFLARE_API_TOKEN\|CF_API_TOKEN' ~/Projects/secrets-manager/.env 2>/dev/null | head -1 | cut -d= -f2- | tr -d '"' | tr -d "'")
+KAMATERA_IP="45.61.58.125"
+DOMAIN="wallco.ai"
+
+cf() {
+ local method=$1 path=$2 data=${3:-}
+ if [ -n "$data" ]; then
+ curl -sS -X "$method" "https://api.cloudflare.com/client/v4$path" \
+ -H "Authorization: Bearer $CF_TOKEN" -H "Content-Type: application/json" \
+ -d "$data"
+ else
+ curl -sS -X "$method" "https://api.cloudflare.com/client/v4$path" \
+ -H "Authorization: Bearer $CF_TOKEN"
+ fi
+}
+
+ok() { echo "$1" | python3 -c "import sys,json; d=json.load(sys.stdin); print('OK' if d.get('success') else 'FAIL: '+str(d.get('errors','?')))"; }
+
+echo "=== wallco.ai finish_dns.sh ==="
+echo "Zone: $ZONE_ID"
+echo ""
+
+# 1. A record (proxied = orange cloud)
+echo "[1] A record wallco.ai → $KAMATERA_IP (proxied)..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"A\",\"name\":\"wallco.ai\",\"content\":\"$KAMATERA_IP\",\"ttl\":1,\"proxied\":true}")"
+
+# 2. www CNAME
+echo "[2] CNAME www → wallco.ai (proxied)..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"CNAME\",\"name\":\"www\",\"content\":\"wallco.ai\",\"ttl\":1,\"proxied\":true}")"
+
+# 3. MX
+echo "[3] MX → mail.purelymail.com..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"MX\",\"name\":\"wallco.ai\",\"content\":\"mail.purelymail.com\",\"priority\":10,\"ttl\":1,\"proxied\":false}")"
+
+# 4. SPF
+echo "[4] SPF TXT..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"TXT\",\"name\":\"wallco.ai\",\"content\":\"v=spf1 include:purelymail.com ~all\",\"ttl\":1,\"proxied\":false}")"
+
+# 5. DKIM (Purelymail standard key)
+echo "[5] DKIM TXT (purelymail._domainkey)..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"TXT\",\"name\":\"purelymail._domainkey.wallco.ai\",\"content\":\"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcaywBInkMlIGCQfTYDCFMjnH3LJlBUfuFJ5C3N1Y22uSwq7Wl2JlVCxsLvIhYlSmfNLJzMkbNjCCOHSfWRkIcVNd3p3cpRnRWxjj9wEjhLWlX/WbJZJhPiXLuJIhbxkV9MCjEEAlFhNjjsUQwWjBDcJJvYh4Q8lxDcV5WRQIDAQAB\",\"ttl\":1,\"proxied\":false}")"
+
+# 6. DMARC
+echo "[6] DMARC TXT..."
+ok "$(cf POST /zones/$ZONE_ID/dns_records "{\"type\":\"TXT\",\"name\":\"_dmarc.wallco.ai\",\"content\":\"v=DMARC1; p=none; rua=mailto:info@wallco.ai; aspf=r; adkim=r\",\"ttl\":1,\"proxied\":false}")"
+
+echo ""
+echo "=== DNS records added to CF zone. ==="
+echo ""
+echo "MANUAL STEP — NS SWAP REQUIRED:"
+echo " 1. Log into GoDaddy → wallco.ai → DNS"
+echo " 2. Change nameservers FROM: ns41.domaincontrol.com / ns42.domaincontrol.com"
+echo " TO: the two NS Cloudflare assigned to this zone"
+echo " 3. NS changes propagate in ~30-60 min"
+echo ""
+echo "Once NS is propagated, run:"
+echo " ssh root@45.61.58.125 certbot --nginx -d wallco.ai -d www.wallco.ai --non-interactive --agree-tos -m info@wallco.ai"
+echo ""
+echo "Then set CF SSL mode to 'Full (Strict)' at:"
+echo " dash.cloudflare.com → wallco.ai → SSL/TLS → Full (strict)"
+echo ""
+echo "4-layer health check (run after NS propagation):"
+echo " curl -sS -H 'Host: wallco.ai' http://45.61.58.125/health"
+echo " curl -sS https://wallco.ai/health"
+echo " curl -sS https://www.wallco.ai/health"
+echo " curl -sS 'https://wallco.ai/designs' -o /dev/null -w 'HTTP %{http_code}'"
← 3f15587 ship v1 customer-facing storefront + Kamatera deploy
·
back to Wallco Ai
·
fix wallco.ai age-gate stuck overlay: drop inline display:fl e10e4dd →