[object Object]

← back to Playa Ignition

Add deploy config for playa.agentabrams.com (Kamatera + Cloudflare)

7444435e61efa8e6e9fe0b33ca1cbe9a2cc183b1 · 2026-09-01 22:38:01 -0700 · Steve Abrams

Files touched

Diff

commit 7444435e61efa8e6e9fe0b33ca1cbe9a2cc183b1
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Sep 1 22:38:01 2026 -0700

    Add deploy config for playa.agentabrams.com (Kamatera + Cloudflare)
---
 deploy/deploy.sh                       | 33 +++++++++++++++++++++++++++++++++
 deploy/playa.agentabrams.com.nginx     |  8 ++++++++
 deploy/playa.agentabrams.com.ssl.nginx | 19 +++++++++++++++++++
 3 files changed, 60 insertions(+)

diff --git a/deploy/deploy.sh b/deploy/deploy.sh
new file mode 100755
index 0000000..7a1c67e
--- /dev/null
+++ b/deploy/deploy.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -euo pipefail
+KAMATERA=root@45.61.58.125
+SITE=playa.agentabrams.com
+HERE="$(cd "$(dirname "$0")/.." && pwd)"
+
+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":"playa","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
+
+rsync -az --delete --exclude .git --exclude deploy --exclude README.md --exclude verification "$HERE/" "$KAMATERA:/var/www/$SITE/"
+CERT="/etc/letsencrypt/live/$SITE/fullchain.pem"
+if ssh "$KAMATERA" "test -f $CERT"; then
+  scp -q "$HERE/deploy/$SITE.ssl.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"
+else
+  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"
+  for _ in $(seq 1 30); do [ -n "$(dig +short "$SITE" @1.1.1.1)" ] && break; sleep 10; done
+  ssh "$KAMATERA" "certbot certonly --webroot -w /var/www/$SITE -d $SITE --non-interactive --agree-tos -m steve@designerwallcoverings.com"
+  scp -q "$HERE/deploy/$SITE.ssl.nginx" "$KAMATERA:/etc/nginx/sites-available/$SITE"
+  ssh "$KAMATERA" "nginx -t && systemctl reload nginx"
+fi
+sleep 2
+code=$(curl -s -o /dev/null -w '%{http_code}' "https://$SITE/")
+echo "https://$SITE -> HTTP $code"
+[ "$code" = '200' ] && echo 'DEPLOY OK' || exit 1
+
diff --git a/deploy/playa.agentabrams.com.nginx b/deploy/playa.agentabrams.com.nginx
new file mode 100644
index 0000000..37e3d1e
--- /dev/null
+++ b/deploy/playa.agentabrams.com.nginx
@@ -0,0 +1,8 @@
+server {
+  listen 45.61.58.125:80;
+  server_name playa.agentabrams.com;
+  root /var/www/playa.agentabrams.com;
+  index index.html;
+  location /.well-known/acme-challenge/ { root /var/www/playa.agentabrams.com; }
+  location / { try_files $uri $uri/ =404; }
+}
diff --git a/deploy/playa.agentabrams.com.ssl.nginx b/deploy/playa.agentabrams.com.ssl.nginx
new file mode 100644
index 0000000..bede72e
--- /dev/null
+++ b/deploy/playa.agentabrams.com.ssl.nginx
@@ -0,0 +1,19 @@
+server {
+  listen 45.61.58.125:80;
+  server_name playa.agentabrams.com;
+  location /.well-known/acme-challenge/ { root /var/www/playa.agentabrams.com; }
+  location / { return 301 https://$host$request_uri; }
+}
+server {
+  listen 45.61.58.125:443 ssl;
+  server_name playa.agentabrams.com;
+  root /var/www/playa.agentabrams.com;
+  index index.html;
+  ssl_certificate /etc/letsencrypt/live/playa.agentabrams.com/fullchain.pem;
+  ssl_certificate_key /etc/letsencrypt/live/playa.agentabrams.com/privkey.pem;
+  include /etc/letsencrypt/options-ssl-nginx.conf;
+  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
+  add_header X-Content-Type-Options nosniff always;
+  add_header Referrer-Policy strict-origin-when-cross-origin always;
+  location / { try_files $uri $uri/ =404; }
+}

← 3af8b73 Playa Ignition: single-file animated Burning Man gallery — n  ·  back to Playa Ignition  ·  Add synthesized techno beat (kick+bass+hats locked to BPM) w 393b5cd →