Mười hai bài xây dựng

Một homeserver Matrix mà federation thực sự hoạt động

Synapse trên một instance Ryzen nhỏ với Postgres, delegation thực hiện qua well-known files thay vì SRV record, và xác minh đạt tới các máy chủ khác.

Nội dung bài viết này triển khai

Một máy chủ gia đình tại example.com, chạy trên matrix.example.com, liên kết liên mạng đúng cách với mọi người khác. Postgres bên dưới, nginx phía trước, việc ủy quyền được xử lý bởi hai tệp JSON nhỏ, và đăng ký bị đóng để máy chủ của bạn không trở thành relay miễn phí của ai đó trong vòng một tuần.

Liên mạng là nơi các cài đặt này thường thất bại, và gần như không bao giờ do Synapse. Máy chủ chạy, tin nhắn nội bộ hoạt động, và rồi không có gì từ bên ngoài đến. Trong thực tế, nguyên nhân gần như luôn là ủy quyền: danh tính của máy chủ và địa chỉ nó sống tại là hai thứ khác nhau, và cơ chế kết nối chúng rất dễ sai một cách tinh vi.

Trước khi bắt đầu

  • Một R-4 là đủ cho vài chục người dùng. Synapse ngốn RAM hơn là CPU, và việc tham gia các phòng liên mạng lớn là điều duy nhất khiến nó hoạt động hết công suất.
  • Hai tên trong DNS: example.com, là danh tính máy chủ của bạn và xuất hiện trong mọi ID người dùng, và matrix.example.com, là nơi phần mềm thực sự lắng nghe.
  • Chứng chỉ cho cả hai. Cái đầu tiên chỉ cần phục vụ hai tệp tĩnh.

1. Cơ sở dữ liệu, với collation đúng

apt update && apt install -y postgresql matrix-synapse nginx certbot
sudo -u postgres psql -c "CREATE USER synapse_user WITH PASSWORD '<a long password>';"
sudo -u postgres psql -c "CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0 OWNER synapse_user;"

Collation không phải chi tiết nhỏ. Synapse từ chối khởi động trên cơ sở dữ liệu được tạo với bất kỳ collation nào khác ngoài C, và lỗi nó in ra khi bạn làm sai sẽ đến sau khi bạn đã nhập dữ liệu. Hãy làm đúng ngay bây giờ, chính xác, một lần.

2. Cấu hình Homeserver

Gói Debian hỏi tên máy chủ trong quá trình cài đặt; trả lời example.com, không phải hostname của máy. Câu trả lời đó trở thành một phần của mọi ID người dùng và ID phòng trên máy chủ và không thể thay đổi sau đó nếu không từ bỏ máy chủ.

Sau đó sửa /etc/matrix-synapse/homeserver.yaml:

server_name: "example.com"
public_baseurl: "https://matrix.example.com/"
pid_file: /run/matrix-synapse.pid

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['127.0.0.1']
    resources:
      - names: [client, federation]
        compress: false

database:
  name: psycopg2
  args:
    user: synapse_user
    password: "<a long password>"
    database: synapse
    host: 127.0.0.1
    cp_min: 5
    cp_max: 10

enable_registration: false
registration_shared_secret: "<a long random string>"
report_stats: false
suppress_key_server_warning: true
url_preview_enabled: false

media_store_path: /var/lib/matrix-synapse/media
max_upload_size: 100M
media_retention:
  remote_media_lifetime: 30d

rc_message:
  per_second: 0.5
  burst_count: 15

Hai trong số các cài đặt đó sẽ cứu bạn khỏi việc tốn đĩa và phiền toái. Lưu giữ phương tiện từ xa loại bỏ các bản sao đã lưu cache của tệp từ các máy chủ khác sau một tháng, và nếu không có nó, kho phương tiện của bạn phát triển mãi mãi với nội dung bạn không bao giờ yêu cầu. Xem trước URL bị tắt vì chúng khiến máy chủ của bạn tìm nạp các địa chỉ tùy ý thay mặt cho bất kỳ ai có thể đăng liên kết, đó là một cỗ máy giả mạo yêu cầu với giao diện trò chuyện.

x_forwarded: true cũng quan trọng: nếu không có nó, Synapse giới hạn tốc độ mọi người dùng trên thế giới như thể họ là một máy khách, vì mọi yêu cầu dường như đến từ nginx.

3. Ủy quyền

Danh tính của bạn là example.com và máy chủ của bạn nằm tại matrix.example.com. Hai tệp thu hẹp khoảng cách. Phục vụ chúng từ example.com, qua HTTPS, với loại nội dung chính xác.

/.well-known/matrix/server:

{ "m.server": "matrix.example.com:443" }

/.well-known/matrix/client:

{ "m.homeserver": { "base_url": "https://matrix.example.com" } }

Cổng trong tệp đầu tiên là bắt buộc. Bỏ qua nó và các máy chủ khác sẽ chuyển sang cổng 8448, không tìm thấy gì đang lắng nghe, và bỏ cuộc một cách lặng lẽ; người dùng của bạn sau đó báo cáo rằng liên mạng bị hỏng trong khi mọi nhật ký trên máy của bạn trông hoàn toàn khỏe mạnh.

server {
  listen 443 ssl;
  server_name example.com;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  location /.well-known/matrix/ {
    root /var/www/wellknown;
    default_type application/json;
    add_header Access-Control-Allow-Origin *;
  }
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name matrix.example.com;
  ssl_certificate     /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
  client_max_body_size 100m;

  location ~ ^(/_matrix|/_synapse/client) {
    proxy_pass http://127.0.0.1:8008;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $host;
  }
}

Tiêu đề Access-Control-Allow-Origin trên vị trí well-known là bắt buộc đối với máy khách web và bị quên bởi gần như tất cả mọi người. Nếu không có nó, máy khách máy tính để bàn hoạt động và máy khách trình duyệt không thể tìm thấy máy chủ của bạn.

mkdir -p /var/www/wellknown/.well-known/matrix
systemctl restart matrix-synapse nginx

4. Một người dùng

register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://127.0.0.1:8008

Trả lời các lời nhắc, tạo tài khoản đầu tiên làm quản trị viên, và để đăng ký mở tắt. Một homeserver với đăng ký mở là một nguồn thư rác trong vòng vài ngày, và các máy chủ khác sẽ bắt đầu từ chối lưu lượng của bạn từ lâu trước khi bạn nhận ra.

Xác minh

Làm việc từ ngoài vào trong. Đầu tiên, phần mềm có trả lời không:

curl -s https://matrix.example.com/_matrix/client/versions | head -c 200
curl -s https://matrix.example.com/_matrix/federation/v1/version

Sau đó, ủy quyền có được phục vụ đúng không, với cổng hiện diện và loại nội dung chính xác:

curl -si https://example.com/.well-known/matrix/server | grep -E "content-type|m.server"
curl -s https://example.com/.well-known/matrix/client

Sau đó, khóa ký của bạn có phân giải không. Các máy chủ khác tìm nạp khóa này trước khi họ nói chuyện với bạn:

curl -s https://matrix.example.com/_matrix/key/v2/server | head -c 300

Cuối cùng, bài kiểm tra duy nhất có giá trị. Đăng nhập với một máy khách, tham gia một phòng công khai được lưu trữ trên một homeserver không phải của bạn, và gửi một tin nhắn. Sau đó đọc trạng thái liên mạng từ API quản trị, sử dụng mã thông báo truy cập mà máy khách của bạn hiển thị trong cài đặt của nó:

curl -s -H "Authorization: Bearer <admin token>" \
  "https://matrix.example.com/_synapse/admin/v1/federation/destinations" | head -c 400

Mỗi đích sẽ hiển thị một giao dịch thành công gần đây và không có khoảng thời gian thử lại. Các đích có retry_interval tăng dần là các máy chủ bạn không thể truy cập; nếu mọi đích trông như vậy, vấn đề là ủy quyền chứ không phải mạng, và bước ba là nơi để xem.

journalctl -u matrix-synapse --since "10 min ago" | grep -i "federation" | tail -20

Sau đó

Việc tham gia một phòng rất lớn lần đầu tiên sẽ chiếm một lõi trong vài phút và kéo về rất nhiều trạng thái. Điều đó là bình thường, nó xảy ra một lần cho mỗi phòng, và đó là lý do chính khiến mọi người kết luận Synapse chậm. Thoại và video cần một máy chủ TURN bên cạnh máy chủ này; coturn trên cùng một phiên bản phục vụ một cộng đồng nhỏ, mặc dù nó muốn dải cổng UDP riêng trong tường lửa. Liên mạng trò chuyện theo cả hai hướng, điều đáng nhớ khi chọn địa điểm: chỉ mục vị trí của chúng tôi liệt kê thời gian khứ hồi mà chúng tôi tự đo lường.

Sẵn sàng khi bạn cần

Chọn thành phố. Chọn kích thước. Thanh toán bằng coin.

Không có biểu mẫu về bạn là ai, không chờ đợi con người phê duyệt, không gọi điện thoại để xác minh bất cứ điều gì. Hóa đơn được thanh toán và thông tin đăng nhập sẽ vào hộp thư của bạn.