← back to Wallco Ai
finish_dns.sh
91 lines
#!/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}'"