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
gcloudCLI 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=0for 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