Self-hosting Chatwoot means running the open-source customer engagement platform on a server you control, so every customer conversation, phone number, and contact record stays inside your own infrastructure. In 2026 the two cleanest paths are Docker Compose for full control, or Coolify for a near one-click deploy — both give you SSL, channel integrations, and scheduled backups.
Short answer
To self-host Chatwoot in 2026, provision a Linux VPS with at least 2 CPU cores and 4 GB RAM, install Docker and Docker Compose, download Chatwoot's official .env.example and docker-compose.production.yaml, prepare the database, and start the containers. Put Nginx in front with a Let's Encrypt certificate for HTTPS, then connect your email, WhatsApp, and website channels. Coolify offers the same result with less manual work.
I run ERPNext and open-source implementations at Mith Tech in Bengaluru, and Chatwoot is the tool I reach for when a client wants a shared support inbox without handing every customer conversation to a foreign SaaS vendor. I have deployed it both ways — hand-rolled Docker Compose and Coolify's managed flow — for teams that also run Frappe and ERPNext next to it.
Honest take: self-hosting Chatwoot is genuinely easy to stand up in an afternoon, but keeping it patched, backed up, and reliable over years is the part most teams underestimate.
What do you need before you self-host Chatwoot?
Before touching Chatwoot, get three things ready: a Linux server, a domain name, and email or messaging credentials for the channels you plan to connect. A VPS with 2 CPU cores and about 4 GB RAM handles a small support team well, because Chatwoot runs several services — Postgres, Redis, a Rails web process, and a Sidekiq background worker — side by side.
Point an A record from a subdomain such as support.yourcompany.com at the server's public IP before you start, since the SSL certificate and Chatwoot's FRONTEND_URL both depend on the domain resolving correctly. Open ports 22, 80, and 443 in your firewall. Keep ports 80 and 443 free for your reverse proxy — Chatwoot itself listens only on localhost port 3000.
| Requirement | Baseline | Why it matters |
|---|---|---|
| CPU / RAM | 2 cores, ~4 GB RAM | Runs Postgres, Redis, Rails, and Sidekiq together |
| OS | Recent Ubuntu / Debian LTS | Well-tested with Docker |
| Docker | 20.10.10 or higher | Compose file compatibility |
| Docker Compose | v2.14.1 or higher | Newer container-naming behaviour |
| Domain | Subdomain with A record | Needed for SSL and FRONTEND_URL |
Skimmable summary: A 4 GB VPS, a subdomain pointing at it, and recent Docker/Compose versions are the whole prerequisite list.
How do you install Chatwoot with Docker Compose?
The official production method pulls two files from the Chatwoot repository — an environment template and a production Compose file — then prepares the database and starts the stack. Work as a non-root user with Docker permissions, and keep everything in one project folder so backups and upgrades stay tidy.
Install Docker and Docker Compose
Install Docker Engine (20.10.10+) and the Compose v2 plugin (v2.14.1+) using Docker's official convenience script or your distribution's packages. Confirm with docker --version and docker compose version before continuing.
Download Chatwoot's official templates
Create a folder such as ~/chatwoot, then fetch the environment and Compose templates from the Chatwoot repository:
wget -O .env https://raw.githubusercontent.com/chatwoot/chatwoot/develop/.env.example
wget -O docker-compose.yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/docker-compose.production.yaml
Edit the .env file
Set FRONTEND_URL to your HTTPS domain (for example https://support.yourcompany.com), generate a fresh SECRET_KEY_BASE, and fill in your SMTP details so Chatwoot can send email. Configure POSTGRES_PASSWORD and Redis settings, and set RAILS_ENV=production.
Prepare the database
Run the database preparation command once before the first launch. It creates the schema and seeds the required data:
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
Start the containers
Bring the full stack up in the background:
docker compose up -d
Verify with curl -I localhost:3000/api — a 200 response means Chatwoot is running behind localhost.
Chatwoot is not on the public internet yet
At this point Chatwoot answers only on localhost:3000. Do not expose port 3000 directly. The next step — a reverse proxy with TLS — is what safely publishes it to your users.
Skimmable summary: Download two official files, edit .env, run the prepare command, then docker compose up -d — Chatwoot is live on localhost.
How do you add SSL and a reverse proxy?
Chatwoot's containers bind to localhost only, so a reverse proxy terminates HTTPS and forwards traffic to port 3000. Nginx with a Let's Encrypt certificate is the standard, free approach and takes a few minutes once your domain resolves to the server.
Install Nginx and Certbot, then create a server block for your subdomain that proxies to 127.0.0.1:3000. Chatwoot needs one non-obvious directive — underscores_in_headers on; — because its API relies on headers that contain underscores, which Nginx drops by default. Forward the standard proxy headers so Chatwoot sees the real protocol and client IP:
server {
server_name support.yourcompany.com;
underscores_in_headers on;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Then run certbot --nginx -d support.yourcompany.com to issue and auto-renew the certificate. The Upgrade and Connection headers matter because Chatwoot uses WebSockets for live agent updates — without them, the dashboard feels laggy or fails to refresh.
Skimmable summary: Nginx proxies HTTPS to localhost:3000; add underscores_in_headers on, forward WebSocket headers, and let Certbot handle the free certificate.
How do you configure channels in Chatwoot?
After HTTPS is live, open your domain, create the super-admin account, and connect channels from the inbox settings — each channel is a source of conversations that lands in one shared agent view. Chatwoot supports email, live website chat, WhatsApp, and social messaging, all managed from a single dashboard.
Email inbox
Point a support mailbox at Chatwoot over IMAP/SMTP, or forward mail to Chatwoot's generated address. Replies thread back to the customer automatically.
Website live chat
Create a website inbox and paste the generated JavaScript widget into your site. Visitors get a chat bubble; agents see conversations in real time.
Connect through the WhatsApp Business Cloud API or an approved provider. Business messaging still requires a Meta-approved number and template approval.
Social & SMS
Add Facebook, Instagram, Telegram, or an SMS provider so every channel funnels into the same agent queue instead of scattered apps.
For most Indian SMBs I start with the website widget and one email inbox, then add WhatsApp once the Meta Business verification is done — that sequence gets a team productive fastest without waiting on external approvals.
Skimmable summary: Create the admin account, then add email, website chat, WhatsApp, and social inboxes — all converging into one shared conversation view.
Is Coolify an easier way to self-host Chatwoot?
Yes — Coolify installs Chatwoot as a one-click service and provisions SSL and backups without hand-editing Nginx or Compose files. Coolify is an open-source, self-hostable platform layer that runs on your own VPS and manages containers, certificates, and scheduled backups through a web dashboard.
The trade-off is straightforward. Docker Compose gives you total transparency and no extra moving parts, which I prefer for servers I manage long-term. Coolify trades a little of that control for speed and a friendlier interface, which suits teams without a dedicated ops person. Either way the data stays on your infrastructure. I have written a full walkthrough in my guide to self-hosting any app with Coolify, and Coolify is one of the managed options we support through Mith Tech's PaaS and cloud hosting service.
| Factor | Docker Compose | Coolify |
|---|---|---|
| Setup effort | Manual, more steps | One-click service |
| SSL | Certbot by hand | Automatic |
| Backups | You script them | Scheduled in the UI |
| Transparency | Full, every file visible | Abstracted behind dashboard |
| Best for | Ops-comfortable teams | Teams wanting speed |
Skimmable summary: Coolify deploys Chatwoot in a click with automatic SSL and backups; Docker Compose gives more control but more manual work.
How do you back up a self-hosted Chatwoot instance?
Back up three things: the Postgres database, the storage volume that holds uploaded files and attachments, and your .env file with its secrets. A dump of any one alone will not restore a working instance, so treat them as a single unit and copy them off the server on a schedule.
Dump the database
Run pg_dump inside the Postgres container to a timestamped file, for example via docker compose exec postgres pg_dump -U postgres chatwoot_production.
Archive the storage volume and secrets
Copy Chatwoot's Docker storage volume and your .env file. Without the same SECRET_KEY_BASE, a restored database cannot decrypt existing sessions and tokens.
Ship backups off-server
Push the archive to S3-compatible object storage or another machine on a cron schedule. A backup that lives only on the same VPS disappears with the VPS.
Test the restore, not just the backup
A backup you have never restored is a hope, not a plan. Once a quarter, restore into a throwaway server and confirm Chatwoot boots and conversations load.
Skimmable summary: Back up the database, the storage volume, and the .env secrets together, ship them off-server, and rehearse the restore.
Frequently asked questions
Is Chatwoot free to self-host?
Chatwoot's community edition is open source, so there is no per-agent licence fee when you run it on your own server — your only costs are the VPS and the time to maintain it. Some advanced enterprise features sit behind a paid edition; pricing varies by edition, so check Chatwoot's official page. For most SMB support desks, the free self-hosted edition covers shared inboxes, channels, and automations.
How much server does Chatwoot need?
A VPS with 2 CPU cores and about 4 GB RAM comfortably runs a small support team, because Chatwoot bundles Postgres, Redis, a Rails web process, and a Sidekiq worker. Larger teams or heavy WhatsApp volume benefit from more RAM and a separate managed database, but 4 GB is a sound starting point for evaluation and small production use.
Can Chatwoot connect to WhatsApp?
Yes. Chatwoot connects to WhatsApp through the WhatsApp Business Cloud API or an approved business solution provider. You still need a Meta-verified business number and approved message templates, which is a Meta requirement rather than a Chatwoot limitation. Once connected, WhatsApp conversations land in the same agent inbox as email and website chat.
Should I use Docker Compose or Coolify?
Choose Docker Compose if you want full transparency and are comfortable editing config files, and choose Coolify if you want a one-click deploy with automatic SSL and scheduled backups. Both keep your data on your own infrastructure. Teams without dedicated ops usually prefer Coolify; long-term self-managed servers often favour plain Compose for its simplicity and visibility.
How do I update a self-hosted Chatwoot?
Pull the new images with docker compose pull, restart with docker compose up -d, then re-run docker compose run --rm rails bundle exec rails db:chatwoot_prepare so any database migrations apply. Always take a fresh backup before upgrading, and read the release notes for breaking changes. Pin to a specific version tag rather than tracking the latest branch on a production instance.
Does self-hosting Chatwoot help with data residency in India?
Yes — hosting Chatwoot on a server in an Indian region keeps customer conversations and contact data on infrastructure you control, which simplifies data-residency and privacy commitments. That is a common reason Indian SMBs self-host rather than use a foreign SaaS dashboard. Pair it with encrypted backups and restricted admin access to keep the whole path under your governance.
About the author
I am Manoj, an ERPNext and open-source implementation consultant at Mith Tech in Bengaluru. I help Indian SMBs run their own stacks — ERPNext, Frappe, and support tools like Chatwoot — on infrastructure they control, without proprietary lock-in. I write these guides from real deployments, not vendor brochures.
Want Chatwoot deployed and maintained for you?
If you would rather skip the server maintenance, we set up Chatwoot alongside your ERPNext stack, wire the channels, and keep it patched and backed up — so your team just answers customers.