From 0d1a3045fbef50df00cb5de63093aaba3118b379 Mon Sep 17 00:00:00 2001 From: poduck Date: Sun, 30 Nov 2025 16:18:11 -0500 Subject: [PATCH] Feat: Add marketing site and switch to git-based deployment --- deploy.sh | 3 + frontend/nginx.conf | 31 +++++++++- frontend/src/i18n/locales/en.json | 60 ++++++++----------- frontend/src/pages/marketing/HomePage.tsx | 12 ++++ .../compose/production/traefik/traefik.yml | 11 +++- smoothschedule/docker-compose.production.yml | 16 +++-- 6 files changed, 90 insertions(+), 43 deletions(-) diff --git a/deploy.sh b/deploy.sh index bacf50d..6e5ff5e 100755 --- a/deploy.sh +++ b/deploy.sh @@ -65,6 +65,9 @@ ssh "$SERVER" "mkdir -p ~/smoothschedule" # Upload backend rsync -avz --delete /tmp/smoothschedule-deploy/backend/ "$SERVER:~/smoothschedule/" +# Upload nginx config +scp "$PROJECT_DIR/frontend/nginx.conf" "$SERVER:~/smoothschedule/nginx.conf" + # Upload frontend rsync -avz --delete /tmp/smoothschedule-deploy/frontend/ "$SERVER:~/smoothschedule-frontend/" diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 13b1b73..4c61fb9 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -45,7 +45,36 @@ http { add_header Cache-Control "public, immutable"; } - # Handle SPA routing - serve index.html for all routes + # Proxy API requests to Django + location /api/ { + proxy_pass http://django:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Proxy Admin requests to Django + location /admin/ { + proxy_pass http://django:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Proxy Static/Media to Django (if served by WhiteNoise/Django) + location /static/ { + proxy_pass http://django:5000; + proxy_set_header Host $host; + } + + location /media/ { + proxy_pass http://django:5000; + proxy_set_header Host $host; + } + + # Handle SPA routing - serve index.html for all other routes location / { try_files $uri $uri/ /index.html; } diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index 99878e5..22a27c4 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -233,14 +233,11 @@ "newTicket": "New Ticket", "errorLoading": "Error loading tickets", "subject": "Subject", - "description": "Description", - "status": "Status", "priority": "Priority", "category": "Category", "ticketType": "Ticket Type", "assignee": "Assignee", "assignedTo": "Assigned to", - "createdAt": "Created At", "unassigned": "Unassigned", "noTicketsFound": "No tickets found", "noTicketsInStatus": "No tickets with this status", @@ -300,15 +297,8 @@ }, "sandboxRestriction": "Platform Support Unavailable in Test Mode", "sandboxRestrictionMessage": "You can only contact SmoothSchedule support in live mode. Please switch to live mode to create a support ticket.", - "status": { - "open": "Open", - "in_progress": "In Progress", - "awaiting_response": "Awaiting Response", - "resolved": "Resolved", - "closed": "Closed" - }, "ticketNumber": "Ticket #{{number}}", - "createdAt": "Created {{date}}" + "createdDate": "Created {{date}}" }, "customerSupport": { "title": "Support", @@ -673,46 +663,46 @@ "signup": "Sign Up" }, "hero": { - "headline": "Scheduling Made Simple", - "subheadline": "The all-in-one platform for managing appointments, resources, and customers. Start free, scale as you grow.", - "cta": "Get Started Free", - "secondaryCta": "Watch Demo", - "trustedBy": "Trusted by 1,000+ businesses worldwide" + "headline": "Orchestrate Your Business", + "subheadline": "The enterprise-grade scheduling platform for service businesses. Multi-tenant, white-label ready, and designed for scale.", + "cta": "Start Your Free Trial", + "secondaryCta": "View Live Demo", + "trustedBy": "Powering next-generation service platforms" }, "features": { - "title": "Everything You Need", - "subtitle": "Powerful features to run your service business", + "title": "Built for Modern Service Businesses", + "subtitle": "A complete platform to manage your schedule, staff, and growth.", "scheduling": { - "title": "Smart Scheduling", - "description": "Drag-and-drop calendar with real-time availability, automated reminders, and conflict detection." + "title": "Intelligent Scheduling", + "description": "Conflict-free booking engine that handles complex resource availability and staff schedules automatically." }, "resources": { - "title": "Resource Management", - "description": "Manage staff, rooms, and equipment. Set availability, skills, and booking rules." + "title": "Resource Orchestration", + "description": "Manage rooms, equipment, and staff as distinct resources with their own availability rules and dependencies." }, "customers": { - "title": "Customer Portal", - "description": "Self-service booking portal for customers. View history, manage appointments, and save payment methods." + "title": "Client Portal", + "description": "Give your clients a premium self-service experience with a dedicated portal to book, pay, and manage appointments." }, "payments": { - "title": "Integrated Payments", - "description": "Accept payments online with Stripe. Deposits, full payments, and automatic invoicing." + "title": "Seamless Payments", + "description": "Secure payment processing powered by Stripe. Accept deposits, full payments, and manage refunds effortlessly." }, "multiTenant": { - "title": "Multi-Location Support", - "description": "Manage multiple locations or brands from a single dashboard with isolated data." + "title": "Multi-Location & Franchise Ready", + "description": "Scale from one location to hundreds. Isolated data, centralized management, and role-based access control." }, "whiteLabel": { - "title": "White-Label Ready", - "description": "Custom domain, branding, and remove SmoothSchedule branding for a seamless experience." + "title": "Your Brand, Front and Center", + "description": "Fully white-label capable. Use your own domain, logo, and colors. Your customers will never know it's us." }, "analytics": { - "title": "Analytics & Reports", - "description": "Track revenue, appointments, and customer trends with beautiful dashboards." + "title": "Business Intelligence", + "description": "Real-time dashboards showing revenue, utilization, and growth metrics to help you make data-driven decisions." }, "integrations": { - "title": "Powerful Integrations", - "description": "Connect with Google Calendar, Zoom, Stripe, and more. API access for custom integrations." + "title": "Extensible Platform", + "description": "API-first design allows deep integration with your existing tools and workflows." } }, "howItWorks": { @@ -1147,4 +1137,4 @@ "goToDashboard": "Go to Dashboard" } } -} +} \ No newline at end of file diff --git a/frontend/src/pages/marketing/HomePage.tsx b/frontend/src/pages/marketing/HomePage.tsx index 3eaa4e0..ba90342 100644 --- a/frontend/src/pages/marketing/HomePage.tsx +++ b/frontend/src/pages/marketing/HomePage.tsx @@ -59,6 +59,18 @@ const HomePage: React.FC = () => { descriptionKey: 'marketing.features.whiteLabel.description', color: 'cyan', }, + { + icon: BarChart3, + titleKey: 'marketing.features.analytics.title', + descriptionKey: 'marketing.features.analytics.description', + color: 'indigo', + }, + { + icon: Plug, + titleKey: 'marketing.features.integrations.title', + descriptionKey: 'marketing.features.integrations.description', + color: 'teal', + }, ]; const testimonials = [ diff --git a/smoothschedule/compose/production/traefik/traefik.yml b/smoothschedule/compose/production/traefik/traefik.yml index aff4eab..e510f24 100644 --- a/smoothschedule/compose/production/traefik/traefik.yml +++ b/smoothschedule/compose/production/traefik/traefik.yml @@ -37,7 +37,9 @@ http: - web-secure middlewares: - csrf - service: django + middlewares: + - csrf + service: nginx tls: certResolver: letsencrypt @@ -48,7 +50,7 @@ http: - web-secure middlewares: - csrf - service: django + service: nginx tls: certResolver: letsencrypt @@ -101,6 +103,11 @@ http: servers: - url: http://flower:5555 + nginx: + loadBalancer: + servers: + - url: http://nginx:80 + providers: # https://doc.traefik.io/traefik/master/providers/file/ file: diff --git a/smoothschedule/docker-compose.production.yml b/smoothschedule/docker-compose.production.yml index 6976332..789d26a 100644 --- a/smoothschedule/docker-compose.production.yml +++ b/smoothschedule/docker-compose.production.yml @@ -2,10 +2,8 @@ volumes: production_postgres_data: {} production_postgres_data_backups: {} production_traefik: {} - - production_redis_data: {} - + production_redis_data: {} services: django: &django @@ -46,13 +44,21 @@ services: - '0.0.0.0:80:80' - '0.0.0.0:443:443' - '0.0.0.0:5555:5555' + - '0.0.0.0:5555:5555' + nginx: + build: + context: ../frontend + dockerfile: Dockerfile.prod + depends_on: + - django + ports: + - "8080:80" # Expose internally for Traefik redis: image: docker.io/redis:7.2 - + volumes: - production_redis_data:/data - celeryworker: <<: *django