成功在群晖的 Docker 上自建了 Synapse 服务器.

2021-12-22 04:58:39 +08:00
 YamatoRyou
前情提要:
https://www.v2ex.com/t/750475
https://www.v2ex.com/t/605207

--------
Delta Chat 用了大半年的感受就是 bug 实在是太多了 (Windows 最多, Andorid 次之), 我甚至体验到网上很多人说的 "Windows 10 每更新一次都会带来新的 bug" 的感觉 (然而 DC 每次更新也都不痛不痒). 有时 Delta Chat 上一条本该立刻就收到的消息, 结果过了好几个小时才收到. 感觉这玩意根本达不到 "能用" 的程度.

以前的帖子里有人再次提到 Rocket.Chat; XMPP 和 Matrix.
于是我接下重试之前失败过的 Rocket.Chat. 这次部署成功, 但试用不到 1 小时就发现: 它在 Android 端不能后台推送通知 (只有当界面在前台显示才能在顶部显示通知, 而且这个通知横幅是嵌入界面内部的), 遂放弃 (对 Rocket.Chat 我反正是彻底死心了);
然后是 XMPP 协议的 ejabberd, 服务端问题不大, 客户端虽然选择很多, 但问题和 Delta Chat 一样, 大多数都很简陋. 挑了好久最后在 Android 上选择了 Conversations (使用过程中也发现了一些问题但我忘了是哪些), Windows 上是 Gajim (让我搞不懂的操作逻辑; 经常崩溃).
最后重试 Matrix 协议的 Synapse. 不知道我做了什么操作, 部署竟然很快就成功了. 对我这种 Linux 菜鸟简直就是惊喜. 为避免未来忘记部署的方法, 我一边实战, 一边写了一份非常详细的 step by step 教程备用.

我主观判断 Element (原 Riot) 的完成度在众多 Matrix 协议 IM 客户端中是最高的, 桌面版和 DC 一样是 Electron App (我不是职业开发者, 对 Electron 的认识只停留在用它编写的软件, 界面放在一个阉割过的 Chromium 内部并且支持跨平台). DC 上蛋疼的通知推送; 消息同步; 大文件传输; 图片粘贴; 托盘图标等问题, Element 统统不存在.
Android 版有不依赖 FCM 的 F-Droid 分支可选. 即使是国产安卓, 经过一番设置 (电池优化 + 通知权限) 也能收到通知推送.
iOS 就不清楚了, 我手上只有一个 iPhone 4S, 没法测试.

现状:
3 部 Android 手机 (未来还会增加); 1 台 Windows 10 笔记本; 1 台 Windows 7 台式机都用上了 Element.
还有一台 Windows 8.1 平板电脑, 因为桌面版 Element 不支持 32 位 Windows 的关系, 只能在浏览器使用 Element-web.
Docker 里额外部署了 matrix-commander, 能用命令行发送消息.

当然 Element 并不完美, 试用了 3~4 天后发现以下问题:
* 私聊聊天室头像有时会消失 (Windows; web);
* 无法更换头像 (Android);
* 无法记忆左侧边栏的宽度; 分类预览和项目排序, 这些设置会因为重新登录而丢失 (Windows; web);
* 无法默认禁用端到端加密 (Android; Windows; web, 双方同时在线的情况下因为要私聊而创建的房间是强制启用端到端加密的, 一旦启用就不能禁用. 看了一些文档说是需要服务端设置才行, 但我还没搞懂怎么弄);
* 手机与手机之间的语音呼叫大部分时候在连接阶段都非常慢 (Android, 同样的服务器, 同样的网络条件, 手机与 PC 却能瞬间接通);
* 消息列表右侧会强制预留一大片空白, 可能留给已读回执的显示 (Windows; web);
* 不支持设置详细的在线状态和个人简介 (Android; Windows; web);
* 界面语言总是被重置为英文 (会发生在重启 Element 时, 在 Windows 10 上发现, Windows 7 没有);
* 窗口坐标被重置 (会发生在重启 Element 时, 在 Windows 10 上发现, Windows 7 没有);

以上问题的发现, 均以使用自建的服务器为前提.
因为已经阶段性地满足了需求, 折腾自建 IM 服务大概要告一段落了.
9509 次点击
所在节点    NAS
62 条回复
AllenHua
2022-10-30 21:01:49 +08:00
请问楼主,安卓或 iOS Element 客户端注册时需要翻墙才能注册怎么解?朋友不会……

部署了一个 conduit ,虽然是自己服务器没有没樯,但是让朋友家人注册时普遍反馈是软件进不去,一直加载中,经过我后续的实验发现是 matrix.org 被墙,而他们又不会翻墙……

按理说只需要注册那会需要访问一下 matrix.org 交换一些信息,之后就只需要使用自己部署的服务器服务了。
YamatoRyou
2022-10-30 23:34:27 +08:00
@AllenHua
构造一个链接并转换为二维码: ```https://mobile.element.io/?hs_url=https://example.com:[port]```
```hs_url=```后面跟上你的服务器地址及端口.
实现通过事先跳转的方式略过了 matrix.org.

用户端:
Android 用户使用微信或支付宝的二维码扫描功能扫描上述链接 (但微信 / 支付宝扫描完成后需要手动从浏览器打开以拉起 Element, 还不如让这些用户额外安装第三方扫描应用);
iOS 用户使用系统自带的二维码扫描功能扫描上述链接.

相关: https://github.com/vector-im/element-android/issues/5097
就目前的 FTUE 还并不理想, 至少目前的 1.5.4 (Android) 也并没有做到更方便地连接到自定义服务器. 建议提 issue.
AllenHua
2022-10-31 11:08:21 +08:00
@YamatoRyou #42 测试了 iOS 可以,感谢。但是 android 不行,app 是从 F-Droid 下载的,这个不支持 android 吗
AllenHua
2022-10-31 12:53:38 +08:00
@AllenHua #43
@YamatoRyou #42 备用机安卓用微信扫了居然可以。感谢楼主提供信息。
YamatoRyou
2022-10-31 23:17:55 +08:00
@AllenHua 还是建议第三方扫描程序. element.io 可能会被拉黑导致阻止跳转.
AllenHua
2022-10-31 23:31:30 +08:00
@YamatoRyou #45 很奇怪,我用了第三方的扫描程序没能跳转,才登录上微信小号通过微信扫了然后成功跳转的。也许是我的扫描 app 问题吧。不用微信扫是正确的。
YamatoRyou
2022-11-01 05:25:44 +08:00
@AllenHua
我推荐几个能凑合用的:
1. https://play.google.com/store/apps/details?id=com.camvision.qrcode.barcode.reader
a) 启动较快;
b) 有广告但不占版面, 可接受;
c) 没有 GMS 的机器可以安装 (apk), 但尝试进入设置会让 app 崩溃;
d) 界面只有英文.

2. https://play.google.com/store/apps/details?id=com.srowen.bs.android
a) 无广告;
b) Android 版本 6.0 以上的机器均可安装 (apk), 但已停更数年, 对比例夸张的屏幕存在适配问题;
c) 有时识别比较慢.

以上都是我用过的, 说实话我都不满意, 但我也懒得再尝试别的了.
yangyang2022
2022-11-08 07:12:43 +08:00
楼主,可以写一下如何使用 docker matrix-commander 发送消息吗?比如发送“pve 服务器重启”到某个房间。
谢谢。
YamatoRyou
2022-11-08 08:41:03 +08:00
@yangyang2022

Shell 命令:
docker run --rm -v /volume1/docker/matrix-commander-new:/data:z matrixcommander/matrix-commander -m '这里填要发送的内容'

关键参数说明:
-v: 必需参数. 将包含 credentials.json 的文件夹映射到容器内的 /data 路径下. credentials.json 的内容:
{"homeserver": "http://<Synapse 容器地址及端口>", "device_id": "<设备 ID>", "user_id": "<要发送消息的账号完整 ID>", "room_id": "<承载消息的目标房间完整 ID>", "access_token": "要发送消息的账号的 token"}
如果你不想初始化, 可以直接从已经登录的客户端中照抄一份到上面的 JSON. 宿主机路径请酌情修改.

-m: 要发送的消息如果有换行不需要 "\n" 之类的转义, 直接在命令中使用回车键换行.

不推荐用 matrix-commander, 理由:
需要额外配置;
花在启动容器的时间就远远慢于直接用 curl;

除非要发送的内容不止纯文本.

----------
curl 版本 Shell 命令:
curl -H "Content-Type: application/json" -H "Authorization: Bearer <这里填账号的 token>" -s -X POST -d '{"msgtype": "m.text", "body": "这里填消息内容"}' "http://<Synapse 容器地址及端口>/_matrix/client/r0/rooms/<要发送消息的目标房间 ID>/send/m.room.message"

以上命令只适合纯文本内容. 要发送的消息如果有换行, 需要使用 "\u000a" 作为换行符.

----------
以上命令涉及到的容器 IP 地址使用的是内网 IP + 端口, 请酌情修改.
yangyang2022
2022-11-08 09:59:52 +08:00
@YamatoRyou 好的 实在感谢!
yy306525121
2023-01-16 09:34:30 +08:00
哈哈,我的 chat 就我和我媳妇两个人用, 这样聊天记录不会丢失, 现在平均每个月存档一次
troilus
2023-02-27 21:55:06 +08:00
@YamatoRyou 大佬,我使用的 docker ,环境变量启用了 httpsproxy ,iOS 也能正常收到推送,但是没法触发 Callkit ,这是什么原因呢? iOS 设备地区都改过,请问找到解决办法了吗?
YamatoRyou
2023-02-28 01:41:43 +08:00
@troilus
在 iOS 上触发 CallKit 需要同时满足以下条件 (测试环境为 iOS 15.6.1, iPhone 7 Plus):
系统区域需要设置为 "美国" (其它国家也可以试试);
手机所在的网络环境需要能翻墙 (或手机上正在使用能翻墙的 VPN).

网络环境很重要, 目的是骗过苹果的 APNS, 使其以为你在国外.

另外关于 iOS 推送, Synapse 容器如果不设置代理, 会导致 iOS 推送延后或丢失. 因为 Element for iOS 使用 matrix.org 作为推送网关, 但 matrix.org 已经被墙, 你即便当下能收到推送也只会时好时坏.
troilus
2023-02-28 08:39:44 +08:00
@YamatoRyou 试了下确实得翻墙收通知才能触发 CallKit
troilus
2023-03-01 16:52:43 +08:00
@YamatoRyou 试了下 nextcloud ,可以比较完美实现 callkit
mway
2023-03-07 16:24:17 +08:00
@YamatoRyou 请问您使用的是什么代理?我在 nas 安装了没法和其他域名下的用户联系,也没法加入公共房间。
yangyang2022
2023-03-08 23:36:12 +08:00
好像新版 element 支持 ntfy 推送了。xmpp 终于可以下课了。
Gary666666
2023-04-15 22:45:35 +08:00
视频语音呼叫时,被呼叫方看不到呼叫方的画面,一团黑,但能看到自己,视频中的语音正常,呼叫方视频语音一切正常,不知为啥
YamatoRyou
274 天前
@yangyang2022 #57 ntfy 甚至还能让自己的实例作为推送网关, 不用担心未来因为上级服务 (unifiedpush.org) 被墙导致 Android 客户端收不到推送.
asuraa
101 天前
@YamatoRyou 老哥请问一下你的 coturn 是怎么部署得?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/823651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX