Architecture
Production Deployment

Production Deployment

Complete guide to deploying the AltSportsLeagues.ai platform to production, including domain mapping, SSL configuration, and verification steps.

πŸ—οΈ Deployment Architecture


πŸš€ Phase 1: Backend Deployment

Test Locally First (CRITICAL)

Always test in local Docker before deploying to Cloud Run!

cd apps/backend
./deploy-local-docker.sh

Wait for deployment (~30 seconds), then test:

# Health check
curl http://localhost:8090/health
 
# API docs
open http://localhost:8090/docs
 
# Test endpoints
curl http://localhost:8090/v1/leagues
 
# View logs
docker compose logs -f

βœ… Expected: All endpoints return 200 OK, no errors in logs

Stop when done:

docker compose down

Deploy to Cloud Run

Navigate to project root and run deployment script:

cd /Users/kbselander/Developer/Notebook/mcp-servers/servers/mcp-server-altsportsleagues.ai/2.1-cloud-run-docker-mcp
 
./deploy-all.sh

Select: Option 2 (Backend only)

Wait: 4-8 minutes for build and deployment

Monitor: Watch the terminal for progress:

Building Docker image...
Pushing to Google Container Registry...
Deploying to Cloud Run...
βœ… Deployment complete!

The script saves the URL to .backend-url:

cat .backend-url
# Example: https://altsportsleagues-backend-xxx-uc.a.run.app

Map Custom Domain

In Google Cloud Console:

  1. Go to Cloud Run Console (opens in a new tab)
  2. Click service: altsportsleagues-backend
  3. Click "Manage Custom Domains" tab
  4. Click "Add Mapping"
  5. Enter domain: api.altsportsleagues.ai
  6. Select region: us-central1
  7. Click Continue
  8. Note the CNAME target: ghs.googlehosted.com
  9. Status shows: "Pending Verification"

In Cloudflare:

  1. Go to Cloudflare Dashboard (opens in a new tab)
  2. Select domain: altsportsleagues.ai
  3. Go to DNS β†’ Records
  4. Click Add Record
  5. Configure:
    • Type: CNAME
    • Name: api
    • Target: ghs.googlehosted.com
    • Proxy status: ☁️ Proxied (orange cloud)
    • TTL: Auto
  6. Click Save

Wait: 5-30 minutes for verification and SSL provisioning

Verify Backend Deployment

Test the custom domain:

# Health check
curl https://api.altsportsleagues.ai/health | jq
 
# Expected: {"status":"healthy","timestamp":"..."}
# API root
curl https://api.altsportsleagues.ai/ | jq
 
# Expected: {"message":"AltSportsLeagues API","version":"1.0.0"}
# API docs
open https://api.altsportsleagues.ai/docs
 
# Expected: Swagger UI loads
# OpenAPI schema
curl https://api.altsportsleagues.ai/openapi.json | jq '.info'
 
# Expected: API metadata

If all tests pass, backend is live! βœ…

Check logs if issues:

gcloud run services logs tail altsportsleagues-backend \
  --region us-central1 \
  --limit 50

🎨 Phase 2: Frontend Deployment

Update Configuration

Update clients/frontend/vercel.json:

{
  "version": 2,
  "buildCommand": "npm run build",
  "framework": "nextjs",
  "rewrites": [
    {
      "source": "/api/v1/:path*",
      "destination": "https://api.altsportsleagues.ai/v1/:path*"
    }
  ],
  "redirects": [
    {
      "source": "/documentation/:path*",
      "destination": "https://docs.altsportsleagues.ai/:path*",
      "permanent": false
    }
  ]
}

Key Changes:

  • βœ… Use custom domain (api.altsportsleagues.ai)
  • βœ… Clean backend path (/v1/* not /api/v1/*)
  • βœ… Add redirect to docs site

Set Environment Variables

In Vercel Dashboard:

  1. Go to Vercel Dashboard (opens in a new tab)
  2. Select your frontend project
  3. Go to Settings β†’ Environment Variables
  4. Add variables for Production environment:
NEXT_PUBLIC_API_URL=https://api.altsportsleagues.ai
BACKEND_API_URL=https://api.altsportsleagues.ai
NEXT_PUBLIC_SITE_URL=https://altsportsleagues.ai

Click Save for each variable.

Deploy Frontend

Option A: Via deployment script

cd /Users/kbselander/Developer/Notebook/mcp-servers/servers/mcp-server-altsportsleagues.ai/2.1-cloud-run-docker-mcp
 
./deploy-all.sh

Select: Option 3 (Frontend only)

Option B: Via Vercel CLI

cd clients/frontend
vercel --prod

Wait: 2-5 minutes for build and deployment

Map Custom Domain

In Vercel Dashboard:

  1. Go to your project β†’ Settings β†’ Domains
  2. Click Add Domain
  3. Enter: altsportsleagues.ai
  4. Click Add
  5. Vercel provides CNAME target (e.g., cname.vercel-dns.com)

In Cloudflare:

  1. Go to DNS β†’ Records
  2. Add CNAME record:
    • Type: CNAME
    • Name: @ (or altsportsleagues.ai)
    • Target: cname.vercel-dns.com (from Vercel)
    • Proxy: ☁️ Proxied
  3. Click Save

Optional - www subdomain:

  • Name: www
  • Target: cname.vercel-dns.com
  • Proxy: ☁️ Proxied

Wait: 1-5 minutes for DNS propagation

Verify Frontend Deployment

# Test main site
open https://altsportsleagues.ai
 
# Test API proxy
curl https://altsportsleagues.ai/api/v1/leagues | jq
 
# Should return same data as direct backend:
curl https://api.altsportsleagues.ai/v1/leagues | jq

In Browser DevTools:

  1. Open https://altsportsleagues.ai
  2. Open DevTools (F12) β†’ Network tab
  3. Trigger API call (e.g., view leagues)
  4. Check request:
    • URL shows: /api/v1/leagues (relative)
    • Status: 200 OK
    • No CORS errors in Console

βœ… Success: If API calls work and no errors, frontend is live!


πŸ“š Phase 3: Documentation Site

Deploy Docs Site

cd apps/docs-site
 
# Install dependencies (if needed)
npm install
 
# Test build locally
npm run build
 
# Deploy to production
vercel --prod

Wait: 3-5 minutes for build

Map Custom Domain

In Vercel Dashboard (separate project for docs):

  1. Select the docs site project
  2. Settings β†’ Domains
  3. Add: docs.altsportsleagues.ai
  4. Note CNAME target from Vercel

In Cloudflare:

  1. DNS β†’ Add Record
  2. Configure:
    • Type: CNAME
    • Name: docs
    • Target: cname.vercel-dns.com (from Vercel docs project)
    • Proxy: ☁️ Proxied
  3. Save

Verify Docs Deployment

# Test docs site
open https://docs.altsportsleagues.ai
 
# Verify architecture pages
open https://docs.altsportsleagues.ai/architecture
 
# Test search
# (Use search bar in docs UI)

Docs should load with full navigation, search, and interactive schema explorers!


βœ… Phase 4: Complete Verification

Verification Checklist

Backend (api.altsportsleagues.ai):

# Health check
curl https://api.altsportsleagues.ai/health | jq
# βœ… Expected: {"status":"healthy"}
 
# API docs
open https://api.altsportsleagues.ai/docs
# βœ… Expected: Swagger UI loads
 
# API endpoint
curl https://api.altsportsleagues.ai/v1/leagues | jq
# βœ… Expected: JSON response

Frontend (altsportsleagues.ai):

# Main site
open https://altsportsleagues.ai
# βœ… Expected: Site loads, no errors
 
# API proxy test
curl https://altsportsleagues.ai/api/v1/leagues | jq
# βœ… Expected: Same data as direct backend call

Browser Console Check:

  1. Open DevTools (F12)
  2. Console tab: No CORS errors βœ…
  3. Network tab: All API calls return 200 βœ…
  4. Application tab: Service worker active (if PWA) βœ…

Docs Site (docs.altsportsleagues.ai):

# Docs homepage
open https://docs.altsportsleagues.ai
# βœ… Expected: Docs load
 
# Architecture section
open https://docs.altsportsleagues.ai/architecture
# βœ… Expected: This page loads!
 
# Search functionality
# Use search in docs UI
# βœ… Expected: Results appear

n8n (n8n.altsportsleagues.ai):

# n8n UI
open https://n8n.altsportsleagues.ai
# βœ… Expected: Login page or dashboard (if authenticated)
 
# Test webhook (if configured)
curl -X POST https://n8n.altsportsleagues.ai/webhook/test
# βœ… Expected: Workflow triggers

πŸ”§ Post-Deployment Configuration

CORS Configuration (Backend)

Ensure backend allows all your frontend domains:

# apps/backend/server.py
 
from fastapi.middleware.cors import CORSMiddleware
 
app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "https://altsportsleagues.ai",
        "https://www.altsportsleagues.ai",
        "https://docs.altsportsleagues.ai",
        "https://n8n.altsportsleagues.ai",
        "https://*.vercel.app",  # Preview deployments
    ],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

Cloudflare Security Settings

Recommended configuration:

  1. SSL/TLS:

    • Mode: Full (strict)
    • Min TLS Version: 1.2
    • Always Use HTTPS: On
  2. Security:

    • DDoS Protection: Auto (included)
    • WAF: On (if available)
    • Bot Fight Mode: On
  3. Performance:

    • Caching Level: Standard
    • Auto Minify: JS, CSS, HTML
    • Brotli: On

Health Check Monitoring

Set up alerts in Google Cloud Console:

  1. Go to Cloud Run β†’ Service β†’ Metrics
  2. Create alert policy:
    • Metric: Request count
    • Condition: > 100 5xx errors in 5 minutes
    • Notification: Email/Slack

πŸ“Š Deployment Timeline

Estimated Duration

PhaseTaskDurationDependencies
Pre-DeploymentLocal testing15 minDocker running
BackendCloud Run deploy8 mingcloud auth
BackendDomain mapping20 minDNS propagation
FrontendVercel deploy5 minvercel auth
FrontendDomain mapping10 minDNS propagation
DocsVercel deploy5 minvercel auth
DocsDomain mapping10 minDNS propagation
VerificationTest all services15 minAll deployed
Total~90 min

Note: Domain mapping times vary. SSL verification can take 5-30 minutes. DNS propagation is usually 1-5 minutes with Cloudflare.


πŸ”„ Rollback Procedures

Rollback Backend to Previous Revision:

# List revisions
gcloud run revisions list \
  --service altsportsleagues-backend \
  --region us-central1
 
# Rollback to specific revision
gcloud run services update-traffic altsportsleagues-backend \
  --to-revisions REVISION_NAME=100 \
  --region us-central1

Check rollback:

curl https://api.altsportsleagues.ai/health

πŸ“ˆ Monitoring & Logs

Backend Logs (Cloud Run)

# Tail logs (live)
gcloud run services logs tail altsportsleagues-backend \
  --region us-central1 \
  --limit 100
 
# Read recent logs
gcloud run services logs read altsportsleagues-backend \
  --region us-central1 \
  --follow

Frontend Logs (Vercel)

# Via CLI
vercel logs
 
# Or in dashboard:
# https://vercel.com/dashboard
# β†’ Project β†’ Deployments β†’ Select deployment β†’ View Logs

Cloudflare Analytics

Visit Cloudflare Dashboard (opens in a new tab) β†’ Analytics:

  • Total requests
  • Bandwidth usage
  • Threats blocked
  • Cache hit rate

πŸ†˜ Troubleshooting

Common Issues

Issue: Domain mapping stuck in "Pending Verification"

⚠️

Solution: Verify DNS is correct in Cloudflare. Use dig api.altsportsleagues.ai to check. Wait up to 30 minutes for Google to verify.

Issue: 502/503 errors from backend

⚠️

Solution: Check Cloud Run logs for application errors. Verify environment variables are set. Test health endpoint directly.

Issue: CORS errors in frontend

⚠️

Solution: Verify backend CORS middleware includes your frontend domain. Ensure frontend uses rewrites (not direct API calls).

Issue: SSL certificate errors

⚠️

Solution: Wait for platforms to provision certificates (automatic). Force HTTPS in Cloudflare settings.


πŸŽ‰ Deployment Complete!

Your platform is now live on production URLs. Monitor the dashboards and set up alerts for any issues. See Security Architecture for best practices.

Platform

Documentation

Community

Support

partnership@altsportsdata.comdev@altsportsleagues.ai

2025 Β© AltSportsLeagues.ai. Powered by AI-driven sports business intelligence.

πŸ€– AI-Enhancedβ€’πŸ“Š Data-Drivenβ€’βš‘ Real-Time