SSD Nodes Learn 🎉 VPS từ $5.50/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

So sánh Mattermost, Rocket.Chat, Synapse và Zulip

So sánh Mattermost, Rocket.Chat, Synapse và Zulip theo RAM, database, mobile push, SSO, nâng cấp và licence, dựa trên số liệu sizing của từng vendor.

Nên chạy lựa chọn thay thế Slack self-hosted nào

Các lựa chọn thay thế Slack self-hosted đáng để một nhóm nhỏ vận hành là Mattermost, Rocket.Chat, Matrix với Synapse và Zulip. Với công cụ nội bộ cho một team trên một server, hãy chạy Mattermost. Với cộng đồng public, hãy chạy Zulip. Chỉ chạy Matrix với Synapse khi bạn phải trao đổi với các server do người khác sở hữu. Federation là điểm duy nhất mà các lựa chọn còn lại không thể sao chép, đồng thời cũng là yếu tố làm thay đổi công việc của administrator.

Danh sách tính năng không giúp phân biệt rõ 4 lựa chọn này. Cả 4 đều có channel, thread, search, upload file và mobile app. Điểm khác biệt là những gì chúng yêu cầu bạn xử lý mỗi tháng: memory, database phải luôn hoạt động, đường dẫn mobile push mà bạn có thể không kiểm soát được, và licence quyết định tính năng bạn cần có nằm sau payment hay không. Phần so sánh dưới đây dựa trên các tiêu chí đó, với 10 user và 100 user.

Bản chất thực tế của từng lựa chọn

Mattermost là một server Go dùng cơ sở dữ liệu PostgreSQL. Một binary, một database và một file cấu hình. Nó hoạt động giống Slack, bao gồm cả thread và slash command. Đây là lựa chọn ít tốn công vận hành nhất trong bốn lựa chọn, và đó là một ưu điểm.

Rocket.Chat là một ứng dụng Node.js chạy trên MongoDB. Nó có bộ tính năng rộng nhất ở đây, bao gồm cuộc gọi thoại, cuộc gọi video và omnichannel inbox để đưa các cuộc hội thoại với khách hàng từ email và các kênh social vào cùng một giao diện. Nếu bạn đang tìm giải pháp vì cần inbox đó, trước tiên hãy cân nhắc một help desk Chatwoot chuyên dụng, vì chat server dùng để hỗ trợ khách hàng là một bài toán khác với chat server dùng cho làm việc nhóm.

Matrix là một protocol, không phải một sản phẩm. Synapse là server tham chiếu (Python, PostgreSQL), còn Element là client được phần lớn người dùng sử dụng. Đây là lựa chọn duy nhất trong danh sách này cho phép server của bạn giao tiếp với các server mà bạn không vận hành.

Zulip là một server Python (Django cùng Tornado), sử dụng PostgreSQL, RabbitMQ, memcached và Redis phía sau. Script riêng của Zulip cài đặt toàn bộ thành một unit. Mô hình của Zulip là topic bên trong channel, nên bạn vẫn có thể tìm lại một cuộc hội thoại từ thứ Ba vào thứ Sáu. Version 12.0 được phát hành vào tháng 4 năm 2026.

Bao nhiêu RAM và dùng database nào ở 10 người dùng và 100 người dùng

Mọi con số trong bảng dưới đây đều lấy từ tài liệu của chính dự án, được đọc vào tháng 8 năm 2026. Không có con số nào là kết quả đo của tôi hoặc do tôi tự nghĩ ra. Cơ sở tính là như nhau cho mọi dòng: cấu hình nhỏ nhất mà dự án công bố, có tính cả database khi dự án tách riêng phần này trong yêu cầu tài nguyên.

ChartRAM in the smallest deployment each project documents (vendor figures, August 2026)
The data behind this chart
[
  {
    "label": "Synapse",
    "published_ram_gb": 1,
    "notes": "Synapse install docs: at least 1 GB free RAM if you want to join large public rooms. PostgreSQL is required for production and is not sized."
  },
  {
    "label": "Mattermost",
    "published_ram_gb": 2,
    "notes": "Mattermost requirements: 1 to 1,000 users on 1 vCPU and 2 GB RAM, single server, database included."
  },
  {
    "label": "Zulip",
    "published_ram_gb": 2,
    "notes": "Zulip requirements: under 100 users on 1 CPU, 2 GB RAM and 2 GB swap. 100 users and above needs 2 CPUs and 4 GB."
  },
  {
    "label": "Rocket.Chat",
    "published_ram_gb": 8,
    "notes": "Rocket.Chat requirements: smallest published tier is 4 GiB for the app plus 4 GiB for MongoDB, rated up to 500 concurrent users."
  }
]

Các dòng không cùng một kiểu, và đây là phát hiện hữu ích đầu tiên. Mức 1 GB của Synapse là ngưỡng tối thiểu cho tiến trình Synapse, kèm một điều kiện: tài liệu yêu cầu có ít nhất từng đó RAM trống nếu bạn muốn tham gia các phòng công khai lớn. PostgreSQL nằm ngoài con số đó. Mức 2 GB của Mattermost là cho toàn bộ máy, đã bao gồm database, và áp dụng cho 1 đến 1,000 người dùng trên một vCPU. Zulip ghi rõ 2 GB và một CPU cho dưới 100 người dùng, cùng 2 GB swap; từ 100 người dùng trở lên cần 4 GB và hai CPU. Rocket.Chat công bố con số lớn nhất ở đây, 8 GB, vì yêu cầu của họ tính ứng dụng là 4 GiB và MongoDB là 4 GiB; tier này được đánh giá cho tối đa 500 người dùng đồng thời.

Ở mức 10 người dùng, cả 4 dự án đều chạy được trên phần cứng mà bạn không cần phải cân nhắc lâu. Ở mức 100 người dùng, yêu cầu bắt đầu khác nhau: Mattermost vẫn nằm trong tier 2 GB, Zulip cần 4 GB và CPU thứ hai, còn tier nhỏ nhất được Rocket.Chat tài liệu hóa vẫn là 8 GB, vì mức tiêu thụ memory của MongoDB phụ thuộc vào máy hơn là số người dùng.

Lựa chọn database ảnh hưởng đến các lần nâng cấp sau này nhiều hơn hiệu năng hằng ngày. Mattermost cần PostgreSQL 14 trở lên và đã ngừng hỗ trợ MySQL từ v11, vì vậy cài MySQL hôm nay đồng nghĩa với việc phải migration vào ngày mai. Synapse chạy trên SQLite, nhưng tài liệu của chính dự án nói rõ rằng SQLite chỉ phù hợp để testing vì hiệu năng kém trong các phòng lớn. Rocket.Chat 8 yêu cầu MongoDB 8.0, nghĩa là nâng cấp database và nâng cấp chat là một project duy nhất thay vì hai project riêng.

VPS 2 GB thực sự đáp ứng được gì

Gói 2 GB là mức khởi điểm tại hầu hết nhà cung cấp. Đây là lựa chọn thực tế cho 2 trong 4 ứng dụng này.

  • Mattermost phù hợp. Đây là ứng dụng duy nhất có tài liệu của nhà cung cấp nêu đúng kích thước này, hỗ trợ tối đa 1,000 người dùng với PostgreSQL chạy trên cùng máy. 10 người dùng trên 2 GB vẫn hoạt động thoải mái.
  • Zulip phù hợp nếu có swap. Tài liệu khuyến nghị bật swap trên mọi máy dưới 5 GB và cảnh báo rằng máy có ít RAM sẽ gặp lỗi hết bộ nhớ trong lúc nâng cấp, khi tools/webpack là bước bị lỗi. Đây là lỗi thực tế bạn sẽ gặp lúc nâng cấp, không phải lúc cài đặt.
  • Synapse phù hợp khi ít tải. Mức tiêu thụ khi idle thấp. Vấn đề nằm ở các đợt tăng tải, và phần về federation bên dưới giải thích nguyên nhân.
  • Rocket.Chat là ứng dụng nên tránh trên máy 2 GB, nguyên nhân là storage engine của MongoDB. WiredTiger đặt kích thước cache nội bộ bằng giá trị lớn hơn giữa 50% của (RAM trừ 1 GB) và 256 MB. Vì vậy, trên máy 2 GB, nó dành khoảng 512 MB trước khi Node.js khởi động. Kết quả không phải là lỗi từ chối rõ ràng. Ứng dụng vẫn cài đặt và chạy, nhưng chậm dần khi lịch sử tăng lên. Cuối cùng, kernel out of memory killer sẽ dừng tiến trình lớn nhất tại thời điểm đó.

Hãy kiểm tra tài nguyên thực tế trước khi quyết định, vì các nhà cung cấp tính RAM khác với free:

free -h
swapon --show

Hãy nhớ rằng chat server không phải thành phần duy nhất trên máy. TLS (transport layer security) termination, backup và container runtime đều cần bộ nhớ. Hãy đặt server bạn chọn phía sau reverse proxy mà bạn hiểu rõ, như Nginx, Caddy hoặc Traefik. Nếu triển khai bằng container, các kiến thức cơ bản về Docker Compose trên VPS là phần đầu tiên cần cấu hình đúng.

Ứng dụng mobile có cần push server riêng của bạn không

Đây là yếu tố mà nhiều người chỉ nhận ra sau khi triển khai, và thường là yếu tố quyết định câu trả lời.

Cơ chế hoạt động như sau. Apple Push Notification service (APNs) và Firebase Cloud Messaging (FCM) chỉ chấp nhận notification từ bên nắm giữ signing credentials của chính ứng dụng đó. Server của bạn không thể push đến một ứng dụng mà bạn không tự build. Vì vậy, chat server tự host nhưng dùng bản build trên App Store của vendor phải chuyển notification đến gateway của vendor, và vendor sẽ quyết định các điều khoản.

  • Mattermost. Lựa chọn miễn phí là Test Push Notification Service (TPNS) tại https://push-test.mattermost.com. Tài liệu nêu rõ dịch vụ này không được khuyến nghị cho production và không có service level agreement (SLA). Dịch vụ chỉ hoạt động với các bản build trên App Store và Play Store. Hosted Push Notification Service (HPNS) đạt tiêu chuẩn production và cần subscription trả phí. Lựa chọn thứ ba là tự compile push proxy. Khi đó, bạn cần tự build app và dùng credentials APNs và FCM của riêng mình.
  • Rocket.Chat. Push yêu cầu đăng ký workspace với Rocket.Chat Cloud. Các workspace cộng đồng bị giới hạn ở 10,000 push notification mỗi tháng. Tức là khoảng 330 notification mỗi ngày cho toàn bộ workspace. Khi dùng hết quota, notification sẽ ngừng đến cho đến khi tháng mới bắt đầu. Với người dùng, hiện tượng này trông giống như app bị hỏng.
  • Matrix với Element. Synapse gửi notification đến một push gateway, còn các app Element chính thức được cấu hình trỏ đến gateway do matrix.org vận hành tại https://matrix.org/_matrix/push/v1/notify. Payload chứa event và room identifier thay vì nội dung message. App sẽ lấy nội dung từ server của bạn, nên gateway chỉ thấy metadata chứ không thấy cuộc trò chuyện. Bạn có thể tự chạy Sygnal gateway. Khi đó, bạn phải tự build và phân phối app của mình. Trên Android có một lựa chọn trung gian: dùng UnifiedPush với ntfy server do bạn host.
  • Zulip. Gói miễn phí bao gồm mobile push service cho tối đa 10 người dùng. Trên 10 người dùng, bạn cần một plan. Gói Community miễn phí áp dụng cho nhiều tổ chức phi thương mại. Zulip 12.0, phát hành vào tháng 4 năm 2026, đã bổ sung mã hóa đầu cuối cho push payload.

Với 10 người dùng, cả 4 lựa chọn này đều cung cấp notification hoạt động mà không mất phí. Với 100 người dùng, tình hình thay đổi: Zulip yêu cầu một plan, Mattermost vẫn hoạt động trên test service nhưng không có SLA và support, giới hạn theo tháng của Rocket.Chat trở thành yếu tố cản trở, còn Matrix không bị ảnh hưởng vì gateway được dùng miễn phí.

Những ứng dụng nào cung cấp single sign-on miễn phí

Mô hình kinh doanh open core thể hiện rõ nhất ở tính năng single sign-on (SSO).

  • Zulip tích hợp SAML (security assertion markup language) và LDAP (lightweight directory access protocol) trong server self-hosted mà không tính phí. Bạn không cần mua tier riêng.
  • Synapse hỗ trợ OpenID Connect (OIDC), SAML và CAS trong file cấu hình riêng, miễn phí. Các triển khai mới ngày càng dùng Matrix Authentication Service, một service riêng có cơ chế migration một chiều từ cơ chế xác thực Synapse cổ điển. Vì vậy, hãy lên kế hoạch migration này thay vì chỉ phát hiện ra khi đã triển khai.
  • Rocket.Chat Community Edition hỗ trợ đăng nhập LDAP và SAML cơ bản. Đồng bộ các thuộc tính user mở rộng, ánh xạ group và team, cũng như đồng bộ nền, yêu cầu enterprise licence.
  • Mattermost Team Edition miễn phí chỉ cung cấp GitLab OAuth, không có tính năng nào khác. SAML, AD/LDAP và OpenID Connect là các tính năng trả phí.

Nếu bạn dự định chạy nhiều service phía sau một lần đăng nhập duy nhất, hãy đặt một identity provider Authentik self-hosted phía trước các service đó và kiểm tra trong licence hiện có, ứng dụng nào trong số 4 ứng dụng này thực sự có thể kết nối với nó.

Cái giá thực sự của federation

Federation là lý do Matrix tồn tại. Người dùng tham gia một room được host trên server của người khác và trò chuyện với những người có account trên server đó, tương tự cách các mail server trao đổi email. Không lựa chọn nào khác ở đây hỗ trợ việc này. Nếu bạn cần federation, không lựa chọn nào khác trên trang này có thể thay thế nó.

Federation cũng là lý do Synapse có loại workload khác biệt. Khi người dùng tham gia một federated room, server của bạn phải giữ một bản sao state và các event của room đó. Server cũng cache media do người dùng trên các server khác đăng lên, như avatar, image và file. Khi đó, mức sử dụng disk phụ thuộc vào những room bạn không tạo và những người không có account trên server của bạn. Vì vậy, media store của các bản cài Synapse thường lớn hơn nhiều so với tổng dung lượng message do người dùng của chính bạn gửi. Đây cũng là lý do tài liệu gắn điều kiện về memory với thao tác tham gia một public room lớn.

Hãy đặt retention policy ngay từ ngày đầu, thay vì đợi đến khi disk đầy:

media_retention:
  local_media_lifetime: 90d
  remote_media_lifetime: 14d

Synapse bổ sung media_retention trong version 1.61, với thời hạn lưu riêng cho local media và remote media. Remote media là cache, nên nếu người dùng yêu cầu lại một file đã bị purge, Synapse sẽ request lại file đó từ server nơi file được lưu ban đầu. Local media không phải cache, vì vậy local_media_lifetime ngắn sẽ xóa vĩnh viễn các file upload của người dùng trên server của bạn.

Tóm lại: nếu người dùng của bạn chỉ trò chuyện với nhau, federation không đem lại lợi ích gì mà còn làm tăng mức sử dụng disk, bandwidth và độ phức tạp khi upgrade. Hãy tắt federation hoặc chọn một server khác.

Nâng cấp được thực hiện như thế nào

Zulip là lựa chọn đơn giản nhất. Chạy một script là xong. Thời gian gián đoạn được ghi trong tài liệu là dưới 30 giây, trừ khi có migration cơ sở dữ liệu lớn. Cài đặt và nâng cấp như sau, do bạn chạy trên server:

cd $(mktemp -d)
curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz
tar -xf zulip-server-latest.tar.gz

Chạy installer bằng root. Flag --push-notifications đăng ký server với mobile push service trong quá trình cài đặt. Lúc đó installer yêu cầu bạn chấp nhận điều khoản dịch vụ, nên hãy đọc trước khi bắt đầu.

sudo ./zulip-server-*/scripts/setup/install --push-notifications --certbot \
    --email=YOUR_EMAIL --hostname=YOUR_HOSTNAME

Các lần nâng cấp sau dùng cùng tarball và thêm một command:

curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz
sudo /home/zulip/deployments/current/scripts/upgrade-zulip zulip-server-latest.tar.gz

Mattermost có quy trình dễ dự đoán. Thay binary, restart, rồi migration sẽ chạy khi khởi động. Từ các bản release tháng 08 năm 2025, nhánh Extended Support Release (ESR) phát hành mỗi 9 tháng và được hỗ trợ trong 12 tháng. Nâng cấp từ một bản ESR lên bản ESR tiếp theo là quy trình đã được kiểm thử. Có thể bỏ qua nhiều bản ESR để nâng cấp một lần, nhưng cách này chưa được kiểm thử. Trên thực tế, bạn sẽ là người kiểm thử.

Rocket.Chat kết hợp ba lần nâng cấp với nhau. Tính đến tháng 08 năm 2026, dòng 8.x là dòng hiện tại. Bản 8.7.0 được phát hành ngày 6 tháng 08 năm 2026 và yêu cầu MongoDB 8.0 cùng phiên bản Node.js tương ứng. Bỏ qua một major version có thể khiến database ở trạng thái mà application từ chối mở. Hướng dẫn cài đặt Rocket.Chat bằng Docker Compose ghim các phiên bản này với nhau, đây là lý do chính để chọn cách triển khai bằng container.

Synapse cần đọc kỹ tài liệu. Mỗi bản release đều có upgrade notes. Bạn phải đọc notes của từng version đã đi qua, không chỉ version cuối cùng bạn nâng cấp lên. Sau khi nâng cấp, Synapse chạy các background update trên database. Trên server nhỏ, quá trình này có thể khiến máy chạy chậm trong nhiều giờ. Đây là hành vi dự kiến, không phải lỗi.

Điều khoản cấp phép, giải thích đơn giản

Mattermost phân phối các bản build Team Edition đã biên dịch theo giấy phép MIT, trong khi mã nguồn được cung cấp theo AGPLv3 hoặc giấy phép thương mại. Một số phần trong repository sử dụng Mattermost Source Available License, yêu cầu giấy phép trả phí nếu chạy trong môi trường production. Rocket.Chat sử dụng MIT, ngoại trừ các thư mục ee/, vốn có giấy phép enterprise riêng. Synapse chuyển từ Apache 2.0 sang AGPLv3 ở phiên bản 1.99.0. Các contributor ký CLA, cho phép Element bán các ngoại lệ đối với giấy phép đó. Zulip sử dụng Apache 2.0 và không có thư mục enterprise. Vì vậy, cơ chế SSO của Zulip không có điều kiện ngoại lệ nào.

Về thực tế, AGPL chỉ ảnh hưởng đến bạn nếu bạn định sửa server rồi cung cấp server đó cho người khác dưới dạng một dịch vụ. Với một team nhỏ, điều quan trọng hơn nhiều là ranh giới open core, tức những tính năng bị thiếu trong bản build miễn phí. Zulip có ít tính năng bị thiếu nhất, còn Mattermost có nhiều nhất.

Nên chọn giải pháp nào

Công cụ nội bộ cho team. Mattermost. Sản phẩm này có footprint được ghi nhận nhỏ nhất, các lần nâng cấp ít phát sinh vấn đề nhất và giao diện quen thuộc, không cần giải thích nhiều. Hãy dự trù dùng gói trả phí ngay khi SSO trở thành yêu cầu, vì hầu hết team đều sẽ đến lúc đó.

Server cộng đồng. Zulip. Topics giúp một channel công khai đông người vẫn dễ đọc sau nhiều tháng, còn SAML và LDAP không tốn phí; việc nâng cấp chỉ cần một command. Nếu cộng đồng của bạn thiên về bài đăng và phản hồi hơn live chat, trước tiên hãy so sánh với phần mềm forum tự host, vì forum được lập chỉ mục tốt hơn trên công cụ tìm kiếm và hoàn toàn không cần push infrastructure. Chọn Rocket.Chat nếu bạn cần các tính năng voice, video và omnichannel, đồng thời có thể cấp cho nó 8 GB RAM theo yêu cầu trong documentation riêng của sản phẩm.

Mạng phải interoperate. Matrix cùng Synapse và Element. Hãy chấp nhận media sẽ tăng dần, cấu hình retention ngay từ ngày đầu, cấp cho hệ thống PostgreSQL và nhiều disk hơn mức bạn nghĩ cần, rồi tận dụng việc trao đổi với các server mà bạn không kiểm soát. Chọn Synapse cho một team không bao giờ federation nghĩa là bạn phải trả chi phí đó mà không nhận được lợi ích.

FAQ

Đâu là lựa chọn thay thế Slack self-hosted tốt nhất cho một team nhỏ?

Mattermost, với hầu hết team nội bộ. Tài liệu của Mattermost mô tả việc chạy cho 1 đến 1,000 user trên 1 vCPU và 2 GB RAM, với PostgreSQL trên cùng máy. Vì vậy, nó phù hợp với gói VPS cấp thấp mà hầu hết nhà cung cấp bán. Điểm hạn chế là single sign-on: bản Team Edition miễn phí chỉ hỗ trợ GitLab OAuth, còn SAML, AD/LDAP và OpenID Connect đều yêu cầu gói trả phí. Nếu SSO miễn phí quan trọng hơn giao diện giống Slack, hãy dùng Zulip.

Có thể chạy chat server self-hosted trên VPS 2 GB không?

Có thể chạy Mattermost. Zulip cũng chạy được nếu thêm swap; tài liệu của Zulip khuyến nghị làm vậy khi RAM dưới 5 GB. Rocket.Chat mới là lựa chọn dễ khiến bạn thất vọng, vì engine WiredTiger của MongoDB dùng phần lớn hơn giữa 50% của (RAM trừ 1 GB) hoặc 256 MB cho cache. Vì vậy, khoảng 512 MB trên máy 2 GB đã bị chiếm trước khi ứng dụng khởi động. Nó sẽ cài đặt được, nhưng hiệu năng giảm dần khi lịch sử chat tăng và cuối cùng bị kill do hết memory. Tier nhỏ nhất được Rocket.Chat công bố là 4 GiB cho app cộng với 4 GiB cho MongoDB.

Chat server self-hosted có cần mobile push notification server riêng không?

Thường là không, vì APNs của Apple và FCM của Google chỉ nhận notification từ bên đã ký app. Do đó, app của vendor dùng gateway của vendor. Điều khoản của mỗi bên khác nhau. Mattermost cung cấp test service miễn phí không có SLA và một hosted service trả phí. Rocket.Chat giới hạn community workspace ở mức 10,000 push notification mỗi tháng. Sau đó, việc gửi notification sẽ dừng cho đến khi tháng mới bắt đầu. Zulip miễn phí push cho tối đa 10 user và yêu cầu gói dịch vụ nếu vượt quá mức đó. Matrix homeserver gửi push thông qua gateway mà các app Element sử dụng, không mất phí. Bạn chỉ cần gateway riêng nếu cũng build và phát hành app của mình.

Có nên self-host Matrix và Synapse cho một team không bao giờ trao đổi với server khác không?

Không. Federation là mục đích chính của Synapse và cũng là nguyên nhân khiến nó nặng hơn khi vận hành. Việc tham gia room trên server khác sẽ kéo state của room và cache media của chúng về disk local. Vì vậy, storage tăng vì những lý do không liên quan đến user của bạn. Hãy thiết lập media_retention với remote_media_lifetime ngắn trước khi điều đó xảy ra. Team chỉ trao đổi nội bộ sẽ phải chịu chi phí vận hành nhưng không nhận được lợi ích của federation. Mattermost hoặc Zulip sẽ đáp ứng cùng nhu cầu trên phần cứng ít hơn.

Lựa chọn thay thế Slack self-hosted nào có single sign-on miễn phí?

Zulip và Synapse. Zulip tích hợp SAML và LDAP miễn phí trong self-hosted server. Synapse hỗ trợ OpenID Connect, SAML và CAS trong cấu hình, còn các bản cài mới hơn đang chuyển sang Matrix Authentication Service riêng. Bản community edition của Rocket.Chat hỗ trợ đăng nhập LDAP và SAML cơ bản, nhưng attribute sync, group mapping và background sync yêu cầu enterprise licence. Team Edition miễn phí của Mattermost chỉ hỗ trợ GitLab OAuth.