Từ bỏ Discord: Tự triển khai Matrix Synapse và Element với Docker

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Giành lại quyền kiểm soát các cuộc hội thoại của bạn

Hãy nghĩ về nhật ký chat hàng ngày của bạn. WhatsApp, Telegram và Discord tuy tiện lợi nhưng về bản chất chúng là những “hộp đen” nơi bạn không thực sự sở hữu dữ liệu của mình. Với những người đam mê HomeLab hay kỹ sư DevOps, sự phụ thuộc này là một vấn đề lớn. Tôi luôn cho rằng những dữ liệu nhạy cảm nhất—các cuộc hội thoại riêng tư—phải nằm trên phần cứng mà chúng ta sở hữu và có quyền kiểm soát.

Triển khai một hệ thống liên lạc liên hợp (federated) là một kỹ năng cốt lõi của bất kỳ kiến trúc sư hiện đại nào. Đây không chỉ là một giải pháp về quyền riêng tư. Đó là một cơ hội để tìm hiểu sâu về cách các hệ thống phân tán quản lý danh tính, trạng thái và bảo mật trên môi trường web mở. Matrix không chỉ là một ứng dụng chat; nó là một tiêu chuẩn mở đã được kiểm chứng, đủ sức cạnh tranh với những nền tảng lớn nhất của Thung lũng Silicon về cả tính năng lẫn khả năng mã hóa.

Bộ công cụ: Synapse và Element

Trước khi bắt tay vào terminal, hãy xem qua các thành phần. Giao thức Matrix hoạt động khá giống email. Bạn có một máy chủ (Homeserver) và một ứng dụng khách (client). Không giống như Slack, nơi mọi người bị bó buộc trong một máy chủ của công ty, Matrix cho phép bạn tự host instance của riêng mình mà vẫn có thể chat với người dùng ở các máy chủ khác thông qua cơ chế “liên hợp” (federation).

  • Synapse: Đây là bộ não của hệ thống. Được viết bằng Python với các thành phần Rust hiệu suất cao, nó xử lý các tác vụ nặng như quản lý cơ sở dữ liệu, trao đổi khóa E2EE và đồng bộ hóa phòng chat.
  • Element: Đây là giao diện của bạn. Mặc dù có các ứng dụng cho di động và máy tính, chúng ta sẽ tự host phiên bản web. Điều này đảm bảo bạn có thể truy cập các cuộc trò chuyện bảo mật từ bất kỳ trình duyệt nào, ở bất kỳ đâu mà không cần thông qua máy chủ chính thức của Element.io.

Điều kiện tiên quyết: Những gì bạn cần

Yêu cầu phần cứng ở mức vừa phải, nhưng đừng quá tiết kiệm RAM. Tôi khuyên dùng ít nhất 2GB bộ nhớ để có trải nghiệm mượt mà.

  • Môi trường Linux (Ubuntu 22.04 hoặc Debian 12 hoạt động hoàn hảo).
  • DockerDocker Compose (khuyên dùng v2.20+).
  • Một tên miền như matrix.yourdomain.com. Matrix sử dụng các bản ghi DNS để tìm kiếm các máy chủ khác.
  • Một reverse proxy như Nginx Proxy Manager hoặc Traefik. Vì mã hóa đầu cuối (E2EE) yêu cầu HTTPS, bạn sẽ cần chứng chỉ SSL hợp lệ.

Bước 1: Tổ chức không gian làm việc

Các thư mục lộn xộn sẽ dẫn đến việc sao lưu bị lỗi. Tôi thường đặt các Docker stack của mình trong /opt để giữ mọi thứ ngăn nắp.

mkdir -p /opt/matrix/data
cd /opt/matrix

Bước 2: Tạo tệp cấu hình

Synapse yêu cầu một cấu hình cơ bản để bắt đầu. Chúng ta sử dụng chính image của Synapse để tạo tệp này. Hãy chọn tên máy chủ (server name) cẩn thận. Nó sẽ trở thành định danh của bạn (ví dụ: @user:chat.domain.com). Việc thay đổi thông tin này sau này là một cơn ác mộng thường đòi hỏi phải xóa sạch toàn bộ cơ sở dữ liệu.

docker run -it --rm \
    -v /opt/matrix/data:/data \
    -e SYNAPSE_SERVER_NAME=chat.yourdomain.com \
    -e SYNAPSE_REPORT_STATS=no \
    matrixdotorg/synapse:latest generate

Lệnh này sẽ tạo tệp homeserver.yaml trong thư mục data của bạn. Chúng ta sẽ điều chỉnh tệp này ở bước tiếp theo để thay đổi cơ sở dữ liệu.

Bước 3: Chuyển sang PostgreSQL

Theo mặc định, Synapse sử dụng SQLite. Nó ổn cho việc thử nghiệm nhanh, nhưng sẽ chạy rất chậm khi cơ sở dữ liệu đạt mức vài trăm megabyte. Nếu bạn dự định có nhiều hơn 2 hoặc 3 người dùng, PostgreSQL là bắt buộc. Nó xử lý việc ghi đồng thời và lịch sử phòng chat lớn hiệu quả hơn nhiều.

Mở tệp /opt/matrix/data/homeserver.yaml. Tìm mục database, comment các dòng liên quan đến SQLite và chuẩn bị cho Postgres. Trong lúc đó, hãy sao chép registration_shared_secret. Bạn sẽ cần nó để tạo người dùng thủ công sau này.

Bước 4: Tệp Docker Compose

Tệp docker-compose.yml này kết nối bộ não hệ thống, cơ sở dữ liệu và giao diện frontend lại với nhau. Tôi đã bao gồm các tham số Postgres cụ thể để đảm bảo mã hóa ký tự không làm hỏng lịch sử chat của bạn.

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: synapse
      POSTGRES_PASSWORD: mat_khau_manh_cua_ban_o_day
      POSTGRES_DB: synapse
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
    volumes:
      - ./postgresdata:/var/lib/postgresql/data

  synapse:
    image: matrixdotorg/synapse:latest
    restart: always
    volumes:
      - ./data:/data
    depends_on:
      - db
    environment:
      - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
    ports:
      - 8008:8008

  element:
    image: vectorim/element-web:latest
    restart: always
    volumes:
      - ./element-config.json:/app/config.json
    ports:
      - 8080:80

Cập nhật homeserver.yaml của bạn để trỏ đến dịch vụ db bằng thông tin đăng nhập bạn vừa thiết lập.

Bước 5: Khởi chạy và Kiểm tra

Đã đến lúc chạy thực tế. Tôi luôn theo dõi log trong lần khởi động đầu tiên để phát hiện bất kỳ lỗi kết nối cơ sở dữ liệu ẩn nào.

docker-compose up -d && docker-compose logs -f synapse

Hãy tìm thông báo “Synapse now listening on port 8008.” Khi thấy dòng đó, hãy trỏ reverse proxy của bạn tới cổng 8008 (cho Synapse) và 8080 (cho Element).

Bước 6: Tạo người dùng Admin

Vì việc đăng ký công khai nên được tắt để đảm bảo an toàn, bạn phải đăng ký người dùng đầu tiên thông qua CLI. Đây là bước mà hầu hết mọi người thường gặp rắc rối.

docker exec -it matrix_synapse_1 register_new_matrix_user \
    -c /data/homeserver.yaml http://localhost:8008

Script sẽ yêu cău bạn nhập mật khẩu. Hãy chắc chắn chọn ‘yes’ khi được hỏi liệu người dùng có phải là admin hay không. Bây giờ bạn đã có toàn quyền kiểm soát máy chủ của mình.

Mẹo bảo trì “xương máu”

Tự host là một cam kết lâu dài. Dưới đây là cách để giữ cho máy chủ không bị quá tải.

Theo dõi dung lượng lưu trữ

Matrix lưu trữ mọi meme và video được gửi trong phòng chat. Nếu bạn tham gia một phòng công khai lớn như #matrix:matrix.org, thư mục data có thể dễ dàng tăng lên hơn 10GB chỉ trong một tháng. Hãy thiết lập một cron job để chạy công cụ dọn dẹp media hàng tuần.

Sao lưu cơ sở dữ liệu là sống còn

Tệp tin thì dễ thay thế; cơ sở dữ liệu thì không. Sử dụng pg_dump để sao lưu container Postgres hàng đêm. Nếu bạn mất cơ sở dữ liệu hoặc các khóa ký (signing keys) trong thư mục data, danh tính máy chủ của bạn coi như đã chết trên mạng lưới Matrix.

Lời kết

Xây dựng trung tâm nhắn tin riêng là một bước tiến lớn hướng tới chủ quyền kỹ thuật số. Cảm giác thật tuyệt khi biết tin nhắn của gia đình mình không bị thu thập để phục vụ quảng cáo. Mặc dù việc thiết lập DNS và reverse proxy có thể hơi khó khăn, nhưng sự ổn định của Synapse trên Docker là cực kỳ vững chắc khi đã được cấu hình đúng. Tiếp theo, hãy tìm hiểu về các “bridge” để kết nối máy chủ của bạn với Telegram hoặc Signal, giúp tập trung mọi cuộc trò chuyện về một nơi bảo mật duy nhất.

Share: