Matrix 使用 mastodon 单点登录并搭建网页端
出于对自己搭建的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网站设置中打开开发,点击创建新应用
在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成功运行,显示界面:
什么?你说失败了?那不如联系我一起解决👍
然后打开Element-web的网址,显示界面:
点击登录后可以显示出手书📝的单点登录按钮。
因为在配置中已禁用注册,所以网页端注册按钮只是一个摆设😎,只能通过手书📝注册来访问。
进入聊天室,成功使用~
完结撒花🎉🎉🎉