← back to Carmelwallpapers
Prepare Carmel storefront on explicit port with identity health check
29b14cd1bec6d1e8604a6f2eb420bb82f9a22902 · 2026-09-10 09:10:13 -0700 · Steve Abrams
Files touched
M .deploy.confM ecosystem.config.cjsM server.jsM site.config.jsonA verification/TK-11380/README.mdA verification/TK-11380/results.jsonA verification/TK-11380/verify.cjs
Diff
commit 29b14cd1bec6d1e8604a6f2eb420bb82f9a22902
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Sep 10 09:10:13 2026 -0700
Prepare Carmel storefront on explicit port with identity health check
---
.deploy.conf | 2 +-
ecosystem.config.cjs | 3 ++-
server.js | 6 +++---
site.config.json | 2 +-
verification/TK-11380/README.md | 9 +++++++++
verification/TK-11380/results.json | 22 ++++++++++++++++++++++
verification/TK-11380/verify.cjs | 15 +++++++++++++++
7 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/.deploy.conf b/.deploy.conf
index 6f9e191..45cbfad 100644
--- a/.deploy.conf
+++ b/.deploy.conf
@@ -1,5 +1,5 @@
PROJECT_NAME=carmelwallpapers
DEPLOY_HOST=45.61.58.125
DEPLOY_PATH=/root/public-projects/carmelwallpapers
-HEALTH_URL=http://127.0.0.1:9861/
+HEALTH_URL=http://127.0.0.1:19961/health
INSTALL_CMD="npm ci --production"
diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs
index 9aaab5c..18ea463 100644
--- a/ecosystem.config.cjs
+++ b/ecosystem.config.cjs
@@ -4,6 +4,7 @@ module.exports = {
script: "server.js",
cwd: __dirname,
env: {
+ PORT: "19961",
NEXT_TELEMETRY_DISABLED: "1",
VITE_HOST: "0.0.0.0",
HOSTNAME: "0.0.0.0",
@@ -11,7 +12,7 @@ module.exports = {
UVICORN_HOST: "0.0.0.0",
FLASK_RUN_HOST: "0.0.0.0",
BIND: "0.0.0.0",
- HOST: "0.0.0.0",
+ HOST: "127.0.0.1",
},
autorestart: true,
max_memory_restart: "300M",
diff --git a/server.js b/server.js
index 18c3316..ceccc42 100644
--- a/server.js
+++ b/server.js
@@ -6,7 +6,7 @@ const path = require('path');
const { createImgProxy } = require('../_shared/image-proxy');
const IMGP = createImgProxy(); // vendor-neutral /img/<token> image proxy
-const PORT = process.env.PORT || 9832;
+const PORT = process.env.PORT || 19961;
const DATA_PATH = path.join(__dirname, 'data', 'products.json');
// ── Vendor-slug redactor (canonical: dw-domain-fleet shared/render.js @ee30c6a) ─
@@ -451,7 +451,7 @@ app.get('/api/sliders', (req, res) => {
// ── Health ────────────────────────────────────────────────────────────────────
app.get('/health', (req, res) => {
- res.json({ ok: true, products: PRODUCTS.length, dropped: DROPPED, aesthetics: AESTHETICS });
+ res.json({ ok: true, site: 'carmelwallpapers', products: PRODUCTS.length, dropped: DROPPED, aesthetics: AESTHETICS });
});
// ── Product detail ────────────────────────────────────────────────────────────
@@ -825,5 +825,5 @@ if (catalog) catalog.mount(app, { siteSlug: SITE_SLUG, rails: SITE_RAILS });
await loadData();
IMGP.registerAll(PRODUCTS); // build the /img token->CDN map for every product image (idempotent; applyProducts also registers)
console.log(`[carmel] image-proxy map: ${IMGP.size()} urls`);
- app.listen(PORT, () => console.log(`carmelwallpapers listening on :${PORT}`));
+ app.listen(PORT, process.env.HOST || '127.0.0.1', () => console.log(`carmelwallpapers listening on :${PORT}`));
})();
diff --git a/site.config.json b/site.config.json
index a65b59e..b5245d2 100644
--- a/site.config.json
+++ b/site.config.json
@@ -16,5 +16,5 @@
"inkLight": "#1a1612"
},
"rails": ["grasscloth", "linen", "botanical", "coastal", "natural", "raffia"],
- "port": 9832
+ "port": 19961
}
diff --git a/verification/TK-11380/README.md b/verification/TK-11380/README.md
new file mode 100644
index 0000000..954cef1
--- /dev/null
+++ b/verification/TK-11380/README.md
@@ -0,0 +1,9 @@
+# TK-11380 — Carmel routing repair preparation
+
+Live carmelwallpapers.com routes to staged-viewer on9861 and displays the wrong app.9832 belongs to Hollywood Wallcoverings. Read-only remote checks found19961 unused; deployment must recheck it.
+
+Local defaults, ecosystem config, site config and deployment health URL now agree on19961. The ecosystem binds localhost, and `/health` identifies `site:carmelwallpapers`. The local preview reported2182 products, correct homepage, one AdSense loader and correct ads.txt. `lsof` confirmed127.0.0.1:19961. No admin/database writes or ad execution occurred. No live file, service or Nginx change occurred.
+
+Run `node verification/TK-11380/verify.cjs` against the running preview. The existing duplicate-loader fix f0febc2 also needs to be included in deployment; remote source still has two loaders. The remote worktree is dirty and production dependencies are absent: use a snapshot and targeted hunks, preserving catalog data and shared files.
+
+Source/config repair is locally verified; live restoration remains gated. This is not an AdSense readiness claim: privacy content and Google review remain outstanding. Full proposed actions and rollback are in `Projects/IWasCute/verification/TK-11380/REVIEW.md`.
diff --git a/verification/TK-11380/results.json b/verification/TK-11380/results.json
new file mode 100644
index 0000000..9ee2424
--- /dev/null
+++ b/verification/TK-11380/results.json
@@ -0,0 +1,22 @@
+{
+ "timestamp": "2026-09-10T16:08:48.191Z",
+ "base": "http://127.0.0.1:19961",
+ "health": {
+ "ok": true,
+ "site": "carmelwallpapers",
+ "products": 2182,
+ "dropped": 0,
+ "aesthetics": {
+ "botanical": 339,
+ "all": 656,
+ "linen": 183,
+ "grasscloth": 792,
+ "coastal": 76,
+ "natural": 136
+ }
+ },
+ "homeIdentity": "PASS",
+ "oneLoader": "PASS",
+ "adsTxt": "PASS",
+ "mode": "Local static catalog; no database/admin writes or ad execution"
+}
diff --git a/verification/TK-11380/verify.cjs b/verification/TK-11380/verify.cjs
new file mode 100644
index 0000000..f2a7bb8
--- /dev/null
+++ b/verification/TK-11380/verify.cjs
@@ -0,0 +1,15 @@
+const fs = require('node:fs');
+const assert = require('node:assert/strict');
+const base = process.env.VERIFY_URL || 'http://127.0.0.1:19961';
+(async () => {
+ const health = await fetch(base + '/health').then(r => r.json());
+ assert.equal(health.site, 'carmelwallpapers');
+ assert.ok(health.products > 0);
+ const html = await fetch(base).then(r => r.text());
+ assert.ok(html.includes('Carmel Wallpapers — Coastal California'));
+ assert.equal(html.split('adsbygoogle.js').length - 1, 1);
+ const ads = await fetch(base + '/ads.txt').then(r => r.text());
+ assert.equal(ads.trim(), 'google.com, pub-5278231299883833, DIRECT, f08c47fec0942fa0');
+ fs.writeFileSync(__dirname + '/results.json', JSON.stringify({ timestamp: new Date().toISOString(), base, health, homeIdentity: 'PASS', oneLoader: 'PASS', adsTxt: 'PASS', mode: 'Local static catalog; no database/admin writes or ad execution' }, null, 2) + '\n');
+ console.log('PASS health identity, catalog, home identity, one loader, ads.txt');
+})().catch(err => { console.error(err); process.exitCode = 1; });
← f0febc2 Keep one AdSense loader in inline page templates
·
back to Carmelwallpapers
·
Record Carmel HTTP status and deployment boundary proof a44568f →