← Back to Blog

Chatwoot Self-Hosted on a VPS: Docker Install Tested on 2 GB and 4 GB of RAM

Published · by Leo Gashi, RS Computers

Chatwoot Live chat Docker

Chatwoot self-hosted costs nothing per agent: the MIT-licensed Community Edition runs from the official Docker Compose file as four containers (a Rails web app, a Sidekiq background worker, PostgreSQL and Redis) on a Linux VPS with 4 GB of RAM, the minimum in Chatwoot's docs. In our lab on 18 October 2026, Chatwoot v4.18.0 used 1.1 GiB of memory at idle and 1.2 GiB with 20 website visitors chatting at once on 2 vCPUs, and it still ran when we cut the server to 2 GiB.

Chatwoot is an open-source support inbox: website live chat, email, WhatsApp, Telegram and social messages land in one dashboard that your agents answer, much like Intercom. For a business inbox we would buy the documented minimum, 4 vCPUs and 4 GB, which is our VPS Mini. Specs and availability by city are on our VPS hosting plans page.

Key facts, checked on 18 October 2026:

Chatwoot system requirements: official minimum vs our measurements

We ran the official Compose file on 18 October 2026 on our Amsterdam test server, in a Debian 13 container limited to 2 vCPUs and 4 GiB of RAM, without swap. Other labs shared the host, so treat CPU figures as a guide. 1 GiB is 1,024 MiB, about 1.07 GB.

ItemChatwoot docsOur lab, v4.18.0
RAM4 GB minimum, up to 10,000 conversations a day1,147 MiB in use at idle, 1,267 MiB peak with 20 visitors at once
CPU4 cores recommended minimum2 vCPUs ran full at about 9 messages per second
SwapAt least 1 GB for upgradesNone; the upgrade database step peaked at 1,383 MiB in a 2 GiB test
DiskAt least 5 to 10 GB for PostgreSQL4.8 GB for the whole server, 3.5 GB of it images; database 27 MB after 937 conversations
SoftwareDocker 20.10.10 or newer, Redis 7.0 or newerDocker 29.9.1, PostgreSQL 16.15, Redis 8.10.2

Why ask for 4 GB when Chatwoot idles at 1.1 GiB? The official minimum covers a busy inbox: agent dashboards open all day, mailboxes polled over IMAP, attachments resized. The same page warns that Sidekiq alone can pass 1 GB on a very active server. Read our numbers as the floor, not the target.

What the Chatwoot Docker Compose file runs

The official Docker guide uses one Compose file that starts the chatwoot/chatwoot image twice, as web app and worker, next to pgvector/pgvector:pg16 and redis:alpine. Every published port listens on 127.0.0.1 only, so nothing is reachable from the internet until you add a reverse proxy.

ContainerWhat it doesIdle, docker statsProcess memory only
railsWeb app, API and chat widget on 127.0.0.1:3000; one Puma process (the Ruby web server) with 5 threads443 MiB398 MiB
sidekiqBackground jobs: notifications, emails, webhooks, reports544 MiB491 MiB
postgresThe database; the pgvector image adds vector search, which Chatwoot 4 expects67 MiB16 MiB
redisJob queue, cache and rate-limit counters10 MiB7 MiB
baseA template the two Chatwoot services copy their settings from; it has no job and stops right after startNot running0

Readings 12 minutes after start. "Process memory" is the anon value from each container's cgroup, without the file cache that docker stats partly counts; our RAM guide for 34 self-hosted apps explains the gap.

How much chat traffic can 2 vCPUs handle?

On 18 October 2026, self-hosted Chatwoot v4.18.0 on 2 vCPUs and 4 GiB handled 8.4 to 9.1 messages per second with 1 to 20 widget visitors at once, and not one request failed. Each simulated visitor opened the widget, which creates a contact, and sent three messages from its own client address; an agent answered twice through the API. Nobody paused to type, so this is a worst case. Each step lasted 60 seconds.

Visitors at onceMessages per secondNew conversations in 60 sVisitor message, p95Agent reply, p95Peak RAM in use
18.41020.17 s0.13 s1,228 MiB
28.71050.33 s0.25 s1,237 MiB
59.11100.82 s0.55 s1,259 MiB
108.91101.40 s1.17 s1,265 MiB
208.61202.71 s2.47 s1,267 MiB

A p95 of 0.17 s means 95 out of 100 messages were saved within 0.17 seconds. Memory barely moved; CPU was the limit. Rails used 74 to 83% of one vCPU, Sidekiq 81 to 85% and PostgreSQL 14 to 16%, about 1.8 of the 2 vCPUs. Sidekiq ended each step with 500 to 1,060 jobs waiting and cleared them within 9 seconds.

For scale, 10,000 conversations a day is about 7 a minute; we pushed more than 100 a minute. Bursts make answers slower, not lost. A second Puma process (WEB_CONCURRENCY=2, see the tuning guide) cut throughput to 7.8 messages per second on 2 vCPUs and grew the rails container to 783 MiB, so it only pays when you have spare cores.

Can Chatwoot run on 2 GB of RAM?

Yes, for a trial. We cut the same container to 2 GiB, the size of a VPS Micro, and cold-started the stack: 889 MiB in use at idle, 9.0 messages per second with 20 visitors, 1,140 MiB at peak. The database step that every upgrade runs, started next to the live stack, peaked at 1,383 MiB. Nothing was killed for lack of memory and no container restarted.

That leaves about 660 MiB for everything we did not test: email polling, attachments, a whole team online. A VPS Micro (2 vCPU, 2 GB, 40 GB NVMe) suits a trial; a business inbox belongs on a VPS Mini (4 vCPU, 4 GB, 80 GB NVMe), which meets the official minimum. You can move from one to the other later in the client area with a short reboot. Both are on the VPS plans page.

How to install Chatwoot with Docker on Debian 13

Steps 1 to 5 follow the official Docker guide; for HTTPS we used Caddy, where the guide shows nginx. Every command below ran in our lab, which used a test name and Caddy's internal certificate. New to containers? Start with our Docker on a VPS guide. Before you start, have ready:

1. Install Docker

# as root
apt-get update
apt-get install -y curl ca-certificates openssl wget
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
docker --version
docker compose version

We saw Docker version 29.9.1 and Docker Compose version v5.6.0.

2. Download the two official files

# as root
mkdir -p /opt/chatwoot && cd /opt/chatwoot
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

3. Set passwords, the secret key and your address

Run this in one session, because the database password sits in a shell variable until it is written to both files. Replace chat.example.com with your name. The last sed pins the version.

# as root, in /opt/chatwoot
PG_PASS=$(openssl rand -hex 16)
REDIS_PASS=$(openssl rand -hex 16)
sed -i "s|^SECRET_KEY_BASE=.*|SECRET_KEY_BASE=$(openssl rand -hex 64)|" .env
sed -i "s|^FRONTEND_URL=.*|FRONTEND_URL=https://chat.example.com|" .env
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$PG_PASS|" .env
sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$REDIS_PASS|" .env
echo "DISABLE_TELEMETRY=true" >> .env
sed -i "s|POSTGRES_PASSWORD=$|POSTGRES_PASSWORD=$PG_PASS|" docker-compose.yaml
sed -i "s|chatwoot/chatwoot:latest|chatwoot/chatwoot:v4.18.0|" docker-compose.yaml
chmod 600 .env
grep -n "image:" docker-compose.yaml

Expect three lines: chatwoot/chatwoot:v4.18.0, pgvector/pgvector:pg16 and redis:alpine. Chatwoot writes FRONTEND_URL into your website's widget code, so it must be the public HTTPS address. DISABLE_TELEMETRY=true stops the usage counts sent to Chatwoot (telemetry docs).

4. Create the database

# as root, in /opt/chatwoot
docker compose pull
docker compose run --rm rails bundle exec rails db:chatwoot_prepare

The pull took 29 seconds and the database step 16. Look for Created database 'chatwoot_production' near the end. Two messages look alarming but are harmless on a first run: Did you not create the database, or did you delete it?, printed just before Chatwoot creates it, and a warning that the attribute `version` is obsolete, which Docker Compose prints for the official file.

5. Start Chatwoot

# as root, in /opt/chatwoot
docker compose up -d
curl -s localhost:3000/api

Ours answered after 33 seconds with {"version":"4.18.0",...,"queue_services":"ok","data_services":"ok"}. If curl reports a refused connection, wait and retry.

6. Put Caddy in front for HTTPS

A reverse proxy is a web server that sits in front of Chatwoot, handles HTTPS and passes each request on. Debian 13 ships Caddy 2.6.2. On a real domain it fetches a free Let's Encrypt certificate by itself; our lab had no public name, so it used Caddy's internal certificate (tls internal) instead.

# as root
apt-get install -y caddy

Replace the contents of /etc/caddy/Caddyfile with:

# /etc/caddy/Caddyfile, edited as root
chat.example.com {
    reverse_proxy 127.0.0.1:3000
}
# as root
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
systemctl reload caddy
ss -tlnp | grep -E ':(80|443|3000|5432|6379) '

Expect Valid configuration, then ports 3000, 5432 and 6379 on 127.0.0.1 and only Caddy on 80 and 443. Keep it that way: never publish Chatwoot's ports on all addresses "to test quickly", because Docker's published ports bypass ufw (Docker docs). Through Caddy our lab got 200 on the API and login page, and 101 Switching Protocols on /cable, the WebSocket that pushes new messages to agents. For nginx or Traefik, see our reverse proxy comparison.

7. Create the admin account and the website inbox

Open https://chat.example.com. A fresh install shows an onboarding page for your name, company, email and password; that first user becomes the super admin. Then go to Settings, Inboxes, Add Inbox, Website, and paste the script Chatwoot gives you just before </body> on your site. We created ours through the API, which returns the same script.

Two Chatwoot errors to avoid: HTTP 429 and failed invites

HTTP 429 when every visitor shares one address

HTTP 429 "Too Many Requests" is what a rate limiter answers when one client sends too much. Our first load run got 8,605 of them. Chatwoot limits the widget per client address: in v4.18.0, 200 new widget sessions per hour and 60 messages per minute per website (rack_attack.rb in the v4.18.0 source; the rate limiting docs still list older, lower numbers). The log showed every request coming from 172.18.0.1, Docker's bridge. Through Caddy, Rails logged the real client address, which Caddy passes in X-Forwarded-For. A proxy that drops that header makes all visitors look like one, and the 201st new visitor in an hour gets an error.

Agent invites fail without SMTP

We invited a second agent before setting up email. The invite failed with Mail::Sendmail::DeliveryError ... /usr/sbin/sendmail: with SMTP_ADDRESS empty, Chatwoot falls back to a sendmail program the image does not contain. Fill in SMTP_ADDRESS, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD and MAILER_SENDER_EMAIL (default accounts@chatwoot.com) from your mail provider, then run docker compose up -d. Outbound port 25 is blocked on new RS Computers servers and opened on request via Telegram; a provider's port 587 does not need it.

Which channels work on self-hosted Chatwoot?

Live chat works on day one; every other channel needs an account with its platform.

ChannelWhat you need besides ChatwootTested by us
Website live chatA public HTTPS addressYes
EmailSMTP and IMAP logins, a forwarding rule, or a Google or Microsoft OAuth app (email docs)No
WhatsAppA WhatsApp Business account and a Meta developer app whose keys a super admin enters; Meta may require app review (signup docs). A Twilio WhatsApp number is the other route.No
TelegramA bot token from @BotFather; Telegram posts updates only to HTTPS on port 443, 80, 88 or 8443 (Bot API)No
Facebook, Instagram, SMS, Line, TikTokAn account and app with each platform; SMS via Twilio or BandwidthNo

Platform rules come along: 24 hours after the customer's last message, WhatsApp accepts only approved templates, and on Facebook and Instagram the customer must write first (supported features). For CRM sync, Chatwoot's webhooks pair well with n8n hosting on the same server. If you still need the CRM itself, see our Odoo or Dolibarr comparison.

Chatwoot self-hosted vs Intercom and Zendesk: five agents priced

As a self-hosted Intercom alternative, Chatwoot turns a per-seat bill into a server bill. Vendor list prices in US dollars, checked on 18 October 2026, before tax. "Annual" is the monthly price when you pay for a year.

OptionPer agent per monthFive agents per monthAI answers
Chatwoot Community, self-hosted$0$0 plus your serverNot included
Chatwoot Premium Support, self-hosted$19$95 plus your serverCaptain AI included
Chatwoot Cloud Startups / Business$19 / $39$95 / $195300 / 500 Captain credits
Intercom Essential$29 annual, $39 monthly$145 / $195Fin, $0.99 per outcome
Intercom Advanced$85 annual, $99 monthly$425 / $495Fin, $0.99 per outcome
Zendesk Suite Team$55 annual, $69 monthly$275 / $3455 per agent included, then $1.50 to $2.00 each

Sources: Chatwoot self-hosted, Chatwoot Cloud, Intercom and Zendesk.

Self-hosted Chatwoot is the better deal when:

Intercom or Zendesk is the honest answer when you want a polished AI agent from day one and nobody will look after a server. The free edition leaves out Captain AI, custom branding, roles and permissions, SSO and SLA policies. Not sure yet? Chatwoot Cloud's free Hacker plan (live chat, 2 agents, 500 conversations a month) lets you try the interface before you install anything.

Which plan and city for self-hosted live chat

Your situationPlanCityWhy
A trial, or one person answering a small shopVPS Micro: 2 vCPU, 2 GB, 40 GB NVMe, 1 Gb/sThe one closest to youPassed our 2 GiB test, but below the official minimum
A business inbox with a few agents, customers in Kosovo and the BalkansVPS Mini: 4 vCPU, 4 GB, 80 GB NVMe, 1 Gb/sPrishtinaMeets the official minimum; Skopje is about 3 ms away on our network, Vienna 18.6 ms
A business inbox with a few agents, customers across Western and Central EuropeVPS Mini: 4 vCPU, 4 GB, 80 GB NVMe, 1 Gb/sAmsterdamMeets the official minimum; 6.6 ms from Frankfurt, 6.7 ms from London
Irish or British customers, data to stay in IrelandVPS Mini, or VDS Small for a teamDublinConversations and uploads stay in an EU country close to the UK
A support team, several channels, n8n alongsideVDS Small: 4 dedicated vCPU, 8 GB, 240 GB NVMe, 10 Gb/sWhere most of your customers areDedicated cores for Sidekiq bursts and room for more Puma workers
Around 20,000 conversations a dayVDS Medium: 8 dedicated vCPU, 16 GB, 480 GB NVMe, 10 Gb/sWhere most of your customers areThe docs size this at 8 cores and 8 GB

VPS plans have shared vCPUs and VDS plans dedicated ones; our VPS vs VDS comparison explains the difference. All are KVM servers with NVMe, unmetered traffic and their own IPv4 and IPv6. Chat does not care about a few milliseconds, so pick the city for your customers and their data. The Vienna, Frankfurt and London figures are our own ping.pe tests of 6 October 2026, published on our city pages; the Skopje figure is measured on our own network. Availability by city is on the plans page.

How to back up and upgrade self-hosted Chatwoot

The data lives in PostgreSQL and in the storage_data volume with uploads (backup docs). Docker prefixes volume names with the folder name, here chatwoot_.

# as root, in /opt/chatwoot
mkdir -p /root/backup
docker compose exec -T postgres pg_dump -U postgres -Fc chatwoot_production > /root/backup/chatwoot-db.dump
docker run --rm -v chatwoot_storage_data:/data -v /root/backup:/backup alpine tar czf /backup/chatwoot-storage.tgz -C /data .
ls -lh /root/backup

Our dump of 937 conversations and 6,385 messages took 1 second and came to 712 KB; restored into a scratch database, it held all 6,385 messages. Copy both files off the server, for example with restic offsite backups. To upgrade, read the release notes, change the image tag, then run these three commands in the order the official Docker guide gives:

# as root, in /opt/chatwoot, after changing the image tag
docker compose pull
docker compose up -d
docker compose run --rm rails bundle exec rails db:chatwoot_prepare

Old installs should step through intermediate versions (upgrade guide). On a 2 GB server, follow the docs and add 1 GB of swap before you upgrade, even though our 2 GiB test got through without it.

Frequently asked questions

Is Chatwoot free to self-host?

Yes. The Community Edition is MIT-licensed and costs $0 per agent. On 18 October 2026, self-hosted Premium Support cost $19 per agent per month (adds Captain AI, branding and roles) and Enterprise $99 (adds SSO and SLA policies).

What are the minimum requirements for self-hosted Chatwoot?

Chatwoot's docs call 4 GB of RAM the required minimum and 4 CPU cores the recommended minimum, for up to 10,000 conversations a day, plus at least 1 GB of swap during upgrades. In our lab, Chatwoot v4.18.0 used 1,147 MiB at idle and 1,267 MiB at peak with 20 visitors chatting at once, and the whole server took 4.8 GB of disk.

Can Chatwoot run on 2 GB of RAM?

In our test it did: limited to 2 GiB, Chatwoot v4.18.0 peaked at 1,140 MiB under load and 1,383 MiB during the upgrade database step, without crashing. That is below the official 4 GB minimum, so keep 2 GB for a trial.

How do I install Chatwoot with Docker?

Download the official .env.example and docker-compose.production.yaml, set the passwords, secret key and FRONTEND_URL, run db:chatwoot_prepare, then docker compose up -d. The stack binds to 127.0.0.1 only, so a reverse proxy such as Caddy publishes it over HTTPS.

Is Chatwoot a good self-hosted Intercom alternative?

For a shared inbox, yes. Five agents on Intercom Essential cost $145 a month on annual billing (checked 18 October 2026); Chatwoot's Community Edition costs nothing beyond a server. Intercom is ahead with its Fin AI agent and needs no server work.

Does self-hosted Chatwoot support WhatsApp and Telegram?

Yes, through official integrations that need platform accounts: a WhatsApp Business account with a Meta developer app (or a Twilio WhatsApp number), and a Telegram bot token from BotFather plus a public HTTPS address. 24 hours after the customer's last message, WhatsApp allows only approved templates.

Put the support inbox on your own server

Chatwoot idles at about 1.1 GiB, yet the official 4 GB is where a real support team should start. RS Computers runs KVM VPS and VDS servers in Amsterdam, Dublin and Prishtina. Pick a size on the VPS hosting plans page, or ask us on Telegram for a quote if you want us to install Chatwoot for you.

← All articles

Chat on Telegram