私有化部署 Signal 服务器最新版 v20250409.1.0

私有化部署 Signal 服务器最新版 v20250409.1.0

为什么要使用 Signal

维基百科说法,Signal是由Signal技术基金会和Signal Messenger LLC开发的跨平台加密消息服务。Signal经互联网发送一对一及组群消息,消息可包含图像及影片,它还可以用来经互联网作一对一及组群语音通话。是目前IM聊天软件中,加密效果最好的聊天工具之一。

还有个新闻,前一阵 Telegram 的老板去法国旅游,直接被逮住了,经过警察的 耐心劝说 ,Telegram 表示后续将与警方开展「广泛的合作,将可疑用户的IP地址与用户数据分享给警方」 _ 这下更突出了 Signal 端到端加密的重要了。当然 如果你用过 Telegram 的端到端加密你就更清楚了,tg 的加密功能 目前(2025-04-01)只能在移动端使用,且只有在线才会推送信息,使用体验实在不佳。更重要的是 Telegram 目前只有 PC 版开源了,手机版早已不再开源;类比 Signal,其服务端,客户端全部开源以供审计,安全性不言而喻。

Signal 所有代码,包括服务端,客户端均开源。网上有很多文章讲如何本地部署signal服务器,或私有化部署相关的。

首先是这里的 https://github.com/madeindra/signal-setup-guide ,过于陈旧了,数据库还是 PostgreSQL,至少 2022 年后已经全面替换为了 dynamodb 了。

这里有一篇文章,https://www.cnblogs.com/lixiaoran/p/14438428.html 比较详细的讲了如何编译部署 Signal 服务器,某亦参考了该文,乐意为其代盐,但一样的问题,其版本过于落后,服务端版本为 3.2.1 这至少已经是6~8年前的版本了,当前最新版服务器的部署,配置与旧版比较已大相径庭,且官方无任何这方面的资料。着实吃力。况且官方团队对软件功能上多年的迭代,已经加入了太多的第三方服务,第三方组件等,要在无任何资料的情况下搞定完全的私有化部署,需要对其服务端与客户端的整体代码结构,组织方式了然于胸 才能进行下去;

与上面那篇文章不一样的地方在于,我这里修改了部分代码以适配本地局域网运行,部分组件如加密货币与支付功能相关,以及其他不合国情之处,搞不定则直接注释了事,仅部署了主要服务器组件+三端客户端,搞定了基础的通讯以及日常使用;如果你恰巧也需要在内网环境部署或者仅仅想搞一下 signal 的私有化部署,可以联系我~ +signal: pfoxh.25 或者 tg: pfoxh25

所以在搞成功之后,这里将最近的折腾过程记录一下,以免遗忘.

准备工作

先明确目标,私有化部署Signal/本地部署Signal服务器,即要能完全将 Signal 运行在本地服务器上,即要能在一个封闭的内网中也能流畅运行与使用。所以涉及的第三方云服务,能修改就尽量修改;

硬件准备

服务器准备4C8G 或以上服务器,使用 ubuntu 22.04 其他发行版亦可,只要能安装使用 docker compose 即可。

域名准备

域名与证书配置,由于域名配置需要时间生效 建议先配置域名 ,同时申请泛域名证书,如果使用 aws 服务,则可以使用 cloudfront 配置,并直接使用 amazon 提供的证书;至少需要以下几个域名:

  • chat.signal
  • storage.signal
  • svr.signal
  • turn.signal
    可以使用三级域名甚至四级域名,如我注册 pfoxh25.cn ,则signal工作域名可以为 chat.signal.pfoxh25.cn, storage.signal.pfoxh25.cn, svr.signal.pfoxh25.cn ...

如果自行部署 s3,则再增加两个

  • s3.signal
  • s3-admin.signal

最新的Signal-Server 使用tus作为附件上传服务,可以考虑加一个 tus.signal;

证书可以使用 acme.sh 申请一个泛域名证书,并配置好自动更新

软件准备

除了 Signal 自身的业务组件外,还有其他如数据库,网关等中间件,完整部署过于复杂,于是顺势将各组件容器化,运行于 docker compose 内,如业务量更大,置于 kubernetes 内是个更好的选择。安装docker 与 docker compose,可以参考 docker 官方文档 https://docs.docker.com/engine/install/ubuntu/ 也可以直接使用

apt install docker.io docker-compose-v2 wget curl lrzsz unzip

配置一个普通用户 非root来执行

useradd -m pfoxh25
usermod pfoxh25 -a -G docker
su - pfoxh25
# 或者在 pfoxh25 用户里执行 newgrp docker

编译与试运行

最新版需要的JDK版本至少为 JDK21,可以下载 openjdk 或其他发行版均可,同时需要配置好maven 不赘述。

git clone https://github.com/signalapp/signal-server
git  checkout -b v20250409.1.0 -t tags/v20250409.1.0
cd signal-server
mvn clean package -DskipTests

编译完成后,下图所示即告完成,在 service/target 目录下可以找到编译后的 jar 文件 TextSecureServer-20250409.1.1-SNAPSHOT.jar ,但默认时该 jar 文件未编译为自包含的,所以无法直接运行,可修改 pom.xml 或使用maven将依赖收集到目录,通过命令行传递给 java 执行;早期版本的 Signal Server 的确会直接打包 fatJar 可直接运行,但后续版本已不再裸机部署转而使用 Docker 容器化,而docker容器的构建是「分层」的,如果每次打包时都出现一个200M+的 jar 包,则每次从服务器拉取的新版本的容器体积都是200M+,为降低每次构建容器时的「变更部分体积」,故而将依赖部分固定,只编译代码部分 jar。

所以这里再执行 maven 指令收集一下依赖,可以将所有的依赖 jar 文件复制到 service/target/libout 中

cd service
..\mvnw dependency:copy-dependencies -DoutputDirectory=target/libout

试着跑一下:

cd service
# org.whispersystems.textsecuregcm.WhisperServerService 是主类
java -cp target/libout/*;target/TextSecureServer-20250409.1.1-SNAPSHOT.jar org.whispersystems.textsecuregcm.WhisperServerService

毫无悬念的失败了

run signal first failed

运行失败主要原因之一是缺少配置文件,配置文件示例在 service/config 目录下,使用下面的命令重新运行试试:

cd service
java -Dsecrets.bundle.filename=config/sample-secrets-bundle.yml -cp target/libout/*;target/TextSecureServer-20250409.1.1-SNAPSHOT.jar org.whispersystems.textsecuregcm.WhisperServerService --version

20250409.1.1-dirty-SNAPSHOT

OK 这次总没毛病了,看上去至少编译没问题,且成功运行了一个小功能 (显示版本号)... _

那就按老规矩,看看 --help

signal cli show version and help

按提示,使用 server config/sample.yml 命令运行服务器看看:java -Dsecrets.bundle.filename=config/sample-secrets-bundle.yml -cp target/libout/*;target/TextSecureServer-20250409.1.1-SNAPSHOT.jar org.whispersystems.textsecuregcm.WhisperServerService server config/sample.yml 依然是 毫无悬念的失败了

img

接下来,使用 idea 打开工程目录,然后对着 java 提示的异常栈,一个个的解决吧~

服务配置

当前配置文件 config/sample.yml 包含如下项:

  1. logging 日志配置,无伤大雅,可默认
  2. metrics 运行时指标采集与监控 官方的监控依赖外部服务 datadog,可修改代码切换到 Prometheus/Grafana
  3. tlsKeyStore HTTPS 的证书密码,不重要,可以直接注释或删除此部分的代码 一般运行时都在外面套一个 nginx 网关,由网关或 CDN 处理 https 证书事宜
  4. stripe,braintree,googlePlayBilling,paymentsService,subscription,oneTimeDonations 均为支付/捐赠/货币相关,直接注释此部分代码即可 如有需要可换成自有支付系统 或其他虚拟币如 波场/USDT 等
  5. appleAppStore, appleDeviceCheck, deviceCheck 设备检查相关 没搞明白,暂时没碰
  6. dynamoDbClient 数据库配置,重要
  7. dynamoDbTables 数据库表配置 重要
  8. cacheCluster,pubsub,pushSchedulerCluster,rateLimitersCluster,messageCache redis 相关配置,其中部分redis 使用集群,部分则使用节点(实在是搞不懂,三天两头的变,24年底时还统一使用集群,几天就变了)
  9. directoryV2,svr2,dogstatsd,shortCode,storageService,registrationService,keyTransparencyService,turn 等 均为一些第三方服务配置 大部分可直接忽略或填一个假的值即可;
  10. badges 徽章功能,类似 QQ秀,可以自定义,如无需要可直接忽略,后面可以修改此部分自定义实现
  11. awsAttachments,cdn 附件与下载相关 用户头像 群头像的存储等也与之相关
  12. apn,fcm 为 苹果手机的推送服务与 Android 系统推送服务相关,国内可切换为极光或其他类似推送服务 纯内网部署则暂时忽略此部分配置
  13. zkConfig, callingZkConfig, backupsZkConfig, unidentifiedDelivery 通讯密钥配置 非常重要

完整功能配置极为复杂,正在完善中...

其他组件

完整功能的 signal 服务端至少应包含 Signal-Server 与上述所有服务组件,其他运维类组件未列举,部分组件 如客户端更新等未在上述列表中,此部分功能官方可能未开源

成功截图

  • 服务端

signal server run succeed

  • 客户端

signal android client

配置实在是复杂,如实践不成功的,有需要的可以联系我~ +signal: pfoxh.25 或者 tg: pfoxh25 万恶的腾讯封了我的v ...

posted @ 2025-04-16 18:56  pfoxh  阅读(1115)  评论(0)    收藏  举报