Feat: Add marketing site and switch to git-based deployment
This commit is contained in:
@@ -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/"
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user