Skip to main content

How to Deploy to GCP Cloud Run

Deploy AuditSwarm to Google Cloud Platform using Cloud Run (current production setup).

Overview​

This guide walks through deploying both the main Next.js app and the MCP server to GCP Cloud Run, with Cloud SQL for the database.

Estimated Time: 45-60 minutes Cost: ~$50-100/month for small deployments


Prerequisites​

  • GCP account with billing enabled
  • gcloud CLI installed and authenticated
  • Domain name (optional, for custom URLs)

Architecture​

Internet
│
├─→ Cloud Run: auditswarms-demo-app (Next.js)
│ │
│ └─→ Cloud SQL: SQL Server database
│
└─→ Cloud Run: auditswarms-mcp (MCP Server)
│
└─→ Cloud SQL (shared)

Step 1: Set Up Cloud SQL Database​

1.1 Create Cloud SQL Instance​

gcloud sql instances create auditswarms-db \
--database-version=SQLSERVER_2019_STANDARD \
--tier=db-custom-2-7680 \
--region=us-central1 \
--root-password=STRONG_PASSWORD_HERE

1.2 Create Database​

gcloud sql databases create auditswarms \
--instance=auditswarms-db

1.3 Get Connection String​

gcloud sql instances describe auditswarms-db \
--format="value(connectionName)"

Save this - you'll need it for DATABASE_URL.


Step 2: Store Secrets in Secret Manager​

# Database URL
echo -n "sqlserver://auditswarms-db:us-central1:auditswarms-db/auditswarms?user=sqlserver&password=YOUR_PASSWORD" | \
gcloud secrets create DATABASE_URL --data-file=-

# NextAuth secret
openssl rand -base64 32 | \
gcloud secrets create NEXTAUTH_SECRET --data-file=-

# Encryption key
openssl rand -base64 32 | \
gcloud secrets create ENCRYPTION_KEY --data-file=-

Step 3: Build and Push Container Images​

3.1 Enable APIs​

gcloud services enable \
cloudbuild.googleapis.com \
run.googleapis.com \
secretmanager.googleapis.com

3.2 Build App Container​

gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/auditswarms-app

3.3 Build MCP Container​

gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/auditswarms-mcp \
--config cloudbuild-mcp.yaml

Step 4: Deploy Main App to Cloud Run​

gcloud run deploy auditswarms-demo-app \
--image gcr.io/YOUR_PROJECT_ID/auditswarms-demo-app \
--region us-central1 \
--platform managed \
--allow-unauthenticated \
--set-secrets="DATABASE_URL=DATABASE_URL:latest,NEXTAUTH_SECRET=NEXTAUTH_SECRET:latest,ENCRYPTION_KEY=ENCRYPTION_KEY:latest" \
--add-cloudsql-instances YOUR_PROJECT_ID:us-central1:auditswarms-db \
--memory 2Gi \
--cpu 2 \
--min-instances 1 \
--max-instances 10

Expected Output:

Service [auditswarms-demo-app] deployed
URL: https://auditswarms-app-HASH.us-central1.run.app

Step 5: Deploy MCP Server to Cloud Run​

gcloud run deploy auditswarms-mcp \
--image gcr.io/YOUR_PROJECT_ID/auditswarms-mcp \
--region us-central1 \
--platform managed \
--allow-unauthenticated \
--set-secrets="DATABASE_URL=DATABASE_URL:latest" \
--add-cloudsql-instances YOUR_PROJECT_ID:us-central1:auditswarms-db \
--memory 1Gi \
--cpu 1 \
--min-instances 1 \
--max-instances 5

Step 6: Run Database Migrations​

# From your local machine
export DATABASE_URL="sqlserver://..." # From Secret Manager

npx prisma migrate deploy

Step 7: Configure OAuth (Optional)​

If using Google OAuth:

# Set environment variables
gcloud run services update auditswarms-demo-app \
--update-env-vars="GOOGLE_CLIENT_ID=your-client-id,GOOGLE_CLIENT_SECRET=your-secret,NEXTAUTH_URL=https://your-app-url.run.app"

Step 8: Verify Deployment​

Test Main App​

curl https://auditswarms-app-HASH.us-central1.run.app/api/health

Expected: {"status":"ok"}

Test MCP Server​

curl https://auditswarms-mcp-HASH.us-central1.run.app/mcp/health

Expected: {"status":"healthy","tools":4}


Step 9: Set Up Custom Domain (Optional)​

gcloud run domain-mappings create \
--service auditswarms-demo-app \
--domain your-domain.com \
--region us-central1

Follow DNS instructions provided.


Monitoring & Logs​

View Logs​

gcloud run services logs read auditswarms-demo-app --region us-central1

Set Up Alerts​

# Cloud Monitoring alert for high error rate
gcloud alpha monitoring policies create \
--notification-channels=CHANNEL_ID \
--display-name="AuditSwarm High Error Rate" \
--condition-threshold-value=5 \
--condition-threshold-duration=300s

Cost Optimization​

Estimated Monthly Costs:

  • Cloud SQL (db-custom-2-7680): ~$100
  • Cloud Run App (1-10 instances): ~$20-50
  • Cloud Run MCP (1-5 instances): ~$10-20
  • Total: ~$130-170/month

To reduce costs:

  • Use --min-instances=0 for dev environments
  • Scale down Cloud SQL tier: db-custom-1-3840
  • Use Cloud Storage for artifacts instead of database

Troubleshooting​

Problem: Database connection errors

Solution:

# Verify Cloud SQL connection
gcloud sql instances describe auditswarms-db | grep connectionName

# Check secret values
gcloud secrets versions access latest --secret=DATABASE_URL

Problem: 502 Bad Gateway errors

Solution:

  • Check container logs: gcloud run services logs read auditswarms-demo-app
  • Verify health endpoint: /api/health
  • Increase memory: --memory 4Gi

Next Steps​