Deployment Guide for MySQLens

This guide covers various deployment scenarios for MySQLens.

Table of Contents

Quick Start

# Clone the repository
git clone https://github.com/a-kash-singh/MySQLens.git
cd MySQLens

# Create environment file
cp .env.example .env

# Edit .env and add your API keys
nano .env

# Start services
docker compose up -d

# Check status
docker compose ps

# View logs
docker compose logs -f

Production Deployment with Docker Compose

# Use production compose file
docker compose -f docker compose.yml up -d

# Scale services (if needed)
docker compose up -d --scale mysqlens-api=2

Manual Installation

Backend Setup

# Install Python 3.11+
python --version

# Create virtual environment
cd backend
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Set environment variables
export GEMINI_API_KEY=your_key_here
export BACKEND_HOST=0.0.0.0
export BACKEND_PORT=8080

# Run the application
python main.py

Frontend Setup

# Install Node.js 20+
node --version

# Install dependencies
cd frontend
npm install

# Set environment variables
export NEXT_PUBLIC_API_URL=http://localhost:8080
export BACKEND_URL=http://localhost:8080

# Build and start
npm run build
npm start

# Or for development
npm run dev

Production Deployment

Prerequisites

1. Server Setup

# Update system
sudo apt update && sudo apt upgrade -y

# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Install Docker Compose
sudo apt install docker compose-plugin

# Create application directory
sudo mkdir -p /opt/mysqlens
cd /opt/mysqlens

2. Configuration

# Clone repository
git clone https://github.com/a-kash-singh/MySQLens.git .

# Create production .env
cat > .env << EOF
# LLM Configuration
GEMINI_API_KEY=your_production_key
LLM_PROVIDER=gemini

# Backend Configuration
BACKEND_HOST=0.0.0.0
BACKEND_PORT=8080
ENVIRONMENT=production
DEBUG=false
LOG_LEVEL=INFO

# Frontend Configuration
NEXT_PUBLIC_API_URL=https://api.yourdomain.com
NODE_ENV=production
EOF

# Set permissions
chmod 600 .env

3. Nginx Reverse Proxy

# /etc/nginx/sites-available/mysqlens

# Frontend
server {
    listen 80;
    listen [::]:80;
    server_name mysqlens.yourdomain.com;

    # Redirect to HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mysqlens.yourdomain.com;

    # SSL Configuration
    ssl_certificate /etc/letsencrypt/live/mysqlens.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysqlens.yourdomain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # Proxy to frontend
    location / {
        proxy_pass http://localhost:3000;
        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;
    }

    # Proxy to backend API
    location /api {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        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;
    }
}

# Backend API (optional separate domain)
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name api.mysqlens.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/api.mysqlens.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.mysqlens.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        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;
    }
}

Enable the site:

sudo ln -s /etc/nginx/sites-available/mysqlens /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

4. SSL with Let’s Encrypt

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

# Obtain certificate
sudo certbot --nginx -d mysqlens.yourdomain.com -d api.mysqlens.yourdomain.com

# Auto-renewal
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

5. Start Services

cd /opt/mysqlens
docker compose up -d

# Verify
docker compose ps
docker compose logs -f

6. Systemd Service (Optional)

# Create systemd service
sudo nano /etc/systemd/system/mysqlens.service
[Unit]
Description=MySQLens
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mysqlens
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Enable and start:

sudo systemctl enable mysqlens
sudo systemctl start mysqlens
sudo systemctl status mysqlens

Cloud Deployment

AWS (EC2)

# Launch EC2 instance (Ubuntu 22.04)
# t3.medium or larger recommended

# Connect via SSH
ssh -i your-key.pem ubuntu@your-instance-ip

# Follow production deployment steps above

# Security Group Rules:
# - Port 22 (SSH) from your IP
# - Port 80 (HTTP) from 0.0.0.0/0
# - Port 443 (HTTPS) from 0.0.0.0/0
# - Port 3306 (MySQL) from instance private IP only

Google Cloud (Compute Engine)

# Create VM instance
gcloud compute instances create mysqlens \
    --image-family=ubuntu-2204-lts \
    --image-project=ubuntu-os-cloud \
    --machine-type=e2-medium \
    --boot-disk-size=20GB \
    --zone=us-central1-a

# SSH into instance
gcloud compute ssh mysqlens --zone=us-central1-a

# Follow production deployment steps

DigitalOcean

# Create Droplet (Ubuntu 22.04, 2GB RAM minimum)

# SSH into droplet
ssh root@your-droplet-ip

# Follow production deployment steps

Kubernetes

Deployment YAML

# mysqlens-deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysqlens

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysqlens-config
  namespace: mysqlens
data:
  BACKEND_HOST: "0.0.0.0"
  BACKEND_PORT: "8080"
  ENVIRONMENT: "production"
  LOG_LEVEL: "INFO"

---
apiVersion: v1
kind: Secret
metadata:
  name: mysqlens-secrets
  namespace: mysqlens
type: Opaque
stringData:
  GEMINI_API_KEY: "your-api-key-here"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysqlens-api
  namespace: mysqlens
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mysqlens-api
  template:
    metadata:
      labels:
        app: mysqlens-api
    spec:
      containers:
      - name: api
        image: your-registry/mysqlens-api:latest
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: mysqlens-config
        - secretRef:
            name: mysqlens-secrets
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysqlens-ui
  namespace: mysqlens
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mysqlens-ui
  template:
    metadata:
      labels:
        app: mysqlens-ui
    spec:
      containers:
      - name: ui
        image: your-registry/mysqlens-ui:latest
        ports:
        - containerPort: 3000
        env:
        - name: BACKEND_URL
          value: "http://mysqlens-api:8080"
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"

---
apiVersion: v1
kind: Service
metadata:
  name: mysqlens-api
  namespace: mysqlens
spec:
  selector:
    app: mysqlens-api
  ports:
  - port: 8080
    targetPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: mysqlens-ui
  namespace: mysqlens
spec:
  selector:
    app: mysqlens-ui
  ports:
  - port: 3000
    targetPort: 3000

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mysqlens-ingress
  namespace: mysqlens
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - mysqlens.yourdomain.com
    secretName: mysqlens-tls
  rules:
  - host: mysqlens.yourdomain.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: mysqlens-api
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: mysqlens-ui
            port:
              number: 3000

Deploy:

kubectl apply -f mysqlens-deployment.yaml
kubectl get pods -n mysqlens
kubectl logs -f deployment/mysqlens-api -n mysqlens

Configuration

Environment Variables

Required:

Optional:

MySQL Configuration

Ensure performance_schema is enabled in MySQL:

# /etc/mysql/my.cnf or /etc/my.cnf
[mysqld]
performance_schema = ON

Monitoring

Health Checks

# Check service health
curl http://localhost:8080/health

# Check connection status
curl http://localhost:8080/api/connection/status

# Check database health
curl http://localhost:8080/api/health/scan

Logs

# View all logs
docker compose logs -f

# View specific service
docker compose logs -f mysqlens-api
docker compose logs -f mysqlens-ui

# Save logs to file
docker compose logs > logs.txt

Metrics

Monitor these metrics:

Backup

Backup SQLite Database

# Backup recommendations database
docker compose exec mysqlens-api sqlite3 /app/mysqlens.db .dump > backup.sql

# Restore
cat backup.sql | docker compose exec -T mysqlens-api sqlite3 /app/mysqlens.db

Troubleshooting

Can’t Connect to MySQL

  1. Check MySQL is accessible
  2. Verify performance_schema is enabled
  3. Check firewall rules
  4. Verify credentials

Services Won’t Start

# Check logs
docker compose logs

# Rebuild images
docker compose build --no-cache

# Remove old containers
docker compose down -v
docker compose up -d

High Memory Usage

API Errors

# Check backend logs
docker compose logs mysqlens-api

# Verify environment variables
docker compose exec mysqlens-api env | grep API_KEY

# Test API directly
curl http://localhost:8080/api/metrics/vitals

For more help, see the README or open an issue on GitHub.


← Back to Home