前言
官方的Synapse docker镜像仅给出了简单的用法,这里简单记录下自己使用docker compose来搭建synapse的过程,数据库使用postgres并同时启用redis。
搭建
首先,选择一个宿主机文件夹,用于存放synapse所有的数据,我的规划如下:
- Synapse数据:/data/synapse/data
- PostgreSQL数据: /data/synapse/postgres
- Redis持久化数据: /data/synapse/redis
PostgreSQL
pg库我选择了12.5版本,选择的镜像是postgres:12.5-alpine。
- 拉取pg镜像并初始化pg库,挂载volume到上面规划的pg数据文件夹
docker run --name postgres12 -v /data/synapse/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=自定义PostgreSQL密码 -d postgres:12.5-alpine
界面会显示容器的hash值,接着执行下面的命令创建一个用于连接数据库的synapse用户并输入你的密码
docker exec -it postgres12 createuser -U postgres --pwprompt synapse_user
执行下面的语句进入psql
docker exec -it postgres12 psql -U postgres
执行下面的建库语句用于建立一个synapse库
CREATE DATABASE synapse
ENCODING 'UTF8'
LC_COLLATE='C'
LC_CTYPE='C'
template=template0
OWNER synapse_user;
执行完毕后输入\q退出
*后续连接如果有问题,可以在postgres/pg_hba.conf中添加host synapse synapse_user all trust
*具体可以参看官方的Pg搭建手册
- 终止postgres的容器并删除
docker stop postgres12
docker rm postgres12
Synapse
接下来需要进行synapse的初始化
- 拉取Synapse镜像并生成配置文件
docker run -it --rm \
-v /data/synapse/data:/data \
-e SYNAPSE_SERVER_NAME=b612.im \
-e SYNAPSE_REPORT_STATS=yes \
matrixdotorg/synapse:latest generate
*里面的/data/synapse/data
需要更改为自己的配置文件夹地址,b612.im
需要改为自己的域名,SYNAPSE_REPORT_STATS=yes
表明允许匿名汇报你的Synapse信息
- 编辑Synapse生成的配置文件
文件地址为:/data/synapse/data/homeserver.yaml
找到database
配置项,注释掉原先的sqlite3配置,修改为postgres配置
database:
name: psycopg2
args:
user: synapse_user
password: synapse_user的密码
database: synapse
host: db
cp_min: 5
cp_max: 10
找到redis
配置项,修改为下述内容
redis:
enabled: true
host: redis
port: 6379
若需要启用email发信,找到email
配置项,配置即可(记得同时配置public_baseurl
)
配置docker compose
在/data/synapse
文件夹下新建docker-compose.yml文件,内容如下
version: '3'
services:
db:
restart: always
image: postgres:12.5-alpine
shm_size: 1024mb
networks:
- internal_network
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
volumes:
- ./postgres:/var/lib/postgresql/data
redis:
restart: always
image: redis:6.0-alpine
networks:
- internal_network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
volumes:
- ./redis:/data
synapse:
build: .
image: matrixdotorg/synapse
restart: always
ports:
- "127.0.0.1:8008:8008"
depends_on:
- db
- redis
networks:
- external_network
- internal_network
volumes:
- ./data:/data
networks:
external_network:
internal_network:
internal: true
保存后,执行 docker-compose up -d
即可启动Synapse进程
配置Riot web界面
Synapse没有自带的web界面,使用Riot(已更名为element)搭建一个web界面
在(https://github.com/vector-im/element-web/releases)[https://github.com/vector-im/element-web/releases]找到最新的预编译包并下载到服务器web文件夹中。
- 修改配置文件
cp config.sample.json config.json
修改m.homeserver中域名为自己的域名,m.identity_server建议使用https://vector.im
配置管理页面
riot(element)没有后台管理界面,可以使用synapse-admin搭建一个管理页面
docker run -d -p 8100:80 awesometechnologies/synapse-admin
配置nginx
不使用cdn
在不使用CND(如cloudflare)的情况下,配置nginx反向代理,参考如下
注意:8448端口必须开启,否则会无法与其它站通信
server {
listen 80;
listen [::]:80;
server_name 你的域名;
# Enforce HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 8448 ssl default_server;
listen [::]:8448 ssl default_server;
server_name 你的域名;
ssl_certificate 域名证书地址;
ssl_certificate_key 域名私钥地址;
root Riot所在地址;
client_max_body_size 1024M;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://你的域名"}}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
location ~* ^(\/_matrix|\/_synapse) {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
# 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
}
location /admin/ {
#最新的synapse版本(2022-06及以后版本)中,由于静态文件在代码中使用了绝对地址,所以需要进行地址替换
#建议使用子域名替代二级目录的访问方式
sub_filter_once off;
sub_filter "/static/" "/admin/static/";
#上面两行为需要进行地址替换的部分
proxy_pass http://localhost:8100/;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
使用CDN
使用CDN的情况下,由于大部分CDN无法转发8448端口,故需要在nginx配置中指定通信端口为443,示例配置如下
server {
listen 80;
listen [::]:80;
server_name 你的域名;
# Enforce HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 你的域名;
ssl_certificate 域名证书地址;
ssl_certificate_key 域名私钥地址;
root Riot所在地址;
client_max_body_size 1024M;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://你的域名"}}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
location /.well-known/matrix/server{
return 200 '{"m.server": "你的域名:443"}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
}
location ~* ^(\/_matrix|\/_synapse) {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
# 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
}
location /admin/ {
proxy_pass http://localhost:8100/;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
配置turn服务器
turn/stun 服务器允许用户间建立语音视频连接,搭建配置方式可以参考官方的教程:https://github.com/matrix-org/synapse/blob/develop/docs/turn-howto.md
注册一位新用户
docker-compose exec synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
March 11th, 2021 at 09:15 am
感谢感谢!非常需要!
站长能否再写一个turn/stun 服务器的搭建教程?官方的看不懂。。。
我搭建好的matrix服务器安卓与安卓、安卓与web之间通话视频是OK的,跟iOS不论是通话还是视频都提示缺失turn/stun 服务器
June 10th, 2023 at 09:47 pm
配置nginx这块看不明白,这个是一步一步下来就出现的还是通过.yaml的文件运行,没看到像docker run -d之类的命令运行,这块具体怎么做?
如果有幸被看到,还请解惑下,邮箱 [email protected]
February 29th, 2024 at 09:02 pm
配置Riot web界面 那步是npm部署的吗
March 2nd, 2024 at 07:59 pm
Github release界面有编译后的静态部署文件下载,不需要npm:https://github.com/element-hq/element-web/releases