← back to Wallco Ai

deploy/curator-tunnel-finish.sh

66 lines

#!/bin/bash
# curator-tunnel-finish.sh — run AFTER `cloudflared tunnel login` succeeds.
# Idempotent: creates the wpb-curator tunnel, writes its ingress config, routes
# curator.wallpapersback.com → the tunnel, and installs a persistent LaunchAgent.
# No sudo. Requires ~/.cloudflared/cert.pem (from `cloudflared tunnel login`).
set -euo pipefail

TUNNEL=wpb-curator
HOSTNAME=curator.wallpapersback.com
LOCAL_NGINX=http://127.0.0.1:9916
CFDIR="$HOME/.cloudflared"
PLIST="$HOME/Library/LaunchAgents/com.steve.wpb-curator-tunnel.plist"

[ -f "$CFDIR/cert.pem" ] || { echo "ERROR: $CFDIR/cert.pem missing — run 'cloudflared tunnel login' first."; exit 1; }

# 1. Create the tunnel if it doesn't exist; capture its UUID.
if ! cloudflared tunnel list 2>/dev/null | awk '{print $2}' | grep -qx "$TUNNEL"; then
  echo "→ creating tunnel $TUNNEL"
  cloudflared tunnel create "$TUNNEL"
else
  echo "→ tunnel $TUNNEL already exists"
fi
TID=$(cloudflared tunnel list 2>/dev/null | awk -v n="$TUNNEL" '$2==n{print $1}')
echo "  tunnel id: $TID"
CREDS="$CFDIR/$TID.json"

# 2. Write ingress config.
cat > "$CFDIR/config.yml" <<YAML
tunnel: $TID
credentials-file: $CREDS
ingress:
  - hostname: $HOSTNAME
    service: $LOCAL_NGINX
  - service: http_status:404
YAML
echo "→ wrote $CFDIR/config.yml"

# 3. Route the hostname to this tunnel (creates the proxied CNAME in the CF zone).
cloudflared tunnel route dns "$TUNNEL" "$HOSTNAME" 2>&1 | sed 's/^/  /' || true

# 4. Persistent LaunchAgent (auto-respawn, survives reboot/login).
cat > "$PLIST" <<PLISTEOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.steve.wpb-curator-tunnel</string>
  <key>ProgramArguments</key>
  <array>
    <string>$(command -v cloudflared)</string>
    <string>tunnel</string><string>--config</string><string>$CFDIR/config.yml</string>
    <string>run</string><string>$TUNNEL</string>
  </array>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>StandardOutPath</key><string>$HOME/Library/Logs/wpb-curator-tunnel.log</string>
  <key>StandardErrorPath</key><string>$HOME/Library/Logs/wpb-curator-tunnel.log</string>
</dict></plist>
PLISTEOF
echo "→ wrote $PLIST"

launchctl bootout "gui/$(id -u)/com.steve.wpb-curator-tunnel" 2>/dev/null || true
launchctl bootstrap "gui/$(id -u)" "$PLIST"
launchctl kickstart -k "gui/$(id -u)/com.steve.wpb-curator-tunnel" 2>/dev/null || true
echo "✓ tunnel service installed + started. Log: ~/Library/Logs/wpb-curator-tunnel.log"
echo "  (curator.wallpapersback.com resolves only after the GoDaddy→Cloudflare NS cutover.)"