Deployment

Deploying to Cloudflare Workers, Vercel, or Docker

Deployment

Deploy your SaaS Pack application to production.

Prerequisites

  • Cloudflare account
  • Wrangler CLI installed

Deployment Steps

# Install Wrangler
pnpm add -g wrangler

# Login to Cloudflare
wrangler login

# Build the application
pnpm build

# Deploy to Cloudflare Pages
pnpm deploy

Environment Variables

Set environment variables in Cloudflare dashboard:

AUTH_SECRET=your-secret
DATABASE_URL=your-database-url
STRIPE_SECRET_KEY=your-stripe-key

Custom Domain

  1. Add domain in Cloudflare Pages settings
  2. Update DNS records
  3. Configure SSL/TLS

Vercel

Deployment

# Install Vercel CLI
pnpm add -g vercel

# Deploy
vercel

Configuration

{
  "buildCommand": "pnpm build",
  "outputDirectory": ".output/public",
  "framework": "nuxtjs"
}

Docker

Dockerfile

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

EXPOSE 3000

CMD ["node", ".output/server/index.mjs"]

Build and Run

# Build image
docker build -t saaspack .

# Run container
docker run -p 3000:3000 \
  -e DATABASE_URL=your-database-url \
  -e AUTH_SECRET=your-secret \
  saaspack

Docker Compose

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=${DATABASE_URL}
      - AUTH_SECRET=${AUTH_SECRET}
    depends_on:
      - postgres

  postgres:
    image: postgres:16
    environment:
      - POSTGRES_DB=saaspack
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Environment Setup

Production Checklist

  • Set strong AUTH_SECRET
  • Configure production database
  • Set up Stripe webhooks
  • Configure email provider
  • Set up error tracking (Sentry)
  • Configure CDN
  • Enable SSL/TLS
  • Set up monitoring
  • Configure backups
  • Review security headers

Monitoring

Error Tracking

// server/plugins/sentry.ts
import * as Sentry from '@sentry/node'

export default defineNitroPlugin((nitroApp) => {
  Sentry.init({
    dsn: process.env.SENTRY_DSN,
    environment: process.env.NODE_ENV
  })
})

Performance Monitoring

// Add performance monitoring
export default defineNuxtConfig({
  runtimeConfig: {
    public: {
      sentryDsn: process.env.SENTRY_DSN
    }
  }
})

CI/CD

GitHub Actions

name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: pnpm/action-setup@v2
      - uses: actions/setup-node@v3
        with:
          node-version: 20
          cache: 'pnpm'
      
      - run: pnpm install
      - run: pnpm build
      - run: pnpm deploy
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}

Next Steps