V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
YamatoRyou
V2EX  ›  NAS

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

  •  
  •   YamatoRyou · 2021-12-22 04:58:39 +08:00 · 5118 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前情提要:
    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 服务大概要告一段落了.
    51 条回复    2023-01-16 09:34:30 +08:00
    dangyuluo
        1
    dangyuluo  
       2021-12-22 05:12:19 +08:00
    下一步就是怎么让亲朋好友注册账号了
    YamatoRyou
        2
    YamatoRyou  
    OP
       2021-12-22 06:09:14 +08:00
    @dangyuluo
    服务有 2 个主要目的:
    解决我没有微信之后 IM 需求. 实行计划分配制, 不开放注册. 总使用人数最多也就 5 个左右. 就算开放注册, 没有我的指导他们也是寸步难行.
    除了消息同步, 还能作为多个设备的云剪贴板.
    loading
        3
    loading  
       2021-12-22 08:35:30 +08:00
    有点谍战片的感觉了,自建 im 一般是是企业级应用,亲朋好友可能要友尽。
    matolv
        4
    matolv  
       2021-12-22 09:53:54 +08:00 via iPhone
    synapse 建在墙内没法启用 federation ,matrix 被 gfw 屏蔽了,会导致 ios 和 play store 的 element 都收不到消息。
    这东西我用了好几年了,现在版本比起当初了 0.x 已经算是可以用了,之前吃内存那是一个快,bug 又多,界面又不人性化。
    不建议 docker 安装,python3 虚拟环境是他最佳用法,然后 nginx 反代。另外视频 /语音通话需要 turn server ,原理是 webrtc 。
    如果你服务器端玩了比较生疏建议用 tg ,大陆 ios 是搜不到 element 的
    YamatoRyou
        5
    YamatoRyou  
    OP
       2021-12-22 10:02:41 +08:00
    @matolv
    我不打算联邦式, 虽说这是它的特色.
    Docker 对我来说也许是最佳选择, 直接绕过群晖的 webui 给系统加料可能会把系统给搞死, 尤其是我不熟悉的情况下.
    我在 2018 到今年年初换用 Delta Chat 之前用的是 TG, 它哪都好, 唯二的致命伤就是中文搜索和代理. 因为我长期独居, 代理一旦挂掉了就相当于失联, 我总不能动不动就跑回去给他们换代理吧.
    iOS 的话, 我在试用 Android 版 Element 的一瞬间就已经预感到它在 iOS 上推送也是个大问题. 鉴于周围亲属什么的用 iPhone 的非常少, 我还是暂时不考虑了吧.
    YamatoRyou
        6
    YamatoRyou  
    OP
       2021-12-22 10:04:50 +08:00
    @loading 因为我早在几年前就强行弃用了微信, 友尽这种结果早就经历过, 不在乎再来一次.
    qeqv
        7
    qeqv  
       2021-12-22 12:10:17 +08:00
    @YamatoRyou OP 是肉翻了吗,国内现在不用微信哪里都去不了,健康码强制让你用微信。另外怎么和父母沟通
    YamatoRyou
        8
    YamatoRyou  
    OP
       2021-12-22 17:04:24 +08:00
    @sevefev
    并没有, 而且我对 "健康码" 的需求极小 (属于能不用尽量不用). 如果在外要用, 通常是纸质健康码. 因为还没交接完成, 当下与家里人沟通用的仍然是 Delta Chat.
    zololiu
        9
    zololiu  
       2021-12-23 14:05:16 +08:00
    比较好奇为什么不直接使用群晖自带的 Chat 套件呢
    YamatoRyou
        10
    YamatoRyou  
    OP
       2021-12-23 18:04:37 +08:00
    @zololiu
    因为我用的是黑群晖, 即使是 Android 也无法接收推送, 我不能接受.
    我要和家里人用, 但它的界面专注办公场合, 易用性不足.
    不能发语音消息.
    我已经放弃它大概两年多了吧, 不知道现在有没有改善. 我猜不会.
    YamatoRyou
        11
    YamatoRyou  
    OP
       2021-12-23 18:13:07 +08:00
    @zololiu 关于没有推送, 可以想象一下这个问题在微信上会是什么结果:
    对方想要急切地联系你, 给你发无论文字或语音, 此时微信在后台, 手机却毫无动静.
    过了许久, 你打开微信, 这才知道对方早就已经连续发了好长一串, 而对方却心如死灰...
    同样地也适用于来电. 我曾经遇到过一台山寨手机, 对方给它打电话有接通的声音, 但这台手机毫无反应 (无论是听觉; 触觉还是视觉层面). 那么机主自然不会知道他有电话要接.
    des
        12
    des  
       2021-12-29 17:58:10 +08:00
    我打算试试 Rocket.Chat
    推送可以转发到网关,然后推到 bark 上,然后 url 跳转
    Android 可能你得自己想办法了,应该也有对应的 App
    不过需要写少量的代码
    des
        13
    des  
       2021-12-30 14:15:28 +08:00
    @YamatoRyou 发现了另外一个好用的,叫 mattermost 。
    支持推送,不过是推到他们的测试环境,然后走 APN/GCM
    YamatoRyou
        14
    YamatoRyou  
    OP
       335 天前
    @des
    我最近收了一个 旧 iPhone 专门测试 Element. Bark 也是我一开始考虑的选择, 但我发现它无法和 Synapse 联动 (比如监控如何触发一个推送通知, 以及这个通知是一般消息还是呼叫?). 由于我一直没解决这个问题, 遂放弃 Bark.
    后来我才知道只要用的是官方发布的 Element 就不用担心推送渠道问题. 只是 matrix.org 已经被墙, 可以用代理让容器连接到 matrix.org.

    自建的 Synapse 在 iOS 上的推送流向是这样的:
    Synapse 服务器 -> matrix.org -> APNS -> iOS 设备
    也就是说服务器管理员只需解决自建的 Synapse 与 matrix.org 的连接问题即可, 更关键的是: 它免费且不限量.
    des
        15
    des  
       335 天前
    @YamatoRyou 应该是有 webhook 之类的东西可以用的,可以参考一下这个是怎么配置的 https://github.com/matrix-org/sygnal
    或者直接在这个上面改,把 bark 的 apns key 复制过来,按照 bark 的数据格式,参考一下 bark 的代码。
    des
        16
    des  
       335 天前
    @YamatoRyou 写几行代码转换一下就好了,不用挂代理。原文是用的 Gotify ,换成 bark 应该也挺容易的
    https://blog.southfox.me/2021/11/%E4%B8%BAMatrix%E5%8A%A0%E5%85%A5%E6%8E%A8%E9%80%81%E5%8A%9F%E8%83%BD/
    MAIJIANBANG
        17
    MAIJIANBANG  
       249 天前
    @YamatoRyou 一直搞不定提醒问题,能否加一下你的 Element 请教一下提醒的问题?
    MAIJIANBANG
        18
    MAIJIANBANG  
       249 天前
    @YamatoRyou 我的 element: @maijianbang:THE ,盼回复
    YamatoRyou
        19
    YamatoRyou  
    OP
       248 天前
    @MAIJIANBANG 你的客户端收不到推送?
    Android 版本请从 F-Droid 下载, 如果应用常驻后台则可以接收推送. 设置 -> 通知的最下面有 "通知故障排除" 用于诊断推送的工作状态.
    iOS 无需任何设置. 但对于墙内的自建服务器, 应确保服务器能访问 matrix.org.
    MAIJIANBANG
        20
    MAIJIANBANG  
       248 天前
    @YamatoRyou 从 F-Droid 下载之后确实可以提醒了,谢谢。我是群晖搭建的,有什么办法让服务器能访问 matrix.org
    YamatoRyou
        21
    YamatoRyou  
    OP
       248 天前
    @MAIJIANBANG
    既然是群晖, 那我猜你的 Synapse 实例是 Docker 容器的形式. 但悲催的是 Docker 容器似乎只支持 HTTP/HTTPS 协议的代理. 这种可以为容器添加环境变量 `HTTPS_PROXY`, 值填写 `http://ip:端口`. 为了以防万一可以再添加一个变量 `HTTP_PROXY`, 值同上.
    我的方案是再起一个 Privoxy 容器, 专供 Synapse, 把上游 Socks5 代理转换为 HTTP 代理.

    Privoxy 配置文件参考:
    `
    listen-address 0.0.0.0:8081
    forward / .
    forward-socks5 ifconfig.me ip:端口 .
    forward-socks5 matrix.org ip:端口 .
    `

    代理搭建完成后测试代理是否生效:
    从 Synapse 容器启动终端, 输入命令:
    `
    curl https://ifconfig.me
    curl https://matrix.org/_matrix/push/v1/notify
    `
    第 1 个命令用于判断 Privoxy 的代理规则, 正确应返回代理服务器的 IP 地址.
    第 2 个命令如果返回 `405 - Method Not Allowed` 则成功, 这个要重复几次.
    如果手头有 iOS 设备和外区苹果 ID 建议用它测试 Element, 因为这是确保 iOS 版本能收到推送的唯一方式.
    YamatoRyou
        22
    YamatoRyou  
    OP
       248 天前
    @YamatoRyou 我本来是写了文案打算做成视频教程, 但我的口条水平似乎不允许. 再加上文案还在完善, 就先搁置了.
    MAIJIANBANG
        23
    MAIJIANBANG  
       247 天前
    @YamatoRyou 稳定的 https 代理不好找啊,有推荐的吗?我和家里人主要用 IOS ,另外我想利用 webhook 走 bark 通知,但是我打开 webhook 界面,提示“此集成管理器为离线状态或者其不能访问你的主服务器。”,这个怎么解决?
    YamatoRyou
        24
    YamatoRyou  
    OP
       246 天前
    @MAIJIANBANG
    无法解决, 因为我解决通知问题不靠这个.
    Bark 或 Gotify 这类并不是最佳选择, 语音视频呼叫及端到端加密消息靠这个转发可能会出现障碍.
    我认为你还不如选择 V 或 S 之类的节点放在 Docker 上. 至少能让苹果直接给你推送.
    这是我目前正在用的方案, 虽然节点有时仍然需要更换, 但有些节点能撑半个多月. 不行了就再换一个.

    这番体验下来我认为 Android 才是最适合 Element 的平台.
    YamatoRyou
        25
    YamatoRyou  
    OP
       246 天前
    @YamatoRyou
    效果如图.
    YamatoRyou
        26
    YamatoRyou  
    OP
       246 天前
    MAIJIANBANG
        27
    MAIJIANBANG  
       246 天前
    @YamatoRyou 羡慕啊,我再研究研究,主要是我是技术小白,搭建啥的都是跟网上教程走才会,头疼,期待大佬早日出遍详细点的教程!!!
    YamatoRyou
        28
    YamatoRyou  
    OP
       228 天前
    @MAIJIANBANG
    在这个问题上我犯了个错误, Element 来电画面取决于设备的 IP 地址. 有以下可能:
    a) 手机所处的网络环境有透明代理的梯子, 或手机正在挂梯子改变了 IP 地址, 导致苹果的推送服务认为该手机来自国外. 这种情况下来电能显示全屏画面;
    b) 国内 IP 则只能显示通知, 需要手动进入 Element 才能接听.

    可能是 CallKit 受政策限制导致的, 我试过更改 iOS 的地区和语言, 亲测无效.
    wgsgyes
        29
    wgsgyes  
       222 天前
    delta chat 要用好,关键是要挑选合适的邮件服务器。
    国内的 163 、QQ 用的 iamp 协议,似乎做了修改,delta chat 无法完美支持。
    国外的邮件服务器,有通达及时性缺陷( hotmail 勉强可以)。
    自建邮件服务器的话,估计很难解决垃圾邮件的问题。

    完美的解决方案是:使用境内世纪互联的 office365 邮箱。
    YamatoRyou
        30
    YamatoRyou  
    OP
       222 天前
    @wgsgyes
    对于自建的邮件服务器, 我当时的策略是这样的:
    由于专为 Delta Chat 服务, 所以 SMTP / IMAP 端口都是故意设置了非标准端口 (另一个原因是为了规避政策风险). 这会导致常见的邮件服务无法发送邮件到此服务器, 该服务器也无法发送邮件到这些邮件服务. 也就杜绝了垃圾邮件. 从去年年 2 月到 12 月底服务器存续期间从未收到过任何垃圾邮件 (测试时使用的是 QQ 邮箱和 Outlook).
    wgsgyes
        31
    wgsgyes  
       222 天前
    @YamatoRyou 垃圾邮件不是问题,收信策略严格就行。
    自建的邮件服务器,不管是 VPS 还是在自己家搭建,若发信量较大,哪天服务商把端口封了,工作就白费了。
    还不如全家统一公用的邮件服务器,比如 outlook ,Delta Chat 已经对所有信息加密了
    wgsgyes
        32
    wgsgyes  
       222 天前
    @YamatoRyou 抱歉,前面可能没表达清楚:自建邮件服务器,在发信量较大时,vps 或你的网络服务商,可能会误判你发垃圾邮件,造成服务不可用
    YamatoRyou
        33
    YamatoRyou  
    OP
       222 天前
    @wgsgyes 看你这么说有点后怕, 不过还好我早就停了.
    kernelt4sk
        34
    kernelt4sk  
       213 天前
    大佬有相关教程了吗。 一直尝试在群晖中搭建 一直未果 基本情况与大佬相同 稳定的就黑群一台 Linux 。
    YamatoRyou
        35
    YamatoRyou  
    OP
       213 天前
    @kernelt4sk
    已有一份比较完善的纯文字版 (无配图), 有做成视频的想法. 如果你急用可以先发给你参考.
    https://1drv.ms/t/s!AqJDCzhI3LndjmU7ZgBweNIhJiWN?e=GpO41G

    内容还在修改中, 不视为最终成品.
    YamatoRyou
        36
    YamatoRyou  
    OP
       213 天前
    @YamatoRyou
    在线预览如果乱码请下载到本地并更换编辑器再查看.
    kernelt4sk
        37
    kernelt4sk  
       212 天前
    @YamatoRyou 感谢大佬 成功跑起来了,还有些小问题 就是安卓无法解密消息 很奇怪。音视频巨卡甚至无法链接 估计 coturn 的问题。 再调试下
    YamatoRyou
        38
    YamatoRyou  
    OP
       212 天前
    @kernelt4sk
    这个问题通常发生在第 2 个及以上登录的设备, 可能是该设备没有交叉验证. 验证未通过的设备不会同步密钥到该设备导致消息无法在该设备上解密.
    coTURN 有公网 IPv4 时效果比较好, 我猜你配置的 coTURN 根本没有生效. 可以观察 coturn 容器的日志.
    SSH 执行命令:
    docker logs -t -f --tail 100 [容器名称]
    用你的设备开始呼叫, 观察日志的变化.
    kernelt4sk
        39
    kernelt4sk  
       212 天前
    @YamatoRyou 确实 看了相关日志 coturn 没生效, 虽然端口开放了 应该是配置文件哪里有问题。 顺便再尝试下整合 id server
    Achophiark
        40
    Achophiark  
       210 天前
    一直想搞一下加密聊天,看了这篇文章又不知道该怎么选择了。
    AllenHua
        41
    AllenHua  
       88 天前
    请问楼主,安卓或 iOS Element 客户端注册时需要翻墙才能注册怎么解?朋友不会……

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

    按理说只需要注册那会需要访问一下 matrix.org 交换一些信息,之后就只需要使用自己部署的服务器服务了。
    YamatoRyou
        42
    YamatoRyou  
    OP
       88 天前
    @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
        43
    AllenHua  
       88 天前
    @YamatoRyou #42 测试了 iOS 可以,感谢。但是 android 不行,app 是从 F-Droid 下载的,这个不支持 android 吗
    AllenHua
        44
    AllenHua  
       88 天前
    @AllenHua #43
    @YamatoRyou #42 备用机安卓用微信扫了居然可以。感谢楼主提供信息。
    YamatoRyou
        45
    YamatoRyou  
    OP
       87 天前
    @AllenHua 还是建议第三方扫描程序. element.io 可能会被拉黑导致阻止跳转.
    AllenHua
        46
    AllenHua  
       87 天前 via iPhone
    @YamatoRyou #45 很奇怪,我用了第三方的扫描程序没能跳转,才登录上微信小号通过微信扫了然后成功跳转的。也许是我的扫描 app 问题吧。不用微信扫是正确的。
    YamatoRyou
        47
    YamatoRyou  
    OP
       87 天前   ❤️ 1
    @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
        48
    yangyang2022  
       80 天前 via Android
    楼主,可以写一下如何使用 docker matrix-commander 发送消息吗?比如发送“pve 服务器重启”到某个房间。
    谢谢。
    YamatoRyou
        49
    YamatoRyou  
    OP
       80 天前
    @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
        50
    yangyang2022  
       80 天前 via Android
    @YamatoRyou 好的 实在感谢!
    yy306525121
        51
    yy306525121  
       11 天前
    哈哈,我的 chat 就我和我媳妇两个人用, 这样聊天记录不会丢失, 现在平均每个月存档一次
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1123 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.