← 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
A deploy/deploy.shA deploy/games.agentabrams.com.nginx
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 →