真夜中の色彩

真夜中の雰囲気が好きなプログラマのブログ

Misskeyの個人鯖を立ててみたのでメモをしてみる

 Misskeyを始めてみて結構楽しい。
 楽しいが、LTLが主流のテーマ鯖などで独り言を挙げていくのもあれかな~と思って、個人鯖を立ててみた。

 誰かの手助けになればいいと思いつつ、主に自分のための手順のメモだよ。

構成

 噂の海外VPSであるVultrを利用する。一人用にしてはちょっとオーバースペック。 独自ドメインは事前に取得済み。

  • VPS
    • 2vCPU
    • 4GB
    • 3.00TB
    • 80GB
  • CDN
    • Cloudflare の無料 DNS

※オブジェクトストレージは利用せずにVPSのストレージに置く運用とする。

参考サイト

vultrの利用開始

https://www.vultr.com/ でアカウントを作成する。
友達から紹介コードをもらったのでちょっとお得にスタートできた。感謝。
私のコードはこちら。
https://www.vultr.com/?ref=9422333-8H
紹介された人は期間限定の $100 分の無料利用がついてきて、紹介した人は $35 分の無料利用が貰えるらしい。

Cloud ComputeからInstanceをチョイス。
場所はTokyoで、Intel High Performanceの中から希望スペックをチョイスしました。
OSはWSLでも使ってるUbuntu。Auto backupは付けた。

支払いに利用したクレジットカードはVIEWカードだとダメだったのは解せぬ……。
けど、海外サービスなので色々あるのかも?

VPS の設定諸々

まずはネットワーク周りもろもろを設定する。下記のサイトが大変参考になったので感謝です。

Misskeyのサーバを設置する(v11系)- noellabo's tech blog

Vlturから、IPアドレス、Username、Passwordをコピー。
IPv6はインスタンス準備時に既に選択していたのでこのタイミングでは手を付けず。

VPSの作業用ユーザのsshキーを作成して、~/.ssh/ 配下に置いておく。

最初はrootユーザを使ってsshで接続して諸々設定する。
rootでやること

  • 作業用ユーザを作成して、sudoを許可する
  • 作業用ユーザに切り替えて、先ほど作ったsshキーの公開鍵ファイルを設置
  • /etc/ssh/sshd_config を修正して下記を設定
    • sshのポート番号を変更(ここではそのままの20とする)
    • rootのログインを禁止
    • パスワードログインを禁止
  • sshd の設定テスト
  • 設定テストがOKならば、sshdをrestart
  • ファイアウォール設定を実施

ここまでの作業コマンドメモ

$ adduser gumi
$ usermod -aG sudo gumi
$ sudo -iu gumi
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ touch authorized_keys
$ chmod 600 authorized_keys
$ vi authorized_keys
$ sudo vi /etc/ssh/sshd_config
$ sudo sshd -t
$ sudo systemctl restart sshd
$ sudo ufw allow 22/tcp
$ sudo ufw enable

ここまでやったら別ターミナルを開いて、作業用ユーザでssh出来るか確認する。
接続OKならばrootでログインしていたターミナルは閉じる。
OSのシステムアップデートをしておく。

$ sudo apt update
$ sudo apt upgrade

IPv6アドレスが割り当てられているかどうかを ip a で確認する。
割り当てられてそうだったのでpingが通るどうかを確認する。

我が家の回線はIPv6対応していなかったのですが、それに気づかずに四苦八苦した……。
結局、スマホの5G回線経由でチェックしたらOKだったのでヨシ!!
住み始めたときはまだまだマイナーだったんだよな、IPv6……。

Cloudflare でドメイン設定

独自ドメインはムームードメインで取っているので、DNSだけCloudflareを利用するような形にする。
こちらのサイトが大変参考になったので感謝。

ドメインをどう設定するかに関しては、引き続き下記サイトの記載を参考。

タイプA(IPv4)のレコード、タイプAAAA(IPv6)のレコードを追加する。
名前はmisskey, misskey-mediaの2つ。前者はアプリケーション、後者はオブジェクトストレージ相当。

※構築後、下記の設定をミスっていてSSL無限リダイレクトしたので要注意!!!! - https://misskey.systems/notes/9bzu54wh0s

構築手順

ここから、VPSに作業用ユーザで接続して構築準備を進めていく。
Misskey 13.10.0 をインストールする。

参考したサイトはこちら。 - Misskey構築の手引き - Ubuntu版Misskeyインストール方法詳説

丁度 v13.10.0 から必要バージョンなどが変わっているので各コンポーネントのインストールには要注意。
リリースノート要チェック。

Node.js 18.x or later is required
PostgreSQL 15.x is required

パッケージマネージャがv13.0.0でyarnからpnpmに変わっているので、古い解説などは読み替えが必要。
上記の公式サイトであるMisskey-Hubの情報で読み替えること。(yarnってなんだ?って躓いたりしました)

基本あれこれ インストール

最低限必要そうなやつは先にいれておく。

$ sudo apt install build-essential
$ sudo apt install postgresql redis-server nginx
$ sudo apt install -y curl

PostgreSQL インストール

PostgreSQL 15.x is required

前の節でとりあえず apt で PostgreSQL はインストールしてある。

PostgreSQL のデータベースとユーザを作成する

$ sudo -u postgres psql
could not change directory to "/home/gumi": Permission denied
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# CREATE ROLE misskey LOGIN CREATEDB PASSWORD 'パスワード';
 DATABASE misskey OWNER misskey;CREATE ROLE
postgres=# CREATE DATABASE misskey OWNER misskey;
CREATE DATABASE
postgres=# \q

aptでインストールしたものがバージョン低いことに気づいたので、更新。
最初からこの方法でインストールOK

$ psql --version
psql (PostgreSQL) 14.7 (Ubuntu 14.7-0ubuntu0.22.04.1)

$ wget https://salsa.debian.org/postgresql/postgresql-common/raw/master/pgdg/apt.postgresql.org.sh

$ chmod 764 ./apt.postgresql.org.sh
$ sh apt.postgresql.org.sh -i -v 15
$ psql --version
psql (PostgreSQL) 15.2 (Ubuntu 15.2-1.pgdg22.04+1)

node インストール

Node.js 18.x or later is required

$ curl -sL https://deb.nodesource.com/setup_18.x | sudo -E sh -

$ sudo apt install -y nodejs

$ node -v
v18.15.0

$ sudo corepack enable

Redis インストール

apt でインストールしたけど、改めてRedis指定の方法でやってみる。

$ sudo apt install lsb-release

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

$ curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb jammy main

$ sudo apt-get update

$ sudo apt install -y redis

$ redis-server -v
Redis server v=7.0.10 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=4ee54d6fe8d124c4

misskey 動作用ユーザ作成

アプリケーション動作用のユーザを作る

gumi@vultr:~$ sudo adduser --disabled-password --disabled-login misskey
Adding user `misskey' ...
Adding new group `misskey' (1002) ...
Adding new user `misskey' (1002) with group `misskey' ...
Creating home directory `/home/misskey' ...
Copying files from `/etc/skel' ...
Changing the user information for misskey
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

nginx

http://nginx.org/en/linux_packages.html#Ubuntu

インストールしとく

$ sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
>     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
pub   rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
> http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
>     | sudo tee /etc/apt/sources.list.d/nginx.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx
$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
>     | sudo tee /etc/apt/preferences.d/99nginx
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900

$ sudo apt update

$ sudo apt install nginx

ffmpeg インストール

必要らしいのでやっとく

sudo apt install ffmpeg

ファイアウォール

設置のためにもファイアウォールの設定しとく

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)

$ sudo ufw allow 80
Rule added
Rule added (v6)
$ sudo ufw allow 443
Rule added
Rule added (v6)
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

$ systemctl enable ufw

$ curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

証明書関連のあれこれ

$ sudo apt install -y certbot python3-certbot-dns-cloudflare

$ sudo mkdir /etc/cloudflare
$ sudo vi /etc/cloudflare/cloudflare.ini
$ sudo chmod 600 /etc/cloudflare/cloudflare.ini

$ sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/cloudflare/cloudflare.ini --dns-cloudflare-propagation-seconds 60 --server https://acme-v02.api.letsencrypt.org/directory -d otsumami.bar -d *.otsumami.bar

Misskey のインストールと nginx の設定

パッケージマネージャの pnpm をインストールする。
その後、misskey 動作用ユーザに切り替えてインストールを行う。
まずはGithubからcloneしたりする

$ sudo npm install pnpm
$ sudo -iu misskey

misskey@vultr:~$ ls -al
total 20
drwxr-x--- 2 misskey misskey 4096 Mar 21 12:13 .
drwxr-xr-x 5 root    root    4096 Mar 20 16:02 ..
-rw-r--r-- 1 misskey misskey  220 Mar 20 16:02 .sh_logout
-rw-r--r-- 1 misskey misskey 3771 Mar 20 16:02 .shrc
-rw-r--r-- 1 misskey misskey  807 Mar 20 16:02 .profile

misskey@vultr:~$ git clone -b master https://github.com/misskey-dev/misskey.git
misskey@vultr:~$ cd misskey
misskey@vultr:~/misskey$ git checkout master
misskey@vultr:~/misskey$ git submodule update --init

pnpmで必要なnpmパッケージをインストール。

misskey@vultr:~/misskey$ NODE_ENV=production pnpm install --frozen-lockfile

設定ファイルの作成をする。example.ymlをコピーして作成して編集。

misskey@vultr:~/misskey$ cp .config/example.yml .config/default.yml
misskey@vultr:~/misskey$ vi .config/default.yml
misskey@vultr:~/misskey$ NODE_ENV=production pnpm run build
misskey@vultr:~/misskey$ pnpm run init

nginxの設定をする。設定内容は本家のガイドを見てやった。
https://misskey-hub.net/docs/admin/nginx.html

$ sudo vi /etc/nginx/conf.d/misskey.conf
$ sudo ln -s /etc/nginx/conf.d/misskey.conf /etc/nginx/sites-enabled/misskey.conf
$ sudo nginx -t
$ sudo systemctl restart nginx

大体おしまい

あとは自分のサイトにアクセスしてMisskeyの画面が表示されるか確認。
無限リダイレクトしている人はCloudflareの設定を確認だ。

動いたのを目の当たりにするとやっぱり嬉しいね。

Misskey鯖を運用していくにはこのほかにも色々あるけどひとまずここでおわる。