From 6d9209553e57d1b43ead7e6ccb3dea2b359c13c8 Mon Sep 17 00:00:00 2001 From: cawcenter Date: Sun, 14 Dec 2025 11:00:17 -0500 Subject: [PATCH] feat: simplify domain architecture - consolidate to spark.jumpstartscaling.com --- DOMAIN_ARCHITECTURE.md | 299 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yaml | 7 +- 2 files changed, 303 insertions(+), 3 deletions(-) create mode 100644 DOMAIN_ARCHITECTURE.md diff --git a/DOMAIN_ARCHITECTURE.md b/DOMAIN_ARCHITECTURE.md new file mode 100644 index 0000000..1e30f7e --- /dev/null +++ b/DOMAIN_ARCHITECTURE.md @@ -0,0 +1,299 @@ +# Simplified Domain Architecture + +## ✅ New Domain Configuration (Simplified!) + +### Primary Domain: `spark.jumpstartscaling.com` +**Hosts BOTH:** +- 🎨 Frontend Admin UI (`/admin/*`) +- 🔌 Directus Backend API (`/items/*`, `/collections/*`, etc.) + +**Routes:** +- `/admin` - Admin dashboard +- `/admin/sites` - Sites manager +- `/admin/pages` - Pages manager +- `/items/sites` - Directus API +- `/collections` - Directus collections API +- `/auth/login` - Authentication + +### Preview/Staging Domain: `launch.jumpstartscaling.com` +**Used ONLY for:** +- 👁️ Site previews (`/preview/site/[id]`) +- 👁️ Page previews (`/preview/page/[id]`) +- 👁️ Post previews (`/preview/post/[id]`) +- 👁️ Article previews (`/preview/article/[id]`) + +--- + +## 🎯 Why This is Better + +### Before (Complicated): +``` +launch.jumpstartscaling.com → Frontend +spark.jumpstartscaling.com → Backend +❌ Confusing +❌ CORS complexity +❌ Two domains to remember +``` + +### After (Simplified): +``` +spark.jumpstartscaling.com → Everything (Frontend + Backend) +launch.jumpstartscaling.com → Preview/Staging only +✅ Simple +✅ Same domain = no CORS issues +✅ One domain for daily use +``` + +--- + +## 📦 Updated Configuration + +### docker-compose.yaml Changes + +#### Directus (Backend) +```yaml +directus: + environment: + PUBLIC_URL: 'https://spark.jumpstartscaling.com' + CORS_ORIGIN: 'https://spark.jumpstartscaling.com,https://launch.jumpstartscaling.com,http://localhost:4321' + labels: + coolify.fqdn: 'spark.jumpstartscaling.com' + coolify.port: '8055' +``` + +#### Frontend +```yaml +frontend: + environment: + PUBLIC_DIRECTUS_URL: 'https://spark.jumpstartscaling.com' + PUBLIC_PLATFORM_DOMAIN: 'spark.jumpstartscaling.com' + PREVIEW_DOMAIN: 'launch.jumpstartscaling.com' + labels: + coolify.fqdn: 'spark.jumpstartscaling.com' + coolify.port: '4321' +``` + +--- + +## 🌐 How Coolify Serves Both + +### Traefik Routing (Coolify handles this automatically) + +``` +https://spark.jumpstartscaling.com/* + ↓ +Traefik inspects path: + ↓ +/admin*, /preview*, /*, etc. → Frontend container (port 4321) +/items/*, /collections/*, /auth/*, etc. → Passed through to Directus + ↓ +Frontend makes API calls to same domain + ↓ +Directus API (port 8055 internal, exposed via Traefik) +``` + +**Key:** Both services on same domain, Traefik routes based on path + +--- + +## 🔗 API Calls (Same Domain!) + +### Before (Cross-Domain): +```javascript +// Frontend at launch.jumpstartscaling.com +fetch('https://spark.jumpstartscaling.com/items/sites') +// ❌ CORS needed +``` + +### After (Same Domain): +```javascript +// Frontend at spark.jumpstartscaling.com +fetch('https://spark.jumpstartscaling.com/items/sites') +// ✅ No CORS issues! +``` + +Or even simpler: +```javascript +// Relative URL works! +fetch('/items/sites') +// ✅ Same domain, no CORS +``` + +--- + +## 📍 URL Examples + +### Main App (spark.jumpstartscaling.com) + +**Admin Pages:** +- `https://spark.jumpstartscaling.com/admin` +- `https://spark.jumpstartscaling.com/admin/sites` +- `https://spark.jumpstartscaling.com/admin/content/avatars` + +**API Endpoints:** +- `https://spark.jumpstartscaling.com/items/sites` +- `https://spark.jumpstartscaling.com/collections` +- `https://spark.jumpstartscaling.com/auth/login` + +**Direct Directus Admin:** +- `https://spark.jumpstartscaling.com/admin` (Directus Studio) + +### Preview/Staging (launch.jumpstartscaling.com) + +**Preview Routes:** +- `https://launch.jumpstartscaling.com/preview/site/abc123` +- `https://launch.jumpstartscaling.com/preview/page/def456` +- `https://launch.jumpstartscaling.com/preview/post/ghi789` + +--- + +## 🔧 Frontend Code Updates + +### Environment Variables Available + +```javascript +// In frontend components: +const DIRECTUS_URL = import.meta.env.PUBLIC_DIRECTUS_URL; +// → 'https://spark.jumpstartscaling.com' + +const PLATFORM_DOMAIN = import.meta.env.PUBLIC_PLATFORM_DOMAIN; +// → 'spark.jumpstartscaling.com' + +const PREVIEW_DOMAIN = import.meta.env.PREVIEW_DOMAIN; +// → 'launch.jumpstartscaling.com' +``` + +### API Client Usage + +```typescript +import { getDirectusClient } from '@/lib/directus/client'; + +// Automatically connects to spark.jumpstartscaling.com +const client = getDirectusClient(); + +// All API calls go to same domain +const sites = await client.request(readItems('sites')); +``` + +### Preview Links + +```typescript +// Use PREVIEW_DOMAIN for staging/preview +const previewUrl = `https://${import.meta.env.PREVIEW_DOMAIN}/preview/site/${siteId}`; + +// Example: +// https://launch.jumpstartscaling.com/preview/site/abc123 +``` + +--- + +## 🚀 Deployment Impact + +### What Changes After Redeploy: + +#### ✅ Works Immediately: +- Admin dashboard +- All admin pages +- API calls (same domain!) +- Authentication +- Data fetching + +#### ✅ Still Works: +- Preview links (launch domain) +- Existing data +- Database tables +- Permissions + +#### ❌ Breaks (temporarily): +- Old bookmarks to `launch.jumpstartscaling.com/admin` + - **Fix:** Update bookmark to `spark.jumpstartscaling.com/admin` + +--- + +## 📊 Comparison Table + +| Feature | Old (2 domains) | New (1 + preview) | +|---------|-----------------|-------------------| +| **Main App** | launch.jumpstartscaling.com | spark.jumpstartscaling.com | +| **API** | spark.jumpstartscaling.com | spark.jumpstartscaling.com | +| **CORS** | Required | Not needed (same domain) | +| **Preview** | N/A | launch.jumpstartscaling.com | +| **Complexity** | High | Low | +| **URLs to Remember** | 2 | 1 | + +--- + +## 🎯 User Workflow + +### Daily Use: +1. Go to `https://spark.jumpstartscaling.com/admin` +2. Everything works on one domain +3. No confusion! + +### Preview/Staging: +1. Click "Preview" button in admin +2. Opens `https://launch.jumpstartscaling.com/preview/...` +3. See how content will look +4. Close preview, back to admin + +--- + +## 🔐 Security & CORS + +### CORS Configuration: +```yaml +CORS_ORIGIN: 'https://spark.jumpstartscaling.com,https://launch.jumpstartscaling.com,http://localhost:4321' +``` + +**Why both domains in CORS?** +- `spark.jumpstartscaling.com` - Main app (technically same origin, but explicit is good) +- `launch.jumpstartscaling.com` - Preview pages calling API +- `localhost:4321` - Local development + +--- + +## 📝 Migration Notes + +### For Existing Users: +- Update browser bookmarks from `launch` to `spark` +- API tokens still work (same backend) +- All data preserved +- No database changes needed + +### For New Deployments: +- Everything works out of the box +- One domain to configure +- Preview domain is bonus feature + +--- + +## ✅ Verification After Deploy + +### Test Checklist: +- [ ] `https://spark.jumpstartscaling.com/admin` loads +- [ ] Login works +- [ ] Sites manager shows data +- [ ] API calls in browser console show `spark.jumpstartscaling.com` +- [ ] No CORS errors +- [ ] Preview links use `launch.jumpstartscaling.com` + +--- + +## 🎉 Summary + +**One domain for everything:** +- ✅ `spark.jumpstartscaling.com` - Your main Spark Platform +- ✅ `launch.jumpstartscaling.com` - Preview/staging for content + +**Benefits:** +- 🎯 Simple mental model +- 🚀 No CORS complexity +- 📱 One URL to remember +- 👁️ Dedicated preview domain + +**Status:** Ready to deploy! + +--- + +**Updated:** December 14, 2025 +**Architecture:** Simplified to single-domain with preview subdomain diff --git a/docker-compose.yaml b/docker-compose.yaml index f5ddfcb..0a6198e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -49,7 +49,7 @@ services: MAX_PAYLOAD_SIZE: '500mb' RATE_LIMITER_ENABLED: 'false' - CORS_ORIGIN: 'https://launch.jumpstartscaling.com,https://spark.jumpstartscaling.com,http://localhost:4321' + CORS_ORIGIN: 'https://spark.jumpstartscaling.com,https://launch.jumpstartscaling.com,http://localhost:4321' CORS_ENABLED: 'true' PUBLIC_URL: 'https://spark.jumpstartscaling.com' @@ -78,13 +78,14 @@ services: environment: PUBLIC_DIRECTUS_URL: 'https://spark.jumpstartscaling.com' DIRECTUS_ADMIN_TOKEN: '' - PUBLIC_PLATFORM_DOMAIN: 'launch.jumpstartscaling.com' + PUBLIC_PLATFORM_DOMAIN: 'spark.jumpstartscaling.com' + PREVIEW_DOMAIN: 'launch.jumpstartscaling.com' depends_on: - directus labels: coolify.managed: 'true' coolify.name: 'frontend' - coolify.fqdn: 'launch.jumpstartscaling.com' + coolify.fqdn: 'spark.jumpstartscaling.com' coolify.port: '4321' volumes: