Skip to content

Deployment

Scripts, Procedures, and Monitoring


Deployment Process

Prerequisites

  • Docker 24.0+
  • Docker Compose 2.20+
  • Git
  • SSL certificates

Deploy Script

Location: /opt/vitara-platform/scripts/deploy.sh

#!/bin/bash
set -e

cd /opt/vitara-platform

# Pull latest code
git pull origin main

# Test NGINX config
docker run --rm -v $(pwd)/nginx:/etc/nginx:ro nginx:alpine nginx -t

# Stop containers
docker compose down

# Build images
docker compose build --no-cache

# Start services
docker compose up -d

# Wait and verify
sleep 15
curl -s http://localhost:9080/health

Running Deployment

cd /opt/vitara-platform
./scripts/deploy.sh

SSL Setup

Let's Encrypt Certificate

Location: /opt/vitara-platform/scripts/ssl-setup.sh

#!/bin/bash

# Get wildcard certificate
certbot certonly \
  --standalone \
  -d vitaravox.ca \
  -d "*.vitaravox.ca" \
  --email admin@vitaravox.com \
  --agree-tos

# Restart NGINX
docker restart vitara-nginx

Certificate Renewal

# Add to crontab
0 3 * * * certbot renew --quiet --post-hook "docker restart vitara-nginx"

Verify Certificate

openssl s_client -connect api.vitaravox.ca:9443 -servername api.vitaravox.ca

Environment Configuration

Production .env

# Database
POSTGRES_PASSWORD=<secure-password>

# Environment
NODE_ENV=production

# OSCAR
OSCAR_API_URL=http://15.222.50.48:3000
OSCAR_API_KEY=<api-key>

# Vapi
VAPI_WEBHOOK_SECRET=<webhook-secret>

# Clinic
TRANSFER_NUMBER=+1-604-555-0100

# Admin
ADMIN_JWT_SECRET=<jwt-secret>
ENCRYPTION_KEY=<encryption-key>

Generate Secrets

# API key
openssl rand -hex 32

# JWT secret
openssl rand -base64 64

Monitoring

Health Checks

Endpoint Check Interval
/health API health 30s
pg_isready Database 10s
NGINX status Proxy 30s

Check All Services

docker compose ps

Expected output:

NAME                  STATUS
vitara-db             Up (healthy)
vitara-voice-agent    Up (healthy)
vitara-nginx          Up

View Logs

# All services
docker compose logs -f

# Specific service
docker compose logs -f vitara-voice-agent

# Last 100 lines
docker compose logs --tail 100 vitara-voice-agent

Backup Procedures

Database Backup

# Full backup
docker exec vitara-db pg_dump -U vitara vitara > backup_$(date +%Y%m%d).sql

# Compressed
docker exec vitara-db pg_dump -U vitara vitara | gzip > backup_$(date +%Y%m%d).sql.gz

Restore

docker exec -i vitara-db psql -U vitara vitara < backup_20260112.sql

Automated Backup

# Add to crontab
0 2 * * * docker exec vitara-db pg_dump -U vitara vitara | gzip > /backups/vitara_$(date +\%Y\%m\%d).sql.gz

Troubleshooting

Container Won't Start

# Check logs
docker compose logs vitara-voice-agent

# Common issues:
# - DATABASE_URL incorrect
# - Port already in use
# - Missing .env file

Database Connection Failed

# Check database is running
docker exec vitara-db pg_isready -U vitara

# Test connection
docker exec vitara-db psql -U vitara -d vitara -c "SELECT 1"

OSCAR Connection Failed

# Test from container
docker exec vitara-voice-agent wget -O - http://15.222.50.48:3000/health

# Check credentials
docker exec vitara-voice-agent printenv | grep OSCAR

SSL Certificate Issues

# Check expiry
openssl x509 -in /etc/letsencrypt/live/vitaravox.ca/fullchain.pem -noout -dates

# Force renewal
certbot renew --force-renewal

Resource Usage

Check Memory

docker stats --no-stream

Expected Usage

Container Memory CPU
vitara-db ~100MB 0.5%
vitara-voice-agent ~150MB 1%
vitara-nginx ~10MB 0.1%

Rollback Procedure

Quick Rollback

cd /opt/vitara-platform

# Checkout previous version
git checkout HEAD~1

# Redeploy
docker compose down
docker compose build
docker compose up -d

Rollback to Specific Version

# List recent commits
git log --oneline -10

# Checkout specific commit
git checkout abc123

# Redeploy
./scripts/deploy.sh

URLs

Service URL
API (HTTPS) https://api.vitaravox.ca:9443
API (HTTP) http://api.vitaravox.ca:9080
Health https://api.vitaravox.ca:9443/health
Docs https://vitdocs.vitaravox.ca

Next Steps