[object Object]

← back to Games Agentabrams

deploy package: nginx conf + gated one-shot deploy.sh (DNS + rsync + certbot)

7d4ac89dcc07f871319b521553bab1a114dc444c · 2026-07-23 11:04:54 -0700 · Steve Abrams

Files touched

Diff

commit 7d4ac89dcc07f871319b521553bab1a114dc444c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jul 23 11:04:54 2026 -0700

    deploy package: nginx conf + gated one-shot deploy.sh (DNS + rsync + certbot)
---
 deploy/deploy.sh                   | 47 ++++++++++++++++++++++++++++++++++++++
 deploy/games.agentabrams.com.nginx | 19 +++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/deploy/deploy.sh b/deploy/deploy.sh
new file mode 100755
index 0000000..7c1f59e
--- /dev/null
+++ b/deploy/deploy.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# games.agentabrams.com — full first deploy (DNS + rsync + nginx + SSL).
+# Steve-gated: run only with explicit approval.
+set -euo pipefail
+KAMATERA=root@45.61.58.125
+SITE=games.agentabrams.com
+HERE="$(cd "$(dirname "$0")/.." && pwd)"
+
+# 1. DNS: A record games -> Kamatera (DNS-only, matches fleet pattern)
+export $(grep -E "^CLOUDFLARE_API_TOKEN=" ~/Projects/secrets-manager/.env)
+ZONE=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
+  "https://api.cloudflare.com/client/v4/zones?name=agentabrams.com" \
+  | python3 -c "import sys,json; print(json.load(sys.stdin)['result'][0]['id'])")
+EXISTS=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
+  "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records?name=$SITE" \
+  | python3 -c "import sys,json; print(len(json.load(sys.stdin)['result']))")
+if [ "$EXISTS" = "0" ]; then
+  curl -s -X POST -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" -H "Content-Type: application/json" \
+    "https://api.cloudflare.com/client/v4/zones/$ZONE/dns_records" \
+    -d "{\"type\":\"A\",\"name\":\"games\",\"content\":\"45.61.58.125\",\"ttl\":300,\"proxied\":false}" \
+    | python3 -c "import sys,json; r=json.load(sys.stdin); assert r['success'], r['errors']; print('DNS record created')"
+else
+  echo "DNS record already exists"
+fi
+
+# 2. Content
+rsync -az --exclude .git --exclude tests --exclude deploy "$HERE/" $KAMATERA:/var/www/$SITE/
+echo "content rsynced"
+
+# 3. nginx (80 first so certbot HTTP-01 can pass)
+scp -q "$HERE/deploy/$SITE.nginx" $KAMATERA:/etc/nginx/sites-available/$SITE
+ssh $KAMATERA "ln -sf /etc/nginx/sites-available/$SITE /etc/nginx/sites-enabled/$SITE && nginx -t && systemctl reload nginx"
+echo "nginx staged"
+
+# 4. Wait for DNS, then SSL
+for i in $(seq 1 30); do
+  [ -n "$(dig +short $SITE @1.1.1.1)" ] && break
+  sleep 10
+done
+ssh $KAMATERA "certbot --nginx -d $SITE --non-interactive --agree-tos -m steve@designerwallcoverings.com && systemctl reload nginx"
+
+# 5. Smoke test
+sleep 2
+code=$(curl -s -o /dev/null -w '%{http_code}' https://$SITE/)
+echo "https://$SITE -> HTTP $code"
+curl -s https://$SITE/games.json | head -c 200; echo
+[ "$code" = "200" ] && echo "DEPLOY OK" || { echo "DEPLOY FAILED"; exit 1; }
diff --git a/deploy/games.agentabrams.com.nginx b/deploy/games.agentabrams.com.nginx
new file mode 100644
index 0000000..9f925aa
--- /dev/null
+++ b/deploy/games.agentabrams.com.nginx
@@ -0,0 +1,19 @@
+# games.agentabrams.com — Agent Abrams Arcade (public static games hub)
+server {
+    listen 80;
+    server_name games.agentabrams.com;
+
+    access_log /var/log/nginx/games.agentabrams.com.access.log;
+    error_log /var/log/nginx/games.agentabrams.com.error.log;
+
+    add_header X-Content-Type-Options "nosniff" always;
+    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
+
+    root /var/www/games.agentabrams.com;
+    index index.html;
+    autoindex off;
+
+    location / {
+        try_files $uri $uri/ $uri.html =404;
+    }
+}

← cd005d2 initial scaffold: games hub (left panel manifest list, right  ·  back to Games Agentabrams  ·  live: games.agentabrams.com deployed (explicit-IP listen fix d8a99a6 →