← back to Dw Yolo Loop
Artmura landing: self-contained BUNDLE mode + turnkey deploy script for artmura.designerwallcoverings.com
f357517b7396bc0f706e666cbf86d876884a2d10 · 2026-06-12 11:01:20 -0700 · Steve Abrams
- server BUNDLE=1 reads ./_data + ./_images (no repo-relative paths on host); verified locally
- deploy-landing.sh: rsync app+data+images → Kamatera, pm2 (BUNDLE), nginx vhost, certbot SSL, smoke test
- (SSH to Kamatera is classifier-gated; Steve runs the script or grants SSH perm)
Files touched
A artmura-site/.gitignoreA artmura-site/deploy-landing.shM artmura-site/ecosystem.config.cjsM artmura-site/server.js
Diff
commit f357517b7396bc0f706e666cbf86d876884a2d10
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jun 12 11:01:20 2026 -0700
Artmura landing: self-contained BUNDLE mode + turnkey deploy script for artmura.designerwallcoverings.com
- server BUNDLE=1 reads ./_data + ./_images (no repo-relative paths on host); verified locally
- deploy-landing.sh: rsync app+data+images → Kamatera, pm2 (BUNDLE), nginx vhost, certbot SSL, smoke test
- (SSH to Kamatera is classifier-gated; Steve runs the script or grants SSH perm)
---
artmura-site/.gitignore | 4 ++++
artmura-site/deploy-landing.sh | 45 +++++++++++++++++++++++++++++++++++++++
artmura-site/ecosystem.config.cjs | 2 +-
artmura-site/server.js | 11 ++++++----
4 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/artmura-site/.gitignore b/artmura-site/.gitignore
new file mode 100644
index 0000000..c4c5d54
--- /dev/null
+++ b/artmura-site/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+_data/
+_images/
+lines/
diff --git a/artmura-site/deploy-landing.sh b/artmura-site/deploy-landing.sh
new file mode 100755
index 0000000..248e615
--- /dev/null
+++ b/artmura-site/deploy-landing.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+# Deploy the Artmura brand-landing to artmura.designerwallcoverings.com on Kamatera.
+# Self-contained: ships app + bundled data + images; pm2 (BUNDLE=1) + nginx + Let's Encrypt.
+# Run from repo root: bash artmura-site/deploy-landing.sh
+set -euo pipefail
+KAM="${KAM:-root@45.61.58.125}"
+APP="/root/Projects/artmura-site"
+DOMAIN="artmura.designerwallcoverings.com"
+PORT=9920
+REPO="$(cd "$(dirname "$0")/.." && pwd)"
+
+echo "→ shipping app + data + images to $KAM:$APP"
+ssh "$KAM" "mkdir -p $APP/_data $APP/_images"
+rsync -az --delete --exclude node_modules --exclude _images --exclude _data "$REPO/artmura-site/" "$KAM:$APP/"
+rsync -az "$REPO/scripts/artmura-onboard/data/artmura.json" \
+ "$REPO/scripts/artmura-onboard/data/artmura-colors.json" \
+ "$REPO/scripts/artmura-onboard/data/artmura-store-handles.json" "$KAM:$APP/_data/"
+rsync -az "$REPO/.newwall-ref/artmura/images/" "$KAM:$APP/_images/"
+
+echo "→ install + pm2 (BUNDLE=1, port $PORT)"
+ssh "$KAM" "cd $APP && npm install --omit=dev --silent && (pm2 reload ecosystem.config.cjs || pm2 start ecosystem.config.cjs) && pm2 save"
+
+echo "→ nginx vhost"
+ssh "$KAM" "cat > /etc/nginx/sites-available/$DOMAIN <<NGINX
+server {
+ listen 80;
+ server_name $DOMAIN;
+ location / {
+ proxy_pass http://127.0.0.1:$PORT;
+ 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;
+ }
+}
+NGINX
+ln -sf /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/$DOMAIN
+nginx -t && systemctl reload nginx"
+
+echo "→ Let's Encrypt"
+ssh "$KAM" "certbot --nginx -d $DOMAIN --non-interactive --agree-tos -m steve@designerwallcoverings.com --redirect || echo 'certbot: ensure DNS A record exists first, then re-run certbot'"
+
+echo "→ smoke test"
+ssh "$KAM" "curl -s -o /dev/null -w 'local pm2 → %{http_code}\n' http://127.0.0.1:$PORT/api/config"
+echo "DONE. Ensure Cloudflare DNS: A $DOMAIN → 45.61.58.125 (proxied)."
diff --git a/artmura-site/ecosystem.config.cjs b/artmura-site/ecosystem.config.cjs
index 94935d0..0669549 100644
--- a/artmura-site/ecosystem.config.cjs
+++ b/artmura-site/ecosystem.config.cjs
@@ -5,7 +5,7 @@ module.exports = {
name: 'artmura-site',
script: 'server.js',
cwd: __dirname,
- env: { NODE_ENV: 'production', PORT: process.env.PORT || 9920 },
+ env: { NODE_ENV: 'production', PORT: process.env.PORT || 9920, VENDOR: 'artmura', BUNDLE: '1' },
max_memory_restart: '200M',
autorestart: true,
watch: false,
diff --git a/artmura-site/server.js b/artmura-site/server.js
index 9ce2747..12d10b6 100644
--- a/artmura-site/server.js
+++ b/artmura-site/server.js
@@ -10,10 +10,13 @@ const VENDOR = process.env.VENDOR || 'artmura';
const CFG = require('./site.config.js')[VENDOR];
if (!CFG) { console.error(`No site.config for VENDOR=${VENDOR}`); process.exit(1); }
-const PKG = path.join(ROOT, CFG.dataFile);
-const COLORS_PATH = path.join(ROOT, CFG.colorsFile);
-const HANDLES_PATH = path.join(ROOT, 'scripts/artmura-onboard/data/artmura-store-handles.json');
-const IMG_DIR = path.join(ROOT, CFG.imagePrefix);
+// BUNDLE=1 → self-contained deploy: read data/images from alongside the app (./_data, ./_images),
+// so the host needs only this one directory (no repo-relative ../ paths).
+const BUNDLE = process.env.BUNDLE === '1';
+const PKG = BUNDLE ? path.join(__dirname, '_data', path.basename(CFG.dataFile)) : path.join(ROOT, CFG.dataFile);
+const COLORS_PATH = BUNDLE ? path.join(__dirname, '_data', path.basename(CFG.colorsFile)) : path.join(ROOT, CFG.colorsFile);
+const HANDLES_PATH = BUNDLE ? path.join(__dirname, '_data', 'artmura-store-handles.json') : path.join(ROOT, 'scripts/artmura-onboard/data/artmura-store-handles.json');
+const IMG_DIR = BUNDLE ? path.join(__dirname, '_images') : path.join(ROOT, CFG.imagePrefix);
const PORT = process.env.PORT || 9921;
const app = express();
← 8a03eb4 Artmura site README: document the clone-a-line template flow
·
back to Dw Yolo Loop
·
Artmura deploy: auto-pick free port on Kamatera (:9920 taken 6d72771 →