ハードウェアからサーバ・アプリまでワンストップで開発

Napierを使ってMisskeyサーバを動かす

せっかくの分散SNSなんだから自分でサーバ動かしたいですね

  Napier

ogochan

Twitterがいろいろアレなことになってしまっているので、それの代わるものを使おうと思いました。

選択肢はいろいろあると思うのですが、自分のメディアは自分でコントロールしたいという希望があって、いわゆる「分散SNS」を使うことにします。

分散SNSもいろんなアーキテクチャのものがありいろんなソフトがあるのですが、その中で一番「可能性」を感じたのがMisskeyでした。Misskeyは一番大きなサーバがいろいろアレだったりするのですが、Twitter代替に縛られてないところがお気に入りです。

これをNapierで動かしてみることに成功したので、ちょっとメモしておきます。

Misskeyの紹介

まずなぜMisskeyかという話を書いておきたいと思います。

Misskeyの雰囲気等については、いろんなところで紹介されています。

話題の分散SNS「Misskey」が居心地いい 行儀悪くて笑えるあのころのインターネットが帰ってきた ユーザー爆増中

こういった文化的なことはとりあえずここでは置いておいて、ソフトウェアとしてのMisskeyについてです。

技術的なことについては、作者によるエントリがあるので、そちらを読んで下さい。Activity Pubを実装した分散SNSです。

作者による紹介を読むと、Mastodon以前から存在していることがわかります。つまり、プロトコルとしてはActivity Pubを使っていますが、Mastodonとは異なる文化背景を持っているものです。たとえば、Mastodonでは「引用RT」に相当する機能は頑なに実現されませんが、Misskeyには存在しています。個人的には引用RTは大好きです。

作者は元ツイ廃だったらしいですが、MisskeyにはTwitter代替という方向性はあまり見えません。似てると言えば似てると言えなくもないですが、チャット機能があるものにはありがちのレイアウトや機能ですから、「だいたいそんなもの」という意味でしかありません。むしろ似てると言えばSlackとかに似てるかも知れません。

実は個人的に気にいっているのはこの辺で、Activity PubにもTwitterにも縛られてない、それよりも「利用者にとっての遊び場」として作られているというのが好みです。今は分散SNSのプロトコルはActivity Pubが主流っぽいですが、AT Protocolも流行るかも知れません。その時も多分Misskeyは対応できるんだろうなという予感がします(根拠はない)。

技術スタックはNode.jsを中心に置いたもので、Rails中心のMastodonとは随分異なります。個人的にはRailsには懲りているので、Railsでないというだけで大喜びです。

インストール

とりあえず今は「お試し」ということで、普段の開発環境であるRaspberry Pi 4(8MB)の上で動かしています。これは開発環境と同居なので、実際にちゃんと運用させる時には、それ用にOrange Piでも用意しようと思っています。と、これでわかるように、ARM64 CPUの上でも問題なく動きます

Misskeyのインストールそのものは、Misskey Hubにある「Ubuntu版Misskeyインストール方法詳説」に従えば良いです。

.config/default.ymlの設定で最低限いじるべきところは、

  • url
  • port
  • db
  • redis

辺りです。これ以外は必要があればいじるくらいで良いです。

url実際に公開するURLです。今回は「しまぱん.com」用として作ったので、https://misskey.shima-pan.com/を指定しています。

portローカルに公開するポート番号つまりNapierで指定するローカルポート番号と一致させます。

dbやredisについては、自分の環境に合わせます。

これが出来ればローカルで起動できるはずです。

Napierの設定

Napier側では新規にプロフィールを作成して、必要な情報を入れます。

Napierでは鍵の情報は可読な形式に変換したものが表示されていますが、実際に置くのはテキストエンコードされた鍵です。

証明書は今回はZeroSSLで取得しました。Let's Encryptがお約束だと思うのですが、まぁたまには違うものを使ってみても良いかなと言うのと、今回は「ワイルドカード証明書」ではないので、ZeroSSLでも無料コースで使えます。Let's Encryptは設定を2回やり直すと翌日まで何もできなくなるのが厳しいですね。

ZeroSSLで面倒臭いのは、Napierにはfullchainの証明書が必要なのにZeroSSLではfullchainの証明書をくれないという点です。ここはいろんな解説にあるように、What's My Chain Cert?を使ってfullchain証明書を作ります。Let's Encryptではfullchainを作ってくれるので、この手間は不要です。

これでサーバ側の設定は完了です。

もちろん証明書を作る前に、当該ホストのDNSをwww.napier-net.comに向ける必要があります。自前でNapierを立ち上げている人は、もちろんそちらに。

次にクライアント側の設定ですが、私は

{
    "host": "www.napier-net.com",
    "localPort": 3002,
    "reConnect": true,
    "webServer": false,
    "user": "****",
    "password": "*****",
"secure": true, "profile": "misskey" }

のような設定ファイルを作って、

$npm run cli -- --config config/misskey.conf misskey

のように起動しています。

これで、Napierでporoxyを行ってMisskeyサーバを外部に公開することが出来ました。

まとめ

実はNapierを使ってMisskeyを動かすのは2度目のチャレンジです。前回は「単体では動いているけど連合ができない」状態になっていました。

単体で動いているのに連合ができない原因は、webfingerにあります。Activity Pubではwebfingerを使って個人情報を取得するようになっているのですが、そこでアクセスが正当なものであるかどうかを知るために、証明書のCNとアクセス元との整合性をチェックしています(CNで逆引きかけるみたい)。これが正しくないと、要求を蹴るようになっているようです。webfingerが成功しないと、Acrivity Pubの連合に参加することができません。

前回うまく行かなかった直接の原因は、「証明書をワイルドカードで作ってしまった」ことにあります。ワイルドカード証明書のCNは *. が先頭にあって、こういったものではアクセス元がわからないということのようです。今回、ワイルドカードでないホスト名付きの証明書にしたので、うまく動くようになったようです。

証明書がfullchainでない場合も連合に参加できません(他のサーバからwebfingerした時にエラーになる)。単体では動くので、連合したくない時にはこの辺を雑にやってしまっても良いかも知れません。

"503 Remote SSL cert could not be verified" when trying to fed with mastodon.social, but not other instances #6449

とまぁ、こんなことがありましたが、わかってしまえば特に難しくもなくMisskeyのサーバを自前環境で立ち上げられるようになりました。

これは全く自画自賛に過ぎないのですが、Napierで簡単にproxyが使えるというのはとても便利だなと感じました(小並感

ちなみに、現在のNapierはElectronを使ってクライアントを作れるようになっています。Windows上でしかテストしていませんが、Windowsの任意のフォルダを外部に公開できるのは、なかなか便利です。

最近のエントリー

Hieronymusのインボイス番号対応について

会計システム「Hieronymus」の現状

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル