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: 15Hai 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 nginx4. Một người dùng
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://127.0.0.1:8008Trả 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/versionSau đó, ủ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/clientSau đó, 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 300Cuố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 400Mỗ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 -20Sau đó
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.