Files
chatwoot/developer-docs/self-hosted/cloud/gcp.mdx
T

745 lines
17 KiB
Plaintext

---
title: Google Cloud Platform (GCP) Deployment
description: Deploy Chatwoot on Google Cloud Platform with Compute Engine, Cloud Run, or GKE
sidebarTitle: GCP
---
# Google Cloud Platform Deployment Guide
Deploy Chatwoot on Google Cloud Platform using Compute Engine, Cloud Run, or Google Kubernetes Engine for a scalable, enterprise-ready solution.
## Deployment Options
<CardGroup cols={3}>
<Card title="Compute Engine" icon="server" href="#compute-engine">
Traditional VM deployment with full control
</Card>
<Card title="Cloud Run" icon="cloud" href="#cloud-run">
Serverless container deployment
</Card>
<Card title="GKE" icon="kubernetes" href="#google-kubernetes-engine">
Managed Kubernetes deployment
</Card>
</CardGroup>
## Compute Engine Deployment
### Prerequisites
```bash
# Install and configure gcloud CLI
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init
# Set project and region
gcloud config set project your-project-id
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
```
### Network Setup
```bash
# Create VPC network
gcloud compute networks create chatwoot-vpc --subnet-mode=custom
# Create subnet
gcloud compute networks subnets create chatwoot-subnet \
--network=chatwoot-vpc \
--range=10.0.1.0/24 \
--region=us-central1
# Create firewall rules
gcloud compute firewall-rules create chatwoot-allow-http \
--network=chatwoot-vpc \
--allow=tcp:80,tcp:443,tcp:3000 \
--source-ranges=0.0.0.0/0 \
--target-tags=chatwoot-server
gcloud compute firewall-rules create chatwoot-allow-ssh \
--network=chatwoot-vpc \
--allow=tcp:22 \
--source-ranges=0.0.0.0/0 \
--target-tags=chatwoot-server
```
### Database Setup
#### Cloud SQL PostgreSQL
```bash
# Create Cloud SQL instance
gcloud sql instances create chatwoot-db \
--database-version=POSTGRES_13 \
--tier=db-g1-small \
--region=us-central1 \
--storage-type=SSD \
--storage-size=100GB \
--storage-auto-increase \
--backup-start-time=03:00 \
--enable-bin-log \
--maintenance-window-day=SUN \
--maintenance-window-hour=04
# Create database
gcloud sql databases create chatwoot_production --instance=chatwoot-db
# Create user
gcloud sql users create chatwoot \
--instance=chatwoot-db \
--password=your-secure-password
# Get connection name
gcloud sql instances describe chatwoot-db --format="value(connectionName)"
```
#### Memorystore Redis
```bash
# Create Redis instance
gcloud redis instances create chatwoot-redis \
--size=1 \
--region=us-central1 \
--redis-version=redis_6_x \
--network=chatwoot-vpc
```
### Storage Setup
```bash
# Create Cloud Storage bucket
gsutil mb -p your-project-id -c STANDARD -l us-central1 gs://your-chatwoot-bucket
# Set bucket permissions
gsutil iam ch allUsers:objectViewer gs://your-chatwoot-bucket
# Enable CORS
cat > cors.json << EOF
[
{
"origin": ["https://chatwoot.yourdomain.com"],
"method": ["GET", "PUT", "POST", "DELETE"],
"responseHeader": ["Content-Type"],
"maxAgeSeconds": 3600
}
]
EOF
gsutil cors set cors.json gs://your-chatwoot-bucket
```
### Compute Instance
#### Create Instance Template
```bash
# Create startup script
cat > startup-script.sh << 'EOF'
#!/bin/bash
apt-get update
apt-get install -y wget curl
# Download and install Chatwoot
wget https://get.chatwoot.app/linux/install.sh
chmod +x install.sh
./install.sh --install
# Configure environment
sudo -u chatwoot bash << 'INNER_EOF'
cd /home/chatwoot/chatwoot
cat > .env << 'ENV_EOF'
RAILS_ENV=production
NODE_ENV=production
FRONTEND_URL=https://chatwoot.yourdomain.com
FORCE_SSL=true
# Database
DATABASE_URL=postgresql://chatwoot:password@/chatwoot_production?host=/cloudsql/your-project:us-central1:chatwoot-db
# Redis
REDIS_URL=redis://10.0.0.3:6379/0
# Storage
ACTIVE_STORAGE_SERVICE=google
GCS_PROJECT=your-project-id
GCS_BUCKET=your-chatwoot-bucket
# Email (using SendGrid)
MAILER_SENDER_EMAIL=noreply@yourdomain.com
SMTP_ADDRESS=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USERNAME=apikey
SMTP_PASSWORD=your-sendgrid-api-key
SMTP_AUTHENTICATION=plain
SMTP_ENABLE_STARTTLS_AUTO=true
ENV_EOF
# Prepare database
RAILS_ENV=production bundle exec rake db:chatwoot_prepare
INNER_EOF
# Restart services
systemctl restart chatwoot.target
EOF
# Create instance template
gcloud compute instance-templates create chatwoot-template \
--machine-type=e2-standard-2 \
--network-interface=network=chatwoot-vpc,subnet=chatwoot-subnet \
--boot-disk-size=50GB \
--boot-disk-type=pd-ssd \
--image-family=ubuntu-2004-lts \
--image-project=ubuntu-os-cloud \
--tags=chatwoot-server \
--metadata-from-file startup-script=startup-script.sh \
--service-account=chatwoot-sa@your-project-id.iam.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform
```
#### Create Managed Instance Group
```bash
# Create instance group
gcloud compute instance-groups managed create chatwoot-ig \
--template=chatwoot-template \
--size=2 \
--zone=us-central1-a
# Configure autoscaling
gcloud compute instance-groups managed set-autoscaling chatwoot-ig \
--max-num-replicas=5 \
--min-num-replicas=2 \
--target-cpu-utilization=0.7 \
--zone=us-central1-a
```
### Load Balancer
```bash
# Create health check
gcloud compute health-checks create http chatwoot-health-check \
--port=3000 \
--request-path=/api
# Create backend service
gcloud compute backend-services create chatwoot-backend \
--protocol=HTTP \
--health-checks=chatwoot-health-check \
--global
# Add instance group to backend service
gcloud compute backend-services add-backend chatwoot-backend \
--instance-group=chatwoot-ig \
--instance-group-zone=us-central1-a \
--global
# Create URL map
gcloud compute url-maps create chatwoot-map \
--default-service=chatwoot-backend
# Create SSL certificate
gcloud compute ssl-certificates create chatwoot-ssl \
--domains=chatwoot.yourdomain.com
# Create HTTPS proxy
gcloud compute target-https-proxies create chatwoot-https-proxy \
--url-map=chatwoot-map \
--ssl-certificates=chatwoot-ssl
# Create global forwarding rule
gcloud compute forwarding-rules create chatwoot-https-rule \
--global \
--target-https-proxy=chatwoot-https-proxy \
--ports=443
# Create HTTP to HTTPS redirect
gcloud compute url-maps create chatwoot-redirect \
--default-url-redirect-response-code=301 \
--default-url-redirect-https-redirect
gcloud compute target-http-proxies create chatwoot-http-proxy \
--url-map=chatwoot-redirect
gcloud compute forwarding-rules create chatwoot-http-rule \
--global \
--target-http-proxy=chatwoot-http-proxy \
--ports=80
```
## Cloud Run Deployment
### Containerize Chatwoot
Create `Dockerfile`:
```dockerfile
FROM chatwoot/chatwoot:latest
# Set environment variables
ENV RAILS_ENV=production
ENV NODE_ENV=production
ENV PORT=8080
# Expose port
EXPOSE 8080
# Start command
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "8080"]
```
### Build and Deploy
```bash
# Build container image
gcloud builds submit --tag gcr.io/your-project-id/chatwoot
# Deploy to Cloud Run
gcloud run deploy chatwoot \
--image gcr.io/your-project-id/chatwoot \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--memory 2Gi \
--cpu 2 \
--max-instances 10 \
--set-env-vars RAILS_ENV=production \
--set-env-vars DATABASE_URL="postgresql://..." \
--set-env-vars REDIS_URL="redis://..." \
--set-env-vars FRONTEND_URL="https://chatwoot.yourdomain.com"
# Deploy worker service
gcloud run deploy chatwoot-worker \
--image gcr.io/your-project-id/chatwoot \
--platform managed \
--region us-central1 \
--no-allow-unauthenticated \
--memory 1Gi \
--cpu 1 \
--max-instances 5 \
--command "bundle,exec,sidekiq,-C,config/sidekiq.yml" \
--set-env-vars RAILS_ENV=production \
--set-env-vars DATABASE_URL="postgresql://..." \
--set-env-vars REDIS_URL="redis://..."
```
### Custom Domain
```bash
# Map custom domain
gcloud run domain-mappings create \
--service chatwoot \
--domain chatwoot.yourdomain.com \
--region us-central1
```
## Google Kubernetes Engine (GKE)
### Create GKE Cluster
```bash
# Create GKE cluster
gcloud container clusters create chatwoot-cluster \
--zone us-central1-a \
--num-nodes 3 \
--machine-type e2-standard-2 \
--disk-size 50GB \
--disk-type pd-ssd \
--enable-autoscaling \
--min-nodes 1 \
--max-nodes 5 \
--enable-autorepair \
--enable-autoupgrade \
--network chatwoot-vpc \
--subnetwork chatwoot-subnet
# Get credentials
gcloud container clusters get-credentials chatwoot-cluster --zone us-central1-a
```
### Helm Deployment
```bash
# Add Chatwoot Helm repository
helm repo add chatwoot https://chatwoot.github.io/charts
helm repo update
# Create namespace
kubectl create namespace chatwoot
# Create values file for GCP
cat > gcp-values.yaml << EOF
# GCP-specific values
ingress:
enabled: true
className: gce
annotations:
kubernetes.io/ingress.global-static-ip-name: "chatwoot-ip"
networking.gke.io/managed-certificates: "chatwoot-ssl"
kubernetes.io/ingress.allow-http: "false"
hosts:
- host: chatwoot.yourdomain.com
paths:
- path: /
pathType: Prefix
# Use Cloud SQL and Memorystore
postgresql:
enabled: false
redis:
enabled: false
env:
DATABASE_URL: "postgresql://chatwoot:password@/chatwoot_production?host=/cloudsql/your-project:us-central1:chatwoot-db"
REDIS_URL: "redis://10.0.0.3:6379/0"
ACTIVE_STORAGE_SERVICE: "google"
GCS_PROJECT: "your-project-id"
GCS_BUCKET: "your-chatwoot-bucket"
# Resource limits
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
# Workload Identity
serviceAccount:
create: true
annotations:
iam.gke.io/gcp-service-account: chatwoot-sa@your-project-id.iam.gserviceaccount.com
EOF
# Install Chatwoot
helm install chatwoot chatwoot/chatwoot \
--namespace chatwoot \
--values gcp-values.yaml
```
### SSL Certificate
```yaml
# managed-cert.yaml
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: chatwoot-ssl
namespace: chatwoot
spec:
domains:
- chatwoot.yourdomain.com
```
```bash
kubectl apply -f managed-cert.yaml
```
## Service Account and IAM
### Create Service Account
```bash
# Create service account
gcloud iam service-accounts create chatwoot-sa \
--display-name="Chatwoot Service Account"
# Grant necessary permissions
gcloud projects add-iam-policy-binding your-project-id \
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
--role="roles/cloudsql.client"
gcloud projects add-iam-policy-binding your-project-id \
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
--role="roles/storage.objectAdmin"
gcloud projects add-iam-policy-binding your-project-id \
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
--role="roles/redis.editor"
# Create and download key
gcloud iam service-accounts keys create chatwoot-key.json \
--iam-account=chatwoot-sa@your-project-id.iam.gserviceaccount.com
```
## Monitoring and Logging
### Cloud Monitoring
```bash
# Enable APIs
gcloud services enable monitoring.googleapis.com
gcloud services enable logging.googleapis.com
# Create notification channel
gcloud alpha monitoring channels create \
--display-name="Email Alerts" \
--type=email \
--channel-labels=email_address=admin@yourdomain.com
```
### Custom Metrics
```yaml
# monitoring.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: chatwoot
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'chatwoot'
static_configs:
- targets: ['chatwoot-service:3000']
metrics_path: /metrics
```
### Alerting Policies
```bash
# Create alerting policy for high CPU
gcloud alpha monitoring policies create \
--policy-from-file=cpu-alert-policy.yaml
# cpu-alert-policy.yaml
cat > cpu-alert-policy.yaml << EOF
displayName: "High CPU Usage"
conditions:
- displayName: "CPU usage above 80%"
conditionThreshold:
filter: 'resource.type="gce_instance"'
comparison: COMPARISON_GREATER_THAN
thresholdValue: 0.8
duration: 300s
combiner: OR
enabled: true
notificationChannels:
- projects/your-project-id/notificationChannels/CHANNEL_ID
EOF
```
## Backup and Disaster Recovery
### Database Backups
```bash
# Cloud SQL automatic backups are enabled by default
# Create on-demand backup
gcloud sql backups create --instance=chatwoot-db
# List backups
gcloud sql backups list --instance=chatwoot-db
# Restore from backup
gcloud sql backups restore BACKUP_ID --restore-instance=chatwoot-db-restore
```
### Application Backups
```bash
#!/bin/bash
# backup-script.sh
DATE=$(date +%Y%m%d_%H%M%S)
# Database backup
gcloud sql export sql chatwoot-db gs://your-backup-bucket/db/chatwoot_$DATE.sql
# File storage backup
gsutil -m rsync -r -d gs://your-chatwoot-bucket gs://your-backup-bucket/files/
# Kubernetes configuration backup
kubectl get all -n chatwoot -o yaml > k8s-backup-$DATE.yaml
gsutil cp k8s-backup-$DATE.yaml gs://your-backup-bucket/k8s/
```
## Security Best Practices
### Network Security
```bash
# Create private cluster
gcloud container clusters create chatwoot-private \
--enable-private-nodes \
--master-ipv4-cidr-block 172.16.0.0/28 \
--enable-ip-alias \
--enable-network-policy
# Create firewall rules for private access
gcloud compute firewall-rules create allow-chatwoot-private \
--network chatwoot-vpc \
--allow tcp:443,tcp:80 \
--source-ranges 10.0.0.0/8
```
### Secret Management
```bash
# Create secrets in Secret Manager
gcloud secrets create database-password --data-file=db-password.txt
gcloud secrets create redis-password --data-file=redis-password.txt
# Grant access to service account
gcloud secrets add-iam-policy-binding database-password \
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
```
### Binary Authorization
```bash
# Enable Binary Authorization
gcloud container binauthz policy import policy.yaml
# policy.yaml
cat > policy.yaml << EOF
defaultAdmissionRule:
requireAttestationsBy:
- projects/your-project-id/attestors/prod-attestor
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
globalPolicyEvaluationMode: ENABLE
EOF
```
## Cost Optimization
### Preemptible Instances
```bash
# Create preemptible node pool
gcloud container node-pools create preemptible-pool \
--cluster=chatwoot-cluster \
--zone=us-central1-a \
--machine-type=e2-standard-2 \
--preemptible \
--num-nodes=2 \
--enable-autoscaling \
--min-nodes=0 \
--max-nodes=5
```
### Committed Use Discounts
```bash
# Purchase committed use discount
gcloud compute commitments create chatwoot-commitment \
--plan=12-month \
--region=us-central1 \
--resources=type=VCPU,amount=4 \
--resources=type=MEMORY,amount=16
```
### Resource Optimization
```yaml
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: chatwoot-quota
namespace: chatwoot
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
persistentvolumeclaims: "4"
```
## Troubleshooting
### Common Issues
<Accordion title="Cloud SQL connection issues">
Check:
- Cloud SQL Proxy configuration
- Service account permissions
- Network connectivity
- SSL requirements
</Accordion>
<Accordion title="GKE pod startup failures">
Verify:
- Resource quotas and limits
- Image pull permissions
- Service account configuration
- Network policies
</Accordion>
<Accordion title="Load balancer health check failures">
Solutions:
- Verify health check path (/api)
- Check firewall rules
- Ensure proper backend configuration
- Review application startup time
</Accordion>
### Diagnostic Commands
```bash
# Check Compute Engine instances
gcloud compute instances list
# View Cloud Run services
gcloud run services list
# Check GKE cluster status
gcloud container clusters describe chatwoot-cluster --zone us-central1-a
# View logs
gcloud logging read "resource.type=gce_instance" --limit 50
gcloud logging read "resource.type=cloud_run_revision" --limit 50
# Check Cloud SQL status
gcloud sql instances describe chatwoot-db
```
### Performance Monitoring
```bash
# View metrics
gcloud monitoring metrics list --filter="metric.type:compute"
# Create dashboard
gcloud monitoring dashboards create --config-from-file=dashboard.json
```
## Best Practices
### Security
- Use private GKE clusters
- Enable Workload Identity
- Implement Binary Authorization
- Use Secret Manager for sensitive data
- Enable audit logging
### Performance
- Use Cloud CDN for static assets
- Implement Cloud Memorystore for caching
- Use SSD persistent disks
- Enable HTTP/2 and gRPC
- Optimize container images
### Reliability
- Deploy across multiple zones
- Use managed services (Cloud SQL, Memorystore)
- Implement proper health checks
- Set up monitoring and alerting
- Test disaster recovery procedures
### Cost Management
- Use preemptible instances for non-critical workloads
- Implement resource quotas
- Purchase committed use discounts
- Monitor usage with Cloud Billing
- Use Cloud Functions for event-driven tasks
---
This GCP deployment guide provides comprehensive options for hosting Chatwoot on Google Cloud Platform. Choose the deployment method that best aligns with your scalability, security, and operational requirements.