前言

官方的Synapse docker镜像仅给出了简单的用法,这里简单记录下自己使用docker compose来搭建synapse的过程,数据库使用postgres并同时启用redis。

搭建

首先,选择一个宿主机文件夹,用于存放synapse所有的数据,我的规划如下:

PostgreSQL

pg库我选择了12.5版本,选择的镜像是postgres:12.5-alpine。

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搭建手册

docker stop postgres12
docker rm postgres12

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信息

文件地址为:/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