From 739c63f6b3bb3cffc1b8e92f7cdf9b49e37a41cb Mon Sep 17 00:00:00 2001 From: Fredrik Johansson Date: Tue, 23 Jun 2026 08:44:46 +0200 Subject: [PATCH] Add deploy/ with nginx config and web deploy script nginx-waste.conf: serve web/dist/ at root, proxy /ws to anchor (port 8080), SPA fallback for clean invite URLs, immutable cache for assets. deploy-web.sh: build + rsync to anchor host, skip config.js so the host's runtime config is not clobbered. Co-Authored-By: Claude Sonnet 4.6 --- deploy/deploy-web.sh | 29 +++++++++++++++++++++++++++ deploy/nginx-waste.conf | 44 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 deploy/deploy-web.sh create mode 100644 deploy/nginx-waste.conf diff --git a/deploy/deploy-web.sh b/deploy/deploy-web.sh new file mode 100755 index 0000000..fef9342 --- /dev/null +++ b/deploy/deploy-web.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Deploy the web UI to the anchor host. +# Usage: ./deploy/deploy-web.sh [user@host] +# +# Builds web/dist/, syncs it to /var/www/waste-web/ on the anchor host, +# then reloads nginx. The anchor binary and config.js are left untouched. + +set -euo pipefail + +HOST="${1:-root@waste.dev.xplwd.com}" +REMOTE_WEB="/var/www/waste-web" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +echo "→ Building web UI…" +cd "$REPO_ROOT/web" +npm ci --silent +npm run build + +echo "→ Syncing dist/ to $HOST:$REMOTE_WEB/" +rsync -az --delete \ + --exclude='config.js' \ + "$REPO_ROOT/web/dist/" \ + "$HOST:$REMOTE_WEB/" + +echo "→ Reloading nginx…" +ssh "$HOST" "nginx -t && systemctl reload nginx" + +echo "✓ Deployed to https://waste.dev.xplwd.com" diff --git a/deploy/nginx-waste.conf b/deploy/nginx-waste.conf new file mode 100644 index 0000000..e23c594 --- /dev/null +++ b/deploy/nginx-waste.conf @@ -0,0 +1,44 @@ +server { + listen 443 ssl; + server_name waste.dev.xplwd.com; + + # TLS managed by certbot / your cert provider + ssl_certificate /etc/letsencrypt/live/waste.dev.xplwd.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/waste.dev.xplwd.com/privkey.pem; + + root /var/www/waste-web; + index index.html; + + # Runtime config (host-specific; not in git) + location = /config.js { + try_files $uri =204; + add_header Cache-Control "no-cache"; + } + + # WebSocket signaling → waste anchor + location /ws { + proxy_pass http://127.0.0.1:8080; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_read_timeout 3600s; + } + + # SPA — serve index.html for all non-asset paths + location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-cache"; + } + + # Immutable hashed assets + location /assets/ { + add_header Cache-Control "public, max-age=31536000, immutable"; + } +} + +server { + listen 80; + server_name waste.dev.xplwd.com; + return 301 https://$host$request_uri; +}