Đến nội dung chính
Phạm Nam

Tìm kiếm

Nhập từ khoá để tìm trong các bài viết.

Quay lại

Tự Host Stoat: Discord Riêng Chạy Bằng Docker

Hướng dẫn chi tiết tự host Stoat bằng Docker Compose: dựng chat server riêng thay Discord, có kênh thoại, file, bot. Cấu hình domain, backup, bảo mật đầy đủ.

10 phút đọc—

Stoat là gì?

Minh họa server chat tự host Stoat: kênh thoại, tin nhắn và cụm container Docker

Stoat là chat server tự host, thay thế trực tiếp cho Discord: server, kênh text, kênh thoại, chia sẻ file, bot — nhưng dữ liệu nằm trên VPS của bạn, mã nguồn mở hoàn toàn.

Thông số nhanhStoat
Thay thế choDiscord
Giấy phépAGPL-3.0
Cài đặtDocker Compose, 14 service
Database / FileMongoDB / MinIO
Voice/VideoLiveKit
Yêu cầu tối thiểu2 vCPU, 2 GB RAM, 20 GB ổ cứng
Khuyên dùng4 GB RAM trở lên, SSD, Ubuntu Server
Trang chủ / Repostoat.chat / github.com/stoatchat/self-hosted

Discord tiện, nhưng toàn bộ tin nhắn, file, giọng nói của cộng đồng bạn nằm trên máy chủ của người khác, chịu chính sách của người khác. Chính sách đổi, tài khoản khóa, dữ liệu đi theo — bạn không có nút nào để bấm. Tự host Stoat là cách giữ lại trải nghiệm kiểu Discord mà không phụ thuộc vào nền tảng.

Theo repo chính thức, Stoat là tên mới của Revolt — nền tảng chat mã nguồn mở, giấy phép AGPL-3.0. Repo tự host chính thức là stoatchat/self-hosted (2.677 sao, 300 fork), chứa toàn bộ cấu hình để triển khai một instance đầy đủ: back-end, web front-end, file server, metadata và image proxy.

Stoat gồm những gì?

Đừng tưởng Stoat chỉ là một container duy nhất. Stack chính thức gồm 14 service chạy bằng Docker Compose, chia thành các lớp rõ ràng:

  • MongoDB — database chính: mọi tin nhắn, quyền hạn, tài khoản đều nằm đây.
  • MinIO — kho file: ảnh, video, file đính kèm mà thành viên gửi lên.
  • Caddy — reverse proxy: hứng traffic web, tự lo chứng chỉ HTTPS.
  • LiveKit — voice/video thời gian thực: kênh thoại và video call chạy qua đây, cần mở cổng 7881/tcp và 50000–50100/udp.
  • Các service ứng dụng — API, events, Autumn (file server), January (proxy ảnh/metadata), Gifbox, Pushd (thông báo đẩy), Crond (tác vụ nền).

Hiểu stack này quan trọng vì hai lý do: thứ nhất, bạn biết mình cần backup cái gì; thứ hai, khi có lỗi, bạn biết nhìn vào log của service nào thay vì mò mẫm.

Về tính năng, Stoat có đủ bộ khung của Discord: server, kênh text, kênh thoại, chia sẻ file, bot, phân quyền theo role. Nó không cố bắt chước 100% Discord, nhưng với một cộng đồng game, lớp học hay team nhỏ thì đã đủ dùng.

Cần chuẩn bị gì trước khi cài

README chính thức khuyên bắt đầu với ít nhất 2 vCPU và 2 GB RAM; môi trường test của maintainers chạy trên VPS KVM 2 (2 vCPU, 4 GB RAM, 50 GB SSD). Tài liệu cộng đồng chi tiết hơn: RAM khuyên dùng 4 GB trở lên, ổ cứng tối thiểu 20 GB (khuyên 50 GB trở lên vì file upload lưu trong MinIO), SSD cho hiệu năng database tốt hơn.

  • Hệ điều hành: Ubuntu Server là lựa chọn được khuyên dùng (maintainers dùng trong production). Debian-based cũng chạy được; Windows/macOS qua Docker Desktop thì không được khuyên.
  • Domain: một domain hoặc subdomain trỏ về IP server (bản ghi A/AAAA). Bài này hướng dẫn theo cách dùng domain chuẩn.
  • Cổng mạng cần mở: 80 (HTTP, redirect sang HTTPS), 443 (HTTPS), 7881/tcp và 50000–50100/udp (LiveKit voice/video).

Cài đặt Stoat bằng Docker Compose từng bước

Mọi lệnh dưới đây đều lấy từ README chính thức của repo stoatchat/self-hosted. Làm đúng thứ tự, đừng nhảy bước.

Bước 1: Củng cố server và mở firewall

SSH vào VPS rồi cập nhật hệ thống, bật firewall chỉ mở đúng cổng cần thiết:

apt-get update && apt-get upgrade -y

# configure firewall
ufw allow ssh
ufw allow http
ufw allow https
ufw allow 7881/tcp
ufw allow 50000:50100/udp
ufw default deny
ufw enable

Nếu đã cấu hình SSH key, tắt đăng nhập bằng mật khẩu cho an toàn:

sudo sed -E -i 's|^#?(PasswordAuthentication)\s.*|\1 no|' /etc/ssh/sshd_config

⚠️ LƯU Ý QUAN TRỌNG: Trỏ domain về IP server trước khi chạy cài đặt, vì script sinh cấu hình sẽ gắn domain vào chứng chỉ và các URL nội bộ. Domain chưa trỏ thì Caddy không cấp được chứng chỉ HTTPS.

Bước 2: Cài Docker và clone repo

# ensure Git is installed
apt-get update
apt-get install ca-certificates curl git micro

# install docker (Ubuntu Server)
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Lưu ý dùng docker compose (plugin V2), không phải lệnh docker-compose cũ.

git clone https://github.com/stoatchat/self-hosted stoat
cd stoat

Bước 3: Sinh cấu hình bằng generate_config.sh

chmod +x ./generate_config.sh
./generate_config.sh your.domain

Thay your.domain bằng domain thật của bạn. Script này sinh ra các secret cần thiết và ghi vào file secrets.env, đồng thời tạo Revolt.toml (cấu hình back-end) và .env.web (cấu hình web client và Caddy).

⚠️ LƯU Ý QUAN TRỌNG: Sao lưu secrets.env ngay lập tức. Theo README, mất file này có thể khiến bạn mất quyền truy cập toàn bộ file trên instance. Đây là file quan trọng nhất trong cả quá trình cài đặt, quan trọng hơn cả database.

Muốn chỉnh thêm thì mở Revolt.toml ra sửa — các tùy chọn đáng chú ý gồm xác minh email, captcha, dùng S3 server riêng thay MinIO mặc định, và thông báo đẩy iOS/Android (cần tài khoản developer Apple/Google):

micro Revolt.toml

Bước 4: Chạy thử foreground rồi chạy nền

Lần đầu tiên, chạy foreground để nhìn log trực tiếp, bắt lỗi cấu hình ngay thay vì đoán mò:

docker compose up

Nếu không có lỗi nghiêm trọng, bấm Ctrl + C rồi chạy nền:

docker compose up -d

Mở trình duyệt vào https://your.domain, tạo tài khoản đầu tiên — tài khoản này sẽ là admin để bạn cấu hình server, tạo kênh, mời thành viên.

Bước 5: Trỏ client vào server riêng

README lưu ý thẳng thắn: hiện tại phần lớn client chính thức chưa hỗ trợ instance tự host. Web client chạy tốt, và dùng dưới dạng PWA thì trải nghiệm gần như app native.

Thành viên tham gia bằng cách:

  • Web: mở https://your.domain trên trình duyệt.
  • Desktop (Windows, macOS, Linux): tải từ stoat.chat/download, ở màn hình đăng nhập chọn “Custom Server URL” và nhập domain của bạn.
  • Mobile (iOS, Android): tương tự, tùy chọn custom server URL nằm trong luồng đăng nhập.

💡 MẸO DÙNG AI: Bước “custom server URL” là nguồn câu hỏi hỗ trợ số một khi bạn mở server cho cộng đồng. Hãy ghim một tin nhắn hướng dẫn kèm ảnh chụp màn hình ngay trong kênh chào mừng — đỡ phải trả lời từng người một.

Backup và cập nhật

3 thứ bắt buộc phải sao lưu

  1. MongoDB — mọi tin nhắn, quyền, tài khoản. Dump định kỳ bằng mongodump.
  2. MinIO — mọi file upload. Sao lưu volume chứa dữ liệu file.
  3. secrets.env và Revolt.toml — không có hai file này, database restore cũng không dùng được.

Một script backup tối giản chạy hàng đêm:

#!/bin/bash
BACKUP_DIR=/mnt/backups
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_DIR
cd /path/to/stoat
# MongoDB dump
docker compose exec -T database mongodump --archive --gzip > $BACKUP_DIR/stoat-mongo-$DATE.gz
# MinIO files
tar czf $BACKUP_DIR/stoat-files-$DATE.tar.gz $(docker volume inspect stoat_autumn_data --format '{{ .Mountpoint }}')
# Config and secrets
tar czf $BACKUP_DIR/stoat-config-$DATE.tar.gz Revolt.toml secrets.env
# Keep last 30 days
find $BACKUP_DIR -name "stoat-*" -mtime +30 -delete

Cập nhật không mất dữ liệu

Trước mỗi lần cập nhật, đọc file NOTICES ở đầu và cuối README — vài bản cập nhật gần đây yêu cầu migration thủ công. Quy trình chung:

git pull
./generate_config.sh --overwrite your.domain
docker compose pull
docker compose up -d

Lưu ý: bước --overwrite sẽ ghi đè cấu hình — nếu bạn đã tùy chỉnh Revolt.toml thì copy phần tùy chỉnh ra trước, rồi chép lại sau. Một trường hợp đặc biệt: nếu bạn nâng cấp từ instance Revolt cài trước tháng 10/2025, cần hạ stack cũ theo tên project cũ trước:

docker compose -p revolt down
docker compose up -d

Dữ liệu vẫn nguyên vì volume đặt tên giống nhau.

Ưu điểm và nhược điểm

Phần dưới đây là nhận định của mình dựa trên thông tin từ repo — không phải tuyên bố chính thức của Stoat.

Ưu điểm

  • Giao diện quen thuộc kiểu Discord. Người dùng cuối không cần học lại — đây là lợi thế lớn so với Matrix/Element khi dọn cả cộng đồng sang.
  • Một lệnh sinh cấu hình. generate_config.sh lo hết secret, khác hẳn thời tự ghép từng service thủ công.
  • Dữ liệu nằm nhà bạn. Tin nhắn, file, voice đều trên VPS của bạn, không qua máy chủ bên thứ ba.
  • Mã nguồn mở AGPL-3.0. Được quyền xem, sửa, fork — và bất kỳ ai chạy bản sửa đổi cho người khác dùng cũng phải mở mã nguồn theo.
  • Bot và phân quyền đầy đủ. Đủ để vận hành cộng đồng thật, không chỉ demo.

Nhược điểm và giới hạn

  • Client tự host còn hạn chế. README nói thẳng: phần lớn client chính thức chưa hỗ trợ instance tự host, web client và PWA là đường dùng chính. Ai quen app desktop/mobile của Discord sẽ thấy cấn ở bước custom server URL.
  • Nặng hơn các lựa chọn nhẹ. 14 service, MongoDB + MinIO + LiveKit — VPS 2 GB RAM chỉ đủ cho cộng đồng nhỏ; đông người là phải nâng cấp.
  • Video có giới hạn. Do implementation chưa hoàn thiện, user stream video vượt kích thước tối đa trong Revolt.toml sẽ bị kick khỏi voice — chỉnh được qua trường video_resolution nhưng phải biết mà chỉnh.
  • Cập nhật đôi khi cần migration tay. Đọc NOTICES trước mỗi lần update, đừng docker compose pull mù.
  • Chưa test hiệu năng thực tế — các bước trên đối chiếu README chính thức, nhưng hiệu năng với 50–100 user đồng thời cần test tay trước khi cam kết với cộng đồng.

So sánh nhanh

Tiêu chíStoatDiscordMatrix/ElementMattermost
Tự hostCó, Docker ComposeKhôngCóCó
Giao diệnGiống DiscordChuẩn mựcKiểu chat truyền thốngKiểu Slack
Voice channelCó (LiveKit)Rất tốtCó, qua tích hợpCơ bản
Độ nặngTrung bình (14 service)Không tốn server bạnNhẹ–trung bìnhTrung bình
Bot/APICóRất mạnhCóCó
Phù hợp nhấtCộng đồng game, nhóm bạnMọi đối tượngLiên hợp mở, bảo mật caoTeam công ty

Nhận định của mình: Stoat thắng ở “cảm giác Discord” — dọn cộng đồng sang mà thành viên không phải học lại. Matrix thắng ở liên hợp và bảo mật đầu cuối; Mattermost thắng ở môi trường doanh nghiệp. Chọn theo cộng đồng của bạn, không chọn theo hype.

Use-case thực tế cho sysadmin và cộng đồng nhỏ

  1. Server riêng cho team/game clan. Thay group chat rải rác bằng một server có kênh text, voice, file riêng — không lo chính sách nền tảng.
  2. Lớp học, câu lạc bộ. Giáo viên, mentor quản lý thành viên, phân role, lưu tài liệu ngay trong server.
  3. Homelab mở rộng. Ai đã có VPS chạy Docker thì Stoat chỉ là thêm một stack compose nữa, chung hạ tầng với các app tự host khác.
  4. Môi trường cần kiểm soát dữ liệu. Nội dung nội bộ không đi qua máy chủ bên thứ ba — quan trọng với team làm sản phẩm chưa công bố.
  5. Chạy thử trước khi cam kết. Dựng instance test trên VPS rẻ, mời vài người dùng thử một tuần rồi mới quyết định dọn cả cộng đồng sang.

Lưu ý bảo mật quan trọng

  • Không bao giờ expose MongoDB ra internet. Đừng thêm port 27017 vào compose để “debug cho tiện” — Docker bypass luôn rule ufw, database public là coi như mất trắng. README cảnh báo rõ điểm này.
  • Giữ secrets.env như giữ chìa khóa két. Mất nó là mất file, không có đường khôi phục mềm.
  • CPU cũ lưu ý MongoDB. CPU đời cũ không hỗ trợ MongoDB mới nhất thì pin về mongo:4.4 và sửa healthcheck theo hướng dẫn trong README; hệ ARM thì cân nhắc thay KeyDB bằng valkey/redis.
  • Cập nhật theo NOTICES, không cập nhật mù. Vài bản cập nhật đổi tên section cấu hình, bỏ qua là lỗi khó hiểu.

Kết luận: ai nên tự host Stoat?

Nếu bạn có một cộng đồng đang sống trên Discord nhưng muốn dữ liệu nằm trong tay mình, có VPS nhàn rỗi và quen Docker Compose thì Stoat là lựa chọn thực tế nhất lúc này: cài trong một buổi chiều, giao diện thành viên không cần học lại, backup rõ ràng.

Bắt đầu từ instance nhỏ, mời vài người thân thiết dùng thử, đọc kỹ NOTICES trước mỗi lần cập nhật. Và nhớ: tự host nghĩa là bạn làm admin thật — backup, cập nhật, bảo mật đều là việc của bạn, không còn ai lo hộ nữa.

Link repo gốc: https://github.com/stoatchat/self-hosted Trang chủ: https://stoat.chat/ Giấy phép: AGPL-3.0 — dùng, sửa, chia sẻ thoải mái theo điều khoản copyleft của giấy phép.


Bài viết liên quan

Bình luận

Bình luận được duyệt trước khi hiển thị.

Đang tải bình luận…

Để lại bình luận