---
title: Azure Deployment
description: Deploy Chatwoot on Microsoft Azure with various deployment options
sidebarTitle: Azure
---

# Azure Deployment Guide

Deploy Chatwoot on Microsoft Azure using various deployment options including Virtual Machines, Container Instances, or App Service for a scalable, production-ready setup.

## Deployment Options

<CardGroup cols={3}>
  <Card title="Virtual Machines" icon="server" href="#virtual-machines">
    Full control with custom VM deployment
  </Card>
  <Card title="Container Instances" icon="docker" href="#container-instances">
    Serverless container deployment
  </Card>
  <Card title="App Service" icon="cloud" href="#app-service">
    Platform-as-a-Service deployment
  </Card>
</CardGroup>

## Virtual Machines Deployment

### Architecture Overview

```
Azure Load Balancer
       |
Virtual Machines (Availability Set)
       |
Azure Database for PostgreSQL + Azure Cache for Redis
```

### Prerequisites

- Azure subscription with appropriate permissions
- Azure CLI installed and configured
- Domain name for your Chatwoot installation

### Step 1: Resource Group and Network

#### Create Resource Group

```bash
# Create resource group
az group create \
  --name chatwoot-rg \
  --location eastus
```

#### Create Virtual Network

```bash
# Create virtual network
az network vnet create \
  --resource-group chatwoot-rg \
  --name chatwoot-vnet \
  --address-prefix 10.0.0.0/16 \
  --subnet-name chatwoot-subnet \
  --subnet-prefix 10.0.1.0/24
```

#### Create Network Security Group

```bash
# Create NSG
az network nsg create \
  --resource-group chatwoot-rg \
  --name chatwoot-nsg

# Add rules
az network nsg rule create \
  --resource-group chatwoot-rg \
  --nsg-name chatwoot-nsg \
  --name AllowHTTP \
  --protocol tcp \
  --priority 1000 \
  --destination-port-range 80

az network nsg rule create \
  --resource-group chatwoot-rg \
  --nsg-name chatwoot-nsg \
  --name AllowHTTPS \
  --protocol tcp \
  --priority 1001 \
  --destination-port-range 443

az network nsg rule create \
  --resource-group chatwoot-rg \
  --nsg-name chatwoot-nsg \
  --name AllowSSH \
  --protocol tcp \
  --priority 1002 \
  --destination-port-range 22 \
  --source-address-prefix "YOUR_IP_ADDRESS"
```

### Step 2: Database Setup

#### Create PostgreSQL Server

```bash
# Create PostgreSQL server
az postgres server create \
  --resource-group chatwoot-rg \
  --name chatwoot-postgres \
  --location eastus \
  --admin-user chatwoot \
  --admin-password "YourSecurePassword123!" \
  --sku-name GP_Gen5_2 \
  --version 13

# Create database
az postgres db create \
  --resource-group chatwoot-rg \
  --server-name chatwoot-postgres \
  --name chatwoot_production

# Configure firewall
az postgres server firewall-rule create \
  --resource-group chatwoot-rg \
  --server chatwoot-postgres \
  --name AllowAzureServices \
  --start-ip-address 0.0.0.0 \
  --end-ip-address 0.0.0.0
```

#### Create Redis Cache

```bash
# Create Redis cache
az redis create \
  --resource-group chatwoot-rg \
  --name chatwoot-redis \
  --location eastus \
  --sku Basic \
  --vm-size c0
```

### Step 3: Storage Account

```bash
# Create storage account
az storage account create \
  --resource-group chatwoot-rg \
  --name chatwootstorage \
  --location eastus \
  --sku Standard_LRS

# Create container for file uploads
az storage container create \
  --account-name chatwootstorage \
  --name uploads \
  --public-access blob
```

### Step 4: Virtual Machine

#### Create Availability Set

```bash
# Create availability set
az vm availability-set create \
  --resource-group chatwoot-rg \
  --name chatwoot-avset \
  --platform-fault-domain-count 2 \
  --platform-update-domain-count 2
```

#### Create Virtual Machine

```bash
# Create VM
az vm create \
  --resource-group chatwoot-rg \
  --name chatwoot-vm \
  --image UbuntuLTS \
  --size Standard_D2s_v3 \
  --availability-set chatwoot-avset \
  --vnet-name chatwoot-vnet \
  --subnet chatwoot-subnet \
  --nsg chatwoot-nsg \
  --admin-username azureuser \
  --generate-ssh-keys \
  --custom-data cloud-init.txt
```

#### Cloud-Init Configuration

Create `cloud-init.txt`:

```yaml
#cloud-config
package_upgrade: true
packages:
  - curl
  - wget
  - git

runcmd:
  - wget https://get.chatwoot.app/linux/install.sh
  - chmod +x install.sh
  - ./install.sh --install
```

### Step 5: Load Balancer

```bash
# Create public IP
az network public-ip create \
  --resource-group chatwoot-rg \
  --name chatwoot-lb-ip \
  --sku Standard

# Create load balancer
az network lb create \
  --resource-group chatwoot-rg \
  --name chatwoot-lb \
  --public-ip-address chatwoot-lb-ip \
  --frontend-ip-name chatwoot-frontend \
  --backend-pool-name chatwoot-backend

# Create health probe
az network lb probe create \
  --resource-group chatwoot-rg \
  --lb-name chatwoot-lb \
  --name chatwoot-health \
  --protocol http \
  --port 3000 \
  --path /api

# Create load balancing rule
az network lb rule create \
  --resource-group chatwoot-rg \
  --lb-name chatwoot-lb \
  --name chatwoot-rule \
  --protocol tcp \
  --frontend-port 80 \
  --backend-port 3000 \
  --frontend-ip-name chatwoot-frontend \
  --backend-pool-name chatwoot-backend \
  --probe-name chatwoot-health
```

### Step 6: Configuration

SSH to the VM and configure Chatwoot:

```bash
# SSH to VM
ssh azureuser@<VM_PUBLIC_IP>

# Switch to chatwoot user
sudo -i -u chatwoot
cd chatwoot

# Edit environment variables
nano .env
```

Update `.env` with Azure services:

```bash
# Database
DATABASE_URL="postgresql://chatwoot:YourSecurePassword123!@chatwoot-postgres.postgres.database.azure.com:5432/chatwoot_production"

# Redis
REDIS_URL="redis://:PRIMARY_ACCESS_KEY@chatwoot-redis.redis.cache.windows.net:6380/0?ssl=true"

# Storage (Azure Blob)
ACTIVE_STORAGE_SERVICE="azure"
AZURE_STORAGE_ACCOUNT_NAME="chatwootstorage"
AZURE_STORAGE_ACCESS_KEY="your-access-key"
AZURE_STORAGE_CONTAINER="uploads"

# Frontend URL
FRONTEND_URL="https://chatwoot.yourdomain.com"
FORCE_SSL=true
```

## Container Instances Deployment

### Docker Compose for Azure

Create `docker-compose.azure.yml`:

```yaml
version: '3.8'

services:
  chatwoot-web:
    image: chatwoot/chatwoot:latest
    environment:
      - RAILS_ENV=production
      - DATABASE_URL=postgresql://chatwoot:password@postgres:5432/chatwoot_production
      - REDIS_URL=redis://redis:6379/0
      - FRONTEND_URL=https://chatwoot.yourdomain.com
      - FORCE_SSL=true
    ports:
      - "3000:3000"
    depends_on:
      - postgres
      - redis

  chatwoot-worker:
    image: chatwoot/chatwoot:latest
    environment:
      - RAILS_ENV=production
      - DATABASE_URL=postgresql://chatwoot:password@postgres:5432/chatwoot_production
      - REDIS_URL=redis://redis:6379/0
    command: bundle exec sidekiq -C config/sidekiq.yml
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:13
    environment:
      - POSTGRES_DB=chatwoot_production
      - POSTGRES_USER=chatwoot
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:
```

### Deploy with Azure Container Instances

```bash
# Create container group
az container create \
  --resource-group chatwoot-rg \
  --file docker-compose.azure.yml \
  --dns-name-label chatwoot-app \
  --ports 3000
```

## App Service Deployment

### Create App Service Plan

```bash
# Create App Service plan
az appservice plan create \
  --resource-group chatwoot-rg \
  --name chatwoot-plan \
  --sku P1V2 \
  --is-linux

# Create web app
az webapp create \
  --resource-group chatwoot-rg \
  --plan chatwoot-plan \
  --name chatwoot-app \
  --deployment-container-image-name chatwoot/chatwoot:latest
```

### Configure App Settings

```bash
# Set environment variables
az webapp config appsettings set \
  --resource-group chatwoot-rg \
  --name chatwoot-app \
  --settings \
    RAILS_ENV=production \
    DATABASE_URL="postgresql://chatwoot:password@chatwoot-postgres.postgres.database.azure.com:5432/chatwoot_production" \
    REDIS_URL="redis://:key@chatwoot-redis.redis.cache.windows.net:6380/0?ssl=true" \
    FRONTEND_URL="https://chatwoot-app.azurewebsites.net" \
    FORCE_SSL=true
```

## Monitoring and Logging

### Application Insights

```bash
# Create Application Insights
az monitor app-insights component create \
  --resource-group chatwoot-rg \
  --app chatwoot-insights \
  --location eastus \
  --kind web

# Get instrumentation key
az monitor app-insights component show \
  --resource-group chatwoot-rg \
  --app chatwoot-insights \
  --query instrumentationKey
```

### Log Analytics Workspace

```bash
# Create Log Analytics workspace
az monitor log-analytics workspace create \
  --resource-group chatwoot-rg \
  --workspace-name chatwoot-logs \
  --location eastus
```

## Security Configuration

### Key Vault for Secrets

```bash
# Create Key Vault
az keyvault create \
  --resource-group chatwoot-rg \
  --name chatwoot-vault \
  --location eastus

# Store secrets
az keyvault secret set \
  --vault-name chatwoot-vault \
  --name database-password \
  --value "YourSecurePassword123!"

az keyvault secret set \
  --vault-name chatwoot-vault \
  --name redis-key \
  --value "your-redis-access-key"
```

### Managed Identity

```bash
# Enable managed identity for VM
az vm identity assign \
  --resource-group chatwoot-rg \
  --name chatwoot-vm

# Grant access to Key Vault
az keyvault set-policy \
  --name chatwoot-vault \
  --object-id <MANAGED_IDENTITY_PRINCIPAL_ID> \
  --secret-permissions get list
```

## Backup and Disaster Recovery

### Database Backup

```bash
# Enable automated backup for PostgreSQL
az postgres server configuration set \
  --resource-group chatwoot-rg \
  --server-name chatwoot-postgres \
  --name backup_retention_days \
  --value 7

# Create manual backup
az postgres server backup create \
  --resource-group chatwoot-rg \
  --server-name chatwoot-postgres \
  --backup-name manual-backup-$(date +%Y%m%d)
```

### VM Backup

```bash
# Create Recovery Services vault
az backup vault create \
  --resource-group chatwoot-rg \
  --name chatwoot-vault \
  --location eastus

# Enable backup for VM
az backup protection enable-for-vm \
  --resource-group chatwoot-rg \
  --vault-name chatwoot-vault \
  --vm chatwoot-vm \
  --policy-name DefaultPolicy
```

## Scaling and Performance

### VM Scale Sets

```bash
# Create VM scale set
az vmss create \
  --resource-group chatwoot-rg \
  --name chatwoot-vmss \
  --image UbuntuLTS \
  --vm-sku Standard_D2s_v3 \
  --instance-count 2 \
  --vnet-name chatwoot-vnet \
  --subnet chatwoot-subnet \
  --lb chatwoot-lb \
  --backend-pool-name chatwoot-backend \
  --custom-data cloud-init.txt

# Configure autoscaling
az monitor autoscale create \
  --resource-group chatwoot-rg \
  --resource chatwoot-vmss \
  --resource-type Microsoft.Compute/virtualMachineScaleSets \
  --name chatwoot-autoscale \
  --min-count 2 \
  --max-count 5 \
  --count 2

# Add scale-out rule
az monitor autoscale rule create \
  --resource-group chatwoot-rg \
  --autoscale-name chatwoot-autoscale \
  --condition "Percentage CPU > 70 avg 5m" \
  --scale out 1

# Add scale-in rule
az monitor autoscale rule create \
  --resource-group chatwoot-rg \
  --autoscale-name chatwoot-autoscale \
  --condition "Percentage CPU < 30 avg 5m" \
  --scale in 1
```

## SSL Certificate

### App Service Certificate

```bash
# Create App Service certificate
az webapp config ssl upload \
  --resource-group chatwoot-rg \
  --name chatwoot-app \
  --certificate-file certificate.pfx \
  --certificate-password "certificate-password"

# Bind certificate to domain
az webapp config ssl bind \
  --resource-group chatwoot-rg \
  --name chatwoot-app \
  --certificate-thumbprint <THUMBPRINT> \
  --ssl-type SNI
```

### Let's Encrypt with VM

```bash
# Install Certbot on VM
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Obtain certificate
sudo certbot --nginx -d chatwoot.yourdomain.com

# Auto-renewal
sudo crontab -e
# Add: 0 12 * * * /usr/bin/certbot renew --quiet
```

## Cost Optimization

### Reserved Instances

```bash
# Purchase reserved capacity for VMs
az reservations reservation-order purchase \
  --reservation-order-id <ORDER_ID> \
  --sku Standard_D2s_v3 \
  --location eastus \
  --quantity 2 \
  --term P1Y
```

### Azure Advisor

```bash
# Get cost recommendations
az advisor recommendation list \
  --category Cost \
  --resource-group chatwoot-rg
```

## Troubleshooting

### Common Issues

<Accordion title="Database connection timeout">
Check:
- PostgreSQL firewall rules
- Network security group rules
- Connection string format
- SSL requirements for Azure Database
</Accordion>

<Accordion title="Redis connection issues">
Verify:
- Redis access keys
- SSL configuration (required for Azure Cache)
- Network connectivity
- Port 6380 (SSL) vs 6379 (non-SSL)
</Accordion>

<Accordion title="Storage upload failures">
Solutions:
- Verify storage account access keys
- Check container permissions
- Ensure CORS settings if needed
- Validate Azure Storage configuration
</Accordion>

### Diagnostic Commands

```bash
# Check VM status
az vm get-instance-view \
  --resource-group chatwoot-rg \
  --name chatwoot-vm

# View application logs
az webapp log tail \
  --resource-group chatwoot-rg \
  --name chatwoot-app

# Check database connectivity
az postgres server show \
  --resource-group chatwoot-rg \
  --name chatwoot-postgres
```

## Best Practices

### Security
- Use Azure Key Vault for secrets management
- Enable managed identities for Azure resources
- Implement network security groups with least privilege
- Enable Azure Security Center recommendations

### Performance
- Use Azure CDN for static assets
- Implement Redis caching strategies
- Monitor with Application Insights
- Use proximity placement groups for low latency

### Cost Management
- Use Azure Cost Management for monitoring
- Implement auto-shutdown for development VMs
- Consider spot instances for non-critical workloads
- Use reserved instances for predictable workloads

### Backup and Recovery
- Enable automated backups for all data services
- Test backup restoration procedures regularly
- Implement geo-redundant storage for critical data
- Document disaster recovery procedures

---

This Azure deployment guide provides multiple options for hosting Chatwoot on Microsoft Azure. Choose the deployment method that best fits your requirements, budget, and operational preferences. 