← 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
A .deploy.confA deploy-kamatera.shA docs/nginx-vhost-designersalesreps.com.confA ecosystem.config.js
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 →