Monorepo for Aesthetic.Computer
aesthetic.computer
1#!/usr/bin/env fish
2# Deploy grab worker with automatic DNS configuration
3# Based on the nanos/conductor.mjs pattern
4
5set -e
6
7echo "🚀 Deploying grab worker with automatic DNS setup..."
8echo ""
9
10# Load environment variables from vault
11set VAULT_DIR /workspaces/aesthetic-computer/aesthetic-computer-vault/grab
12if test -f $VAULT_DIR/.env
13 source $VAULT_DIR/.env
14 echo "✅ Loaded environment variables from vault"
15else
16 echo "⚠️ Warning: No .env file found in vault"
17 echo " Continuing with system environment variables..."
18end
19
20echo ""
21
22# Step 1: Deploy the worker
23echo "📦 Step 1: Deploying worker to Cloudflare..."
24cd /workspaces/aesthetic-computer/grab
25npx wrangler deploy
26
27echo ""
28echo "✅ Worker deployed successfully!"
29echo ""
30
31# Step 2: Configure DNS via Cloudflare API
32echo "🌐 Step 2: Configuring DNS (CNAME record)..."
33
34# Check for required environment variables
35if not set -q CLOUDFLARE_EMAIL
36 echo "❌ Error: CLOUDFLARE_EMAIL not set"
37 echo " Please add to $VAULT_DIR/.env"
38 exit 1
39end
40
41if not set -q CLOUDFLARE_API_TOKEN
42 echo "❌ Error: CLOUDFLARE_API_TOKEN not set"
43 echo " Please add to $VAULT_DIR/.env"
44 exit 1
45end
46
47# Cloudflare configuration
48set ZONE_ID "a23b54e8877a833a1cf8db7765bce3ca"
49set SUBDOMAIN "grab"
50set FULL_DOMAIN "grab.aesthetic.computer"
51set TARGET "aesthetic-grab.aesthetic-computer.workers.dev"
52
53echo " Zone: aesthetic.computer ($ZONE_ID)"
54echo " Creating: $FULL_DOMAIN → $TARGET"
55echo ""
56
57# Step 2a: Check if DNS record already exists
58echo " Checking for existing DNS record..."
59set CHECK_RESPONSE (curl -s -X GET \
60 "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=CNAME&name=$FULL_DOMAIN" \
61 -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
62 -H "X-Auth-Key: $CLOUDFLARE_API_TOKEN" \
63 -H "Content-Type: application/json")
64
65set RECORD_ID (echo $CHECK_RESPONSE | jq -r '.result[0].id // empty')
66
67# Step 2b: Create or update DNS record
68if test -n "$RECORD_ID"
69 echo " 🟡 Updating existing CNAME record (ID: $RECORD_ID)..."
70 set DNS_RESPONSE (curl -s -X PUT \
71 "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
72 -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
73 -H "X-Auth-Key: $CLOUDFLARE_API_TOKEN" \
74 -H "Content-Type: application/json" \
75 --data "{
76 \"type\": \"CNAME\",
77 \"name\": \"$SUBDOMAIN\",
78 \"content\": \"$TARGET\",
79 \"ttl\": 1,
80 \"proxied\": true
81 }")
82else
83 echo " 🟡 Creating new CNAME record..."
84 set DNS_RESPONSE (curl -s -X POST \
85 "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
86 -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
87 -H "X-Auth-Key: $CLOUDFLARE_API_TOKEN" \
88 -H "Content-Type: application/json" \
89 --data "{
90 \"type\": \"CNAME\",
91 \"name\": \"$SUBDOMAIN\",
92 \"content\": \"$TARGET\",
93 \"ttl\": 1,
94 \"proxied\": true
95 }")
96end
97
98# Check if DNS operation was successful
99set DNS_SUCCESS (echo $DNS_RESPONSE | jq -r '.success')
100
101if test "$DNS_SUCCESS" = "true"
102 echo " ✅ DNS record configured successfully!"
103else
104 echo " ❌ DNS configuration failed:"
105 echo $DNS_RESPONSE | jq -r '.errors[]?.message // "Unknown error"'
106 echo ""
107 echo " You can manually configure via:"
108 echo " https://dash.cloudflare.com/$ZONE_ID/aesthetic.computer/dns/records"
109 exit 1
110end
111
112echo ""
113
114# Step 3: Wait for DNS propagation
115echo "⏳ Step 3: Waiting for DNS propagation..."
116echo " This usually takes 30-60 seconds..."
117echo ""
118
119sleep 5
120
121# Try to verify DNS is working
122set MAX_ATTEMPTS 12
123set ATTEMPT 1
124
125while test $ATTEMPT -le $MAX_ATTEMPTS
126 echo -n " Attempt $ATTEMPT/$MAX_ATTEMPTS: "
127
128 set HTTP_CODE (curl -s -o /dev/null -w "%{http_code}" "https://$FULL_DOMAIN/icon/128x128/prompt.png" 2>/dev/null)
129
130 if test "$HTTP_CODE" = "200"
131 echo "✅ DNS working!"
132 break
133 else
134 echo "⏳ Waiting... (HTTP $HTTP_CODE)"
135 if test $ATTEMPT -eq $MAX_ATTEMPTS
136 echo ""
137 echo " ⚠️ DNS may still be propagating. Manual check:"
138 echo " dig $FULL_DOMAIN"
139 echo " curl -I https://$FULL_DOMAIN/icon/128x128/prompt.png"
140 else
141 sleep 5
142 end
143 end
144
145 set ATTEMPT (math $ATTEMPT + 1)
146end
147
148echo ""
149
150# Step 4: Success summary
151echo "✨ Deployment complete!"
152echo ""
153echo "📊 Deployment Summary:"
154echo " Worker URL: https://aesthetic-grab.aesthetic-computer.workers.dev"
155echo " Custom URL: https://$FULL_DOMAIN"
156echo " DNS Record: $FULL_DOMAIN → $TARGET (CNAME, Proxied)"
157echo ""
158echo "🧪 Test Commands:"
159echo " curl -I \"https://$FULL_DOMAIN/icon/128x128/prompt.png\""
160echo " curl -I \"https://$FULL_DOMAIN/preview/1200x630/prompt.png\""
161echo ""
162echo "📋 Next Steps:"
163echo " 1. Test screenshot generation with various pieces"
164echo " 2. Monitor logs: npx wrangler tail"
165echo " 3. Check Cloudflare dashboard for errors"
166echo " 4. Validate production integration on aesthetic.computer"
167echo ""