--- 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 Full control with custom VM deployment Serverless container deployment Platform-as-a-Service deployment ## 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@ # 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 \ --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 \ --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 \ --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 Check: - PostgreSQL firewall rules - Network security group rules - Connection string format - SSL requirements for Azure Database Verify: - Redis access keys - SSL configuration (required for Azure Cache) - Network connectivity - Port 6380 (SSL) vs 6379 (non-SSL) Solutions: - Verify storage account access keys - Check container permissions - Ensure CORS settings if needed - Validate Azure Storage configuration ### 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.