Deployment guide

Chatwoot

Overview

Chatwoot is an open source customer engagement and support platform. It is a self-hosted alternative to Intercom, Zendesk and Freshdesk. Your team gets a shared inbox for live chat, email and social channels, plus contact management, conversation routing and assignment, canned responses, reporting and an agent dashboard. You run customer support on your own infrastructure, without a per-seat SaaS subscription.

The SecureAnyCloud image installs Chatwoot 4.15.1 as the official production Docker Compose stack and runs it behind nginx as a systemd service. A complete support desk is online within minutes of launch.

What you get:

  • Chatwoot 4.15.1 (MIT), deployed from the official production Docker Compose stack and pinned, so the image never silently upgrades at build time.
  • Docker Engine (Docker CE) and the Docker Compose plugin, installed from the official Docker package repository.
  • The Chatwoot Compose stack: the rails web application (Puma on container port 3000), the sidekiq background workers, postgres (PostgreSQL 16 with the pgvector extension) and redis (password protected).
  • A system nginx reverse proxy on port 80, forwarding to the Rails app on 127.0.0.1:3000. It sets the WebSocket upgrade headers that Chatwoot ActionCable realtime needs, and it serves an unauthenticated static /health endpoint.
  • A dedicated data disk. All stateful data (the PostgreSQL database, the Redis data and every uploaded file) lives on a 40 GiB disk mounted at /var/lib/chatwoot. Docker's data-root is relocated there. The disk is independently resizable and re-provisioned on every VM.
  • A per-VM super admin account (email and a generated password), created at first boot. Each instance gets a fresh Rails secret key base and fresh database and Redis passwords.
  • Three systemd units: nginx.service, chatwoot.service (a oneshot wrapper around docker compose up -d) and chatwoot-firstboot.service.
  • 24/7 SecureAnyCloud support

Prerequisites

Before you deploy this image, make sure you have an active Azure subscription, an SSH key, and a VNet with a subnet.

The recommended size is Standard_B4ms (4 vCPU / 16 GB RAM), because the Rails stack needs the memory. In the NSG, allow inbound 22/tcp from your management CIDR for SSH. Also allow 80/tcp from the CIDR that needs the Chatwoot web app. Add 443/tcp if you enable HTTPS.

1

Connect over SSH

Replace <vm-ip> with the public IP of your VM. The default login user is azureuser.

ssh azureuser@<vm-ip>
2

Confirm the services are active

sudo systemctl is-active docker.service nginx.service chatwoot.service docker --version docker compose version

You should see active printed three times, the Docker Engine version, and the Docker Compose v2 plugin version.

3

Confirm the Chatwoot containers are running

sudo docker ps --format "table {{.Names}}\t{{.Status}}"

You should see all four containers in the Up state: chatwoot-rails-1, chatwoot-sidekiq-1, chatwoot-postgres-1 and chatwoot-redis-1.

4

Confirm the data disk is mounted

All stateful Chatwoot data lives on a dedicated data disk mounted at /var/lib/chatwoot.

findmnt /var/lib/chatwoot df -h /var/lib/chatwoot

findmnt shows the device backing /var/lib/chatwoot, and df confirms the 40 GiB volume.

5

Check the health endpoint

The nginx reverse proxy serves an unauthenticated static /health endpoint on port 80. The Chatwoot API answers on /api.

curl -s http://localhost/health
curl -s -o /dev/null -w "%{http_code}\n" http://localhost/api

/health returns OK and /api returns 200. Together they confirm that nginx and the Rails app are both up.

6

Read the per-VM admin credentials

On its first boot, your instance generates a unique super admin email and password and writes them to a root-only file.

sudo cat /root/chatwoot-credentials.txt

This file lists CHATWOOT_URL (where to sign in), CHATWOOT_ADMIN_EMAIL and CHATWOOT_ADMIN_PASSWORD. Store the password somewhere safe.

7

Sign in to Chatwoot

Open http://<vm-ip>/ in your browser. You are redirected to the agent sign-in page. Enter the CHATWOOT_ADMIN_EMAIL and CHATWOOT_ADMIN_PASSWORD from Step 6, then sign in.

You can also verify the login from the command line with the Devise Token Auth endpoint. A correct password returns 200:

EMAIL=$(sudo grep '^CHATWOOT_ADMIN_EMAIL=' /root/chatwoot-credentials.txt | cut -d= -f2-)
PASS=$(sudo grep '^CHATWOOT_ADMIN_PASSWORD=' /root/chatwoot-credentials.txt | cut -d= -f2-)
curl -s -o /dev/null -w "%{http_code}\n" -X POST http://localhost/auth/sign_in \
  -H 'Content-Type: application/json' \
  -d "{\"email\":\"$EMAIL\",\"password\":\"$PASS\"}"

A 200 confirms that the per-VM super admin authenticates end to end.

8

Explore the dashboard

After you sign in, you land on the conversations dashboard. This is the shared team inbox where live chat, email and social conversations arrive and are assigned to agents.

From the dashboard, you can manage your contacts directory:

You can also review conversation analytics and configure your account from the reports and settings area:

9

Create your first inbox

Chatwoot organises incoming conversations into inboxes. From the agent dashboard, open Settings, then Inboxes, then Add Inbox. Choose a channel, for example a Website live-chat widget, an email channel or an API channel.

Follow the wizard to name the inbox. Then embed the generated widget script in your website, or connect your channel. New conversations from that channel appear in the dashboard for your agents.

Managing the stack

The Chatwoot stack is wrapped by the chatwoot.service systemd unit, which runs docker compose up -d from /opt/chatwoot.

sudo systemctl restart chatwoot.service
sudo systemctl status chatwoot.service --no-pager

To inspect the application logs, tail the Rails container:

cd /opt/chatwoot
sudo docker compose logs --tail 50 rails

Enabling HTTPS

The image serves plain HTTP on port 80. For any public deployment, put TLS in front with your own domain. Point a DNS A record at the VM public IP. Then install a certificate with the certbot nginx plugin, and update FRONTEND_URL in /opt/chatwoot/.env to your https:// domain. Finish with sudo systemctl restart chatwoot.service. In outline:

  • Install certbot and the nginx plugin from the Ubuntu repositories.
  • Run certbot against your domain to obtain and install a certificate into the nginx site.
  • Set FRONTEND_URL=https://your-domain/ in /opt/chatwoot/.env and restart chatwoot.service.

Use your own registered domain throughout.

Maintenance

The OS receives unattended security updates.

To update Chatwoot itself, edit the pinned image tag in /opt/chatwoot/docker-compose.yml. Then, from /opt/chatwoot, run sudo docker compose pull, followed by sudo docker compose run --rm rails bundle exec rails db:chatwoot_prepare and sudo systemctl restart chatwoot.service. Always snapshot the /var/lib/chatwoot data disk before a major version upgrade.

Support

SecureAnyCloud provides 24/7 support for this image. Chatwoot is a trademark of Chatwoot Inc. This image is provided by SecureAnyCloud and is not affiliated with or endorsed by Chatwoot Inc.

Deploy on Azure

Launch Chatwoot 4.15.1 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure