私有化部署 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
毫无悬念的失败了

运行失败主要原因之一是缺少配置文件,配置文件示例在 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 吧

按提示,使用 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 依然是 毫无悬念的失败了

接下来,使用 idea 打开工程目录,然后对着 java 提示的异常栈,一个个的解决吧~
服务配置
当前配置文件 config/sample.yml 包含如下项:
- logging 日志配置,无伤大雅,可默认
- metrics 运行时指标采集与监控 官方的监控依赖外部服务 datadog,可修改代码切换到 Prometheus/Grafana
- tlsKeyStore HTTPS 的证书密码,不重要,可以直接注释或删除此部分的代码 一般运行时都在外面套一个 nginx 网关,由网关或 CDN 处理 https 证书事宜
- stripe,braintree,googlePlayBilling,paymentsService,subscription,oneTimeDonations 均为支付/捐赠/货币相关,直接注释此部分代码即可 如有需要可换成自有支付系统 或其他虚拟币如 波场/USDT 等
- appleAppStore, appleDeviceCheck, deviceCheck 设备检查相关 没搞明白,暂时没碰
- dynamoDbClient 数据库配置,重要
- dynamoDbTables 数据库表配置 重要
- cacheCluster,pubsub,pushSchedulerCluster,rateLimitersCluster,messageCache redis 相关配置,其中部分redis 使用集群,部分则使用节点(实在是搞不懂,三天两头的变,24年底时还统一使用集群,几天就变了)
- directoryV2,svr2,dogstatsd,shortCode,storageService,registrationService,keyTransparencyService,turn 等 均为一些第三方服务配置 大部分可直接忽略或填一个假的值即可;
- badges 徽章功能,类似 QQ秀,可以自定义,如无需要可直接忽略,后面可以修改此部分自定义实现
- awsAttachments,cdn 附件与下载相关 用户头像 群头像的存储等也与之相关
- apn,fcm 为 苹果手机的推送服务与 Android 系统推送服务相关,国内可切换为极光或其他类似推送服务 纯内网部署则暂时忽略此部分配置
- zkConfig, callingZkConfig, backupsZkConfig, unidentifiedDelivery 通讯密钥配置 非常重要
完整功能配置极为复杂,正在完善中...
其他组件
- https://github.com/signalapp/storage-service 存储服务 重要,无此服务则无法建群,无法保存用户头像信息等
- https://github.com/signalapp/coturn 音视频通话 turnserver ,重要,无此服务,则无法进行单人或群语音视频
- https://github.com/signalapp/registration-service 用户注册控制服务 重要,否则无法注册 无法登入
- https://github.com/signalapp/tus-server 附件存储服务,Signal 历史上多次变更其后端存储引擎,可以更换,如无此服务,则聊天附件功能无法使用
- https://github.com/signalapp/Signal-Calling-Service signal 自行实现的 SFU 音视频转发服务单元 无此服务则无法使用群聊音视频
- https://github.com/signalapp/SecureValueRecovery2 PIN 码验证服务,重要,用于创建或验证用户 PIN 码 运行该服务需要支持 intel sgx 加密计算的服务器,aws即亚马逊云服务器暂不支持 (但有计划适配 aws Nitro)
- https://github.com/signalapp/ContactDiscoveryService-Icelake 用户发现 重要,无此服务则客户端无法使用手机号码查找 与上面类似,运行该服务也需要 sgx
- https://github.com/signalapp/key-transparency-auditor 密钥透明度审计 暂时(2025/04)未与客户端整合 未来有这方面的计划 暂时可忽略
完整功能的 signal 服务端至少应包含 Signal-Server 与上述所有服务组件,其他运维类组件未列举,部分组件 如客户端更新等未在上述列表中,此部分功能官方可能未开源
成功截图
- 服务端

- 客户端

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

浙公网安备 33010602011771号