如何在 Ubuntu 22.04 上使用 Matrix Synapse 和 Element 安装和创建聊天服务器

如何在 Ubuntu 22.04 上使用 Matrix Synapse 和 Element 安装和创建聊天服务器

Matrix 是去中心化和端到端加密货币通信的开放标准。 它是使用实时同步的标准化 API 相互通信的服务器和服务的集合。 它使用家庭服务器来存储帐户信息和聊天记录。 如果一台家庭服务器出现故障,由于去中心化的性质,其他服务器可以继续通信而不会出现问题。 您可以使用由其他人托管的 Matrix 家庭服务器或托管您自己的服务器来保持对数据的控制。

在本教程中,您将学习如何使用 Synapse(Matrix 的家庭服务器实现)安装和创建聊天服务器。 Element 是使用 Matrix React SDK 构建的 Matrix Web 客户端。 这将允许您在网络上提供 Matrix 聊天。 您还可以将该服务器与您选择的任何其他 Matrix 客户端一起使用。 我们还将安装 Coturn 服务器以启用语音和视频通话。 如果您不感兴趣,Coturn 服务是可选的。

先决条件

  1. 运行 Ubuntu 22.04 的服务器。

  2. 具有 root 权限的非 sudo 用户。

  3. 简单的防火墙(UFW)已启用并正在运行。

  4. Matrix、Element 和 Coturn 的完全限定域名 (FQDN) 指向您的服务器。 我们将使用 matrix.example.com, element.example.com, 和 coturn.example.com 分别针对三项服务。

  5. 确保一切都已更新。

    $sudo apt update && sudo apt upgrade
    

第 1 步 – 配置防火墙

在安装任何软件包之前,第一步是配置防火墙以打开 HTTP、HTTPS 和 Synapse 端口。

检查防火墙的状态。

$sudo ufw status

您应该会看到类似以下内容的内容。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

在防火墙中打开 HTTP、HTTPS 和 Synapse 端口。

$sudo ufw allow 8448
$sudo ufw allow http
$sudo ufw allow https

再次检查状态以确认。

$sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
8448                       ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
8448 (v6)                  ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)

第 2 步 – 安装 Matrix Synapse

添加 Matrix GPG 密钥。

$sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg

添加 Matrix APT 存储库。

$echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list

更新系统存储库列表。

$sudo apt update

安装矩阵突触。

$sudo apt install matrix-synapse-py3

在安装过程中,系统将要求您输入服务器名称,该名称构成您的 Matrix ID 的一部分。 输入您的 Matrix 域名来代替它。 这将作为您的家庭服务器地址。

您还将被询问是否希望将有关您的家庭服务器的匿名统计数据发送回 Matrix。 类型 N 拒绝。

您可以稍后在文件中更改这些设置 /etc/matrix-synapse/conf.d/server_name.yaml

Matrix Synapse 的服务在安装过程中启用并启动。 检查服务的状态。

$sudo systemctl status matrix-synapse
? matrix-synapse.service - Synapse Matrix homeserver
     Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-09-26 09:38:38 UTC; 1min 19s ago
    Process: 12926 ExecStartPre=/opt/venvs/matrix-synapse/bin/python -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-key>   Main PID: 12931 (python)
      Tasks: 8 (limit: 2238)
     Memory: 87.3M
        CPU: 4.180s
     CGroup: /system.slice/matrix-synapse.service
             ??12931 /opt/venvs/matrix-synapse/bin/python -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/

Sep 26 09:38:36 matrix matrix-synapse[12926]: Generating signing key file /etc/matrix-synapse/homeserver.signing.key
Sep 26 09:38:37 matrix matrix-synapse[12931]: This server is configured to use 'matrix.org' as its trusted key server via the
Sep 26 09:38:37 matrix matrix-synapse[12931]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Sep 26 09:38:37 matrix matrix-synapse[12931]: server since it is long-lived, stable and trusted. However, some admins may
Sep 26 09:38:37 matrix matrix-synapse[12931]: wish to use another server for this purpose.
Sep 26 09:38:37 matrix matrix-synapse[12931]: To suppress this warning and continue using 'matrix.org', admins should set
Sep 26 09:38:37 matrix matrix-synapse[12931]: 'suppress_key_server_warning' to 'true' in homeserver.yaml.
Sep 26 09:38:37 matrix matrix-synapse[12931]: --------------------------------------------------------------------------------
Sep 26 09:38:38 matrix matrix-synapse[12931]: Config is missing macaroon_secret_key
Sep 26 09:38:38 matrix systemd[1]: Started Synapse Matrix homeserver.

第 3 步 – 安装和配置 PostgreSQL

我们将使用 PostgreSQL 的官方 APT 存储库进行安装。 运行以下命令添加 PostgreSQL GPG 密钥。

$curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

将 APT 存储库添加到您的源列表中。

$sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

更新系统存储库。

$sudo apt update

现在,您可以使用以下命令安装 PostgreSQL。

$sudo apt install postgresql postgresql-contrib

检查 PostgreSQL 服务的状态。

$sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-09-26 09:41:36 UTC; 2min 14s ago
    Process: 15586 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 15586 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Sep 26 09:41:36 matrix systemd[1]: Starting PostgreSQL RDBMS...
Sep 26 09:41:36 matrix systemd[1]: Finished PostgreSQL RDBMS.

您可以看到该服务默认已启用并正在运行。

登录 postgres 系统帐户。

$sudo -su postgres

为 PostgreSQL 创建一个新的数据库用户和数据库。

$createuser --pwprompt synapse
$createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapse

退出 postgres 帐户。

$exit

第 4 步 – 安装 Nginx

对于生产环境,建议使用 Nginx 代理运行 Synapse 服务器。

Ubuntu 22.04 附带旧版本的 Nginx。 要安装最新版本,您需要下载官方 Nginx 存储库。

导入 Nginx 的签名密钥。

$curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

添加 Nginx 稳定版本的存储库。

$echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

更新系统存储库。

$sudo apt update

安装 Nginx。

$sudo apt install nginx

验证安装。

$nginx -v
nginx version: nginx/1.22.0

启动 Nginx 服务器。

$sudo systemctl start nginx

第 5 步 – 安装 SSL

我们需要安装 Certbot 来生成 SSL 证书。 您可以使用 Ubuntu 的存储库安装 Certbot,也可以使用 Snapd 工具获取最新版本。 我们将使用 Snapd 版本。

Ubuntu 22.04 默认安装了 Snapd。 运行以下命令以确保您的 Snapd 版本是最新的。

$sudo snap install core
$sudo snap refresh core

安装证书机器人。

$sudo snap install --classic certbot

使用以下命令确保 Certbot 命令可以通过创建指向该命令的符号链接来运行 /usr/bin 目录。

$sudo ln -s /snap/bin/certbot /usr/bin/certbot

运行以下命令生成 SSL 证书。

$sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com

上述命令将下载证书到 /etc/letsencrypt/live/matrix.example.com 您服务器上的目录。

生成 Diffie-Hellman 组证书。

$sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

要检查 SSL 续订是否正常工作,请试运行该过程。

$sudo certbot renew --dry-run

如果没有看到任何错误,则一切都已准备就绪。 您的证书将自动更新。

第 6 步 – 配置 Matrix Synapse

您可以通过文件配置Matrix服务器 /etc/matrix-synapse/homeserver.yaml 但不建议这样做,因为每次升级后它都会被覆盖。 对于生产使用,您应该将配置文件放在 /etc/matrix-synapse/conf.d 文件夹。

Synapse 的安装在以下位置创建了两个配置文件 /etc/matrix-synapse/conf.d 文件夹。

$ls /etc/matrix-synapse/conf.d
report_stats.yaml  server_name.yaml

为数据库创建一个新的配置文件并将其打开进行编辑。

$sudo nano /etc/matrix-synapse/conf.d/database.yaml

将以下行粘贴到编辑器中。 更换 your-password 字段使用您在步骤 3 中创建的 PostgreSQL 用户密码。替换 localhost 如果您在其他地方托管数据库,则使用您服务器的 IP 地址。

database:
  name: psycopg2
  args:
    user: synapse
    password: 'your-password'
    database: synapsedb
    host: localhost
    cp_min: 5
    cp_max: 10

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

创建秘密注册密钥。 密钥应该受到保护,因为它允许任何人注册新用户,即使注册被禁用。

$echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'" | sudo tee /etc/matrix-synapse/conf.d/registration_shared_secret.yaml

默认情况下,Synapse 启用状态指示器来显示人员是否在线。 它可能会导致 CPU 使用率较高,因此您可以禁用它。 为其创建一个新的配置文件。

$sudo nano /etc/matrix-synapse/conf.d/presence.yaml

将以下行粘贴到编辑器中。

presence:
  enabled: false

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

重新启动 Synapse 服务以应用更改。

创建一个新的矩阵用户。 系统将要求您提供用户名和密码。 由于这是我们创建的第一个用户,因此输入 yes 当询问是否使用户成为管理员时。

$register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml http://localhost:8008
New user localpart [navjot]: navjot
Password: 
Confirm password: 
Make admin [no]: yes
Sending registration request...
Success!

如果要开放公共注册,请创建一个新的配置文件。

$sudo nano /etc/matrix-synapse/conf.d/registration.yaml

将以下行粘贴到其中。

enable_registration: true

默认情况下,Synapse 不允许在没有电子邮件验证的情况下进行注册。 要启用电子邮件验证,请粘贴以下行。

registrations_require_3pid:
  - email

email:
  smtp_host: mail.example.com
  smtp_port: 587

  # If mail server has no authentication, skip these 2 lines
  smtp_user: '[email protected]'
  smtp_pass: 'password'

  # Optional, require encryption with STARTTLS
  require_transport_security: true

  app_name: 'HowtoForge Example Chat'  # defines value for %(app)s in notif_from and email subject
  notif_from: "%(app)s <[email protected]>"

要禁用电子邮件验证,请粘贴以下行。

enable_registration_without_verification: true

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

重新启动 Synapse 以应用配置。

$sudo systemctl restart matrix-synapse

第 7 步 – 配置 Nginx

打开文件 /etc/nginx/nginx.conf 进行编辑。

$sudo nano /etc/nginx/nginx.conf

在该行之前添加以下行 include /etc/nginx/conf.d/*.conf;

server_names_hash_bucket_size  64;

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

创建并打开文件 /etc/nginx/conf.d/synapse.conf 进行编辑。

$sudo nano /etc/nginx/conf.d/synapse.conf

将以下代码粘贴到其中。

# enforce HTTPS
server {
    # Client port
    listen 80;
    listen [::]:80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}

server {
    server_name matrix.example.com;

    # Client port
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # Federation port
    listen 8448 ssl http2 default_server;
    listen [::]:8448 ssl http2 default_server;

    access_log  /var/log/nginx/synapse.access.log;
    error_log   /var/log/nginx/synapse.error.log;

    # TLS configuration
    ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location ~ ^(/_matrix|/_synapse/client) {
            proxy_pass http://localhost:8008;
            proxy_http_version 1.1;

            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;

            # Nginx by default only allows file uploads up to 1M in size
            # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
            client_max_body_size 50M;
    }
}

完成后,按 Ctrl + X 并在出现提示时输入 Y 来保存文件。

验证 Nginx 配置文件语法。

$sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重新启动 Nginx 服务。

$sudo systemctl restart nginx

第 8 步 – 安装 Coturn

您需要安装围绕 NAT (TURN) 服务器的使用中继遍历,以启用语音和视频呼叫。 为此,我们将安装 Coturn 包。 如果您不需要此功能,可以跳过此步骤。

Ubuntu 22.04 不随 Coturn 软件包一起提供,因为一个错误问题现已解决。 但是,还有另一种使用非官方存储库安装 Coturn 的方法。 您也可以选择使用 Docker 来安装 Coturn,但我们不会使用该方法,因为它超出了本教程的范围。

添加非官方 Coturn 存储库。

$sudo add-apt-repository ppa:ubuntuhandbook1/coturn

安装 Coturn。

$sudo apt install coturn

打开 TURN 和 UDP 端口。

$sudo ufw allow 3478
$sudo ufw allow 5349
$sudo ufw allow 49152:65535/udp

为 Turn 生成 SSL 证书(turn.example.com)。

$sudo certbot certonly --nginx -d turn.example.com

生成身份验证密钥并将其保存在配置文件中。

$echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)" | sudo tee /etc/turnserver.conf

打开配置文件进行编辑。

$sudo nano /etc/turnserver.conf

将以下行粘贴到身份验证密钥下方。

use-auth-secret
realm=turn.example.com
cert=/etc/letsencrypt/live/turn.example.com/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem

# VoIP is UDP, no need for TCP
no-tcp-relay

# Do not allow traffic to private IP ranges
no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

# Limit number of sessions per user
user-quota=12
# Limit total number of sessions
total-quota=1200

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

重新启动 Coturn 以应用配置。

$sudo systemctl restart coturn

为 Coturn 创建一个新的 Synapse 配置文件。

$sudo nano /etc/matrix-synapse/conf.d/turn.yaml

将以下行粘贴到其中。 代替 turn_shared_secret 值 与 的值 static-auth-secret 来自 \etc\turnserver.conf 文件。

turn_uris: [ "turn:turn.example.com?transport=udp", "turn:turn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

重新启动 Synapse 以应用更改。

$sudo systemctl restart matrix-synapse

第 9 步 – 访问矩阵

您可以使用 Element 的 Web 客户端访问 Matrix Chat: https://app.element.io。 单击登录按钮继续。

Element Web 登录页面

单击主服务器下的编辑链接。 进入 matrix.example.com 作为您的家庭服务器。

元素客户端自定义主服务器

如果客户端正确检测到您的家庭服务器,边界和文本将变为绿色,否则将显示为红色。 单击“继续”继续。

元素自定义家庭服务器登录

单击“登录”按钮登录。系统将要求您创建安全且加密的备份。

矩阵安全备份

选择“输入安全短语”选项以创建每次登录时都需要的安全短语。单击“继续”继续。

元素安全短语

输入安全短语并单击继续按钮继续。 系统将要求您在下一个屏幕上再次确认。

元素确认安全短语

再次输入该短语并单击“继续”继续。

元素安全密钥弹出

您将获得一组安全密钥,如果您忘记了安全短语,可以使用这些密钥。 单击“下载”按钮保存它们。

单击继续按钮继续。

元素密码验证

系统会要求您提供帐户密码。 输入密码并单击继续按钮以完成加密货币备份的设置。

Element Web 客户端仪表板

我们创建了一个名为 Howtoforge 的群聊室,如上所示。

第 10 步 – 安装元件

安装 jq 用于安装 JSON 文本处理器的包。

$sudo apt install jq

为 Element 创建一个目录。

$sudo mkdir -p /var/www/element

创建一个新文件以获取最新的 Element 版本。

$sudo nano /var/www/element/update.sh

将以下行添加到其中。

#!/bin/sh
set -e

install_location="/var/www/element"
latest="$(curl -s https://api.github.com/repos/vector-im/element-web/releases/latest | jq -r .tag_name)"

cd "$install_location"

[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"

wget "https://github.com/vector-im/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"

[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

使文件可执行。

$sudo chmod +x /var/www/element/update.sh

运行脚本以下载 Element。

$sudo /var/www/element/update.sh

第 11 步 – 配置元素

复制相同的元素配置文件。

$sudo cp /var/www/element/current/config.sample.json /var/www/element/config.json

打开配置文件进行编辑。

$sudo nano /var/www/element/config.json

找到以下几行。

"m.homeserver": {
    "base_url": "https://matrix-client.matrix.org",
    "server_name": "matrix.org"
},

将默认的 Matrix 主服务器地址更改为您的主服务器并删除 server_name 多变的。

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

如果您想在网站标题中使用自己的名称而不是 Element,请更改品牌名称。

"brand": "Howtoforge Example Chat",

设置 disable_guests 变量设置为 true 以禁止访客使用 Element。

"disable_guests": true,

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

为 Element 客户端生成 SSL 证书。

$sudo certbot certonly --nginx -d element.example.com

创建并打开文件 /etc/nginx/conf.d/element.conf 进行编辑。

$sudo nano /etc/nginx/conf.d/element.conf

将以下行粘贴到其中。

server {
    listen 80;
    listen [::]:80;
    server_name element.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name element.example.com;

    root /var/www/element/current;
    index index.html;

    access_log  /var/log/nginx/element.access.log;
    error_log   /var/log/nginx/element.error.log;

    add_header Referrer-Policy "strict-origin" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;

    # TLS configuration
    ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
}

按 Ctrl + X 并在出现提示时输入 Y 保存文件。

验证 Nginx 配置文件语法。

$sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重新启动 Nginx 服务。

$sudo systemctl restart nginx

您可以通过 URL 访问 Element 客户端 https://element.example.com 在您的浏览器中。 登录后您将进入应用程序仪表板。

Element 自托管仪表板

结论

关于使用 Nginx 作为代理服务器安装 Matrix Synapse Chat 服务器以及 Coturn 和 Element Web 客户端的教程到此结束。 如果您有任何疑问,请在下面的评测中发表。

资讯来源:由0x资讯编译自HOWTOFORGE,版权归作者所有,未经许可,不得转载
你可能还喜欢