ドメインを新規に取得する場合、使えるようになるまでに時間が掛かりますので、早めに手続きを開始してください。ドメインを取得したら、信頼できるDNSサーバを選定して(契約して)ネームサーバに指定します。ここでは、既に所有しているnoellabo.comというドメインのサブドメインとして、misskey.noellabo.comという名前で運用することにします。Cloudflareの無料プランを契約し、noellabo.comでCloudflareを利用するようセットアップされているものとします。例に使用したこのドメインは2016年7月23日にムームードメインで取得し、現在はCloudflareに移管して更新しています。ムームードメインでの新規取得・1年目にかかる費用は999円、2年目以降の更新が1,480円、Cloudflareでの更新に切り替えてからは8.03ドル(執筆時点で853円ぐらい)です。メールサーバーパスワードの再発行などのために、メール送信を引き受けてくれるサーバが必要です。運用しているメールサーバや、借りているメールサービスがある場合はそれを利用することもできます。ここでは、mailgunを利用します。利用頻度は低いので、無料の範囲で足りると思います。オブジェクトストレージユーザーが添付したりリモートから取得するメディア等のファイルは、サーバのローカルストレージに保存する動作が標準ですが、オブジェクトストレージに保存する方が管理・運用し易くなります。最初からオブジェクトストレージを利用しましょう。Service(S3と呼ばれる)のAPIがデファクトスタンダードとなっていて、MisskeyもS3互換のAPIであれば、様々なオブジェクトストレージサービスを利用できます。ここでは、リリースされたばかりのVultrのオブジェクトストレージを利用します。月額5ドルで250GBの保存容量とダウンロード1TB/月、超過分は従量課金となります。保存容量が0.02ドル/GB、ダウンロードが0.01ドル/GBです。Misskeyは他のSNSと比較して、ユーザーに様々なファイルの取り扱いを許しており、ユーザー毎に保存領域を持てるようになっています。サーバに付属する固定容量のストレージでは容量の制限が厳しくなるので、ほぼ無限に容量を拡大できるオブジェクトストレージを上手に活用してください。今回は手順を割愛しますが、バックアップデータの保存にも便利です。作業用PC作業用のPCからsshでサーバに接続し、インストールや更新を行います。10やmacOSにはsshクライアントが最初から入っていますので、それを利用します。LinuxやFreeBSDなどからの接続も同様です。Fediverse上のSNSアカウントいくつか動作確認をするために、既存のFediverse上のSNSにアカウントを持っていた方が良いでしょう。Misskey、Pleroma、Mastodonのアカウントがそれぞれあると便利です。Misskeyはmisskey.io(公式インスタンス)が良いでしょう。私の運営するのえすきーを利用していただいてもかまいません。Pleromaはこれといって特にオススメがありませんが、私の運営するのえろまを利用していただいてもかまいません。MastodonはFedibirdをお薦めします。私の運営するサーバですが、Fediverseの活動拠点を志向しており、LTLがないため他の利用者に遠慮なく活動できるため、テストに最適です。Misskeyを設置・運用している友人・知人Misskeyに詳しい知り合いがいると、ちょっとした問題が起きても対処が簡単です。少人数で開発されている進化の速いサービスは、だいたいドキュメント整備が追いついていません。行き詰まったらFediverseで助けを求めましょう。誰か知っている人が反応してくれると思います。情報はどこを参照すべきか当記事も含め、非公式の情報は時間経過とともに内容が古くなり、現在の状況に適合しなくなることが常です。できるだけ、開発者が直接関わっている公式の一次情報をあたります。Githubの公式リポジトリなんといっても、まずはコレ。公式のリポジトリです。syuilo/misskeyREADME.mdに、主要な情報のインデックスがまとまっていますね。WikiWikiも参考になります。https://misskey.wiki/情報の鮮度としては古くなりがちですが、Wikiというカタチでないと記録されにくい、過去から現在にかけての経緯を説明した文章や、開発者、インスタンス情報と運営者、関連ソフトウェア・アプリ、Bot、機能の解説などの情報が参照できます。joinmisskeyMisskeyへの玄関口として設置されたサイトです。joinmisskey開発者・運営者向け情報インスタンス一覧ブログいくつかのコンテンツと、情報へのポインタがまとまっています。Misskeyの項VPSサーバを借りて、環境を整備するさて、具体的な手順の説明に入ります。Vultrに登録して、新しいサーバを借ります。Nowインストールが始まるので、StatusがRunningになるまで待ちます。Networkを選択IPv6アドレスをコピーします(ここでは2001:19f0:7001:35fb:5400:02ff:fe36:3bd5)VultrのIPv6アドレスは、ここで有効にしただけではUbuntuから使えないので、後ほど必要な設定することで利用可能になります。ここでは、DNSの設定のためにアドレスを把握するところまでとします。オブジェクトストレージVultrのWebから、オブジェクトストレージを作成します。Bucketsを選択。Credentialsの各項目をメモ(右側のコピーボタンを活用する)オブジェクトストレージ自体に付ける名前は、単なるラベルなので何でもかまいません。バケットの名前は、Hostonameとあわせて、参照するURLの一部になります。CDNの裏側に隠蔽して使うことが多いので、それほど気にしなくても大丈夫です。バケットの名前は、VultrのLocation単位で、他の利用者が使っていないユニークな(他と重複のない唯一の、という意味でユニークと言います)名前をつける必要があるので、ドメイン名などを含めるなど工夫が必要です。作業マシンで、ssh接続の準備。ssh-keygenコマンドでsshの鍵を作っておきます~/.ssh/configに、借りたサーバの設定を記述しておきますrootでログインして、作業用のユーザーを作り、鍵で接続できるように公開鍵を登録します作業用ユーザーで接続し直します。ed25519で、鍵の種類を指定。保存場所と保存名はデフォルトでOK。パスフレーズは空でも良いですが、指定しておけば、盗まれても悪用されにくくなります。この操作で、秘密鍵が~/.ssh/id_ed25519に、公開鍵が~/.ssh/id_ed25519.pubに生成されます。この公開鍵の内容を後ほどサーバの~/.ssh/authorized_keysにコピーして登録することで、秘密鍵を使ってサーバに接続できるようになります。noel@macbook.local次に.ssh/configを記述します。メモ帳やvi、nanoなどでファイルを作成します。~/.ssh/id_ed25519Hostにこれからこのサーバに接続する際に使いたい任意の名前をつけます。ここではmisskeyとします。Userに、サーバ上に作成する作業用ユーザー名を記述します。ここではnoelとします。Portに、SSHで使用するポート番号を記述します。標準のポートであれば不要ですが、変更する場合はここを任意の番号に書き換えておきます。ここでは22とします。Hostnameに、サーバのIPアドレスを記述します。DNSで解決できるようにしてあれば、ドメイン名を記載してもOKです。ここでは先ほどメモした45.77.128.78とします。IdentityFileに、秘密鍵のファイルパスを記述します。ここでは先ほど作成した~/ssh/id_ed25519とします。22というコマンドで接続します。password:はじめて接続するサーバなので、接続先ホストの鍵のfingerprintを表示して、ホントにこのサーバに接続していいか確認されます。yesと答えると、~/.ssh/known_hostsに記録され、次回から確認は出なくなります。同じIPアドレス(またはドメイン名)で別のサーバにすり替えられている場合に検出されるので、より安全になります。rootのパスワードを聞かれますので、Vultrからコピーしてきたrootのパスワードをペーストします。無事にログインできましたか?作業用ユーザーを作成rootでssh接続するのは推奨されません。代わりに、作業用のユーザーつくります。noelパスワードを聞かれますので、設定してください。その他の設定は、空のままで大丈夫です。作業ユーザーを、sudoを許可するグループに追加します。noel作業ユーザーに切り替えて、sshを鍵で接続できるように設定します。authorized_keysauthorized_keysに、あらかじめ手元で作ってある公開鍵をコピペします。noel@macbook.localsshdの設定を変更します。no最後に、sshdの設定をテストします。エラーがあった場合は、メッセージを頼りに修正してください。間違ったままだとsshで接続できなくなってしまいますので、慎重にやりましょう。-t問題なければ、設定を有効にするために、sshdを再起動します。sshdファイアウォールを設定して、特定のポートの接続だけを許可します。ここでは、ufwを使って、ssh接続だけを許可して、有効化します。22の部分は、先ほど設定したポート番号を指定してください。これを間違うと、接続できなくなります。enable設定ができたら、もう一つターミナル/コマンドプロンプトを開いて、ssh接続できることを確認します。ここまで正しく設定できていれば、さきほど~/.ssh/configに設定した作業用のユーザーとポート番号、登録した公開鍵に対応する秘密鍵で接続できるはずです。misskeyパスフレーズを設定している場合は聞かれます。無事に接続できましたか?問題があったら、先に接続したターミナル/コマンドプロンプトの方の画面で、サーバの設定を見直します。切断しなければ操作を続行できます。接続できるようになったら、最初にrootで接続した方は、ログアウトして切断しておきます。最後に、次の作業にうつるまえに、システムのアップデートをかけておきます。upgradeメモリの少ない環境向けの追加設定Misskeyのビルドには、概ね2GB以上のメモリが必要です。不足はスワップファイルで補います。2GBだとかなりギリギリなので、もう少し足しておいた方が良いと思います。0足りないですね......。swapを追加します。ここでは2GB追加します。/etc/fstab/etc/fstabには下記の内容を追記します。1950204これならなんとか大丈夫そうですね。VultrのIPv6アドレスを有効にするVultrの場合の設定です。このへんの事情はVPSによってまったく異なります。aなどとして、IPv6アドレスが割り当てられていることが確認でき、外部からpingして応答があればOKです。foreverドメインの設定Cloudflareでドメインを管理しているという前提で、ホストの追加設定を行います。ここではnoellabo.comというドメインに、misskeyというホストを設定します。オブジェクトストレージに保存するメディアの参照専用に、misskey-mediaというホストも設定します。メールに関する設定は、とりあえず後回しにします。2001:19f0:7001:35fb:5400:02ff:fe36:3bd5オレンジ色の雲(cloud)マークはクリックすると切り替えられますが、オレンジにしておくと、Cloudflareによりキャッシュされ、IPアドレスが隠蔽(本当のIPの代わりにCloudflareのIPになる)されます。Misskeyをセットアップ公式のセットアップ手順は、こちらに記載があります。当記事と記載内容に違いがある場合は、公式の手順に従って下さい。https://github.com/syuilo/misskey/blob/develop/docs/setup.ja.mdまずは、PostgreSQLと、redis、nginx、ビルドツールとpythonをaptでインストールしておきます。pythonPostgreSQLの設定PostgreSQLにmisskeyというユーザー(ROLE)と、misskeyデータベースを作っておきます。パスワードを設定してください。ここではC&U#eb2CMkDiEivD$C9Uとしています。\qMisskeyのインストールドキュメントに従って、misskeyユーザーを作って、リポジトリをcloneするところまでやります。git://github.com/syuilo/misskey.gitnodejsとyarnをnodenvでインストールするnodejsとyarnのインストールについては、nodenvで行います。src.bashrcの末尾に、nodenvのPATHと初期化を追記します。buildがHeap不足にならないように、NODE_OPTIONSも指定しておきます。~/.bashrc下記の内容を~/.bashrcの末尾に追加します。root)"/plugins/nodenv-updateで、misskeyディレクトリに入って、.node-versionファイルを確認。misskeyが想定しているnodeのバージョンになります。.node-versionここではv12.6.0となりました。nodenvで、12.6.0をインストールします。12.6.0無事にインストールされたか、nodeとyarnのそれぞれのバージョンを確認します。masteryarnで依存関係をインストールします。package.jsonに記載されている、Misskeyが利用しているパッケージ(ソフトウェア部品)のインストールです。Misskeyがバージョンアップした場合は、package.jsonの内容も変更されることがありますので、必ず実行します。変更されたものだけを検出して高速に実行されます。install設定ファイルのひな形をコピーして、編集します。.config/default.ymlだいたいいじるのはこのあたりになるでしょう。Misskeyを設置するURL、今回はmisskey.noellabo.comという名前で運用するつもりですのでurlにそのように記述します。portはここでは3000を使用します。3000で接続する流れです。dbのuserは、先に作成したPostgreSQLのROLEです。ここではmisskeyと設定します。dbのpassは、先に作成したPostgreSQLのROLEに設定したパスワードです。ここではC&U#eb2CMkDiEivD$C9Uと設定します。Misskeyをビルドします。yarnでpackage.jsonに記載のbuild手順を実行します。buildを実行するように記述があります。webpackの手順はwebpack.config.tsに、gulpの手順はgulpfile.tsに記載があります。buildNODE_ENVは、開発やテスト、実運用の切替の設定です。productionにすると、実運用環境であると認識して、アセットの圧縮など最適化をしっかりかけて、開発やテストだけに必要な動作を行わないようになります。この手順は、CPU時間とメモリを大量に消費するため、不足すると失敗します。待ち時間が長いので、先にやっておけることを済ませておいた方が良いでしょう。Misskeyがバージョンアップした場合は、必ずビルドが必要です。ビルドが完了したら、データベースを初期化します。空のデータベースを作ってありますので、ここで行うのは、テーブルやインデックスの作成です。init実行する手順は多いですが、あっという間に実行されます。migrateでマイグレーションを行います。マイグレーションは、最新のプログラムで必要な、データベースに対する変更を実行する手順です。この手順が完了すると、Misskeyを起動する準備が整います。先の手順で、Misskeyを起動する準備が整いましたが、VPSサーバの起動とともに起動し、バックグラウンドで実行し続けるために、systemdの設定が必要です。Misskeyをサービスとして起動するための、systemdのユニットファイルを設定します。/etc/systemd/system/misskey.service下記の内容を記述します。WantedBy=multi-user.targetユニットファイルの変更を反映(daemon-reload)し、有効に(enable)し、実行(start)します。misskey停止する場合はstop、開始がstart、再起動がrestartです。Misskeyのバージョンアップの際などに、マイグレーション前に停止し、マイグレーション後に開始する、などの操作を行います。nginx(リバースプロキシ)Misskeyは、それ自身がWebサーバとしての機能を備えていますが、こうしたWebアプリケーションでは、外部からのアクセスを一度nginx等のリバースプロキシが引き受けて、必要に応じてアプリケーションに転送する構成をとることが一般的です。nginxがSSLを処理したり、キャッシュを利用して高速に応答したり、多数のアクセスを上手に捌いてくれることで、アプリケーションは自身の機能を実現することに専念できるようになります。アプリケーションをメンテナンスのために停止する場合にも、適切な応答を返すことができるなどのメリットもあります。443/tcp証明書certbotを使って取得・更新します。私が書いた記事の中では、これの後半が参考になるかと思います。https://noellabo.qrunch.io/entries/54MFy6cuWRsKUhQgここではmisskey.noellabo.comをcloudflareのDNSで管理している前提で、DNS認証で証明書を取得する手順を示します。certbotと、cloudflare用のDNS認証を自動化するプラグインをインストールします。python3-certbot-dns-cloudflarecloudflareにプログラムから必要な指示を行うため、IDとなるメールアドレスと、APIのキーを設定したファイルを作成します。.cloudflare_credentialsファイルの内容に、cloudflareで登録したメールアドレスと、取得したAPIのキーを設定します。(noel@example.comはダミーのアドレスです。--dry-run問題ないようであれば--dry-runをはずし、実際に取得を行います。--no-eff-emailオプションの意味を一覧しておきます。電子フロンティア財団(certbot開発元)とメールアドレスをシェアする許可certbotでは、証明書の更新が実際に行われた場合にだけ実行するスクリプトを定義しておくことができます。nginxなどは、証明書が更新されても、nginxに再読込を指示しないと、古い証明書の内容をいつまでも覚えていて実際に新しい証明書が使用されません。自動的に証明書などが再読込されるように設定しておきます。renewal-hooks/deploy/reload.sh内容は、下記の通りです。nginxこれに実行権を設定しておきます。renewal-hooks/deploy/reload.shaptでインストールしたcertbotの場合、cronによって自動的に更新処理を定期実行するよう、あらかじめ/etc/cron.d/certbotというファイルが仕掛けられています。証明書の有効期限が1ヶ月を切ると、取得の際に使ったバラメータに基づいて再取得が行われ、nginxのreloadが行われて、新しい証明書が使われるようになります。証明書の取得に失敗していると、設定したメールアドレスに、期限が迫っている旨、メールが届きます。放置するとマズイので、メールが届いたらすぐに設定を確認することをお勧めします。nginxの設定nginxの方は、misskeyのリポジトリにあるサンプルを利用して、ドメインと証明書のパスを書き換えて、所定のディレクトリに配置し、シンボリックリンクを張ります。サンプルファイルはこれです。https://github.com/syuilo/misskey/blob/develop/docs/examples/misskey.nginxこのファイルは、gitでリポジトリごと取得済みですので、misskeyディレクトリのdocs/examplesにmisskey.nginxというカタチで保存されています。../sites-available/misskey.noellabo.comという感じで設定ファイルをコピーして、シンボリックリンクを配置します。順序が逆ですが、ファイルを編集して、ドメインと証明書のパスを設定します。/etc/nginx/sites-available/misskey.noellabo.com設定ファイルを書き換えたら、必ずチェックします。エラーが出たら、OKでるまで直して再実行します。-tnginxをリロードすれば、nginx経由でmisskeyに繋がるようになります。nginxオブジェクトストレージのポリシーの設定Vultrのオブジェクトストレージに保存されたファイルを誰でも閲覧できるようにするために、s3cmdでポリシーを設定しておきます。Endpointだけ設定すれば、あとはEnterで大丈夫かと思います。いうファイルをmisskey-media_policyというファイル名で保存します。}バケット名misskey-noellabo-com以下の全てのファイルに、s3:GetObjectを許可するポリシーです。これを、実際に適用します。今後、オブジェクトストレージを変更した際にURLが変わらないようにすること、Cloudflareによるキャッシュを利用するために、nginxに設定を追加してプロキシ接続できるようにします。nginxオブジェクトストレージを使用する設定Misskeyの管理者設定画面から行います。オンメール送信の設定メール送信は、自前で設置するよりも外部に委託した方が良いと思います。ここではMailgunを利用します。Mailgunを利用開始するための登録方法の解説は割愛します。ドメインは素のまま使うこともできるが、mg.付きで設定する方が切り分けられて良い。mailgun.orgCloudflareでは、Nameの入力内容にドメイン名部分(noellabo.com)は不要なので注意。Nowでチェックが完了すると、以下のようなグリーンのチェックがついてMailgunが利用できるようになる。Passwordした画面。7a90afe0005bf35034b0d0bc671897b6-898ca80e-df05107aMisskeyの管理、インスタンスから、メールサーバーの設定で、拾った情報を入力する。メールアドレスは利用するドメインで任意のものを設定して保存ボタンを押すインスタンスの管理者アドレスの設定が同じ管理画面の上の方にあるので、そこにメールを受け取れるアドレスを記載して、メールの送信テストボタンを押す。