PDSが1台……PDSが2台……
10月中旬、Xによるブロックの仕様変更によりBlueskyユーザーが急増することになりました。https://bsky.app/profile/gigazine.net/post/3l6qt3srqr72c
私の運営しているカスタムフィードRepostNextPostもその影響を受けてデータ受信が追いつかず、反映するまで遅延が発生することに……結局1ヶ月ほど遅延と戦ってたんですが、さすがにサーバーの性能も限界かなと思い、新しいサーバーに移行・カスタムフィードのデータ受信をFirehoseからJetstreamに変更することにしました。 https://bsky.app/profile/l-tan.dolciss.net/post/3lbuaef6des25
ただこのサーバー、カスタムフィードと一緒にPDSも動いておりまして、新しいサーバーにも空っぽのPDSを入れていました(PDSと一緒に入るCaddyでカスタムフィードのアクセスも捌いていたため)。今までは同じアドレスに設定して、前のサーバーからまるっとPDSのデータを移すことで移行してたんですが、
🤔「せっかくサーバーが2台平行稼働してるんだし、アカウント移行を試せば良いのでは……?」
ということで、運営のBryan(@bnewbold.net)さんが書かれた Migrating PDS Account with goat を参考にやってみることに。記事内にもありますが、さらにアカウント移行の仕組みや流れはDaniel(@dholms.xyz)さんの ACCOUNT MIGRATION · bluesky-social/pdsが詳しいです。
手順としては自動と手動があり、自動で失敗しても続きを手動でできるとありますが、今回は旧サーバーの期限も迫っていることもあって自動で試してみることにします。
注意
本記事のアカウント移行は、"サードパーティーPDS"から"サードパーティーPDS"へのアカウント移行です。 Bluesky公式のPDS(*.us-(ea|we)st.host.bsky.network、いわゆるきのこPDS)からの移行も可能かと思いますが、2024年現在公式PDSに戻る方法は用意されていないため、お気を付けください。当然ながら本記事の手順を実行してアカウントやデータの喪失があったとしても、当方で責任は取れませんのであしからず……
移行前の準備
PLCデータ
ひとまず移行前のアカウントのPLCデータは次のとおり https://web.plc.directory/did/did:plc:yudyb347zpi23jrzmiu7g7ar
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/multikey/v1",
"https://w3id.org/security/suites/secp256k1-2019/v1"
],
"alsoKnownAs": [
"at://l-test.pds.dolciss.net"
],
"id": "did:plc:yudyb347zpi23jrzmiu7g7ar",
"service": [
{
"id": "#atproto_pds",
"serviceEndpoint": "https://pds.dolciss.net",
"type": "AtprotoPersonalDataServer"
}
],
"verificationMethod": [
{
"controller": "did:plc:yudyb347zpi23jrzmiu7g7ar",
"id": "did:plc:yudyb347zpi23jrzmiu7g7ar#atproto",
"publicKeyMultibase": "zQ3shMpqkdyUDL2R2xGGahowEcWojP2CoMVGLeHU9wpmAPW7y",
"type": "Multikey"
}
]
}
設定値の準備
また先述の記事には、以下の情報が必要と書かれていますのであらかじめ準備しておきます。
- your existing account credentials ($ACCOUNTDID, $OLDHANDLE, $OLDPASSWORD)
- the new PDS host and service DID ($NEWPDSHOST, $NEWPDSSERVICEDID)
- invite code for the new PDS ($INVITECODE)
- desired new PDS handle and credentials ($NEWHANDLE, $NEWEMAIL, $NEWPASSWORD)
1つめは移行前のアカウントの情報
- $ACCOUNTDID → 上のPLCデータからもわかるとおり
did:plc:yudyb347zpi23jrzmiu7g7arです - $OLDHANDLE →
l-test.pds.dolciss.net - $OLDPASSWORD → 設定したパスワード(アカウント操作を含むので、アプリパスワードではなく本パスワード)
2つめは新しいPDSの情報
- $NEWPDSHOST →
https://pds2.dolciss.netとしました - $NEWPDSSERVICEDID → 基本的にそのまま
did:web:pds2.dolciss.net
3つめは新しいPDSの招待コード
- $INVITECODE → 新しいサーバーで
sudo pdsadmin create-invite-codeを実行して生成します
4つめは移行先のアカウント情報
- $NEWHANDLE → PDSのローカルハンドル(ハンドルの後ろがサーバードメイン)とするので
l-test.pds2.dolciss.netとします - $NEWEMAIL → 同じメールアドレスでよいかと
- $NEWPASSWORD → 何かしらパスワードを用意します
goatコマンドのインストール
今回のアカウント移行には、記事に沿ってBluesky公式が用意しているGoのパッケージindigoの中にあるgoatを使用します。
インストールは1行コマンドを叩くだけのようです
dolce@xxx:~$ go install github.com/bluesky-social/indigo/cmd/goat@latest
Command 'go' not found, but can be installed with:
sudo snap install go # version 1.23.3, or
sudo apt install golang-go # version 2:1.21~2
sudo apt install gccgo-go # version 2:1.21~2
See 'snap info go' for additional versions.
あ。新しいサーバーにはそもそもgoが入っていなかった…のでインストールします
dolce@xxx:~$ sudo apt install golang-go
dolce@xxx:~$ go version
go version go1.22.2 linux/amd64
こんどこそ
dolce@xxx:~$ go install github.com/bluesky-social/indigo/cmd/goat@latest
go: downloading github.com/bluesky-social/indigo v0.0.0-20241223053147-c130614850e5
go: downloading github.com/adrg/xdg v0.5.0
~以下必要パッケージのダウンロードが続く~
go: downloading golang.org/x/sync v0.7.0
dolce@xxx:~$ goat help
Command 'goat' not found, did you mean:
インストールはできたっぽいけど、こんどはコマンドが見つからない……go installしたがcommand not found。によると単にPATHが通ってないと。
dolce@xxx:~$ go env GOPATH
/home/dolce/go
dolce@xxx:~$ vi ~/.bashrc
~export PATH="$HOME/go/bin:$PATH" を追記する~
dolce@xxx:~$ source ~/.bashrc
dolce@xxx:~$ goat -v
goat version v0.0.0-20241223053147-c130614850e5
やったー🙌
いよいよ移行
先述の通り自動でアカウント移行をやってみます。
まずは移行前の現在のアカウントにログインします。
dolce@xxx:~$ goat account login -u l-test.pds.dolciss.net -p 本パスワード
dolce@xxx:~$ goat account status
DID: did:plc:yudyb347zpi23jrzmiu7g7ar
Host: https://pds.dolciss.net
{
"activated": true,
"expectedBlobs": 19,
"importedBlobs": 20,
"indexedRecords": 84,
"privateStateValues": 0,
"repoBlocks": 110,
"repoCommit": "bafyreieupcvzb565u3wwdmfpnsqgmvhlwdji5efrpqg2di4cdl7upcusgm",
"repoRev": "3leiw3gr75s23",
"validDid": true
}
アカウント操作のためにメールによる2要素認証が必要なため、認証コードをリクエストします。
dolce@xxx:~$ goat account plc request-token
Success; check email for token.
これで情報が揃いましたので、アカウント移行のコマンドを実行します。
dolce@xxx:~$ goat account migrate \
> --pds-host https://pds2.dolciss.net \
> --new-handle l-test.pds2.dolciss.net \
> --new-password 新パスワード \
> --new-email 新メールアドレス \
> --plc-token メールで送られてきた認証コード \
> --invite-code 発行した招待コード
2024/12/30 15:36:36 INFO new host serviceDID=did:web:pds2.dolciss.net url=https://pds2.dolciss.net
2024/12/30 15:36:36 INFO creating account on new host handle=l-test.pds2.dolciss.net host=https://pds2.dolciss.net
2024/12/30 15:36:38 INFO migrating repo
2024/12/30 15:36:39 INFO migrating preferences
2024/12/30 15:36:39 INFO migrating blobs
2024/12/30 15:36:39 INFO transferred blob cid=bafkreia6fq522uxlstp7iwzwhzdnuzg6xduuyy4qepypueizgsvfm2co3i size=168575
~blob転送がつづく~
2024/12/30 15:36:42 INFO transferred blob cid=bafkreigwgkw36msftb7qlcnw3kj54t3i6lt6i4mceom6i2d4vnvhw3xduq size=62512
2024/12/30 15:36:42 INFO account migration status status="&{Activated:false ExpectedBlobs:19 ImportedBlobs:19 IndexedRecords:84 PrivateStateValues:0 RepoBlocks:110 RepoCommit:bafyreieupcvzb565u3wwdmfpnsqgmvhlwdji5efrpqg2di4cdl7upcusgm RepoRev:3leiw6iijes2l ValidDid:false}"
2024/12/30 15:36:42 INFO updating identity to new host
2024/12/30 15:36:44 INFO activating new account
2024/12/30 15:36:44 INFO account migration completed
blobの数も少ないこともあってか8秒で終わりました。はやっ
移行後の確認
旧アカウント
まずは古いアカウントをみてみます。
dolce@xxx:~$ goat account status
DID: did:plc:yudyb347zpi23jrzmiu7g7ar
Host: https://pds.dolciss.net
{
"activated": false,
"expectedBlobs": 19,
"importedBlobs": 20,
"indexedRecords": 84,
"privateStateValues": 0,
"repoBlocks": 110,
"repoCommit": "bafyreieupcvzb565u3wwdmfpnsqgmvhlwdji5efrpqg2di4cdl7upcusgm",
"repoRev": "3leiw3gr75s23",
"validDid": false
}
deactivate状態になっているようです。特に問題なければ削除してもいいとのことですが、公式でログインしても再有効化しますか?と聞かれるので削除ルートはあるのかしら……(この状態で再有効化したらどうなるかは怖くて試してない)
新アカウント
新しいアカウントもみてみます(投稿テストを先にしてしまったので数字が増えてる……)
dolce@xxx:~$ goat account logout
dolce@xxx:~$ goat account login -u l-test.pds2.dolciss.net -p 新パスワード
dolce@xxx:~$ goat account status
DID: did:plc:yudyb347zpi23jrzmiu7g7ar
Host: https://pds2.dolciss.net
{
"activated": true,
"expectedBlobs": 19,
"importedBlobs": 19,
"indexedRecords": 86,
"privateStateValues": 0,
"repoBlocks": 113,
"repoCommit": "bafyreibiovuzjpxjoi6a3pbyuh4w3jy2blj4n4epkdudjwj4jxvmwglziu",
"repoRev": "3leix2u6j2k2l",
"validDid": true
}
動かしっぱなしにしていた羽衣でもエラーが
公式でもプロフィールをみようとすると同じエラーが出ています。
サインインし直せば新しいPDSでログインできました。
プロフィールもそのまま、フォロワーも画像投稿も全部引き継がれています。
PLCデータ
冒頭の移行前と比較して、アカウントハンドルのalsoKnownAs、PDSのserviceEndpoint、公開鍵のpublicKeyMultibaseが新しくなっていることが分かります。
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/multikey/v1",
"https://w3id.org/security/suites/secp256k1-2019/v1"
],
"alsoKnownAs": [
"at://l-test.pds2.dolciss.net"
],
"id": "did:plc:yudyb347zpi23jrzmiu7g7ar",
"service": [
{
"id": "#atproto_pds",
"serviceEndpoint": "https://pds2.dolciss.net",
"type": "AtprotoPersonalDataServer"
}
],
"verificationMethod": [
{
"controller": "did:plc:yudyb347zpi23jrzmiu7g7ar",
"id": "did:plc:yudyb347zpi23jrzmiu7g7ar#atproto",
"publicKeyMultibase": "zQ3shNqnMcCTPqAZm3dEf5uYvYHn4EUiw1vwH3d8xdLVD1PaD",
"type": "Multikey"
}
]
}
おわりに
というわけで、自動のアカウント移行どこかで詰まるかなと思っていたものの、案外すんなり終わってよかったような、もう少しいろいろ試せて方がよかったような……ともあれ無事に移行できたので、これで旧サーバーを安心して爆破(契約切れ)して年を越せます。あとは新しいサーバーの方が性能良くしたので、更新費用をなんとかせねば……みなさま良いお年を。