橙色に染まる空

Misskeyに自分専用のサーバーを構築した経緯

2026年2月に突如思い立って、分散型SNSに自分専用のサーバーを構築しました。紆余曲折の概要と、最終的にMisskeyにしてよかったと感じた理由について記録します。

サーバーを構築する手順の具体的な解説というよりも、なぜ最終的にMisskeyでサーバーを構築したかという経緯の説明にウエイトを置いています。(Fediverseにサーバーを構築したいけど自分にできるかな...)と迷っている方に向けて書いています。

1. 自分専用サーバーに憧れがあった

MastodonやMisskey, Pleromaなどでは自分専用のサーバーを構築することができます。これは通称「おひとりさまサーバー」とよばれています。以前から自分専用のサーバーへの単純なあこがれもありましたし、最終的にはSNSにおいても、自分のデータのコントロールを可能な限り自分でできるようにしたいという気持ちが大きかったです。なので、自分用サーバーの構築と運用はその一つの到達点であると考えていました。

また「サーバーをこうやって構築しました」という記録やブログエントリはネット上に多いものの、自分の技術では、実際の継続・運用のハードルは高いなと感じていました。手間を削減するのであればホスティングサービスもありますが、せっかくなら最初から自分で立ち上げたいという気持ちもありました。 サーバー構築に関する知識は乏しかったので、いろいろなハードルを越える必要がありました。

具体的には:

サーバー構築で向き合うこと(とてもざっくりと)

  • VS Codeによる編集環境の準備
  • 独自ドメインの契約とその維持
  • VPS(仮想専用サーバー)の契約・準備
  • Docker Composeのインストール
  • YAMLファイルの編集
  • Cloudflare Tunnelの構築
  • オブジェクトストレージの準備

などです。

もしサーバー構築をしたいとなったら、使っているパソコンにVSCodeをぜひインストールしてみてください。VPSのコンソールを毎回起動して直接コマンドを叩くのは、頻繁に接続して作業することになった場合に大変です。SSHのキーをセットアップすれば、数クリックでシームレスにVPSと繋がって面倒が減ります。また、インデントにとても厳格なYAMLファイルの編集のときに真価を発揮します。

今まで上記にほとんど触れていなかったので、Linuxのディレクトリの移動から覚えるというほぼゼロからのスタートでした。ですが、なんとか形になって安堵しています。

2. Concrntで大枠をつかんだ

サーバー構築の具体的なきっかけは、あるMastodonサーバーの運営終了でした。そのローカルタイムラインで移行先として「Concurrent(Concrnt)に移ります」と投稿しているユーザーがいました。この投稿をきっかけに同サービスを知りました。

ConcrntはActivityPub(MastodonやMisskeyなどが参加している分散SNSの接続プロトコル)にも対応していると知りました。さらには、自分のサーバーも作れると知って、取りかかりとして良いのではないかと感じたのです。

VPSの契約や、Dockerのインストール、スワップ領域の作成などLLM(Gemini)に聞きながら設定をしました。海外のサービスですがDigitalOceanというところで、RAM 1GBのVPSをとりあえず契約しました。同構成で料金は6ドル/月です。一般的な内容については学習データがあるようで、DockerやDigitalOceanのセッティングはLLMと対話しながらスムーズに進みました。

しかしながら、Concrntのサーバー構築は新しいサービスということもあってLLMのハルシネーションが多かったです。公式のドキュメントに忠実に従っていればよかったのですが、LLMが提示する(同モデルから提示された実際の仕様とは異なる)コードを考えずにどんどんコピペしていたら崩壊しました。

正しくセッティングができたものの、自分の技量不足でapconfig.yamlの秘密鍵をどれにしてよいかで行き詰まってしまいました。このように、LLMを使ったファイルの編集から、ActivityPubからの投稿の受信を実装するまで試行錯誤の連続でした。ですが、その過程で設定の仕組みを深く学ぶことができました。

こうしてなんとかサーバー構築はできました。ですが、既存のFediverseアカウントから引っ越しを試みたものの、こちらの設定の不備か何らかの要因で、移行機能がうまく動作しません。やはり、Fediverseの中で自分に合う場所を再考すべきなのかと思案して辿り着いたのが、比較的軽量な動作で知られるPleroma(Akkoma)という選択肢でした。

3. Pleromaの設定で行き詰まる

結論からいうと、PleromaはMisskeyより軽量だし、いいスペックの(具体的には2GB以上のRAM)VPSの契約は予算的に無理だから…と妥協をしたら失敗しました。

こちらでもGeminiといっしょにインストールをやっていたところ、提示されたクローン先が違っており(なぜか)Akkomaがインストールされました。AkkomaとはPleromaのフォークで、機能が充実しているそうです。また開発ペースも本家のPleromaより速いそうなので結果オーライでした。

インストール完了もつかの間、MastodonやMisskeyとはまた違ったUIで認知負荷がのしかかりました。また、Cloudflare R2経由でアップロードした画像ファイルがうまくプレビューされない問題が解決できなかったです。アップロード自体は成功しているものの、URLに意図しない文字列が付加されてしまい、プレビュー画像がことごとくリンク切れになってしまいました。

インストールの作業自体よりも、UIとこの問題の対処のほうで時間がかかってPleromaへの熱意は冷めてしまいました。

4. Misskeyという(自分の)最適解

こうした回り道をして、最初に憧れていたMisskeyのサーバーを立てることに決めました。

2GBのRAMがMisskey稼働の最低ラインということで、廉価なVPSを探していました。そして、WebARENAのIndigoというものを見つけました。 ストレージは競合のサービスよりは少ないものの、814円/月で2GBメモリのVPSが契約できました。この価格であれば、最初に契約したDigitalOcean(1GB RAM)の6ドル/月と遜色ありません。

思いの外Misskeyを選んでよかったことがいくつかあります。

まず、日本語のマニュアルとしては3つの中ではいちばんMisskeyが充実していたことです。インストール方法もDockerを使う方法やシェルスクリプトなど色々あります。Misskeyのサーバー構築では、公式マニュアルにあるDocker Composeでインストールする方法を参考にしました。

実際にでてきたエラーの解釈やわからない部分はGeminiとやり取りしながら設定しました。GeminiのGemという、ある分野の特化機能が付加されたものに「コーディングパートナー(プログラミングに特化)」があるためそれを使うといいかもしれません。

幸い、LLMにもMisskeyに関する学習データがそれなりにあるようで、vibe coding(ほぼLLMの言われたとおりにコピペ)でもできました。規模の経済性(厳密には少し違いますが、Misskeyというプラットフォームが持つ情報の多さという意味で)が効いているなと感じました。

その後、VPSの利用料金が固定費となることが気になったため、Raspberry 5 (RAM 4GB)を購入しました。 SSDや付属品などの購入も加わって費用はかかりましたが、自分の手元でサーバーが動いている安心感には代えがたいものがあります。 画像ファイルはR2 Bucketに保存していたため、移行作業はYAMLファイルとデータベースの移植くらいでした(例に漏れずここでもGeminiのハルシネーションに苦しめられましたが)。

5. 今となっては回り道をしてよかった

段階を踏んだ試行錯誤があったからこそですが、もっとも難しく見えたMisskeyが結果的にスムーズな流れでサーバーの構築ができたような体感でした。

Pleromaで数時間向き合ってもなお解決しなかったCloudflare R2の設定はMisskeyではあっさりとできました。 Misskeyの管理者用のコントロールパネルは、ふだん使っているMisskeyの設定画面の延長のような見た目です。 そのため、新たな学習コストを多く払わずセッティングができたので嬉しいポイントです。

もちろん、新しいコンセプトの提案や、軽量なシステムがもたらす技術的な恩恵も大切であると感じます。 ですが、最終的に「使い慣れているプラットフォームに身を落ち着ける」ことは、私がサーバーを長く、そして楽しく運用していく上でのキーポイントになりそうだなと感じています。

6. Vibe Codingをするにあたって

私のように、プログラミングの技量に自信はないけど、ターミナルでコマンドを打ったり、ファイルを編集したいとなった場合vibe codingという選択肢があります。 LLMの言われたとおりにコマンドやファイルの記述をコピペするだけ(雰囲気)でコーディングができることが名前の由来のようです。 便利な反面、漫然と丸投げしているとハルシネーションの無限ループになった経験があるので、ちょっとしたコツのようなものを簡単にまとめました:

vibe codingをするときのポイント

  • 公式のマニュアル・ドキュメントへ忠実に従う
  • クリティカルシンキングを持つ
  • 自分の直感を信じる

6.1. 公式のマニュアル・ドキュメントへ忠実に従う

たとえ、LLMが「この方法がいいですよ!」といっても公式のドキュメントから逸脱している場合はその後正しくセットアップできなくなることがほとんどです。対処法としては、最初のプロンプトで公式のドキュメントを提示して「公式のマニュアルはこういっているけどどうしたらいい?」というスタンスで聞くとそれに即した回答が得られやすい気がします。

6.2. クリティカルシンキングを持つ

これと最後の項目は似ていますが。LLMの回答と公式ドキュメントの記述の乖離や、さっきから回答が循環していないか?といった違和感に気づくことが大切だと感じました。自分の疑念をないがしろにせず、もし行き詰まったら他のモデルに聞くことも手です(実際にGeminiからGPTに移行して解決した問題があります)。

6.3. 自分の直感を信じる

なんか回答が無限ループしているなと思ったり、この記述を加えろとLLMが言ったりしているけど本当に必要なのかなどと、自分の直感を問われる場面がvibe codingでは多々あります。クリティカルシンキング(いい意味での疑り深さ)と併せて、変だなと思う指示には従わないことが最終的には良い結果を招きます。

Appendix: 参考にしたウェブサイト

VPSのスワップ領域の作成について

Linuxでスワップ領域を作成する方法 - https://qiita.com/youareyouya/items/1f76fd8de74346130395

Dockerのインストール

英語の公式ドキュメントですが、さっと読んで一つずつコピペしていくと無事インストールできました。

Install using the apt repository - https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

Misskeyの公式マニュアル

Dockerで構築したので、マニュアルはこちらを参考にしました。

Docker Composeを使ったMisskey構築 -
https://misskey-hub.net/ja/docs/for-admin/install/guides/docker/

サーバーを構築したあとの各種設定

【鯖缶入門】Misskeyインスタンスを建てたらやっておきたい事 -
https://qiita.com/mai_llj/items/a1a4c65651af904cac60

Related Posts (以下もいかがですか)