7.0 KiB
7.0 KiB
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)
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
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):
// Frontend at launch.jumpstartscaling.com
fetch('https://spark.jumpstartscaling.com/items/sites')
// ❌ CORS needed
After (Same Domain):
// Frontend at spark.jumpstartscaling.com
fetch('https://spark.jumpstartscaling.com/items/sites')
// ✅ No CORS issues!
Or even simpler:
// Relative URL works!
fetch('/items/sites')
// ✅ Same domain, no CORS
📍 URL Examples
Main App (spark.jumpstartscaling.com)
Admin Pages:
https://spark.jumpstartscaling.com/adminhttps://spark.jumpstartscaling.com/admin/siteshttps://spark.jumpstartscaling.com/admin/content/avatars
API Endpoints:
https://spark.jumpstartscaling.com/items/siteshttps://spark.jumpstartscaling.com/collectionshttps://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/abc123https://launch.jumpstartscaling.com/preview/page/def456https://launch.jumpstartscaling.com/preview/post/ghi789
🔧 Frontend Code Updates
Environment Variables Available
// 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
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
// 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
- Fix: Update bookmark to
📊 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:
- Go to
https://spark.jumpstartscaling.com/admin - Everything works on one domain
- No confusion!
Preview/Staging:
- Click "Preview" button in admin
- Opens
https://launch.jumpstartscaling.com/preview/... - See how content will look
- Close preview, back to admin
🔐 Security & CORS
CORS Configuration:
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 APIlocalhost:4321- Local development
📝 Migration Notes
For Existing Users:
- Update browser bookmarks from
launchtospark - 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/adminloads- 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