Layer 5 · self-hosting reality check
What it actually takes to self-host Chatwoot
The docs say 4 GB (the vendor minimum, sized for up to 10,000 conversations a day), plus at least 1 GB of swap so upgrades do not run out of memory. In practice you want 4 GB plus 1 GB of swap is enough for a small team. Sidekiq alone can use more than 1 GB on a busy server, and 8 GB is the vendor's figure for 20,000 conversations a day.. Here is the honest version — real requirements, real monthly cost, what you will be maintaining, and the one thing that catches people out.
Usually reached from Freshdesk alternatives, where Chatwoot is one of the picks.
Wondering whether you need to at all? Is Freshdesk free? — what the free tier actually allows, and where the wall is.
| RAM — documented minimum | 4 GB (the vendor minimum, sized for up to 10,000 conversations a day), plus at least 1 GB of swap so upgrades do not run out of memory |
|---|---|
| RAM — what it really needs | 4 GB plus 1 GB of swap is enough for a small team. Sidekiq alone can use more than 1 GB on a busy server, and 8 GB is the vendor's figure for 20,000 conversations a day. |
| CPU | 4 cores is the vendor's recommended minimum; 8 for 20,000 conversations a day |
| Disk | Attachments go to local disk (/app/storage) unless you point storage at S3-compatible object storage, which Chatwoot recommends. PostgreSQL wants 5–10 GB to start and Redis about 100 MB. |
| Monthly cost | $24–48/mo for a 10-agent instance on a 4–8 GB VPS (Chatwoot asks for 4 cores, which most hosts only sell with 8 GB), plus object storage if attachments move off the box |
| Setup time | An hour with Docker Compose. Each channel after that (email, WhatsApp, social) is its own setup. |
| How you install it | docker compose from the official docker-compose.production.yaml: rails, sidekiq, pgvector/pgvector:pg16 and redis, all bound to localhost behind your own Nginx for HTTPS. Or the install script for Ubuntu 24.04. |
| Ongoing maintenance | Pull new images and run `rails db:chatwoot_prepare` on every update, and step very old installs through intermediate tags. Set WEB_CONCURRENCY yourself: the docs leave it out, so Puma runs a single process unless you change it. |
| Where it stops scaling | The vendor sizes 4 GB and 4 cores for about 10,000 conversations a day, and 8 GB with 8 cores for 20,000. Past that, run Sidekiq and Rails on separate servers and move to managed PostgreSQL and Redis. |
The thing that catches people out
Since v4, Chatwoot's database migrations need PostgreSQL with the pgvector extension. The official compose file now ships pgvector/pgvector:pg16, but anyone who brought their own database hits failed migrations in the middle of an upgrade. That includes a plain postgres image, a pre-v4 compose file, the Bitnami Postgres chart on Kubernetes, and a managed database where the extension is not allow-listed. Swap to the pgvector image (same major version, same data volume) and check that the old version boots on it before you upgrade.
When not to self-host Chatwoot
Your support is mostly long email threads with SLAs and a knowledge base: Zammad or FreeScout fit better. Also skip it if you do not want to run Rails, Sidekiq, PostgreSQL and Redis; Chatwoot Cloud runs the same product for you.
Every guide here carries this section. A site that only ever tells you to self-host is selling something — the useful answer is sometimes no.
Other Layer 5 self-hosting guides
- Self-hosting LibreOffice2 GB with a large spreadsheet open
- Self-hosting ONLYOFFICE6 GB for the Document Server with a handful of concurrent editors
- Self-hosting Collabora Online4 GB, and roughly 1 GB per 20 concurrent documents
- Self-hosting CryptPad2 GB for a small instance
- Self-hosting Mattermost4 GB for a team of 50 with PostgreSQL on the same box
- Self-hosting Rocket.Chat6 GB with MongoDB on the same machine
Common questions
- How much RAM does Chatwoot actually need?
- 4 GB plus 1 GB of swap is enough for a small team. Sidekiq alone can use more than 1 GB on a busy server, and 8 GB is the vendor's figure for 20,000 conversations a day. in practice. The documented minimum is 4 GB (the vendor minimum, sized for up to 10,000 conversations a day), plus at least 1 GB of swap so upgrades do not run out of memory, which is the figure at which the process starts rather than the figure at which it works under real use. 4 cores is the vendor's recommended minimum; 8 for 20,000 conversations a day alongside it.
- What does self-hosting Chatwoot cost per month?
- $24–48/mo for a 10-agent instance on a 4–8 GB VPS (Chatwoot asks for 4 cores, which most hosts only sell with 8 GB), plus object storage if attachments move off the box This is commodity VPS pricing and excludes your time, which is the larger cost for most people — budget for pull new images and run `rails db:chatwoot_prepare` on every update, and step very old installs through intermediate tags. Set WEB_CONCURRENCY yourself: the docs leave it out, so Puma runs a single process unless you change it.
- How long does it take to set up Chatwoot?
- An hour with Docker Compose. Each channel after that (email, WhatsApp, social) is its own setup., via docker compose from the official docker-compose.production.yaml: rails, sidekiq, pgvector/pgvector:pg16 and redis, all bound to localhost behind your own Nginx for HTTPS. Or the install script for Ubuntu 24.04..
- When should I NOT self-host Chatwoot?
- Your support is mostly long email threads with SLAs and a knowledge base: Zammad or FreeScout fit better. Also skip it if you do not want to run Rails, Sidekiq, PostgreSQL and Redis; Chatwoot Cloud runs the same product for you.
- What is the most common mistake when self-hosting Chatwoot?
- Since v4, Chatwoot's database migrations need PostgreSQL with the pgvector extension. The official compose file now ships pgvector/pgvector:pg16, but anyone who brought their own database hits failed migrations in the middle of an upgrade. That includes a plain postgres image, a pre-v4 compose file, the Bitnami Postgres chart on Kubernetes, and a managed database where the extension is not allow-listed. Swap to the pgvector image (same major version, same data volume) and check that the old version boots on it before you upgrade.