Mixed host, split into three areas below: production (live customer traffic), staging (real customer data, no live traffic) and development (disposable). Separated at the docker-network level, not just by convention.
🔒 LoginAggregate host metrics, refreshed every 60 s.
Isolated on the prod_edge docker network. No development container can resolve or reach anything here. Change deliberately.
directory.n3-marketing.com
Own A record, Let's Encrypt cert, customer share-links. Also at /2027events/.events.n3-marketing.com
Printed QR codes resolve through this. Pure nginx return 302 — no container, no upstream, so nothing on this box can take it down. Staged and correct; DNS still points elsewhere, so this host is not yet the live origin. Its redirect table is deliberately not served on the dev hostname — test with curl --resolve events.n3-marketing.com:443:127.0.0.1.None. Neither production site uses a database — showdir is file-backed, the QR redirector is config only. There is no production database on this host.
Serves no customers, but holds a full copy of production data. Treat the data as production even though the site is not.
dev.surveyswithgames.com
All 78 marketing pages rebuilt as static HTML. No WordPress./app/
CodeIgniter, own login. Existing passwords work unchanged./api/Serves the three Play Store apps. Same paths as production, so installed apps need no republish if the domain moves here.github.com/n3-will privaten3_swg_db, network swg_netswg_appreal customer data — 122 accounts, 1.5M survey rows. What /app/ and the Android endpoints read.swg_manifestreal customer data — 2.3 GB manifest/chart data. Not the swg_manifest in n3_mysql; different database, same name. That collision is why this instance exists.swg_dbreal customer data — the old WordPress database. Nothing reads it any more; kept so PMPro history stays inspectable.Shared n3_edge network, no production traffic. nginx resolves each of these per request, so one being down can no longer stop the proxy starting — which is how a crash-looping dev container took production down on 2026-08-24.
/app/dashboard//n8n/ basic auth/n3-marketing//brief-preview//intel/ basic auth/booking-verify/ basic auth — live GHL tokens/audit.html basic auth/private/repos.html basic auth — all GitHub repos, generated hourly/private/environments.html basic auth — the rules, and how to add a site to the right area/private/costs.html basic auth — month-to-date spend and per-resource breakdown, live from the DO APIn3_mysql, network n3_dataswg_manifestdev — the working development database. Absorbs new production data nightly.swg_mirrorreal customer data — read-only mirror of production, wiped and reloaded nightly from the verified prod dump.swg_testproderived from real — stand-in production for app testing, seeded from the mirror.n3_ghl_appdev — GHL app data.Browse either instance from phpMyAdmin (server dropdown) or Adminer. Credentials on the credentials page.
/api/Dead on traveler too — nothing listens on :5000 there. Returns 503 to match./crm/Dead on traveler too — nothing listens on :3333 there. Returns 503 to match./n3/Blocked on the domain question: the blueprint says n3marketing.com, production answers on n3-marketing.com. directnic DNS is manual only, so the cutover cannot be scripted. When it lands it belongs in the Production area above — prod_edge, reservations, its own conf file.Adding something? Put it in the right area. Production goes on prod_edge with a memory reservation and its own nginx conf file; development goes on n3_edge. Never use a literal proxy_pass. Full rules: environment split. Verify with /srv/scripts/check-env-split.sh.