[object Object]

← back to Designersalesreps

chore: add deploy scaffold — ecosystem.config.js, deploy-kamatera.sh, nginx vhost, .deploy.conf

a245b58f0b6b53d22fd7e5202e38fbcccd35a9a8 · 2026-07-27 14:39:36 -0700 · Steve Abrams

Onboard prep for designersalesreps.com (port 9901). DNS/CF/pm2 gates
pending Steve approval per pending-approval/designersalesreps-go-live.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Files touched

Diff

commit a245b58f0b6b53d22fd7e5202e38fbcccd35a9a8
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Jul 27 14:39:36 2026 -0700

    chore: add deploy scaffold — ecosystem.config.js, deploy-kamatera.sh, nginx vhost, .deploy.conf
    
    Onboard prep for designersalesreps.com (port 9901). DNS/CF/pm2 gates
    pending Steve approval per pending-approval/designersalesreps-go-live.md.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---
 .deploy.conf                                |  4 +++
 deploy-kamatera.sh                          | 36 +++++++++++++++++++++
 docs/nginx-vhost-designersalesreps.com.conf | 49 +++++++++++++++++++++++++++++
 ecosystem.config.js                         | 25 +++++++++++++++
 4 files changed, 114 insertions(+)

diff --git a/.deploy.conf b/.deploy.conf
new file mode 100644
index 0000000..8db8695
--- /dev/null
+++ b/.deploy.conf
@@ -0,0 +1,4 @@
+PROJECT_NAME=designersalesreps
+DEPLOY_PATH=/root/Projects/designersalesreps
+HEALTH_URL=https://designersalesreps.com/health
+PORT=9901
diff --git a/deploy-kamatera.sh b/deploy-kamatera.sh
new file mode 100644
index 0000000..48fabc0
--- /dev/null
+++ b/deploy-kamatera.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+# deploy-kamatera.sh — designersalesreps.com → Kamatera 45.61.58.125
+# Usage: bash deploy-kamatera.sh
+set -euo pipefail
+
+REMOTE=root@45.61.58.125
+LOCAL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+REMOTE_DIR=/root/Projects/designersalesreps
+HEALTH_URL=http://127.0.0.1:9901/health
+
+echo "==> Syncing to $REMOTE:$REMOTE_DIR"
+rsync -az --delete \
+  --exclude='node_modules/' \
+  --exclude='.git/' \
+  --exclude='.env*' \
+  --exclude='*.log' \
+  --exclude='claims.jsonl' \
+  --exclude='logs/' \
+  "$LOCAL_DIR/" "$REMOTE:$REMOTE_DIR/"
+
+echo "==> npm install on remote"
+ssh "$REMOTE" "cd $REMOTE_DIR && npm install --omit=dev --silent"
+
+echo "==> mkdir logs"
+ssh "$REMOTE" "mkdir -p $REMOTE_DIR/logs"
+
+echo "==> pm2 startOrReload"
+ssh "$REMOTE" "cd $REMOTE_DIR && pm2 startOrReload ecosystem.config.js --update-env && pm2 save"
+
+echo "==> Health check (origin direct)"
+ssh "$REMOTE" "curl -sf $HEALTH_URL" && echo "PASS: origin direct" || { echo "FAIL: health check"; exit 1; }
+
+echo "==> Verifying CF-proxied (HTTPS)"
+curl -sf https://designersalesreps.com/health && echo "PASS: CF proxied" || echo "WARN: CF not yet routed (DNS pending?)"
+
+echo "==> Done. designersalesreps.com is live on :9901"
diff --git a/docs/nginx-vhost-designersalesreps.com.conf b/docs/nginx-vhost-designersalesreps.com.conf
new file mode 100644
index 0000000..4c9ad99
--- /dev/null
+++ b/docs/nginx-vhost-designersalesreps.com.conf
@@ -0,0 +1,49 @@
+# nginx vhost — designersalesreps.com
+# Copy to: /etc/nginx/sites-available/designersalesreps.com
+# Enable: ln -s /etc/nginx/sites-available/designersalesreps.com /etc/nginx/sites-enabled/
+# Reload: nginx -t && systemctl reload nginx
+#
+# CF real-IP: required so access logs + rate-limit show visitor IPs, not CF edge IPs.
+
+server {
+    listen 80;
+    server_name designersalesreps.com www.designersalesreps.com;
+
+    # Cloudflare real-IP passthrough (CF IP ranges — update periodically)
+    set_real_ip_from 103.21.244.0/22;
+    set_real_ip_from 103.22.200.0/22;
+    set_real_ip_from 103.31.4.0/22;
+    set_real_ip_from 104.16.0.0/13;
+    set_real_ip_from 104.24.0.0/14;
+    set_real_ip_from 108.162.192.0/18;
+    set_real_ip_from 131.0.72.0/22;
+    set_real_ip_from 141.101.64.0/18;
+    set_real_ip_from 162.158.0.0/15;
+    set_real_ip_from 172.64.0.0/13;
+    set_real_ip_from 173.245.48.0/20;
+    set_real_ip_from 188.114.96.0/20;
+    set_real_ip_from 190.93.240.0/20;
+    set_real_ip_from 197.234.240.0/22;
+    set_real_ip_from 198.41.128.0/17;
+    set_real_ip_from 2400:cb00::/32;
+    set_real_ip_from 2606:4700::/32;
+    set_real_ip_from 2803:f800::/32;
+    set_real_ip_from 2405:b500::/32;
+    set_real_ip_from 2405:8100::/32;
+    set_real_ip_from 2a06:98c0::/29;
+    set_real_ip_from 2c0f:f248::/32;
+    real_ip_header CF-Connecting-IP;
+
+    location / {
+        proxy_pass http://127.0.0.1:9901;
+        proxy_http_version 1.1;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection 'upgrade';
+        proxy_cache_bypass $http_upgrade;
+        proxy_read_timeout 30s;
+    }
+}
diff --git a/ecosystem.config.js b/ecosystem.config.js
new file mode 100644
index 0000000..a59ef7c
--- /dev/null
+++ b/ecosystem.config.js
@@ -0,0 +1,25 @@
+module.exports = {
+  apps: [{
+    name: 'designersalesreps',
+    script: 'server.js',
+    cwd: '/root/Projects/designersalesreps',
+    env: {
+      PORT: 9901,
+      NODE_ENV: 'production'
+    },
+    instances: 1,
+    autorestart: true,
+    watch: false,
+    max_memory_restart: '512M',
+    error_file: './logs/err.log',
+    out_file: './logs/out.log',
+    log_file: './logs/combined.log',
+    time: true,
+    max_restarts: Infinity,
+    min_uptime: '5s',
+    restart_delay: 1000,
+    exp_backoff_restart_delay: 100,
+    cron_restart: '0 4 * * *',
+    kill_timeout: 5000
+  }]
+};

← d122630 Harden external links with rel=noopener noreferrer  ·  back to Designersalesreps  ·  auto-save: 2026-07-27T14:51:27 (1 files) — package-lock.json 08f518f →