Files
net/DOMAIN_ARCHITECTURE.md

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/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

// 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'));
// 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:

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