Twitter、ばたばたしてますね!

ばたばたしていた余波を受けて、今年の1月末くらいから Mastodon や Misskey など ActivityPub 対応のSNSの各所を転々としていましたが、5月くらいに勢い余って、自分ひとりだけのサーバー、いわゆる「おひとりさまサーバー」を立て、しばらく運用していました。 この記事ではおひとりさまサーバーの構築と、しばらく運用してみた感想その他について記載します。

要約

記事が長くなったので感想だけ先に書いておきます。

  • おひとりさまサーバーは楽しいですが、気をつけたことがいいことと無縁にはならないです
  • 最低限Linuxでコマンドを叩ける程度の知識があればおひとりさまサーバーの構築は可能そうですが、運用に関しては気をつけることは当然あります
  • GCEの e2-micro でサーバーを動かすことは可能ですが、ほんの少しでも他者を呼ぶ可能性があるならやめたほうがいいです

環境構築

以下は2023/05に行った設定内容をもとに、2023/07に書き起こしております。 そのため、当時設定した手順とは厳密には異なる手順を踏んでいる場合があります。ご了承ください。

構成

  • Google Compute Engine (GCE) e2-micro
  • Cloudflare
  • Google Cloud Storage (GCS)

元々このサイトが GCS + Cloudflare で動いているので、それに乗っけてしまうほうが早かろう、ということで Google Cloud Platform (GCP) で動かすことにしました。 GCPには 無料枠 があり、当時時点GCEの無料枠を使っていなかったので、ひとまずお試しレベルに無料枠が使えるのであればそれに越したことはないだろう、という判断もあります。

動かしているのは Calckey です。 Calckeyは Misskey のフォークで、細かい説明は省略しますが、だいたいMisskeyみたいなことが出来ます。興味がある方はよしなに調べていただければと思います。

Calckeyの構築はMisskeyの構築とほぼ同様に行えます。 そのため、構築に際しては下記の記事を参考にさせていただきました。

構築手順

ドメインはこのサイトのドメイン rettuce.page が既にあったので、そのサブドメイン calc.rettuce.page で動かしています。 そのためドメイン取得に関する手順は全省略しています。

また構築に際しては Calckey Ubuntu install shell script で提供されているスクリプトを使用しています。

GCEインスタンスの作成

GCPの無料枠で使えるインスタンスを作成します。

余談なのですが、Misskeyの構築には「VPSを借りてきて構築する」手順のほうが、検索したときに資料が見つかりやすいかな……と思いました。GCP自体「まったく分からない」という人が手を出すにはハードルが高い環境ではあろうかと思うので、「この手順に沿ってやれば誰でもサーバーが構築できるよ!」という性質のものではなく、「私はこのへん気をつけて設定しました」程度の内容であることに留意いただければと思います。 誰向けの記事なのかいよいよもって分からなくなってきたな

また、GCEインスタンス作成に関しては、いずれの設定もあとから変更は可能です。ただし、あとからの変更しようと思うとやや面倒くさい項目もあるため、それには「★」を付けています。

★ 無料枠で指定されているリージョンを選択する リージョンの指定

一部の米国リージョンでのみ無料枠が適用されるので、対象のリージョンを指定します。

e2-micro を指定する マシンタイプの指定

無料枠は e2-micro のみなのでこれを指定します。かよわい。

★ ブートディスクをUbuntuにして、「標準永続ディスク」にする ブートディスクの設定

インストール用のスクリプトの動作の関係で、OSは Ubuntu 20.04 LTS x86/64 がよいです。 また、 「ブートディスクの種類」のデフォルトに指定されている「バランス永続ディスク」は無料枠の対象外なので、無料枠にこだわるならば「標準永続ディスク」に変更の必要があります。

HTTPSトラフィックを許可する トラフィックを許可

HTTPで通信することもないと思うので、HTTPSを許可。

静的外部IPアドレスを予約する 静的外部IPアドレスを予約

「詳細オプション > ネットワークインターフェース > 外部IPv4アドレス」から「静的外部IPアドレスを予約」で入力項目が表示されます。 「名前」に calckey-ip とかの、適当な (あとで何用途かの判断が付けやすい) 名前を設定して「予約」すると、インスタンスの外部IPアドレスが固定されます。これをやっておかないとインスタンスを再起動するたびに外部IPアドレスが変わるので、面倒くさくなります。

ストレージに書き込み権限を付与する ストレージの書き込み権限

「アイデンティティと API へのアクセス > アクセススコープ」から「API ごとにアクセス権を設定」を選択します。 なんか色々項目が出て来ますが、今回は「ストレージ」の項目を「読み取り/書き込み」に変更するだけでOKです。 後ほどデータベースのバックアップをGCSに保存するための設定なので、それをやらないのであれば不要です。

このあたりを設定したらインスタンスを「作成」して、インスタンスの起動を待ちます。

Cloudflareの設定

Calckey Ubuntu install shell script の「Configure Cloudflare」に記載されている設定を行います。

DNSの設定をする DNS

左メニューから「DNS」を選択。既存のドメイン rettuce.page のサブドメイン calc.rettuce.page で動かす場合、下記の設定を行います。

項目 設定値
タイプ A
名前 calc
IPv4アドレス GCEのインスタンス作成時に予約した「静的外部IPアドレス」

SSL/TLS 暗号化モードをフルにする SSL/TLS暗号化モード

左メニューから「SSL/TLS」を選択。

コードのサイズ圧縮を無効にする Anto Minify

左メニューから「Speed > 最適化」を選択肢、タブ「コンテンツの最適化 > Auto Minify」。 すべてのチェックを外してください。

Calckeyインストール

GCEのインスタンスが起動したら、インスタンスにSSH接続し Calckey Ubuntu install shell script の「Steps > 1. Prepare」記載のコマンドを実行します。

諸々のアップデートが完了したらインスタンスが再起動するので、再起動後に再度SSH接続し、「2. Start the installation」のコマンドを実行します。 サーバーの性能が激弱なので、スワップファイルの作成もスクリプト内でやってくれます。助かる。

あとは出てくるメッセージに適宜入力を行い、インストールを進めていきます。 既に2ヶ月前で記憶が曖昧なので こちらのサイトsudo bash ubuntu.sh 実行後あたりの流れを見ていくのがよいのではないかと思います。上記サイトはMisskeyでの例ですが、Calckeyも同じことを聞かれます。

Calckeyの設定

インストールスクリプトが実行完了したら、指定したドメインでCalckeyにアクセス出来るようになっているはずです。 ブラウザからアクセスし、adminアカウントを作成し、左メニュー「コントロールパネル」よりCalckeyの設定を行っていきます。

動かし始める前にやっておいたほうがよいであろう項目に「★」をつけています。

★「誰でも新規登録できるようにする」をOFFにする

「全般」に項目があります。 おひとりさまなので無効にしておきます。

LTL/GTLをOFFにする

これもおひとりさまでは不要だったので、「全般」にある下記の項目を無効にしておきます。

  • 「推奨されるタイムラインを有効にする」
  • 「ローカルタイムラインを有効にする」
  • 「グローバルタイムラインを有効にする」

リレーサーバーに参加して連合TLを見る場合はGTLを有効にしてもよいと思いますが、サーバースペック的にどこまで耐えられるか分かったもんじゃないので、ひとまず見なかったことにしておきます。

★「リモートのファイルをキャッシュする」をOFFにする

「全般 > ファイル」に項目があります。 これを有効にすると、自分のサーバーにキャッシュがすごい勢いで貯まっていくので無効にしておいたほうがよさそうに思います。

DeepL翻訳をONにする

Calckeyはノートのメニューから翻訳が出来ます。英語よわよわの民にはありがたい機能です。 使用するためには、DeepLのアカウントを作成してAPIキーを発行する必要があります。 なおDeepLのアカウント作成には、無料版であってもクレジットカード情報を必要とするので留意ください。

DeepL

DeepLのアカウント登録後、「アカウント > DeepL APIで使用する認証キー」に表示されている認証キーをコピーして、Calckeyの「全般 > DeepL Translation」にある「DeepL Auth Key」にペーストしてください。

「メール配信機能を有効化する」をOFFにする

「メールサーバー」に項目があります。 おひとりさまなので不要です。

★オブジェクトストレージの設定

アップロードした画像や、カスタム絵文字などを配置するストレージの設定です。 これを設定しないとサーバーのディスクにファイルが配置されていきどんどん容量を食うので、設定を行います。 今回はGCSをオブジェクトストレージに設定していきます。

GCPの「Cloud Storage > バケット」からオブジェクトストレージ用のバケットを作成します。

★バケット名を設定する バケット名

適当な名前を付けます。あとから変更出来ないので注意してください。 ファイルのURLの一部になるので、自分が作成したバケットであることが分かりやすく、かつ見られても問題がない名称を推奨します。

★無料枠で指定されているリージョンを選択する リージョン

「ロケーションタイプ」を「Resion」に設定し、リージョンを選択します。 GCSにも無料枠があるので、可能な限り無料で運用する想定ならば無料枠が適用されるリージョンを選択してください。これもあとから変更出来ないので注意してください

オブジェクトへのアクセス設定を変更する アクセス制御

サービスアカウントに権限を付与

GCSにファイルをアップロードするためのサービスアカウントと、サービスアカウントに対してGCSへのアクセス権限を付与していきます。

バケットを作成したら、「設定 > 相互運用性 > サービス アカウントのアクセスキー」と辿り、「別のサービスアカウントのキーを作成」し、「新しいアカウントを作成」します。 サービスアカウント名は静的IPのときと同様、あとで何用途かの判断が付けやすい適当な名前を設定するのとよいと思います。

サービスアカウント

サービスアカウントに「Storageオブジェクト作成者」の権限を付与します

サービスアカウント アクセス許可

これでアカウントを作成すると、HMACキーが発行されます。 ここで表示されたアクセスキーとシークレットはあとで使うので、メモしておいてください。

サービスアカウントのHMACキー

ここまでGCSの設定を行ったら、Calckeyの「コントロールパネル > オブジェクトストレージ」に設定を行います。

オブジェクトストレージ

項目 設定値
Base URL https://storage.googleapis.com/先ほど作成したバケット名
Bucket 先ほど作成したバケット名
Prefix (空欄) 1
Endpoint https://storage.googleapis.com
Region (空欄)
Access key サービスアカウント作成時に発行された「アクセスキー」
Secret key サービスアカウント作成時に発行された「シークレット」
SSLを使用する ON

プロキシアカウントの作成

リスト機能を使用する場合、リストに追加したアカウントのノート (トゥート) を取得するために「プロキシアカウント」という特別なアカウントが代理でフォローを行い、ノートを取得する仕組みになっています。 フォロー以外に対してリスト機能を使用する場合は、このプロキシアカウントを作成していく必要があります。

  1. 「コントロールパネル > ユーザー」から、左上にある「+」を押下して、プロキシアカウントのアカウント名/パスワードを入力
  2. 「コントロールパネル > プロキシアカウント」から、「アカウントを選択」し先程作成したアカウントを設定

プロキシアカウントが選択できない場合、いったんプロキシアカウントで適当なノートを行うとよい説があります2。 ログインついでにプロキシアカウントのプロフィールの設定などを行っていくとよいと思います。 フォローされた相手に「このアカウントはなにか」を説明するドキュメントが書かれていると親切なのかなと思います3

DBバックアップ

サーバーがとにかく貧弱なので、なにかあって全てが吹き飛んだ場合に最悪復元できるようにしておきます。 ファイルはオブジェクトストレージに保存してあるので、あとはデータベースを復元できればなんとかなるんじゃないかな多分、ということでDBのバックアップを取得して、GCSに保存しておくようにします。

まずはCalckeyを動かしているインスタンスを選択し、「APIとIDと管理」の「サービスアカウント」の値を確認しておきます。

サービスアカウント

次にDBのバックアップを保存しておくGCSのバケットを用意します。 Calckeyのオブジェクトストレージに使用したバケットはインターネット上に公開されているので、別途開されていないバケットを新しく作成しておくべきかと思います。

バケットの作成手順は割愛します。作成したら、バケット右端の「■」が縦3つに並んだやつから「アクセス権の編集」、開いたメニューから「プリンシパルを追加」を選択。

サービスアカウントにロールを付与

「新しいプリンシパル」に先程確認した「サービスアカウント」を設定し、「ロールを選択」に「Storage オブジェクト作成者」を設定します。

これでGCEインスタンスからバックアップ用のバケットにアクセス出来るようになっているはずなので、SSHでGCEのインスタンスに接続し、バックアップ用のスクリプトなどをを作成します。

# PostgreSQLのdumpを出力するディレクトリを作成しておく
sudo mkdir /var/backup

# dumpファイルをGCSにアップロードするスクリプトを作成
vi backup_db.sh

backup_db.sh の中身は下記の感じにしておきます。 BUCKET_NAME BUCKET_DIR は作成したバケット名やバックアップを保存したいディレクトリ名に置き換えてもらいつつ、全体的によしなに変更してください。

# !/bin/bash
PATH=$PATH:/snap/bin

DUMP_DIR=/var/backup
DUMP_FILE_NAME=calckey_db.gz

BUCKET_NAME=your-bucket-name
BUCKET_DIR=backup-dir
BACKUP_FILE_NAME=calckey_db_`date +"%Y%m%d-%H%M%S"`.gz

DUMP=${DUMP_DIR}/${DUMP_FILE_NAME}
BACKUP=gs://${BUCKET_NAME}/${BUCKET_DIR}/${BACKUP_FILE_NAME}

gsutil cp ${DUMP} ${BACKUP}

あとは、cronでPostgreSQLのバックアップの取得と、上記スクリプトの実行を1日1回実行するようにします。

sudo vi /etc/cron.d/pgbuckup

pgbuckup の中身は下記のようにしました。 動かすのはCalckeyを触っていない時間がよいので、私が寝ているであろう 5:00 を実行時間にしています。

# pgbuckup 1日1回DBをバックアップする
SHELL=/bin/bash

0 5 * * * postgres pg_dumpall | gzip -c > /var/backup/calckey_db.gz
5 5 * * * youraccount bash /home/youraccount/backup_db.sh

youraccount のところは実行ユーザーに合わせていい感じにしてください。 これを保存したら、cronを再起動します。

sudo chmod 644 /etc/cron.d/pgbuckup
sudo systemctl restart cron

インスタンスの再起動

サーバーがとにかく貧弱なので、数日動かしているとなんかモッサリしてきます。ということでGCEインスタンスを、これも1日1回、寝ている時間 (5:30-5:45) で再起動するようにしています。

この辺の設定、やった作業を改めて見返したら、この方法はあまりお行儀よくないのでは?4 となったので割愛します。 よしなにググってください。

運用した感想

全体的な話

おひとりさま、楽しい~~~~!!!!

Misskey系のサーバーでよく「個人運営」というワードを聞くと思いますが、その言葉のとおり、規模の大小こそ異なれど大半のサーバーが個人によって運営されています5。 そのため、サーバー内のルールに関しては、運営者に迷惑がかからないよう様々な制約があるケースが大半ですが、おひとりさまなら私がルールなのでその辺自由にいけるのが大変気分的に楽ですね。はしゃぎすぎると他のサーバーからブロックされることになるので節度を守って自由にしたほうがいいのは前提ですが……。

あと、Misskeyの話がTwitterなどで話題になるときに俎上に上がりがちなもののひとつがカスタム絵文字だと思っていますが、好きなカスタム絵文字追加し放題なのでこのあたりも好きな人は好きなやつなんじゃなかろうか、と思います。

一方で、「サーバーに自分しかいない」「連合しているサーバーがない」という状態は、フォローを増やす手段が限られている、ということでもあり。 SNS、一定のフォローがないとあまり面白くならないところはどうしてもあると思うので、そのあたりは「他の参加者が多いサーバーで気の合う人を探す」というような動きは検討していく必要があるのではないか、とも思います。有名どころの misskey.io とかですね6

また「他サーバーと連合する」という仕様上、どうしても下手なことをすると別のサーバーに対してご迷惑をおかけする可能性はあるよな、というところはあり。そういうやらかしを防いだり、情報収集という意味でも、サーバー管理人のフォローは増やしていったほうが捗るのではなかろうか、という気がしています。 その場合はハッシュタグ #鯖缶のみなさんと繋がりたい #鯖管のみなさんと繋がりたい とかも活用していくとよさそうに思います。

性能的な話

この記事は e2-micro で構築をしていますが、実は 2023/07/09 現在 e2-small にスペックを上げています。てへぺろ。

7月頭ごろに発生したTwitterのAPI制限の兼ね合いで、Twitterから新規に登録した方もそうなのですが、Twitterから流入した結果ふだん利用しているサーバーが不安定になり他のサーバーに改めて登録したアカウントがかなり増えた印象で、だいたい フォロー数が150 / 連合しているサーバー数が50 くらいのあたりで、なんとないサーバーの悲鳴を感じ始めたので、スペックを上げることにしました。 このあたりの上げ下げがサクッと出来るのはGCPのよいところではありますが、あまり下がることないんじゃないですか? という点と、 e2-small の時点で月あたりだいたい $12 ほど掛かる = 他のVPSであればもう少し月次コスト下げる選択肢は全然ありそう、という点で別にGCPを強く推奨する感じではないかな……と思っています。

とりあえず e2-micro でもサーバーを動かすことは出来ますが、リレーサーバーに参加するとか、サーバーに友人知人を呼びたい需要がある場合はやめておいたほうがいいんじゃないかな、と思います。かなり真面目に。

最後になりましたが、最近はFediverse上では主に @[email protected] で動いています。あんまり益のある話をしないアカウントですが、ご縁がありましたら、よろしくお願いいたします。


  1. 設定した場合、バケットの下にここで設定した名称のディレクトリが作成され、その中にファイルが配置されます。オブジェクトストレージ専用のバケットとして設定するのであれば不要でよいでしょう ↩︎

  2. うろ覚えです ↩︎

  3. 私のサーバーのプロキシアカウントは HatoCalc Proxy になっています。とあるサーバーでプロキシアカウントがプロ騎士アカウントになっていたのを盛大にパクりました ↩︎

  4. GCPが作成したサービスアカウントに直接ロールを付与しているのですが、Google的にはそれはあまり推奨していなさそう ↩︎

  5. Misskey/Calckey系で明確に法人が運営しているサーバーってあるんですかね? 私は聞いた記憶がないです ↩︎

  6. 2023/07/09現在、招待制&招待コード抽選制と伺っているので、すぐにアカウントを作るのは難しそうな気配ですが。また他のサーバーについても招待制に移行しているケースがかなり多いように思われ、「Fediverseにアカウントを持つ行為」自体の敷居が少しずつ上がっているのかもしれない、とは思わなくもないです ↩︎