基于Docker私有化部署属于自己的去中心化聊天系统

一直想搞一套自己的聊天系统,因为目前已知的QQ、微信之类的都是别人的站在安全和法律层面看,这些都是不太友好的,我记得这套系统我上次部署的时候是在两三年前吧,那个时候技术能力有限,语音和视讯的问题一直没解决,今时不同往日了,哈哈!
Matrix Synapse是一款去中心化的聊天系统,它是点对点通信,会对聊天的内容进行加密,在没有密钥的情况下,任何人都无法解密消息,一定程度上保护了用户数据和隐私的安全,本文仅用于学习交流,不用于违法犯罪用途,若你们自己拿去干违法犯罪的事的话,要自己承担法律责任,本人不承担任何因你们用于违法犯罪用途而带来的法律责任!
重要的事情说三遍,不得用于违法犯罪用途!
重要的事情说三遍,不得用于违法犯罪用途!
重要的事情说三遍,不得用于违法犯罪用途!

一、系统环境

1、Alpine系统
2、Docker
3、Synapse容器镜像
4、Nginx容器镜像
5、Postgresql容器镜像
6、Coturn容器镜像
7、Let’s Encrypt证书(腾讯阿里云随便申请)
8、ZeroSSL证书 点这里官方申请
9、Matrix客户端 点击这里官方下载

我这边用的是工控机小盒子,2+32G的,使用人数多的话可以考虑扩容。

二、Alpine安装部署部分

1、刻录Alpine系统安装盘

这部分也没什么难的吧,就是下个BalenaEtcher,然后把Alpine镜像写进去到U盘就行,U盘我用的是8G的。

2、Alpine系统安装

这部分还是有点东西的,听我细细道来
引导进入Alpine后,默认用户是root,密码为空,因为你还没安装系统
然后输入下面的命令来将Alpine装到硬盘里

开始安装

1
setup-alpine

选择键盘布局

1
us

选择键盘语言

1
us

设置主机名

1
回车

初始化网卡eth0

1
2
回车  
回车,通过DHCP获取IP地址

初始化网卡eth1

1
2
回车  
回车,通过DHCP获取IP地址

问你要不要手动配置网络

1
回车

设置root密码

1
输入你需要设置的root密码,要输入两遍

设置时区

1
PRC

设置http代理

1
回车

设置你要运行的NTP客户

1
回车

选择一个mirrors方式

1
2
f 
需要等待一会

设置一个用户

1
回车

设置SSH服务器

1
回车

是否允许root用户登陆

1
yes

设置ssh key

1
回车

选择要安装的磁盘

1
2
sda
这里要根据你自己实际情况选择,我的硬盘只有一块sda,所以选择sda

设置磁盘类型

1
2
lvm
为了方便后面扩容,所以我选择lvm

设置磁盘用途

1
2
sys
设置为系统盘

清除磁盘所有数据

1
y

然后重启下,系统就装好了。

三、Synapse配套容器部署

1、下载容器
1
2
3
docker pull matrixdotorg/synapse  
docker pull bitnami/postgresql
docker pull coturn/coturn

这里nginx需要定制,写个Dockerfile

1
vi Dockerfile
1
2
3
FROM nginx:latest
WORKDIR /data/nginx
CMD ["nginx", "-g", "daemon off;", "-c", "/data/nginx/nginx.conf"]

执行Dockerfile

1
docker build -t nginx:custom .
2、创建所需的文件夹
1
2
3
4
5
6
7
mkdir -p /data/nginx/v_hosts
mkdir -p /data/nginx/logs
mkdir -p /data/synapse/config
mkdir -p /data/synapse/ssl_cert
mkdir -p /data/synapse/datas
mkdir -p /data/postgresql
mkdir -p /data/coturn/my.conf/
你需要申请两份证书,理论上一份就够了,但是我没试过,反正我用两份,一分是Let’s Encrypt颁发的SSL证书,一份是ZeroSSL颁发的证书,之所以需要两份,是因为官方说,如果证书是Let’s发的,那么TLS/DTLS 将无法与任何使用 Chromium WebRTC 库的 Matrix 客户端配合使用。换句话说,如果用它家的证书,那么你的coturn服务在TLS这块可能会有问题,所以,我把Let’s的证书给synapse用,Zero的证书给coturn用。

你需要将你申请的Let’s证书放到 /data/synapse/ssl_cert
将Zero的证书放到 /data/coturn/my.conf

3、编辑nginx配置文件
1
2
cd /data/nginx
vi nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
user  nginx;
worker_processes 1;

error_log /data/nginx/logs/nginx_error.log debug;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /data/nginx/logs/nginx_access.log main;

gzip on;
gzip_min_length 1;
gzip_comp_level 9;
gzip_types text/css text/plan text/xml text/javascrip application/javascript application/x-javascript application/html application/xml application/json image/png image/jpg image/jpeg image/gif image/ico image/icon image/webp image/svg+xml;


sendfile on;
server_tokens off;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /data/nginx/v_hosts/synapsehttps.conf;
}
1
vi /data/nginx/v_hosts/synapsehttps.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
access_log /data/nginx/logs/https_synapse_access.log main;
error_log /data/nginx/logs/https_synapse_error.log debug;

server_name abc.com;

ssl_certificate /data/synapse/ssl_cert/abc.com.crt;
ssl_certificate_key /data/synapse/ssl_cert/abc.com.key;

location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://synapse:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
add_header X-Frame-Options SAMEORIGIN;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, HEAD" always;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, Date" always;

client_max_body_size 1024M;

proxy_http_version 1.1;
}
}
4、生成synapse的配置文件和key
1
2
3
4
5
6
7
8
9
10
11
docker run -it --rm \
--mount type=bind,src=/data/synapse/config,dst=/data/synapse/config \
--mount type=bind,src=/data/synapse/datas,dst=/data/synapse/datas \
--mount type=bind,src=/data/synapse/ssl_cert,dst=/data/synapse/ssl_cert \
-e SYNAPSE_SERVER_NAME=abc.com \
-e SYNAPSE_REPORT_STATS=yes \
-e SYNAPSE_HTTP_PORT=8008 \
-e SYNAPSE_CONFIG_DIR=/data/synapse/config \
-e SYNAPSE_CONFIG_PATH=/data/synapse/config/homeserver.yaml \
-e SYNAPSE_DATA_DIR=/data/synapse/datas \
matrixdotorg/synapse:latest generate
5、修改Synapse的homeserver.yaml文件
1
2
cd /data/synapse/config
vi homeserver.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server_name: "abc.com"
pid_file: /data/synapse/datas/homeserver.pid
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
resources:
- names: [client, federation]
compress: false
database:
name: psycopg2
args:
user: root
password: dabaicai@QQ.com
port: 5432
dbname: synapse
host: postgresql
max_upload_size: 1024M
log_config: "/data/synapse/config/abc.com.log.config"
media_store_path: /data/synapse/datas/media_store
registration_shared_secret: "I;9dawdwdXtyoUZnD-j,y,c4Te:Gh-SuqscPI*K+iudawfMdBf"
report_stats: true
macaroon_secret_key: "zWKv9cdasfawsda^3:iz=UJd,W+Zl=7iw^FErbdawdasfaP&e9Xp"
form_secret: "LY9tzBafwfgqa:DWHCL_m8FciUxuW_=GAi+cLRsdwafasa-dwaf"
signing_key_path: "/data/synapse/config/abc.com.signing.key"
tls_certificate_path: "/data/synapse/ssl_cert/abc.com.crt"
tls_private_key_path: "/data/synapse/ssl_cert/abc.com.key"
turn_uris: [turn:co.abc.com:5349]
turn_username: "ceshi"
turn_password: "ceshi123"
turn_user_lifetime: 86400000
turn_allow_guests: false
trusted_key_servers:
 - server_name: "abc.com"

其实你只需要改下域名,把数据库改成postgresql的然后指向你的ssl证书位置再加个turn服务就行了,也没啥改的

6、配置turnserver配置文件
1
2
cd /data/coturn/my.conf
vi turnserver.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
listening-device=ens33
listening-port=3478
tls-listening-port=5349
listening-ip=0.0.0.0
listening-ip=[::]
external-ip=co.abc.com
min-port=49152
max-port=65535
verbose
fingerprint
lt-cred-mech
use-auth-secret
static-auth-secret=123456
server-name=co.abc.com
user=ceshi:ceshi123
realm=co.abc.com
cert=co.abc.com.crt
pkey=co.abc.com.key
cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"
CA-file=ca_bundle.crt
no-stdout-log
log-file=/var/tmp/turn.log
syslog
no-rfc5780
no-stun-backward-compatibility
response-origin-only-with-rfc5780
7、创建docker网络
1
docker network create synapse-network
8、运行postgresql容器
1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d \
--name postgresql \
--network synapse-network \
-v /data/postgresql:/bitnami/postgresql \
-e POSTGRESQL_PASSWORD=dabaicai@QQ.com \
-e POSTGRESQL_USER=root \
-e POSTGRESQL_DATABASE=synapse \
-e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
-e POSTGRESQL_PORT_NUMBER=5432 \
-p 0.0.0.0:5432:5432 \
-p [::]:5432:5432 \
--restart=always \
bitnami/postgresql:latest
9、运行coturn容器
1
2
3
4
5
6
7
cd /data/coturn

docker run -d --network=host \
--name coturnserver \
-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \
--restart=always \
  coturn/coturn
10、运行nginx容器
1
2
3
4
5
6
7
8
9
10
11
docker run -d \
--name nginx \
--network synapse-network \
-v /data/nginx/nginx.conf:/data/nginx/nginx.conf:ro \
-v /data/nginx/v_hosts:/data/nginx/v_hosts:ro \
-v /data/nginx/logs:/data/nginx/logs \
-v /data/synapse/ssl_cert:/data/synapse/ssl_cert:ro \
-p 0.0.0.0:9832:9832 \
-p [::]:9832:9832 \
--restart=always \
  nginx:custom
11、运行synapse容器
1
2
3
4
5
6
7
8
9
docker run -d \
--name synapse \
--network synapse-network \
--mount type=bind,src=/data/synapse/config,dst=/data/synapse/config \
--mount type=bind,src=/data/synapse/datas,dst=/data/synapse/datas \
--mount type=bind,src=/data/synapse/ssl_cert,dst=/data/synapse/ssl_cert \
-e SYNAPSE_CONFIG_PATH=/data/synapse/config/homeserver.yaml \
--restart=always \
  matrixdotorg/synapse:latest
12、创建用户
1
2
3
参数-a是设置成管理员的意思,我们需要先生成一个管理员,再来生成普通用户

docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/synapse/config/homeserver.yaml -u guanliyuan -p Abcd123* -a
1
2
3
4
生成普通用户  
docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/synapse/config/homeserver.yaml -u putong -p Putong123*

这里会问你要不要设置成管理员,输入no然后回车就行

然后使用客户端登陆就行了,打开客户端选择自己的家庭服务器,地址格式是https://域名,比如https://abc.com,如果你修改了nginx的端口,那就是https://abc.com:你的端口

四、总结

Synapse是软件服务,将数据存入到postgresqsl中,然后nginx反向代理synapse,coturn是用来拨打语音和视讯的。
我搞了半天都没搞懂为什么IPV6也还是需要coturn,理论上IPV6是可以直接对外访问的,应该无需coturn服务才对,有意思的是,在内网的话,语音和视讯是正常的,唉,摸不着头脑!

上面就是部署步骤了,有不懂的可以微信或QQ联系我,不收费!

五、微信扫一扫关注我吧

戴戴的Linux 戴戴的Linux

文章目录
  1. 1. 一直想搞一套自己的聊天系统,因为目前已知的QQ、微信之类的都是别人的站在安全和法律层面看,这些都是不太友好的,我记得这套系统我上次部署的时候是在两三年前吧,那个时候技术能力有限,语音和视讯的问题一直没解决,今时不同往日了,哈哈!
  2. 2. Matrix Synapse是一款去中心化的聊天系统,它是点对点通信,会对聊天的内容进行加密,在没有密钥的情况下,任何人都无法解密消息,一定程度上保护了用户数据和隐私的安全,本文仅用于学习交流,不用于违法犯罪用途,若你们自己拿去干违法犯罪的事的话,要自己承担法律责任,本人不承担任何因你们用于违法犯罪用途而带来的法律责任!
  • 重要的事情说三遍,不得用于违法犯罪用途!
  • 重要的事情说三遍,不得用于违法犯罪用途!
  • 重要的事情说三遍,不得用于违法犯罪用途!
  • 一、系统环境
  • 二、Alpine安装部署部分
    1. 1、刻录Alpine系统安装盘
    2. 2、Alpine系统安装
  • 三、Synapse配套容器部署
    1. 1、下载容器
    2. 2、创建所需的文件夹
      1. 1. 你需要申请两份证书,理论上一份就够了,但是我没试过,反正我用两份,一分是Let’s Encrypt颁发的SSL证书,一份是ZeroSSL颁发的证书,之所以需要两份,是因为官方说,如果证书是Let’s发的,那么TLS/DTLS 将无法与任何使用 Chromium WebRTC 库的 Matrix 客户端配合使用。换句话说,如果用它家的证书,那么你的coturn服务在TLS这块可能会有问题,所以,我把Let’s的证书给synapse用,Zero的证书给coturn用。
    3. 3、编辑nginx配置文件
    4. 4、生成synapse的配置文件和key
    5. 5、修改Synapse的homeserver.yaml文件
    6. 6、配置turnserver配置文件
    7. 7、创建docker网络
    8. 8、运行postgresql容器
    9. 9、运行coturn容器
    10. 10、运行nginx容器
    11. 11、运行synapse容器
    12. 12、创建用户
  • 四、总结
  • 五、微信扫一扫关注我吧


  • 本站总访问量 本文总阅读量