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

前言

官方的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

注意

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

Read More

arm64 VPS安装mailcow 邮局

git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
git checkout feat/arm64-cow
./generate_config.sh  #填写FQDN 设置时区

docker compose pull
docker compose up -d

Read More

docker-compose 安装maddy 邮件服务

docker-compose.yml

version: "3.5"
services:
  maddy:
    image: foxcpp/maddy:latest
    restart: unless-stopped
    ports:
      - "25:25"
      - "143:143"
      - "465:465"
      - "587:587"
      - "993:993"
    volumes:
      - ./maddydata:/data
    environment:
        # REPLACE DOMAINS WITH YOURS
      - MADDY_HOSTNAME=mx.example.com
      - MADDY_DOMAIN=example.com
    
  snappymail:
    image: ajanvier/snappymail
    volumes:
      - ./snappymail/data:/snappymail/data
    depends_on:
      - maddy
    ports:
      - "80:8888"

maddy.conf

下载 https://github.com/foxcpp/maddy/raw/master/maddy.conf.docker
放入maddydata文件夹改名maddy.conf

maddy SSL 证书

maddydata/tls/fullchain.pem
maddydata/tls/privkey.pem

dkim 记录

域名添加txt 记录 default._domainkey
复制 maddydata/dkim/example.com_default.dns 填入

添加账户

docker-compose exec maddy maddyctl creds create foxcpp@maddy.test
docker-compose exec maddy maddyctl imap-acct create foxcpp@maddy.test

snappymail 配置

mx.example.com/?admin 打开管理面板 用户admin 密码在snappymail/data/_data_/_default_/
snappymail 后台添加域名,设置主机地址为maddy IMAP端口993 SMTP 587

自定义nginx配置

nginx.conf https://github.com/ajanvier/docker-snappymail/blob/master/rootfs/etc/nginx/nginx.conf

已知问题

snappymail 收到新邮件无法查看,是个bug,推荐使用桌面客户端

内存占用真的很少,当然是没有垃圾邮件和病毒防护的
Screenshot_20230301_220246.png

Read More

甲骨文ARM使用 Mailcow 邮局《已有原生arm支持,本篇过期》

mailcow 是个很好的邮局系统,但是官方没有ARM版本,现在可以用 platform: linux/amd64 在arm上运行amd64的容器,另外有网友编译了一些镜像的arm版

ubuntu要安装qemu binfmt-support qemu-user-static ,debian11 安装 bullseye-backports qemu binfmt-support qemu-user-static

docker-compose.override.yml

version: '2.4'
services:
  unbound-mailcow:
    image: quay.io/mailcowarm64/unbound
  clamd-mailcow:
    platform: linux/amd64
  rspamd-mailcow:
   # image: quay.io/mailcowarm64/rspamd #我用了这个arm镜像后连接不上smtp 有待后续测试
    platform: linux/amd64
  php-fpm-mailcow:
    image: quay.io/mailcowarm64/phpfpm
  sogo-mailcow:
    platform: linux/amd64
    image: mailcow/sogo:1.114
  dovecot-mailcow:
    platform: linux/amd64
    image: mailcow/dovecot:1.21
  postfix-mailcow:
    image: quay.io/mailcowarm64/postfix
  acme-mailcow:
    image: quay.io/mailcowarm64/acme
  netfilter-mailcow:
    image: quay.io/mailcowarm64/netfilter
  watchdog-mailcow:
    image: quay.io/mailcowarm64/watchdog
  dockerapi-mailcow:
    image: quay.io/mailcowarm64/dockerapi
  solr-mailcow:
    image: quay.io/mailcowarm64/solr
  olefy-mailcow:
    image: quay.io/mailcowarm64/olefy

SOGo 和dovecot镜像 版本根据 https://github.com/mailcow/mailcow-dockerized/issues/879#issuecomment-1413271536 修改

SOGo 不能用,建议安装RoundCube 更新后可以使用

https://docs.mailcow.email/third_party/roundcube/third_party-roundcube/

Read More

修改电信卡为无忧卡套餐

天翼生活和微信公众号客服果然是说要携带本人身份证去营业厅

直接投诉工信部,然后有当地电信电话问在不在本地,我说不在,让他直接改。结果下午当地的人(装宽带的)到我家来了,知道我在家本地(这时我不在家),又想让我去营业厅

我表示直接就可以改的业务,我为什么要去营业厅,你们不给我办理,我就继续投诉

一小时后,电信10000电话,修改成功。下月生效

因为当初上门推销我母亲办理了129的套餐,我很不喜欢当地的电信人员

Read More

吐槽一下趣域

前段时间在趣域的域名交易买了2个.cat域名,然后就修改dns,结果有一个24小时后还没生效,找了客服,然后是修改成功了。
接着我又修改域名所有人信息,还是不生效,后来发现域名状态不对

Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Domain Status: clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited

clientUpdateProhibited 禁止更新域名信息,发了个服务单,第二天域名状态变成了OK,然后再次修改域名联系人信息
结果每次都是 The server encountered an internal error and was unable to complete your request.
Screenshot_20210922_221756.png
我每天尝试3次都是这样,直到昨晚再次尝试,终于提示成功
QQ截图20210921200758.png

然后我去查询whois,结果又是出现了上面的3个禁止状态,所以有事没有修改成功……
到现在whois信息还是之前注册域名的人的信息……

继续发工单,找客服吧

PS:
1.最开始修改信息就是提示的成功,之后再修改都是The server encountered an internal error and was unable to complete your request.当然信息是一直没有更新(因为有clientUpdateProhibited)。
2.隔几天,趣域修改域名联系人信息那里显示的信息会变的和whois显示的一样,而修改后不管有没有提示成功,也就是图2都会变成你提交的信息,然后再过几天又变成和whois的一样。
3.查了下趣域域名出售平台的cat域名,注册商为swhosting.com的都又上面的3个禁止状态。

Read More

Ubuntu 20.04 衍生版安装Ubuntu Kylin 移动应用环境

首先按麒麟官方的教程安装kmre

wget http://archive.ubuntukylin.com/ubuntukylin/pool/main/k/kylin-software-keyring/kylin-software-keyring_2021.04.21_all.deb 
sudo dpkg -i kylin-software-keyring_2021.04.21_all.deb
sudo apt update
sudo apt install linux-headers-`uname -r`
sudo apt install kmre kylin-kmre-modules-dkms kylin-software-center 
reboot

Read More

Mailu.io自定义Docker镜像使用Postgresql 数据库

setup.mailu.io 生成的master版本docker-compose.yml和mailu.env 使用postgresql和mysql 数据库时roundcube会启动不了,见 https://github.com/Mailu/Mailu/issues/1471

所以自己修改镜像来让Roundcube 也用上postgresql

下载mailu源码,进入webmails/roundcube目录,修改start.py 25-28行

os.environ.get("ROUNDCUBE_DB_USER","roundcube"),
os.environ.get("ROUNDCUBE_DB_PW"),
os.environ.get("ROUNDCUBE_DB_HOST",os.environ.get("DB_HOST","database")),
os.environ.get("ROUNDCUBE_DB_NAME","roundcube")

修改下面的,maildb为docker-compose.yml中为Roundcube准备的容器host

os.environ.get("ROUNDCUBE_DB_USER","roundcube"),
os.environ.get("ROUNDCUBE_DB_PW","roundcube"),
os.environ.get("ROUNDCUBE_DB_HOST","maildb"),
os.environ.get("ROUNDCUBE_DB_NAME","roundcube")

docker build -t roundcube . # 编译修改过的镜像

修改docker-compose.yml的webmail 镜像为roundcube

docker-compose.yml中添加

  maildb:
    restart: always
    image: postgres:12-alpine
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres"]
    environment:
      - POSTGRES_PASSWORD=roundcube
      - POSTGRES_USER=roundcube
      - POSTGRES_DB=roundcube
    volumes:
      - ./data/webmaildb:/var/lib/postgresql/data

然后就可以愉快的使用postgresql了

Read More

Hestiacp一个基于Vestacp的Linux web服务器面板

昨天在一个新的vps上安装Vestacp,结果安装不上,才发现Vestacp到现在都还不支持20.04。于是去Vestacp Forum搜索,发现了Hestiacp www.hestiacp.com . https://forum.vestacp.com/viewtopic.php?p=83143#p83143

相对于Vestacp做的一些改进

  1. 默认支持多版本php共存,可以为每个网站选择不同的php版本,Vestacp虽然也可以做到但不是官方支持,比较麻烦
    深度截图_选择区域_20200924095128.png
    深度截图_选择区域_20200924095226.png
  2. 自带文件管理器,而Vestacp 的文件管理器是要购买的,不过感觉Hestiacp的文件管理器功能有点弱,总比没有好,差强人意。要注意的是文件管理器的根是用户目录(/home/username)是到不了其他目录的
    深度截图_选择区域_20200924095239.png
  3. 邮件改进,Vestacp的webmail 是/webmail/不管哪个域名都可以访问,Hestiacp则是自动添加了webmail和mail的邮箱专用子域名。注意,如果要使用dkim的话,请从Web服务添加域名并选中DNS支持和邮箱支持,否则看不到dkim公钥(要去DNS服务里查看)
    深度截图_选择区域_20200924095427.png
Read More

再次试用CyberPanel

这次试用的是CyberPanel V2.0 先说感受,还是难用

问题
1,后台加载太慢,后台调用了https://code.jquery.com/jquery-3.2.1.min.js 国内打不开,即使用了科学后可以打开了后台还是慢的要死,一直在loading... 我只好F12删除loading的div

2,添加网站时可以选择设置dkim,之后在email那里有dkim manager ,然而不像别的面板那样直接提供v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BA 这样的让你去添加DNS设置,这里提供的是几段,不明白怎么组合

改进
1,后台备份下面有了个新的备份的条目,和上面的不同,可以在备份后直接选择恢复备份了

只试了不到1小时,后台慢的受不了,删了,还是用VestaCP

Read More