IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    【转】使用docker搭建Synapse[Matrix]

    冷轩信发表于 2025-02-24 09:25:00
    love 0

    前言

    官方的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。 (2024年最新版要求postgresql13以上)

    拉取pg镜像并初始化pg库,挂载volume到上面规划的pg数据文件夹

    docker run --name postgres13 -v /data/synapse/postgres:/var/lib/postgresql/data -e   POSTGRES_PASSWORD=自定义PostgreSQL密码 -d postgres:13-alpine
    

    界面会显示容器的hash值,接着执行下面的命令创建一个用于连接数据库的synapse用户并输入你的密码

    docker exec -it postgres13 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 postgres13
    docker rm postgres13
    

    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:13-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
    

    原文链接 https://www.b612.me/code/223.html

    注意

    首次登录后请设置安全备份 使用安全密钥或安全短语,记住并保存,这样第二个设备登录后可以用第一个设备验证后自动解密聊天内容



沪ICP备19023445号-2号
友情链接