自己架設Bluesky PDS 並使用自己的Domain建立帳號
Bluesky 是一個去中心化的社交媒體平台,類似於 Mastodon或Misskey等去中心化聯邦宇宙平台,但使用的是自家開發的 AT Protocol 協定,因此沒辦法與聯邦宇宙的 ActivityPub 協議互通。
由於去中心化的技術架構,沒有單一的中央伺服器來控制用戶的資料和內容。用戶的數據存儲在個人的 PDS(Personal Data Storage)中,讓他們能夠更好地管理和保護自己的信息,目前最大的PDS就是Bluesky自己的bsky.social。
雖然Bluesky是可自行架設的社群平台,但它的特點在於它不提供前端網頁,而是專注於提供 API 通訊介面。使用者可以通過 bsky.app 的網頁版或 iOS、Android 應用程式,選擇不同的帳號託管服務供應商,將自己的帳號存放在各種伺服器上,當然也可以選擇自己架設PDS來存放自己專屬的資料。
什麼是PDS?
Personal Data Storage的縮寫,是讀取、寫入和主要儲存與帳號相關的資料的位置,Mastodon、Miskey等中的實例與此類似。
但Bluesky採用的AT協定,角色與前述的實例略有不同,從廣義上講,中繼伺服器從 PDS 收集發布資料和帳號配置文件,透過名為 AppView 的伺服器,再從各地PDS伺服器的資料聚合以建立時間軸和來源。
什麼是聯邦?
指聚合來自不同PDS的貼文和反應的系統,允許其他人接收來自其他 PDS 的貼文和反應,並透過相互交談和關注來相互交流。
Bluesky 使用稱為 AT 協定的規格進行連接,下圖是引用自官方文檔,PDS在最下面。
PDS 伺服器可以做什麼
PDS本身只是貼文、反應、追蹤關係等帳戶資訊的儲存位置,無法控制時間軸或動態上的貼文。
與官方的bsky.social不同,PDS 可以自行指派特定的網域,並且使用者可以使用該子網域作為handle。
使用範例
例如,有一家HOMO公司
HOMO公司有一個名為inmu.homo
的網域,並在https://inmu.homo
作為官網。inmu.homo
是HOMO公司擁有和經營的域名,因此通常不能由HOMO公司以外的任何人使用。
HOMO公司使用inmu.homo
這個域名設立 PDS,並使用以inmu.homo
結尾的handle建立帳戶,使用inmu.homo
這個域名才能保證該資訊是由HOMO公司本身或HOMO公司的其他部門發送的。
假設HOMO公司為每個人員建立帳戶並發布文章。
- 黑色高級車
blackcar.inmu.homo
- 田所浩二
Tadokoro.inmu.homo
- 三浦
miura.inmu.homo
- 中田
Nakada.inmu.homo
這些帳號都是在同一個PDS上的,一看就知道每個帳戶都屬於HOMO公司。
當屬於某個組織的個人發送貼文時,透過HOMO公司網域中的帳號發布貼文可以明確其身份,並防止第三方傳播虛假訊息,即使關閉了帳戶,也可以防止帳號被重新註冊,即可以防範第三方重新註冊獲得相同的handle並冒充欺騙其他使用者。
PDS 目前的限制
雖然 bluesky 開放自行架設PDS,但 PDS 聯邦仍處於開發階段。
目前自架 PDS 有以下限制。
- 每個 PDS 最多 10 個帳戶
- 每小時最多 1500 個事件(包括貼文、收藏、愛心轉發等)
- 每天最多 10,000 個事件
看來要大規模邀請朋友、熟人、或社群裡的人來使用還很長的路要走。
Bluesky PDS 伺服器規格建議
- OS:Ubuntu 20.04、22.04,Debian11、12 (只能用這幾個版本的OS,太高或太低都不能用)
- RAM:至少 2 GB RAM
- 存儲空間:至少 10 GB 可用空間
本文操作環境為 Ubuntu server 22.04,另外要自己準備一個域名。
安裝 Bluesky PDS 伺服器
下載 Bluesky 的伺服器安裝腳本
wget https://raw.githubusercontent.com/bluesky-social/pds/main/installer.sh
啟動安裝程式
sudo bash installer.sh
設定DNS domain與管理員信箱
輸入你用於PDS的domain ex:pds.example.com
Enter your public DNS address (e.g. example.com):
輸入你的信箱
Enter an admin email address (e.g. [email protected]):
之後就會開始安裝PDS,需要一到兩分鐘的時間。
安裝結束後會跳出是否建立第一的PDS帳號,這裡先選否,輸入N。
Create a PDS user account? (y/N) N
安裝完成後記得在DNS後台將你輸入的domain指向到你的PDS主機上,如果有防火牆或路由器,記得把 80 與 443 Port指向你的PDS主機。
Required Firewall Ports
------------------------------------------------------------------------
Service Direction Port Protocol Source
------- --------- ---- -------- ----------------------
HTTP TLS verification Inbound 80 TCP Any
HTTP Control Panel Inbound 443 TCP Any
Required DNS entries
------------------------------------------------------------------------
Name Type Value
------- --------- ---------------
pds.avantiblog.tw A Server's IP
*.pds.avantiblog.tw A Server's IP
Detected public IP of this server: Server's IP
打開瀏覽器輸入PDS主機的IP會顯示以下訊息,代表PDS主機正常運作中,如果網域DNS已經設定好則可以直接輸入PDS主機的domain看看是否可以連上。
設定SMTP伺服器
雖說PDS不需要SMTP伺服器也能運作,但是如果你要修改密碼或是更改用戶名以及刪除帳號的時候Bluesky PDS還是會發認證信到信箱,所以還是必須得設定。
編輯pds.env
sudo nano /pds/pds.env
將以下內容貼到文件最底下
#這行是設定SMTP伺服器URL,
PDS_EMAIL_SMTP_URL=smtps://user:[email protected]:465/
#將 [email protected] 替換成SMTP發信地址
[email protected]
如果你的SMTP伺服器為EXCHANGE or Office365 or Outlook,SMTP的URL的帳號為完整電子郵件,且帳號的@要換成URL格式。
#如果你的SMTP伺服器 EXCHANGE or Office365 or Outlook,SMTP的URL的帳號為完整電子郵件
smtp://username@example.com:[email protected]
#帳號的 @ 要換成 URL 格式
smtp://username%40example.com:[email protected]
如果SMTP伺服器是有SSL或TLS加密,記得將開頭的smtp://
改成smtps://
,並在後面加上阜號SSL 465 or TLS 587。
參照來源1:Invalid SMTP courier URL format
參照來源2:urlencoder.org
使用Resend作為SMTP伺服器
如果你覺得以上SMTP很麻煩,甚麼 Outlook、Gmail 的設定都不想弄,而且你想用自己的domain發信的話,可以選擇使用Resend作為SMTP服務。
建立Resend Domain記錄
首先登入Resend後台,選擇 Domain > Add domain 設定你要發信的域名,如bluesky.example.com
接著會請你到網域DNS後台添加幾筆紀錄。
來到DNS後台(以cloudflare為例),新增上述的一筆MX紀錄、兩筆TXT紀錄即可。
之後回到Resend,選擇Verify DNS Records,Resend會開始驗證DNS有沒有添加以上紀錄,如果都設定無誤都會通過。
建立Resend API Key
接著選擇選擇 API Keys > Create API Keys 建立SMTP發送密碼,Name隨便填一個辨識用的名子,Permission選擇Sending access,Domain選擇剛剛設定好的域名。
接下來會給你一組API Keys,這個密碼只會顯示一次,建議複製好後放到記事本之類的地方。
編輯pds.env
接下來回到上面設定 SMTP 的地方
將以下內容貼到文件最底下,將 YOUR_API_KEY_HERE 換成上面給你的 API Keys,信箱則改成你想發信的名子 + resend 上設定的 domain。
#將YOUR_API_KEY_HERE換成上一部給你的 API Keys
PDS_EMAIL_SMTP_URL=smtps://resend:[email protected]:465/
#將 [email protected] 替換成 SMTP 發信地址
[email protected]
註冊BlueSky帳號
PDS 伺服器搭建到這裡就差不多了,接下來就換到 BlueSky 註冊帳號。
產生邀請碼
首先在 PDS 主機上產生邀請碼,如果你的 PDS 主機可以與 Bluesky 正常通信的話應該會正常產生。
sudo pdsadmin create-invite-code
pds-avantiblog-tw-7r55q-kjrm5
註冊帳號
到Bluesky上註冊帳號,託管服務供應商預設是bluesky自己的,在託管服務供應商上選擇自訂,輸入你的PDS伺服器位置。
如果PDS可以正常通訊的話會看到輸入邀請碼以及電子郵件等欄位,如果出現無法連線到服務,就要檢查DNS有沒有指向到PDS主機,或是防火牆 or Proxy (如果有的話) 設定正不正確。
建立一個使用者代碼,後續一些基本設定可以先SKIP掉。
解決 Invalid Handle 無效的帳號代碼問題
開開心心註冊好帳號後,進到個人檔案頁面想要裝飾一下自己的profile,卻發現帳號名稱是Invalid Handle,這可能是 PDS 目前所存在的Bug,建立帳號時不會把 PDS 的 domain 套用上新註冊的帳號,所以目前必須手動去把 domain 加上去。
選取左邊欄的設定>進階設定>變更帳號代碼>選擇”我擁有自己的網域”
輸入使用者名稱 + PDS主機的網域 pds.example.com
,或是你想改用根網域 example.com
或其他網域 example.xyz
也可以。
之後到DNS後台,將上述的TXT紀錄新增上去就好了,在主機名稱記得將你的使用著名稱加上去。
再回到 Bluesky變更代碼頁面驗證網域,如果DNS設定無誤就可以驗證成功,再回到個人頁面就可以看到不會是 Invalid Handle 而是剛剛改好的 Handle 了。
以上就是如何架設 Bluesky PDS 伺服器到註冊 Bluesky 帳號的基本步驟,Bluesky本身仍在開發中,所以未來情況可能會發生變化,如果我還在用的話可能會回來更新這篇文章。
pdsadmin指令介紹
PDS安裝完成後,可以使用pdsadmin命令來在PDS主機上管理帳號。
雖然平常不太會去動他,但如果要對特定帳號做改動是蠻好用的。
以下介紹一些pdsadmin一些指令。
系統指令
啟動PDS
sudo systemctl start pds
停止 PDS
sudo systemctl start pds
PDS狀態確認
sudo systemctl status pds
管理指令
顯示 PDS 中的帳號清單
sudo pdsadmin account list
建立一個帳號,輸入電子郵件地址和 handle 以在 PDS 上建立帳號
sudo pdsadmin account create [email] [handle]
刪除帳號,實際資料會被刪除,所以一旦刪除就無法恢復。
sudo pdsadmin account delete [did:plc:abcdef123456]
凍結帳號,凍結的帳號無法發布或更新個人資料,其他帳號也看不到凍結帳號的個人資料,如果該帳號已登錄會被登出。
sudo pdsadmin account takedown [did:plc:abcdef123456]
解凍帳戶,先前發布的內容會被恢復,其他帳號也可以重新看到該帳號。
sudo pdsadmin account untakedown [did:plc:abcdef123456]
密碼重設,該使用者會收到一個新密碼,可以使用該密碼登入。如果切換帳戶會被立即登出。
sudo pdsadmin account reset-password [did:plc:abcdef123456]
PDS更新,如果有新的PDS版本發布,可以使用該指令將PDS更新到最新版本。帳戶和資料和所有內容都會保留,compose.yml設定文件會被重置
sudo pdsadmin update
參考來源
atproto.com – Self-hosting
github.com – bluesky-social/pds
tedliou.com – [軟體教學] 自架 Bluesky PDS 伺服器,促進去中心化社群發展
zenn.dev – PDSを建ててBlueskyの連合に参加する (0.4.0-beta)
rafaeleyng.github.io – Self-hosting a Bluesky PDS and using your domain as your handle