mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-24 05:43:58 +00:00
Major additions: - Complete Next.js studio application with 1600+ components - Docker support (Dockerfile.combined, docker-compose.yml) - GCP deployment documentation and benchmarks - SQL benchmark scripts for performance testing - Sentry integration for monitoring - Comprehensive test suite and mocks Studio features: - Dashboard and admin interfaces - Data visualization components - Authentication and user management - API integration with RuVector backend - Static data and public assets 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
559 lines
16 KiB
Markdown
559 lines
16 KiB
Markdown
# Deploying RuVector on Google Cloud SQL
|
|
|
|
This guide walks you through deploying RuVector as a custom PostgreSQL extension on Google Cloud SQL. Cloud SQL provides managed PostgreSQL with automatic backups, high availability, and scaling.
|
|
|
|
## Overview
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Google Cloud Platform │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────────────────────────┐ │
|
|
│ │ Cloud Run │ │ Cloud SQL │ │
|
|
│ │ (API/App) │─────►│ PostgreSQL 17 + RuVector │ │
|
|
│ └──────────────┘ │ • 65+ SQL functions │ │
|
|
│ │ │ • Vector search │ │
|
|
│ │ │ • GNN, Attention, Routing │ │
|
|
│ ▼ │ • Automatic backups │ │
|
|
│ ┌──────────────┐ │ • High availability │ │
|
|
│ │ Users │ └──────────────────────────────────┘ │
|
|
│ └──────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Prerequisites
|
|
|
|
- Google Cloud account with billing enabled
|
|
- `gcloud` CLI installed and authenticated
|
|
- Docker installed locally
|
|
- Project with Cloud SQL Admin API enabled
|
|
|
|
```bash
|
|
# Install gcloud CLI
|
|
curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz
|
|
tar -xf google-cloud-cli-linux-x86_64.tar.gz
|
|
./google-cloud-sdk/install.sh
|
|
|
|
# Login and set project
|
|
gcloud auth login
|
|
gcloud config set project YOUR_PROJECT_ID
|
|
|
|
# Enable required APIs
|
|
gcloud services enable sqladmin.googleapis.com
|
|
gcloud services enable compute.googleapis.com
|
|
gcloud services enable artifactregistry.googleapis.com
|
|
```
|
|
|
|
---
|
|
|
|
## Method 1: Custom PostgreSQL Image with Cloud SQL (Recommended)
|
|
|
|
Cloud SQL supports custom database flags but not custom extensions directly. However, you can use **AlloyDB** or a **Compute Engine VM** with Cloud SQL Proxy for a fully managed experience.
|
|
|
|
### Step 1: Create a Compute Engine VM with RuVector
|
|
|
|
```bash
|
|
# Set variables
|
|
export PROJECT_ID=$(gcloud config get-value project)
|
|
export ZONE=us-central1-a
|
|
export INSTANCE_NAME=ruvector-db
|
|
|
|
# Create a VM with Container-Optimized OS
|
|
gcloud compute instances create-with-container $INSTANCE_NAME \
|
|
--project=$PROJECT_ID \
|
|
--zone=$ZONE \
|
|
--machine-type=e2-standard-4 \
|
|
--container-image=gcr.io/$PROJECT_ID/ruvector:latest \
|
|
--container-restart-policy=always \
|
|
--container-env=POSTGRES_USER=ruvector,POSTGRES_PASSWORD=YOUR_SECURE_PASSWORD,POSTGRES_DB=ruvector_db \
|
|
--boot-disk-size=100GB \
|
|
--boot-disk-type=pd-ssd \
|
|
--tags=postgres-server \
|
|
--metadata=google-logging-enabled=true
|
|
```
|
|
|
|
### Step 2: Configure Firewall Rules
|
|
|
|
```bash
|
|
# Allow PostgreSQL traffic (restrict to your IP in production)
|
|
gcloud compute firewall-rules create allow-postgres \
|
|
--direction=INGRESS \
|
|
--priority=1000 \
|
|
--network=default \
|
|
--action=ALLOW \
|
|
--rules=tcp:5432 \
|
|
--source-ranges=0.0.0.0/0 \
|
|
--target-tags=postgres-server
|
|
|
|
# For production, restrict to specific IPs:
|
|
# --source-ranges=YOUR_IP/32
|
|
```
|
|
|
|
### Step 3: Get the External IP
|
|
|
|
```bash
|
|
gcloud compute instances describe $INSTANCE_NAME \
|
|
--zone=$ZONE \
|
|
--format='get(networkInterfaces[0].accessConfigs[0].natIP)'
|
|
```
|
|
|
|
### Step 4: Connect to RuVector
|
|
|
|
```bash
|
|
# Connect via psql
|
|
psql -h EXTERNAL_IP -U ruvector -d ruvector_db
|
|
|
|
# Verify RuVector is loaded
|
|
SELECT ruvector_version();
|
|
-- Returns: 0.2.5
|
|
|
|
# List all RuVector functions
|
|
SELECT proname FROM pg_proc WHERE proname LIKE 'ruvector_%' ORDER BY proname;
|
|
```
|
|
|
|
---
|
|
|
|
## Method 2: Cloud SQL with Proxy + Compute Engine Sidecar
|
|
|
|
For true Cloud SQL managed experience with RuVector extension processing:
|
|
|
|
### Architecture
|
|
|
|
```
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
│ Your App │────►│ Compute Engine │────►│ Cloud SQL │
|
|
│ (Cloud Run) │ │ (RuVector API) │ │ (PostgreSQL) │
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
│
|
|
│ RuVector functions
|
|
│ run here
|
|
▼
|
|
┌─────────────────┐
|
|
│ Vector Search │
|
|
│ GNN Processing │
|
|
│ Agent Routing │
|
|
└─────────────────┘
|
|
```
|
|
|
|
### Step 1: Create Cloud SQL Instance
|
|
|
|
```bash
|
|
# Create a Cloud SQL PostgreSQL instance
|
|
gcloud sql instances create ruvector-sql \
|
|
--database-version=POSTGRES_17 \
|
|
--tier=db-standard-2 \
|
|
--region=us-central1 \
|
|
--storage-size=100GB \
|
|
--storage-type=SSD \
|
|
--availability-type=REGIONAL \
|
|
--backup-start-time=03:00 \
|
|
--maintenance-window-day=SUN \
|
|
--maintenance-window-hour=04
|
|
|
|
# Set root password
|
|
gcloud sql users set-password postgres \
|
|
--instance=ruvector-sql \
|
|
--password=YOUR_SECURE_PASSWORD
|
|
|
|
# Create database
|
|
gcloud sql databases create ruvector_db --instance=ruvector-sql
|
|
```
|
|
|
|
### Step 2: Create RuVector API Service
|
|
|
|
Create a lightweight API that connects to Cloud SQL and provides RuVector functions:
|
|
|
|
```javascript
|
|
// ruvector-api/server.js
|
|
const express = require('express');
|
|
const { Pool } = require('pg');
|
|
const ruvector = require('ruvector');
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
|
|
// Connect to Cloud SQL via Unix socket
|
|
const pool = new Pool({
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASS,
|
|
database: process.env.DB_NAME,
|
|
host: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`,
|
|
});
|
|
|
|
// Vector search endpoint
|
|
app.post('/search', async (req, res) => {
|
|
const { query_embedding, limit = 10 } = req.body;
|
|
|
|
// Use RuVector's JavaScript SDK for vector operations
|
|
const results = await ruvector.search(query_embedding, { limit });
|
|
res.json(results);
|
|
});
|
|
|
|
// Semantic routing endpoint
|
|
app.post('/route', async (req, res) => {
|
|
const { query } = req.body;
|
|
const agent = await ruvector.route(query);
|
|
res.json({ agent });
|
|
});
|
|
|
|
// GNN-enhanced search
|
|
app.post('/gnn-search', async (req, res) => {
|
|
const { query_embedding, use_gnn = true } = req.body;
|
|
const results = await ruvector.gnnSearch(query_embedding, { use_gnn });
|
|
res.json(results);
|
|
});
|
|
|
|
const PORT = process.env.PORT || 8080;
|
|
app.listen(PORT, () => console.log(`RuVector API running on port ${PORT}`));
|
|
```
|
|
|
|
### Step 3: Deploy API to Cloud Run
|
|
|
|
```bash
|
|
# Build and push the API image
|
|
docker build -t gcr.io/$PROJECT_ID/ruvector-api:latest ./ruvector-api
|
|
docker push gcr.io/$PROJECT_ID/ruvector-api:latest
|
|
|
|
# Deploy to Cloud Run with Cloud SQL connection
|
|
gcloud run deploy ruvector-api \
|
|
--image gcr.io/$PROJECT_ID/ruvector-api:latest \
|
|
--platform managed \
|
|
--region us-central1 \
|
|
--allow-unauthenticated \
|
|
--add-cloudsql-instances $PROJECT_ID:us-central1:ruvector-sql \
|
|
--set-env-vars "DB_USER=postgres,DB_PASS=YOUR_PASSWORD,DB_NAME=ruvector_db,INSTANCE_CONNECTION_NAME=$PROJECT_ID:us-central1:ruvector-sql"
|
|
```
|
|
|
|
---
|
|
|
|
## Method 3: Full RuVector on Compute Engine (Production Ready)
|
|
|
|
For full PostgreSQL extension support with all 65+ functions:
|
|
|
|
### Step 1: Push Image to Google Container Registry
|
|
|
|
```bash
|
|
# Tag and push the RuVector image
|
|
docker tag ruvnet/ruvector:latest gcr.io/$PROJECT_ID/ruvector:latest
|
|
docker push gcr.io/$PROJECT_ID/ruvector:latest
|
|
```
|
|
|
|
### Step 2: Create Instance Template
|
|
|
|
```bash
|
|
# Create an instance template for auto-scaling
|
|
gcloud compute instance-templates create-with-container ruvector-template \
|
|
--machine-type=e2-standard-4 \
|
|
--container-image=gcr.io/$PROJECT_ID/ruvector:latest \
|
|
--container-restart-policy=always \
|
|
--container-env=POSTGRES_USER=ruvector,POSTGRES_PASSWORD=YOUR_SECURE_PASSWORD,POSTGRES_DB=ruvector_db \
|
|
--boot-disk-size=200GB \
|
|
--boot-disk-type=pd-ssd \
|
|
--tags=ruvector-db \
|
|
--metadata=google-logging-enabled=true \
|
|
--container-mount-host-path=host-path=/mnt/disks/pgdata,mount-path=/var/lib/postgresql/data
|
|
```
|
|
|
|
### Step 3: Create Managed Instance Group (Optional - for HA)
|
|
|
|
```bash
|
|
# Create a managed instance group
|
|
gcloud compute instance-groups managed create ruvector-group \
|
|
--template=ruvector-template \
|
|
--size=1 \
|
|
--zone=$ZONE
|
|
|
|
# Set up health check
|
|
gcloud compute health-checks create tcp ruvector-health \
|
|
--port=5432 \
|
|
--check-interval=10s \
|
|
--timeout=5s \
|
|
--healthy-threshold=2 \
|
|
--unhealthy-threshold=3
|
|
```
|
|
|
|
### Step 4: Set Up Load Balancer (Optional)
|
|
|
|
```bash
|
|
# Create a TCP load balancer for PostgreSQL
|
|
gcloud compute backend-services create ruvector-backend \
|
|
--protocol=TCP \
|
|
--health-checks=ruvector-health \
|
|
--global
|
|
|
|
gcloud compute backend-services add-backend ruvector-backend \
|
|
--instance-group=ruvector-group \
|
|
--instance-group-zone=$ZONE \
|
|
--global
|
|
|
|
gcloud compute target-tcp-proxies create ruvector-proxy \
|
|
--backend-service=ruvector-backend
|
|
|
|
gcloud compute forwarding-rules create ruvector-lb \
|
|
--global \
|
|
--target-tcp-proxy=ruvector-proxy \
|
|
--ports=5432
|
|
```
|
|
|
|
---
|
|
|
|
## Connecting Your Application
|
|
|
|
### From Cloud Run / Cloud Functions
|
|
|
|
```javascript
|
|
const { Pool } = require('pg');
|
|
|
|
// For Compute Engine deployment
|
|
const pool = new Pool({
|
|
host: 'EXTERNAL_IP_OR_INTERNAL_IP',
|
|
port: 5432,
|
|
user: 'ruvector',
|
|
password: 'YOUR_PASSWORD',
|
|
database: 'ruvector_db',
|
|
});
|
|
|
|
// Example: Semantic search
|
|
async function semanticSearch(queryEmbedding, limit = 10) {
|
|
const result = await pool.query(`
|
|
SELECT id, title,
|
|
embedding <-> $1::ruvector AS distance
|
|
FROM documents
|
|
ORDER BY distance
|
|
LIMIT $2
|
|
`, [JSON.stringify(queryEmbedding), limit]);
|
|
|
|
return result.rows;
|
|
}
|
|
|
|
// Example: Agent routing
|
|
async function routeQuery(queryEmbedding) {
|
|
const result = await pool.query(`
|
|
SELECT ruvector_route($1::ruvector)
|
|
`, [JSON.stringify(queryEmbedding)]);
|
|
|
|
return result.rows[0].ruvector_route;
|
|
}
|
|
```
|
|
|
|
### From Python
|
|
|
|
```python
|
|
import psycopg2
|
|
import numpy as np
|
|
|
|
conn = psycopg2.connect(
|
|
host="EXTERNAL_IP",
|
|
port=5432,
|
|
user="ruvector",
|
|
password="YOUR_PASSWORD",
|
|
database="ruvector_db"
|
|
)
|
|
|
|
def semantic_search(query_embedding, limit=10):
|
|
with conn.cursor() as cur:
|
|
cur.execute("""
|
|
SELECT id, title,
|
|
embedding <-> %s::ruvector AS distance
|
|
FROM documents
|
|
ORDER BY distance
|
|
LIMIT %s
|
|
""", (str(query_embedding.tolist()), limit))
|
|
return cur.fetchall()
|
|
|
|
def enable_learning():
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT ruvector_enable_learning(true)")
|
|
conn.commit()
|
|
```
|
|
|
|
---
|
|
|
|
## Security Best Practices
|
|
|
|
### 1. Use Private IP
|
|
|
|
```bash
|
|
# Create a VPC-native cluster
|
|
gcloud compute networks create ruvector-vpc --subnet-mode=custom
|
|
|
|
gcloud compute networks subnets create ruvector-subnet \
|
|
--network=ruvector-vpc \
|
|
--region=us-central1 \
|
|
--range=10.0.0.0/24
|
|
|
|
# Deploy VM with private IP only
|
|
gcloud compute instances create ruvector-db \
|
|
--no-address \
|
|
--network=ruvector-vpc \
|
|
--subnet=ruvector-subnet \
|
|
...
|
|
```
|
|
|
|
### 2. Use Cloud SQL Auth Proxy
|
|
|
|
```bash
|
|
# Download the proxy
|
|
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.8.1/cloud-sql-proxy.linux.amd64
|
|
chmod +x cloud-sql-proxy
|
|
|
|
# Run the proxy
|
|
./cloud-sql-proxy --port 5432 $PROJECT_ID:us-central1:ruvector-sql
|
|
```
|
|
|
|
### 3. Enable SSL/TLS
|
|
|
|
```bash
|
|
# Force SSL connections
|
|
gcloud sql instances patch ruvector-sql --require-ssl
|
|
```
|
|
|
|
### 4. Use Secret Manager for Credentials
|
|
|
|
```bash
|
|
# Store password in Secret Manager
|
|
echo -n "YOUR_PASSWORD" | gcloud secrets create ruvector-db-password --data-file=-
|
|
|
|
# Access in Cloud Run
|
|
gcloud run deploy ... --set-secrets=DB_PASS=ruvector-db-password:latest
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring & Logging
|
|
|
|
### Enable Cloud Monitoring
|
|
|
|
```bash
|
|
# View logs
|
|
gcloud logging read "resource.type=gce_instance AND resource.labels.instance_id=INSTANCE_ID" --limit=50
|
|
|
|
# Create uptime check
|
|
gcloud monitoring uptime create ruvector-uptime \
|
|
--display-name="RuVector Database" \
|
|
--resource-type=gce-instance \
|
|
--resource-labels=project_id=$PROJECT_ID,instance_id=INSTANCE_ID,zone=$ZONE
|
|
```
|
|
|
|
### Custom Metrics
|
|
|
|
```sql
|
|
-- Query to monitor index health
|
|
SELECT ruvector_learning_stats();
|
|
|
|
-- Check memory usage
|
|
SELECT ruvector_memory_stats();
|
|
|
|
-- Monitor agent routing performance
|
|
SELECT ruvector_routing_stats();
|
|
```
|
|
|
|
---
|
|
|
|
## Cost Optimization
|
|
|
|
| Configuration | Monthly Cost (est.) | Use Case |
|
|
|---------------|---------------------|----------|
|
|
| e2-micro (1 vCPU, 1GB) | ~$6 | Development/Testing |
|
|
| e2-standard-2 (2 vCPU, 8GB) | ~$50 | Small production |
|
|
| e2-standard-4 (4 vCPU, 16GB) | ~$100 | Medium production |
|
|
| n2-standard-8 (8 vCPU, 32GB) | ~$250 | Large production |
|
|
| n2-highmem-16 (16 vCPU, 128GB) | ~$700 | Enterprise |
|
|
|
|
### Cost-Saving Tips
|
|
|
|
1. **Use preemptible VMs** for non-critical workloads (80% cheaper)
|
|
2. **Schedule shutdowns** for dev/test instances
|
|
3. **Use committed use discounts** for production (up to 57% off)
|
|
4. **Right-size instances** based on actual usage
|
|
|
|
```bash
|
|
# Create preemptible instance (for dev/test)
|
|
gcloud compute instances create ruvector-dev \
|
|
--preemptible \
|
|
--machine-type=e2-standard-2 \
|
|
...
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Connection Refused
|
|
|
|
```bash
|
|
# Check if container is running
|
|
gcloud compute ssh $INSTANCE_NAME --command="docker ps"
|
|
|
|
# Check logs
|
|
gcloud compute ssh $INSTANCE_NAME --command="docker logs \$(docker ps -q)"
|
|
```
|
|
|
|
### Extension Not Loading
|
|
|
|
```bash
|
|
# Verify RuVector files exist
|
|
gcloud compute ssh $INSTANCE_NAME --command="docker exec \$(docker ps -q) ls /usr/share/postgresql/17/extension/"
|
|
```
|
|
|
|
### Performance Issues
|
|
|
|
```sql
|
|
-- Check HNSW index parameters
|
|
SHOW ruvector.ef_search;
|
|
|
|
-- Increase for better accuracy (slower)
|
|
SET ruvector.ef_search = 200;
|
|
|
|
-- Check index stats
|
|
SELECT * FROM pg_stat_user_indexes WHERE indexrelname LIKE '%hnsw%';
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Reference
|
|
|
|
### Essential Commands
|
|
|
|
```bash
|
|
# Deploy RuVector
|
|
gcloud compute instances create-with-container ruvector-db \
|
|
--container-image=gcr.io/$PROJECT_ID/ruvector:latest \
|
|
--machine-type=e2-standard-4 \
|
|
--zone=us-central1-a
|
|
|
|
# Get IP
|
|
gcloud compute instances describe ruvector-db --zone=us-central1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
|
|
|
|
# Connect
|
|
psql -h EXTERNAL_IP -U ruvector -d ruvector_db
|
|
|
|
# SSH into VM
|
|
gcloud compute ssh ruvector-db --zone=us-central1-a
|
|
|
|
# View container logs
|
|
gcloud compute ssh ruvector-db --command="docker logs \$(docker ps -q) --tail 100"
|
|
|
|
# Restart container
|
|
gcloud compute ssh ruvector-db --command="docker restart \$(docker ps -q)"
|
|
|
|
# Delete instance
|
|
gcloud compute instances delete ruvector-db --zone=us-central1-a
|
|
```
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. **Set up backups**: Configure Cloud Storage for PostgreSQL backups
|
|
2. **Enable monitoring**: Set up Prometheus/Grafana or Cloud Monitoring
|
|
3. **Configure SSL**: Enable TLS for secure connections
|
|
4. **Set up replication**: Configure read replicas for scaling
|
|
5. **Implement CI/CD**: Automate deployments with Cloud Build
|
|
|
|
For more information:
|
|
- [RuVector Documentation](https://github.com/ruvnet/ruvector)
|
|
- [Google Cloud SQL Documentation](https://cloud.google.com/sql/docs)
|
|
- [PostgreSQL on GCE Best Practices](https://cloud.google.com/architecture/postgresql-deployment-on-gce)
|