Matrix 使用 mastodon 单点登录并搭建网页端

数字玩具 2022年08月27日 10:15

出于对自己搭建的Matrix服务端,只用于自己跨设备传送文件有点浪费之类...莫名其妙的想法,想要拓展一下用途。前几天又有朋友在博客上发评论想要交流一下,留下了邮件地址。感觉这样的交流有点不够实时。像是回到了过去 “车马很慢” 那种环境。

最近几天发现自己一直再用的Element是可以自托管的!然后看到有朋友搭建的网站上可以使用mastodon登录--这样也太棒了吧!😄,于是起了好奇心:为何不自己搭个?

docker 操作一把梭

随随便便在服务器上找个位置存放matrix的数据,没错,要风水好点的。

扔出自己的docker-compose.yml文件:

version: "3.4"

services:
  synapse:
    hostname: matrix
    image: matrixdotorg/synapse:latest
    restart: always
    #container_name: matrix_server   
    container_name: synapse
    depends_on:
      - db
      - redis
    ports:
      - "127.0.0.1:8437:8008"
    volumes:
      - ./synapse/data:/data
    networks:
      - synapse_network
      - external_network
    healthcheck:
      test: ["CMD-SHELL", "curl -s localhost:8008/health || exit 1"]

  db:
    image: postgres
    restart: always
    container_name: matrix_db
    volumes:
      - ./synapse/db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: #数据库用户
      POSTGRES_PASSWORD: #数据库密码
      POSTGRES_DB: #数据库名
      POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
    networks:
      - synapse_network
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "synapse"]

  redis:
    image: redis:6.0-alpine
    restart: always
    container_name: matrix_redis  
    volumes:
      - ./synapse/redis:/data
    networks:
      - synapse_network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

  element-web:
    image: vectorim/element-web:latest
    restart: always
    container_name: matrix_element_web
    depends_on:
      - synapse
    ports:
      - "127.0.0.1:8845:80"
    volumes:
      - ./element-web/config.json:/app/config.json
      #- ./element-web/config.json:/app/config.json
    networks:
      - external_network

networks:
  synapse_network:
    internal: true
  external_network:
最近再一次偶然使用docker ps时才发现,ports处使用127.0.0.1:端口号:端口号可以只允许本机访问,而自己用了很久的端口号:端口号方式会对任意IP访问到服务器端口的请求作出响应,这怎么行!幸好自己服务器防火墙禁止了全部除80,443端口的所有请求。

详细设置

在编写好docker-compose.yml文件后,先执行:

# 记得调整您站点对应的目录位置和域名!
docker run -it --rm \
    -v <你当前放matrix数据的绝对路径>/synapse/data:/data \
    -e SYNAPSE_SERVER_NAME=matrix.irithys.com \
    -e SYNAPSE_REPORT_STATS=no \
    matrixdotorg/synapse:latest generate

执行后会在目录下的/synapse/data文件夹中生成三个文件,打开homeserver.yaml后进行编辑:

推荐先复制一份原始文件防止修改错误。🤔
# Configuration file for Synapse.
#
# This is a YAML file: see [1] for a quick introduction. Note in particular
# that *indentation is important*: all the elements of a list or dictionary
# should have the same indentation.
#
# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
#
# For more information on how to configure Synapse, including a complete accounting of
# each option, go to docs/usage/configuration/config_documentation.md or
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html

server_name: "matrix.irithys.com" #写成你的网址
pid_file: /data/homeserver.pid #保持原样
web_client_location: https://chat.irrithys.com/ #这个是你将要代理的Element-web地址 注意最后使用 / 截断。
public_baseurl: https://matrix.irithys.com/ #matrix地址
listeners: #不要修改
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false
acme: #一段配置可以删除
  enabled: false
  port: 80
  bind_addresses: ['::', '0.0.0.0']
  reprovision_threshold: 30

database:
 name: psycopg2
 args: #你在docker-compose文件中填写的内容
   user: <你的数据库用户>
   password: <你的数据库密码>
   database: <你的数据库名称>
   host: db
   cp_min: 5
   cp_max: 10
log_config: "/data/matrix.irithys.com.log.config" #这里请填写成你的。文件和 homeserver.yaml在同级目录下。

enable_media_repo: true #填为 false 则不能发送媒体文件
url_preview_enabled: true #URL预览
url_preview_ip_range_blacklist: #全部保持原样
  - '127.0.0.0/8'
  - '10.0.0.0/8'
  - '172.16.0.0/12'
  - '192.168.0.0/16'
  - '100.64.0.0/10'
  - '192.0.0.0/24'
  - '169.254.0.0/16'
  - '192.88.99.0/24'
  - '198.18.0.0/15'
  - '192.0.2.0/24'
  - '198.51.100.0/24'
  - '203.0.113.0/24'
  - '224.0.0.0/4'
  - '::1/128'
  - 'fe80::/10'
  - 'fc00::/7'
  - '2001:db8::/32'
  - 'ff00::/8'
  - 'fec0::/10'
url_preview_url_blacklist:
  - scheme: 'http'
  - netloc: '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
max_spider_size: 5M
url_preview_accept_language:
  - zh
  - en
  - zh-Hans
enable_registration: false #关闭注册
allow_guest_access: false #关闭访客访问
auto_join_rooms: #服务器默认加入的聊天室
  - "#public:matrix.irithys.com"
report_stats: false #是否上传匿名数据
macaroon_secret_key: "<保持原样>"
form_secret: "<保持原样>"
media_store_path: /data/media_store #媒体路径
registration_shared_secret: "<保持原样>"
signing_key_path: "/data/matrix.irithys.com.signing.key" #这里请填写成你的。文件和 homeserver.yaml在同级目录下。
key_refresh_interval: 1d
trusted_key_servers: #允许与此服务器通信的其他Matrix服务器
  - server_name: "matrix.org"
password_config:
  enabled: false
ui_auth:
  session_timeout: "30s" #会话超时
email:
  smtp_host: "<邮箱SMTP>"
  smtp_port: 587
  smtp_user: "<邮箱用户>"
  smtp_pass: "<邮箱密码>"
  enable_tls: true
  require_transport_security: true
  notif_from: "Matrix <邮箱用户>"
  client_base_url: "https://chat.irithys.com/"

user_directory:
  prefer_local_users: true
redis:
  enabled: true
  host: redis
  port: 6379
# vim:ft=yaml

# Configuration file for Synapse.

配置mastodon单点登录

在你的mastodon网站设置中打开开发,点击创建新应用

WNjq0.webp

homeserver.yaml文件追加内容:

oidc_providers: #Mastodon
  - idp_id: mastodon
    idp_name: Mastodon
    idp_brand: "com.irithys.im"  # optional: styling hint for clients
    discover: false
    issuer: "https://im.irithys.com/"
    client_id: <你在mastodon中创建的id>
    client_secret: <你在mastodon中创建的secret>
    authorization_endpoint: "https://<你的mastodon网址>/oauth/authorize"
    token_endpoint: "https://<你的mastodon网址>/oauth/token"
    userinfo_endpoint: "https://<你的mastodon网址>/api/v1/accounts/verify_credentials"
    scopes: ["read:accounts"] #只需要获取此权限
    user_mapping_provider:
      config:
        subject_claim: "id"
        localpart_template: "{{ user.username }}"
        display_name_template: "{{ user.display_name }}"
sso:
  client_whitelist:
    - https://chat.irithys.com/

Element-web配置

docker-compose.yml同级目录下创建element-web文件夹,进入文件夹后创建config.json,内容为:

{
    "default_server_config": {
        "m.homeserver": {
            "base_url": "https://matrix.irithys.com",
            "server_name": "剪秋萝"
        },
        "m.identity_server": {
            "base_url": "https://vector.im"
        }
    },
    "disable_custom_urls": true,
    "disable_guests": false,
    "disable_login_language_selector": true,
    "disable_3pid_login": false,
    "brand": "联合通讯",
    "integrations_ui_url": "https://scalar.vector.im/",
    "integrations_rest_url": "https://scalar.vector.im/api",
    "integrations_widgets_urls": [
        "https://scalar.vector.im/_matrix/integrations/v1",
        "https://scalar.vector.im/api",
        "https://scalar-staging.vector.im/_matrix/integrations/v1",
        "https://scalar-staging.vector.im/api",
        "https://scalar-staging.riot.im/scalar/api"
    ],
    "bug_report_endpoint_url": "mailto:[email protected]",
    "uisi_autorageshake_app": "element-auto-uisi",
    "default_country_code": "CN",
    "show_labs_settings": false,
    "features": { },
    "default_federate": true,
    "default_theme": "light",
    "room_directory": {
        "servers": [
            "matrix.org"
        ]
    },
    "enable_presence_by_hs_url": {
        "https://matrix.org": false,
        "https://matrix-client.matrix.org": false,
        "https://im.irithys.com": true,
        "https://matrix.irithys.com": true
    },
    "setting_defaults": {
        "breadcrumbs": true,
        "language": "zh-hans"
    },

    "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx",
    "showLabsSettings": true,
    "piwik": false,
    "terms_and_conditions_links": [
        {
            "url": "https://im.irithys.com/terms",
            "text": "使用协议 & 隐私条款"
        }
    ]
}

配置可以查阅官方配置说明自己自定义配置

使用配置详解

default_server_config:填写网页端默认连接的Matrix后台,这里填你的咯。

disable_custom_urls: 配置默认情况是否允许连接其他Matrix服务器。(这怎么可以允许!用这我的网页端,结果不连接我的Matrix吗😭)。

disable_guests: 是否允许访客访问。猜测应该需要和homeserver.yaml文件保持一致。

disable_login_language_selector:是否允许在网页上显示出语言切换按钮。

disable_3pid_login:是否启用使用电子邮件地址或电话号码登录的选项。(已经设置为只通过mastodon单点登录,所以选false)。

brand:这个容易理解,就是标题名。

integrations的所有:集成管理器相关内容,保持默认就好。

bug_report_endpoint_url:将问题提交到那里。(可以不写这个,自己也解决不了😂)

uisi_autorageshake_app:启用上面的bug_report_endpoint_url后这个也需要写。保持默认就好。

default_country_code:设置中的电话选项默认位置。

show_labs_settings:是否显示实验室设置。

features:一些Element-web的测试性质的新功能,想开启可以在官方实验室配置说明中找到。

default_federate:聊天室将在创建过程中被标记为“可联合”。通常不应使用此设置,因为在创建聊天室后无法更改聊天室的联合功能。

default_theme:默认主题。

room_directory:将其他服务器添加到下拉列表中。

enable_presence_by_hs_url:配置是否为给定主服务器显示状态。

setting_defaults:默认设置。在此处可以修改为中文。

map_style_url:用于位置共享的地图磁贴服务器样式地址,保持默认就好。

terms_and_conditions_links:在整个应用中添加使用协议 & 隐私条款链接,我这里指向了我mastodon的内容。

其他自定义配置

除此之外还有一些自定义选项可以自行添加

自定义欢迎界面:

{
   "branding": {
      "welcome_background_url": "https://example.org/assets/background.jpg",
      "auth_header_logo_url": "https://example.org/assets/logo.svg",
      "auth_footer_links": [
         {"text": "FAQ", "url": "https://example.org/faq"},
         {"text": "Donate", "url": "https://example.org/donate"}
      ]
   },
   "embedded_pages": {
      "welcome_url": "https://example.org/assets/welcome.html",
      "home_url": "https://example.org/assets/home.html"
   }
}

welcome_background_url:登录、注册和欢迎页面的背景图片。

auth_header_logo_url:登录、注册等页面上使用的Logo。

auth_footer_links:在登录、注册等页面的页脚的链接。

embedded_pages:自己配置的页面。

Nginx配置

共有两个二级域名,一个是matrix-这个是后端,chat-这个是前端网页。

matrix的Nginx配置matrix.irithys.com.conf:

精简了一些不需要显示的配置。
upstream matrix_backend {
    server 127.0.0.1:<matrix端口> fail_timeout=0;
}

server
    {
        listen 80;
        listen [::]:80;
        server_name matrix.irithys.com ;

        location ~ /.well-known {
            allow all;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }

server
    {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        listen 8448 ssl http2 default_server;
        listen [::]:8448 ssl http2 default_server;
        server_name matrix.irithys.com ;

        location ~ /.well-known {
            allow all;
        }

        location / {
            # note: do not add a path (even a single /) after the port in `proxy_pass`,
            # otherwise nginx will canonicalise the URI and cause signature verification
            # errors.
            # 这里写出来
            proxy_pass http://matrix_backend;
            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 100M;
        }

        #location ~ ^(/_matrix|/_synapse/client) {
        location ~* ^(\/_matrix|\/_synapse\/client) {
            # note: do not add a path (even a single /) after the port in `proxy_pass`,
            # otherwise nginx will canonicalise the URI and cause signature verification
            # errors.
            proxy_pass http://matrix_backend;
            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 100M;
        }

        access_log  /home/wwwlogs/matrix.irithys.com.log;
    }
 

chat的Nginx配置chat.irithys.com.conf:

upstream matrix_element_backend {
    # the element server
    server 127.0.0.1:8845;
    keepalive 64;
}

server
    {
        listen 80;
        #listen [::]:80;
        server_name chat.irithys.com ;

        location ~ /.well-known {
            allow all;
        }

        location / {
            return 301 https://$host$request_uri;
        }

        access_log off;
    }

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name chat.irithys.com ;

        location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://matrix_element_backend;
            proxy_http_version 1.1;
            proxy_pass_request_headers on;
            proxy_set_header Connection "keep-alive";
            proxy_store off;
        }

        location ~ /.well-known {
            allow all;
        }

        access_log off;
    }

完成

在上述配置全部设置完毕后使用docker-compose up -d拉取镜像并运行。稍等片刻后...

打开Matrix的网址,如果Matrix成功运行,显示界面:

WN5HC.webp
什么?你说失败了?那不如联系我一起解决👍

然后打开Element-web的网址,显示界面:

欢迎界面

点击登录后可以显示出手书📝的单点登录按钮。

登录界面

因为在配置中已禁用注册,所以网页端注册按钮只是一个摆设😎,只能通过手书📝注册来访问。

进入聊天室,成功使用~

WNYot.webp

完结撒花🎉🎉🎉

标签

吕楪

博主.本博客的所有者,一切的开始。