【转】使用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

ubuntu 22.04 VPS ping: connect: Network is unreachable

新买了个VPS 有ipv6/64 但是ping不通ipv6 ping: connect: Network is unreachable
查看 /etc/netplan/50-cloud-init.yaml

network:
    version: 2
    ethernets:
        eth0:
            addresses:
            - 123.123.123.123/24
            - 2a10:cccc:ccc:ccc::/64
            gateway4: 123.123.123.1
            gateway6: 2a10:cccc:ccc::1
            match:
                macaddress: 22:ed:f8:f7:9f:a2
            nameservers:
                addresses:
                - 1.1.1.1
                - 8.8.4.4
                - 2606:4700:4700::1111
                search:
                - ht-hosting.de
            set-name: eth0

netplan apply 提示

gateway4 has been deprecated, use default routes instead. See the
'Default routes' section of the documentation for more details.
gateway6 has been deprecated, use default routes instead. See the
'Default routes' section of the documentation for more details.

于是去看 https://netplan.io/examples/
修改 /etc/netplan/50-cloud-init.yaml

network:
    version: 2
    ethernets:
        eth0:
            addresses:
            - 123.123.123.123/24
            - 2a10:cccc:ccc:ccc::/64
            routes: 
              - to: default
                via: 123.123.123.1
              - to: default
                via: 2a10:cccc:ccc::1
                on-link: true
            match:
                macaddress: 22:ed:f8:f7:9f:a2
            nameservers:
                addresses:
                - 1.1.1.1
                - 8.8.4.4
                - 2606:4700:4700::1111
                search:
                - ht-hosting.de
            set-name: eth0

然后

netplan generate
netplan apply

ping ipv6.google.com

PING ipv6.google.com(fra16s56-in-x0e.1e100.net (2a00:1450:4001:82f::200e)) 56 data bytes
64 bytes from fra16s56-in-x0e.1e100.net (2a00:1450:4001:82f::200e): icmp_seq=2 ttl=122 time=0.973 ms
64 bytes from fra16s56-in-x0e.1e100.net (2a00:1450:4001:82f::200e): icmp_seq=3 ttl=122 time=0.940 ms
64 bytes from fra16s56-in-x0e.1e100.net (2a00:1450:4001:82f::200e): icmp_seq=4 ttl=122 time=0.953 ms

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

ubuntu 运行FF14 和ACT

1 配置wine环境

export LANG=en_US.UTF8;
export LANGUAGE=en_US;
lutris

这时启动的是英文的lutris ,安装dotnet48很快,不会卡主,好像wine7.8修复了这个问题
手动配置一个wine游戏环境,设置容器目录为~/Games/14
禁用lutris 库,wine版本我用的lutris-fshack-6.21-6-x86_64 别的也可以

打开容器的winetricks 安装dotnet48 和cjkfonts
打开wine设置,系统修改为Windows 10

2 下载GE-Proton7-41 解压到 ~/Games
下载 FFXIV_ACT_Plugin.dll 放到 ~/Games/plugins
下载OverlayPlugin 解压后放到 ~/Games/plugins

https://github.com/ngld/OverlayPlugin/releases
https://advancedcombattracker.com/download.php
https://github.com/GloriousEggroll/proton-ge-custom/releases/tag/GE-Proton7-41

3 安装XIVLauncher-cn ,可以自行编译,也可以用flatpak的
打开XIVLauncher 设置游戏目录,wine 选择自定义 填写~/Games/GE-Proton7-41/files/bin/ 启用Fsync 保存关闭

4 复制~/Games/14 目录下所有文件到 ~/.xlcore_cn/wineprefix
下载dxvk-async 解压后复制x64文件夹中的dll到 ~/.xlcore_cn/wineprefixdrive_c/windows/system32/
下载ACT解压后更名为ACT移动到~/.xlcore_cn/wineprefixdrive_c/
https://github.com/TundraWork/FFXIV_ACT_Plugin_CN/releases
https://github.com/Sporif/dxvk-async/releases/tag/2.0

5 下载 https://codeload.github.com/valarnin/ffxiv-tools/zip/refs/heads/xlcore 解压到~/Games/
修改ffxiv-tools-xlcore/setup-stage1.php 中.xlcore为.xlcore_cn
删除ffxiv-tools-xlcore、helpers/ensure-aur-xlcore.sh CHECK_FOR_MPR() 段落

6 打开XIVLauncher-cn 运行游戏
终端进入~/Games/ffxiv-tools-xlcore/
./setup-stage1.php #会提示wine路径什么的
./setup-stage2.php #会提示你游戏进程没有关闭,去手动关闭,然后备份可以N其他Y
./setup-stage3.php #生成启动脚本和快捷方式

7 启动ACT ,添加插件,英文环境才可以启动ACT
修改~/.local/share/ffxiv-tools/ffxiv-run-act.sh
$PROTON_DIST_PATH/bin/wine64 为$PROTON_PATH/wine64

export LANG=en_US.UTF8;
export LANGUAGE=en_US;
~/.local/share/ffxiv-tools/ffxiv-run-act.sh

添加插件后在OverlayPlugin 中新建悬浮窗

8 启动游戏,打怪测试,这时多半是解析不了游戏数据的,ACT解析插件中测试一下游戏链接,会提示添加防火墙规则,添加一下,关闭ACT和游戏
运行一下./setup-stage2.php 最后的几行命令,可以多运行几次

sudo setcap cap_net_raw,cap_net_admin,cap_sys_ptrace=eip "~/Games/GE-Proton7-41/files/bin/wine"   
sudo setcap cap_net_raw,cap_net_admin,cap_sys_ptrace=eip "~/Games/GE-Proton7-41/files/bin/wine64"   
sudo setcap cap_net_raw,cap_net_admin,cap_sys_ptrace=eip "~/Games/GE-Proton7-41/files/bin/wineserver"   

再次测试

最后,可以修改~/.local/share/ffxiv-tools/ffxiv-run-act.sh 添加 export LANG=en_US.UTF8; 这样可以直接点击快捷方式启动ACT
~/.local/share/ffxiv-tools/ffxiv-run-game.sh 也可以添加,这样就可以使用卫月插件

卫月设置开启测试版插件后可以安装NextUI ,添加 ACT OverlayPlugin WSServer 的URL可以在游戏中显示悬浮窗

Screenshot_20221119_081419.png

感谢 银狸狸的视频 https://www.bilibili.com/video/BV1f84y1y7Fu/
PS:测试时关闭游戏后去手动结束一下卫月和XIXLauncher.Core进程

Read More

Ubuntu 22.04 安装UbuntuKylin kmre 移动运行环境

参考20.04的安装方法

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

但启动麒麟软件商店会初始化失败
sudo apt install pyqt5-dev-tools
sudo kylin-software-center-daemon (或者重启系统)

重新打开软件商店,可以安装移动应用了,但是启动并没有窗口弹出
下载旧版本kyliin-kmre-window并解压
https://archive.ubuntukylin.com/ubuntukylin/pool/partner/kylin-kmre-window_2.2-14.1_amd64.deb
替换/usr/bin/kyliin-kmre-window 为旧版本的

安卓应用就可以运行了

Read More

Ubuntu 20.04 使用UbuntuKylin kmre 运行安卓应用【更新】

以前写过在Ubuntu 20.04 中安装UbuntuKylin kmre运行环境,但我使用的不多。

最近要用的时发现不出现安卓应用的窗口,折腾一通终于发现了问题所在。
是kylin-kmre-window 这个包更新的问题,回退老版本可以解决,但会破坏依赖

于是下载旧版本kyliin-kmre-window并解压
https://archive.ubuntukylin.com/ubuntukylin/pool/partner/kylin-kmre-window_2.2-14.1_amd64.deb
替换/usr/bin/kyliin-kmre-window 为旧版本的

安卓应用就可以运行了

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