Feat: Add marketing site and switch to git-based deployment

This commit is contained in:
poduck
2025-11-30 16:18:11 -05:00
parent 2b28fc49c9
commit 0d1a3045fb
6 changed files with 90 additions and 43 deletions

View File

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

View File

@@ -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;
}

View File

@@ -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"
}
}
}
}

View File

@@ -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 = [

View File

@@ -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:

View File

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