Skip to main content

Overview

Voxora can be deployed to various cloud platforms and hosting providers. This guide covers best practices and deployment strategies for both the web application and API server.

Architecture

A typical production deployment consists of:

Deployment Options

Vercel

Best for Next.js web app deployment

Railway

Easy full-stack deployment

AWS

Enterprise-grade infrastructure

Digital Ocean

Simple VPS hosting

Pre-Deployment Checklist

1

Environment Variables

Set all required production environment variables
2

Database

Set up managed MongoDB (Atlas, etc.)
3

Redis

Set up managed Redis (Upstash, etc.)
4

Email Service

Configure SMTP provider (SendGrid, AWS SES)
5

File Storage

Set up S3 or similar for file uploads
6

Domain & SSL

Configure custom domain and SSL certificates
7

Security

Review security settings and secrets

Build for Production

Build Both Apps

npm run build
This creates optimized production builds:
  • Web App: .next/ directory with static and server files
  • API Server: Transpiled JavaScript (if using TypeScript)

Verify Builds

cd apps/web
npm run start

Environment Setup

Production Environment Variables

# API Configuration
NEXT_PUBLIC_API_URL=https://api.yourdomain.com
NEXT_PUBLIC_SOCKET_URL=https://api.yourdomain.com

# Widget
NEXT_PUBLIC_WIDGET_URL=https://cdn.yourdomain.com/widget

# Features
NEXT_PUBLIC_ENABLE_ANALYTICS=true
NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX

# Sentry
NEXT_PUBLIC_SENTRY_DSN=https://...@sentry.io/...

Deployment Platforms

Vercel (Web App)

1

Install Vercel CLI

npm i -g vercel
2

Login

vercel login
3

Deploy

cd apps/web
vercel --prod
4

Set Environment Variables

Configure in Vercel dashboard or via CLI:
vercel env add NEXT_PUBLIC_API_URL production
vercel.json configuration:
apps/web/vercel.json
{
  "buildCommand": "npm run build",
  "outputDirectory": ".next",
  "framework": "nextjs",
  "env": {
    "NEXT_PUBLIC_API_URL": "@api-url"
  }
}

Railway (Full Stack)

1

Create Project

Sign up at railway.app
2

Install CLI

npm i -g @railway/cli
railway login
3

Deploy

railway init
railway up
4

Add Services

Add MongoDB and Redis from Railway marketplace

Docker Deployment

Create production Docker images:
FROM node:18-alpine AS base

# Dependencies
FROM base AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Builder
FROM base AS builder
WORKDIR /app
COPY . .
COPY --from=deps /app/node_modules ./node_modules
RUN npm run build

# Runner
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000
ENV PORT 3000

CMD ["node", "server.js"]
docker-compose.prod.yml:
version: '3.8'

services:
  web:
    build: ./apps/web
    ports:
      - "3000:3000"
    environment:
      - NEXT_PUBLIC_API_URL=http://api:3002
    depends_on:
      - api

  api:
    build: ./apps/api
    ports:
      - "3002:3002"
    environment:
      - MONGODB_URI=${MONGODB_URI}
      - REDIS_URL=${REDIS_URL}
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - mongodb
      - redis

  mongodb:
    image: mongo:latest
    volumes:
      - mongodb_data:/data/db

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

volumes:
  mongodb_data:
  redis_data:

Database Setup

MongoDB Atlas

1

Create Cluster

2

Configure Network Access

Add your server IP addresses or allow access from anywhere (0.0.0.0/0)
3

Create Database User

Create a user with read/write permissions
4

Get Connection String

mongodb+srv://<user>:<password>@cluster.mongodb.net/voxora

Redis Cloud (Upstash)

1

Create Database

Sign up at upstash.com
2

Get Connection URL

redis://default:<password>@<host>:<port>
3

Update Environment

Set REDIS_URL in your environment variables

CDN & Static Assets

Widget Distribution

Host the chat widget on a CDN:
# Build widget
cd apps/api/public
aws s3 sync widget/ s3://your-bucket/widget/

# Set CloudFront or CDN URL
WIDGET_CDN_URL=https://cdn.yourdomain.com/widget

SSL/TLS Configuration

Let’s Encrypt (Free SSL)

# Install certbot
sudo apt install certbot python3-certbot-nginx

# Obtain certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# Auto-renewal
sudo certbot renew --dry-run

Load Balancing

Nginx Configuration

/etc/nginx/sites-available/voxora
upstream api_servers {
    server 127.0.0.1:3002;
    server 127.0.0.1:3003;
    server 127.0.0.1:3004;
}

server {
    listen 80;
    server_name api.yourdomain.com;
    
    location / {
        proxy_pass http://api_servers;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Monitoring & Logging

Sentry

Error tracking and performance monitoring

LogRocket

Session replay and analytics

DataDog

Infrastructure and application monitoring

PM2

Process management and monitoring

PM2 Setup

# Install PM2
npm install -g pm2

# Start API with PM2
pm2 start apps/api/src/index.js --name voxora-api

# Start on system boot
pm2 startup
pm2 save

Scaling Considerations

Horizontal Scaling

Run multiple API instances behind a load balancer

Database Sharding

Shard MongoDB for large datasets

Redis Clustering

Use Redis cluster for high availability

CDN

Serve static assets via CDN

Next Steps

Web App Deployment

Detailed web app deployment guide

API Server Deployment

Detailed API deployment guide