communication-g7396f4352_1280

過日のことではありますが、Misskeyのお一人様サーバー(自分だけが使うことを想定したサーバー)を建てることに成功し、ひとまず運用開始できたので、そこに至るまでを書こうと思います。

実は正常に運用開始する前に一度サーバーを爆破(もちろん比喩ですよ!)しており、いくつかのつまづきポイントというか失敗もあったので、それも含めた記事となります。 実際にサーバーを建てる手順についてはこちらの記事をご覧ください。

なお、とりあえず運用できているものの、私はサーバーやプログラミング知識は本当に皆無のため、あくまでもこの記事は「事例報告」でしかないことをご理解ください。

前提など。

まず、前提などを書いておきます。 私の技術・スキルは以下。 いや、なにもないんですけれども。

  • サーバー知識・プログラミング知識はなし。
  • このブログ・サイトをWordPressで運用しているため、WordPressやCSS、レンタルサーバー、ドメイン……のあたりは「ほんのちょっぴり」断片的な知識はないでもない。 けれど、体系的には知識も技術もない。 WordPressもずっと自動インストール頼み。
  • ドメインは一応すでに持っている(ほとんど腐らせていた)。
  • 非IT系。

サーバー構築に挑戦してみよう!と思ったきっかけとしては、「いつか自分のサーバーを持って、自由に好きなカスタム絵文字を入れて気楽にやりたい」くらいのふわっとした想いは割とだいぶ前から持っていたのですが、直近でその想いが強まったというか、必要性も感じるようになった……というのがきっかけのひとつとして挙げられます。

別のきっかけとしては、周りでサーバーを建てるのに挑戦・成功している方がちらほらいらっしゃったので、それに感化された感じですね。

ともあれ、知識などが伴わないままそんな感じのノリでの着手だったため、不安も大きかったのですが……結果的にはありがたいことに様々な助言に助けられ、稼働に至れました。

助言をくださったもりかぷさん・まなさすさん・夜坂さんに深く感謝しております!

用語の(不正確だけどざっくりした感じの)説明。

※この記事で登場する用語を、「なんとなくわかった気になる」ように説明を書いています。 技術的には不正確な情報が混入していると思われますので、ちゃんと学びたい場合は別途信頼できる情報を得るようにしてください。 あくまでも記事を読むのをスムーズにするために書いているだけです。

Misskey: 今回サーバーを建てるのに挑戦したソフトウェア名。 サービス名ではありません。 「PawooはMastodonである」の“Mastodon”に相当し、これを使うことで各々がサービスを展開しています。

サーバー: ウェブサイトやインターネットを介したサービスの場合、それらの本体はサーバーという場所に収納されています。 今あなたも、サーバーにアクセスすることでこの記事を閲覧しています。

VPS: Virtual Private Serverの略。 仮想個人サーバー、とでもいいましょうか。 レンタルサーバーよりも自由に操作できますが、その分、活用するには知識・技術も要求される印象。

IPアドレス: Internet Protocolアドレス、略してIPアドレス。 サーバーがある場所を示す数字の羅列です。 現実世界における座標とか緯度経度情報みたいなものです。

ドメイン: ウェブサイトの場所を示す文字列です(当ブログであればseritude.com)。

アクセスしたい場合、IPアドレスを入力してもいいのですが……それはいわば地図で言う緯度経度情報みたいなものであり、どこを指しているのかひと目見ただけではわかりにくすぎます。 そこで、ドメインという……建物名のようなものを付与することでわかりやすくしているイメージです。

「35.658584 139.7454316」と書くより「東京タワー」って書いたほうがわかりやすいですよね。 「東京タワー」がドメインに相当する感じです。

DNS: Domain Name Systemの略。 「具体的にこのドメインはどのIPアドレスを指すのか」などを関連付けるためのものです。 「ああ、東京タワー? それなら○○にありますよ」と質問者(=アクセスする人)に場所を教える感じです。

DNSレコードというもので詳細に設定します。 ドメインを地名ではなく建物名と書きましたが、それはサーバーの移動・引っ越しなどでIPアドレスが変わることがあるためです。

現実で言えば東京タワーが大阪に移動したりすることがままあるので、建物名はそのままに、緯度経度の絶対的な場所は変更する……という感じです(まぁ、現実では東京タワーをはじめ建物自体の移動はそうそうないでしょうけど……)。

CDN: Content Delivery Networkの略。 サーバーからのデータ送受信を肩代わりしてくれる分散したサーバー群のイメージ。 一箇所の大本となるサーバーにアクセスが集中するとウェブサイトが重くなったりしてしまうので、アクセスを散らすことで負荷も分散させてくれます。

オブジェクトストレージ: すごく大雑把に言えば「ファイル置き場」。 VPSはレンタルサーバーに比べて置いておけるファイル・データの総量が少ないので、こうしたものを利用します。 部屋が狭いので倉庫を借りる……感じですかね。 たぶん。

VPSを借りて、いざ挑戦!

前述の通り、お一人様サーバーを建てたい!必要!という気持ちが強くなったので、VPSを借りることにしました。 お安いというのと、普段お世話になっているサーバーの管理人さんが使っている(使っていた?)ということで、WebARENAのIndigoというVPSを借りることにしました。

※同時に、いよいよ作業するぞ!ということで、今後必要になるCDNサービスのCloudflareにも登録をしておきました。

Misskeyのビルド(動くように構築すること)には最低でも2GB程度のメモリ/RAMが必要(保存容量/ストレージじゃないですよ!)という話を見聞きしていたため、メモリが2GBのプランにしようと決めていました。

会員登録はまぁウェブサービスに普段から登録している人なら特につまづくところもない感じで、決済用のクレジットカード情報も入力しつつ……という流れ。 定額課金制ではなく従量課金制(ただし月ごとの上限額もあるので、ちょっと安心)なので、即時請求とかってわけではないです。

登録が完了すると、Indigoのコントロールパネル(管理画面)にアクセスできるようになりました。 ここで、先にドメインのDNSレコードに、VPSのIPアドレスを設定しておこう……と思ってあちこち見たんですが、どこにもIPアドレスの表記が見当たらず。

どうすればIPアドレスを確認できるんだ? としばしあちこち見て回っていましたが……なんのことはなく、まず最初に「インスタンスの作成」をしなければならなかったようです。

そういえばアカウント登録時にはプラン選択らしいものはしていなかったかも……? 登録後に改めてインスタンス作成画面でサーバーのスペックを選ぶ感じだと思います。 OSはUbuntu 22.04を選び、2vCPU 2GBRAMのものを選択しました。

少なくともIndigoにおいてはこの「インスタンス」というのが実際に操作できるVPSのことのようなので、インスタンスを作成してはじめてVPSをレンタルしたという扱いになり、操作や作業ができるようになるということのようです。

インスタンス作成には先に「SSH鍵」というものを作ってくださいと言われたので、そちらもサクッと作成し、同時にSSH鍵の書かれたテキストファイルもDLし、インスタンス作成を行いました。 IPアドレスも作成後に表示されたのでひとまずこれで1stステップはOKだなーと安堵。

VPSの利用は初めてだったため、手順についてはなるほどな~とはなったものの、先程はやろうと思っていたDNSレコード編集はここではしませんでした。 まだなにもしていないので、ドメインをVPSのIPアドレスに設定したとしても、アクセスしたところでなにも表示されないから。

DNS……というかDNSサーバー(実際にドメインとIPアドレスを紐づけて処理するサーバー)の仕組み上、虚無空間や間違った場所を指定すると、修正しても内容の反映に時間がかかるイメージがあったため、ひとまず先にVPSの作業を進めよう!と考えました。

実際にどうなのかは……私にはわかりません。 ただまぁ、ひととおり準備できてからのほうがスムーズで間違いないかな、とは思いました。

ということで、いよいよ不安入り乱れる、実作業に入っていきます。

サーバーの話す言葉がなにもわからない……。

さて、Misskeyを動かすためには、なんだかよくわからないままに、様々な手順を踏む必要があります。

サーバーを建てるにあたっては、公式ドキュメントである「Ubuntu版Misskeyインストール方法詳説」を参考にしました……というか、どうせなにをやっているかは私には理解できないため、言われるがままコマンドを打ち込んでいくばかりになりそうですが、まぁ、ともかくこれを開いておきます。

というわけでインスタンスを起動し、コンソール(コマンドプロンプトみたいなやつですね。 GUIのように視覚的にわかりやすくはない印象なので、ここで結構ウッとなります)を起動……しようとしたんですが、なんと早々にここでエラーが発生。 インスタンスの起動直後でまだコンソールを起動できなかったかな?となんどか試すもののエラー……。

ふと思い立ってブラウザ(Chrome)で使っていた「uBlock Origin」という広告ブロック系拡張機能をオフにしたところ、アクセスできました。 この拡張機能は優秀なんですが、たまにこういう問題が起きるので、おかしいな?と思ったらオフにして再読み込みしてみると解決したりします。 今回もこのケースでした。

と、ここで「コンソールは使いにくいので(コピペとかもできないので)、クライアントソフト(SSHクライアント)を使った方がいい」という助言を頂いたので、中でもおすすめされた「RLogin」を使うことにしました。

サーバーにアクセスするたぐいのクライアントソフトといえば、FTPクライアントは使ったことはあるので、SSHクライアントというものもなんとなくイメージはできたんですが、接続設定がちょっと困ったものでして。

IPアドレスは先程表示されたものを入れればいいのはわかったんですが、

「ユーザー名とパスワードは……? あれ? 与えられてたっけ? でもIndigoとかのメールアドレスとかパスワードではないような……? うーん?」

……と、ここでも手が止まってしまいました。 サービスのIDやパスワードをサーバーのログインには使わないだろうなぁ……と思いつつ、他に候補が思いつかないので入力してみたものの、やはりだめ。 じゃあとrootとかadminを入れてもだめっぽい。

さぁ困ったぞ……と検索してみたところ、IndigoのF&Qページに答えが。 ええ!?

RLoginの接続設定のスクリーンショット

……もしかしたらどこかに案内があったのかもしれないけれども、見覚えがないなぁ……とか思いながら、指定どおりに概ね上記のようにし、赤丸部分から先程DLしたSSH鍵のファイルを指定することで、ようやく接続ができるようになりました! いや~幸先が悪いというか、この時点でもう不安しかないですね!!

ともあれ、接続ができると、真っ黒な……例のコマンドプロンプトめいた画面が表示されます。

RLoginのスクリーンショット
いわゆるCUIというやつですが、私は馴染みがないのでここで結構怯むやつです。

怯みそうになりますが、とにかく今は思考を挟まずにいこう……!ということで作業を開始します。

最初は試しに写経というか、手打ちでやっていたんですが、まぁ効率的ではないのとタイプミスも発生しうるので早々にコピペに切り替え。

そもそも「手順に書かれているコマンドのうち、複数行にまたがったものは一行ずつ実行するべきか、それとも一括でもOKなのか」もわからなかったため、非常におっかなびっくりやっていきました。 結果的に、複数行まとめて書いてある部分は一括でも大丈夫そうでしたが、「○○を確認」というコマンドの注釈がある場合は念のため分けて実行したりも。

さて、不慣れなCUIでの作業ゆえにおっかなびっくりとはいえ、やっていることといえば念入りに確認しつつのコピペ作業なので、雑念が浮かんできます。

「さっきから

sudo なんとかかんとか

って出てくるけど、sudoってなんやねん……須藤? 誰だよ……?」

とか思い始めます。 そう、なにもわかっていない。 コピペしていくと、なにかよくわからないものがインストールされたりしているのはわかるけど、具体的に今自分がなにをしているのかは全くわかっていないのです。 作業は進んでいるけれど、全くのブラックボックス。 不安というか怖いです。 割と。

しかしそんな不安をよそに、作業は進んでいきます……もちろん、この過程でなにかミスっていたとしても、「私にはログを見て対処する」なんて知識も技術もないので、ミスを発見できないし修復もできません。 きっとどこかにミスはあったと思います。 なにせ、(もう既に書きましたが)このあとこのインスタンスは爆破することになるんですから。

それにしてもそんな私でも、非常にゆっくりした進捗速度であっても前へ進んでいるっぽいなぁと感じられる公式ドキュメントは、完成度が高いのだと思います。 ところどころ、ほとんど詰まることがなく、中頃にある“Certbot (Let’s Encrypt) の設定”まで来れましたから。

※ところどころ、自分で「自分の環境にあった状態に書き換える」場所がいくつかあるんですが、そこはコピペではいけないので、慎重にはなりました。 例えばドメインを自分のものに置き換えるとか、そういう程度のものですが、そうはいっても緊張します。

※2 Cloudflareの項目の“CDNの設定”のあたりで、ようやくDNSレコードを触りました。 結果的に下手に勇み足でいじくらなくてよかったです。 こちらの記事を参考に、適宜読み替えつつ設定しました。

ただ、翻って言えば、ここで初めてちょっと詰まりました。具体的には、Cloudflareの設定のところの、

mkdir /etc/cloudflare
nano /etc/cloudflare/cloudflare.ini

のあたり。 これをそのままコピペして実行したら(認識している範囲では)初めてエラーが出ました。 “Permission denied”と書かれているので、あなたに権限はないですよ!と言われたわけです。

え、今ログインしているのってroot(管理者)ユーザーじゃないの……?と思いつつも、権限がないということは当該のディレクトリ(階層)に対する書き込みの権限をいじるか、今のユーザーの権限にroot権限を与える必要があるような気がしたんですが、だとして、じゃあどうすれば?というのは私にはわからず、ここで手詰まりか……と思いつつも、状況を普段使っているMisskey系SNSで投稿しました。

すると、またまたありがたいことに「etc下は一般ユーザーだと権限が足りずに操作できないので、“sudo”を先頭につけて実行するとよい」という助言を得られました。 感謝してもしきれない……!

つまり、

sudo mkdir /etc/cloudflare
nano /etc/cloudflare/cloudflare.ini

……ということですね。

そしてここで須藤さん……もとい、“sudo”の正体がはっきりしました。 つまりこれは、Windowsでいう「管理者として実行」に相当するもので、管理者権限を付与してコマンドを実行するというものだったようです。 なるほどなー!

ちなみにSuperuser doを略してsudoのようです。 須藤さんすげー!

ここを突破できたことで、再び作業を進めることができ、ついに“Misskeyのビルド”まで到達! ちょっと詰まったりはしたものの、助言に助けられて意外とすんなりいいところまで来れました。 これは割とすぐサーバーが建っちゃうのでは……!? と根拠なき期待が湧いてきます。

……が、あまりにもそれは無根拠で楽観的すぎたのです。

解決できないエラー、そしてインスタンス爆破へ……。

さぁ、いよいよ“Misskeyのインストール”のところまで来ました。

これで前準備はあらかた終わったので、Misskeyを準備していく

前準備があらかた終わった! Misskeyの準備!! いや~ワクワクしてきましたよ!!!

もうすぐ自分の城が建ち、小さくても一国一城の主になれる!……と思うと気持ちがはやってしまいます。

しかし工程は“いい感じのところ”に差し掛かってきており、であればこそ慎重にならねば……と努めて冷静になろうとします。 ここで失敗したら過去の数時間(不慣れなのもあり、結構かかっています!)が水泡に帰すわけですから。

そうして“Misskeyのビルド”に到達しました。 これが終わればデータベースの初期化を経てMisskeyの起動となります。 やったー!

ビルドをする。yes we can…

よーし、できる、できるぞ……!という、暗示にも祈りにも似たなにかを胸に、以下のコマンドを実行しました。

cd misskey
NODE_ENV=production pnpm run build

…………なんらかがインストールされていく中、ここでエラーが発生。

NODE_ENV=production pnpm run build
-bash: cd: misskey: No such file or directory

> misskey@13.11.3 build /home/misskey/misskey
> pnpm build-pre && pnpm -r build && pnpm gulp


> misskey@13.11.3 build-pre /home/misskey/misskey
> node ./scripts/build-pre.js

Scope: 4 of 5 workspace projects
packages/misskey-js build$ tsc
│ sh: 1: tsc: not found
└─ Running...
/home/misskey/misskey/packages/misskey-js:
 ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL  misskey-js@0.0.15 build: `tsc`
spawn ENOENT
 ELIFECYCLE  Command failed with exit code 1.

なんかよくわかりませんが、2行目では「Misskey?そんなファイルもしくはディレクトリはないよ」と言われている気配がありますし、13行目でも「tsc見つからないんだけど?」と言われている感じです。

さぁ、困った。 これまでのエラーに比べると今回のエラーは込み入っている印象を受けました。 インストールしたはずのものが「存在しない」と言われているわけですからね。 たしかに、すべての手順を踏んできたはずなのに……いや、本当だろうか? もしかしたらなにか飛ばしてしまったのか?

わからないので、これもSNSに投げ込みます(これまでの初歩的なものよりは解決が難しいだろうなぁという予感はしつつ)。 すると「Typescript環境が構築できていないので、それをインストールすれば解決するかも」「あるいはメモリ不足の可能性も」という助言をいただけました。

なんと手厚く助言してくださるのだろう……!と感謝を胸に、まずは比較的簡単そうなメモリ不足の解決からやってみました。 PCにメモリを増設するのとは違って、VPSのメモリを増やすことは基本的にはできない(上位スペックのインスタンスを借り直す……つまり、今までの手順を1からやり直すことになる)ので、スワップという方法を取ります。

スワップは、ストレージの一部を仮想メモリとして割り当てることで、メモリ不足の緊急時などを凌ぐような使い方を想定した方法です。 メモリよりは速度が出ないので応急処置的な意味合いが強いですが、メモリ不足の場合はスワップを設定することでビルドできた……という声が見られたので、試行します。

スワップ作成にはこちらの記事を参考にしました。 記事中のコマンドもそのままコピペでは通らなかったので、適宜“sudo”を頭にくっつけつつ実行していきます。 そんな頻繁に「とりあえず困ったらsudoをつけてみる」で大丈夫なのか……?とか思いつつも、まぁどうしようもないので。

とりあえずRAM2GBとスワップ2GBの計4GBがメモリとして使えるようになったので、ビルドを再試行……ちょっとエラー内容がかわったものの、結局tscがないみたいに怒られたので、Typescript環境を入れてみることに……。

……残念ながら、これもうまくいきませんでした。 この段になってくると、nginx(これで“エンジンエックス”って読むらしいですよ!)の確認をするコマンド、

sudo systemctl status nginx

で返ってくる答えが“Active”が正常(想定される状況)なところが、“Dead”という表記になっていて、このnginxの起動を試すコマンドを調べて実行するもうまくいかず、なんとなく「ああ、色々と綻びが出始めたな……」と目から光が消えていくのを感じました。

誰かに尋ねるしかないのだろうなぁと思いつつも、同時に「いっそクリーンな状態でやり直したほうがいいのでは?」とも思い始めており、その後もわからないなりに色々と試したものの解決には至らず、ひとまずこの日は終了ということに。

翌日、ずっと外を出歩く予定があり疲れ果て、帰宅後に再挑戦する気が起きず……翌日は筋肉痛がひどくて引き続きやる気も起きなかったため、丸2日放置しました(不完全な状態で放置しているとセキュリティ的にマズいかな……ということで、この間はインスタンスを停止しておきました)。

そして丸2日の放置を経た私の頭の中はもう「初期化、しよう!!」という気持ちが支配的だったので、初期化を試みます。 ただ、「インスタンスの初期化」というものは提供されておらず、できることは「古いインスタンスを削除して新しいインスタンスを作成する」という方法のみ。

まぁ、最初のインスタンスはもう私の手には負えないのはわかりきっていたので、躊躇いなく削除し、新たなインスタンスを作成しました。 圧倒的南無三!

このようにして、最初のインスタンスは爆破されたのであります。 すまない、第一号……。

しかしまぁ、まっさらな状態であれば、ちょっと試したいことがありました。 シェルスクリプトとやらです。

拍子抜けするような結末……?

シェルスクリプトについても厳密な意味は知らないんですが、それを読み込み実行させると、記述された処理を自動で実行してくれるもののようです。 Excelでいうマクロ、Photoshopでいうアクションみたいなもの……といえばいいんでしょうかね。

さて、先代インスタンスでの流れを汲んでいるため、Cloudflareの設定変更は最小限で済みます。 具体的にはMisskeyを動かすために割り当てたサブドメイン「mi.seritude.com」のAレコードのIPアドレスを、新たに作ったインスタンスのものにするだけです。

※Aレコードというのが、IPv4という経路でアクセスする際のIPアドレスを設定するものです。 IPv6の場合はAAAAレコードを設定します。 これが、IPアドレスとドメインの関連付け・紐付けですね。

ちなみに今更ですが、お一人様サーバーなのでメール用の設定(MXレコード)とかは作成していません。 誰かを引き入れるならメールサーバーの設定も必要なんでしょうけど、いかんせん自分しか使わないので、登録時はもちろんパスワードリセット(そもそもMisskeyにはないんですっけ?)などの必要もないためです。

“環境を最新にする”のコマンドを実行したあと、“インストールをはじめる”にあるコマンドを実行します。

すると、これまで私がおっかなびっくりコピペをチマチマとやっていたコマンドがどんどん実行されていく……! 時折、どうしても入力が必要なところ(ユーザーとかデータベース周りの項目とか)はあるので全自動とまではいかないものの、大半は自動で高速にログが流れていく……何らかのインストール作業を眺めつつ、他のことをしたりして作業完了を待つことになりました。

ちなみに本スクリプトは実行に3GBのメモリが必要なんですが、スワップを追加設定するのを忘れて実行したため「メモリが3GBに満たないよ!」って警告が出たときはちょっと焦ったんですが、なんと!このスクリプトは自動で不足部分を自動でスワップ作成してくれるので、作業が中断されることもありませんでした。 至れり尽くせり!!

さてさてそんなこんなで放置することしばし、ついに例の“Misskeyのビルド”のあたりに到達。 前回はスワップを2GB用意してもだめだったところですが、今回は自動で用意された1GBしかなく、成功するかどうかは正直予測がつかなかったです。

というか、不安でいっぱいでした。 これでコケたらどうしよう、と。 自分には早かったのではないか、無茶だったのではないか(と思うことになるのではないか)……などという考えが去来しますが、そうこうしている間にCUIのログは見たことがない文字列を描き出し始めました。

……うん!? もしかして、うまくいった!?!?

少々時間はかかりましたが、なんとまぁ、あっさりとビルドができてしまいました。 拍子抜けするくらい、本当にあっさりと。 あのエラー群はいったいなんだったの?という……(結局原因は不明のままというのが、長い目で見るとちょっと怖いところですが)。

ともあれ、なんだかMisskeyのサーバーが建ってしまった気がするので、恐る恐るアクセスしてみると……。

Misskeyのウェルカムメッセージ

やったー! Misskeyの立ち上げ後、一度しか目にする機会がないという、ウェルカムメッセージが表示されました!!

ここまでの苦戦(といっても、ほとんどはありがたい助言のおかげで、私自身はほとんど何もしていないに等しいのですが)が報われた気がしました。

たとえ、「シェルスクリプト走らせたら一発でできた」のだとしても、最初の失敗でほんの少しだけ理解が進んだ気もしますし、非効率であっても得られるものはあったように思いますから。

……と、なんだかエンディングに向かっているような書き方ですが、まだです。 まだ、問題は発生したのです。 だってなにもわからないんだもの。

まだエンディングは迎えさせん!とオブジェクトストレージの設定が立ちはだかる。

続いて「Misskeyインスタンスで最初に設定するべきインスタンス設定とその他設定の説明」を参考に、Misskeyの全体的な初期設定を行っていきます。

私の場合は“誰でも新規登録できるようにする”はオフにし、メールサーバーは前述の通り必要がないので設定せず、グローバルは見ないしフォロー相手は自分で各サーバーに出向いて探せばいい……ということで“リレー設定”も設定しないでおきました。

私一人のサーバーだし、自分のコントロール外の領域から問題を招き入れるリスクがあるものは、最初から遠ざけておこう……ということです。 できるだけ手間や負担は減らしたいですしね。

そして最後に着手したのが“オブジェクトストレージ”の項目でした。 すぐにでも必要そうな設定のなかでは、なんとなく一番手間がかかりそうだったから後回しにしていたんです。

これも前述の通り、オブジェクトストレージをなぜ使うのかといえば、VPSの標準の容量では心もとないからですね。 私が契約したプランというかインスタンスでは約40GBのストレージが用意されていますが、本記事作成時点ですでに12GBほど消費しています。

のこり28GBほどということで、頻繁にサイズの大きい動画や画像をアップしなければしばらく使える可能性はありますが、誰かをフォローしたりして連合する以上、連合先の画像などもキャッシュなどするのであれば想定よりは早く枯渇するものと思われます。 連合先のキャッシュはオフにもできるようですけども、それでもちょっと心もとないです。

完全に閉じた世界でいいならともかく、やはり外界(他のサーバー)と全く繋がらないというのではあまり使う意味もないと思われるため、そうしたファイル類を別途保管しておく場所が必要……ということで、オブジェクトストレージの出番なのです。

となると、ではどこと契約するか……ですが、できるだけ国内にサーバーがあるところがいいのと、やはりできるだけお安いところが……ということで、WebARENA内のWasabiにすることにしました。

東京リージョン(サーバーの所在地)を選んでバケット(実際にファイルを入れておく場所)の作成をしようとするとエラーが発生していたんですが、なにか障害が起きていたのかもしれません。 しばらくリトライしていましたがいっこうに作成できなかったので、試しに大阪リージョンにしたら一瞬でバケットが作成されました。 なんでや!

さて、Wasabiをオブジェクトストレージとするにはひとつ課題があります。 それは「Wasabiのパブリックアクセスが使えなくなった件(対応の仕方)」にもあるように、新規契約者はWasabiをMisskeyのオブジェクトストレージとして使うのが、そのままでは不可能になってしまったということ。

ただそれも、同記事の手順に従っていけば可能……!ということで、記事の通りに作業をしていきます。 あちこちに「???」な部分はありましたが、なんとか解読と理解に努めました。

……が、

メディアサーバの設定を書いて、その中で、proxy呼び出しするlocationの中に変数設定とluaの署名処理の呼び出しを追加。

の部分が、私の浅知恵……というか、虚無知恵ではどうにもなりませんでした。 一応、「こうかな?」という記述をしてみましたが、試しに画像をアップロードすると正常に表示されなかったため、私の記述は間違っていたということです。

たぶんこのへんは知識があれば“メディアサーバの設定を書く”ことでサクッとできるのでしょうけれども、どうしようもない……ということで手詰まり感が出てきました。

Wasabiにこだわる必要もないのですが、かといって他にどんな候補があって、どこがよさげなのか全くわかりません。 どうしたもんか……と思っていたところ、またしても助言を得ることになりました。 ここまででこうして3人の方に救いとなる助言をいただきました。 本当に、皆さんのお陰でございます。

ここでの助言は「Cloudflareのオブジェクトストレージ(R2)でもいいのではないか」というものでした。 先に述べた通り、どうしてもWasabiにしたい!というわけではなかったですし、CloudflareはCDN機能をすでに使っているので、オブジェクトストレージ分野も任せられるならいささか手間が省けて楽です。

その上、リージョンの指定はできない(自動割り当てされる)ものの、一定の条件下であれば料金が発生しないという超絶太っ腹仕様! お一人様サーバーのような小規模運用なら無料の範囲内で収まるか、はみ出ても大きな出費にはなりにくい……ということのようです。

参考: S3互換の「Cloudflare R2」が正式サービスに。データ転送料無料、10GBまで無料の分散型オブジェクトストレージ

リージョン指定できないという点が気がかりでしたが、どのみちWasabiはこのままでは私には使えそうもなかったため、ひとまずこのR2を使ってみることに。

大手企業の提供するクラウドストレージであるため、情報があるかも……ということで検索して見つけたのが、この記事この記事。 ついでに、Misskeyで使う場合に問題になりそうな「[v13.10.3] リージョン未設定のオブジェクトストレージを使用しているインスタンスでファイルがアップロードできない」というページも見つけたので、これらを併読しながら設定していきました。

個人的にちょっと躓いたのが、“Endpoint”の設定。 前述の記事2つによれば“.com以降はいらない”とか“https:// と com/<バケット名>は削除”と書かれていますが、実際にちゃんと動作したのは「(~.comの直後にある)/以降を削除した場合」でした。 「.com」部分は必要です。

ここまでできたら、GitHubのページに書いてあったとおり、リージョン(Region)は空欄にはせず「us-east-1」と記載しました。 これで動作確認をしたところ正常に画像が表示され、また、オブジェクトストレージ上に、アップロードした画像ファイルもちゃんと存在していることがわかったため、これでようやくちゃんと運用できるようになったのでした……。 やったー!

その後、どうやらR2は国内にもサーバーがあるらしい、という情報を頂いたので、こちらのリリース文にある通り、リージョンは“auto”にしました。 たぶんこれで最寄りの国内サーバーにファイルが置かれている……はず……?

こうして、全くの無知だった私は、とてもありがたい助言をくださった方々とシェルスクリプトのおかげで、Misskeyのお一人様サーバーを建てることができたのでした……!

この先も試練があるし、不安もあるけど、挑戦してよかった!

さて、なんやかんやあって自分の城とも言うべきお一人様サーバーが建ったわけですが、これで万事解決かといえば……そうでもありません。

Misskeyは現在進行系で精力的に日々開発が進んでいるソフトウェアであり、アップデートも頻繁に行われています。 ただ、開発は小規模であるため、入念なテストが行われているというわけではないでしょう(求めるのは無理があります)し、そうなるとアップデートに際して問題が起きることも予想されるわけです。

幸い、最新版にすぐアップデートしなければならないわけではなく、好きなタイミングで更新はできるのですが……万一コケた場合のリカバリー方法を私は知らないので、そうなったときにどうなるかな……という不安はあります。 つまるところ、これからは保守管理がずっと試練として続いていく、と。

保守管理関係のトラブルは、こちらの記事を参考にすると乗り越えられるかな……?と思っていたりします。 今後Misskeyのバージョンが新しくなるにつれて、今書いているこの記事も含め情報が古くなり、役に立たなくなっていく日が来ると思いますが……サーバーを建てる人が増えれば新たに新鮮な記事・ノウハウも増える……はず!?

ただ、そうだとしても……自分の城を持てたことは、私にとっては非常に意味があるものです。

自分の場合、利用させてもらっていたサーバーにてすでにHTLの構築がある程度できてきており、逆にLTLをあまり覗かない・参加しなくなってきていたのですが、やはりどこかで利用時に遠慮する気持ちがあって、あんまり自分の好きなことを投稿していなかったように思います。

興味がある人にも情報が届けばいいな、という投稿をしようにも、LTLの流れを遮るのはちょっとなぁ……とか、HTLへの投稿も埋め尽くしたら申し訳ないなぁ……とか、なんかそういう遠慮が出てきてしまって。

しかし、自分のサーバーであればLTLなんてあってないようなものですし、流れなどを気にする必要もないわけです。 自分の投稿でフォロワーのHTLを埋め尽くすかもしれない問題はあるっちゃありますが、公開範囲を基本的にパブリックにしたまま、思うままに(もちろん法律と節度を守った上で!)投稿できるので、とにもかくにも気楽なんですよね。

そしてなにより、私はblobcatというカスタム絵文字が大好きなんですが、自分の好きなblobcatたちを自分のサーバーのカスタム絵文字として登録する喜びも大きいのです。 他にも気に入ったものがあったらインポートさせてもらったりなんだりして、管理者側ならではの楽しみもあるなぁと(それでいて、自分一人のためにモデレーションなどの負担はほぼゼロなので、とても美味しい境遇だと思います)。

そんなわけで、結構手間取ったりはしたものの、挑戦してよかったと思っています。 もし今後何らかの理由で現サーバーを爆破することになっても、また新たなサーバーを建てるのだろうなぁとも思います。 もちろん、先達の支援あってこそ、だったので、Fediverse上のつながりのありがたみを感じることができたのもよかったです。 もりかぷさん・まなさすさん・夜坂さんには重ね重ね、感謝申し上げます!

そして、この長大な事例報告を読んでくださったあなたにも感謝いたします!