私有化部署 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 了。
這里有一篇文章,http://www.rzrgm.cn/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號