Ccmmutty logo
Commutty IT
10 min read

Raspberry Pi 3 Model B+を使ってmisskeyサーバー構築

https://cdn.magicode.io/media/notebox/2a074632-8cdd-4371-9cb2-7b6fee56bf4b.jpeg

TL;DR

Raspberry Pi 3 Model B+でMisskeyのサーバーを作ってみます。
(成果品はこちら)

注意事項

Raspberry Pi 3 Model B+は、Misskeyサーバーの推奨スペックを満たしていません。そのため、使っているとよくフリーズしてしまいます。Watchdogを使ってフリーズを検知して再起動をかける方法がありますが、どちらにしても複数人による使用はおすすめしません。

インストール手順

OSのインストール

筆者はDietPiを使いました。DietPi公式サイトから取ってきて、SDカードなどに書き込んでから、初期設定をしてください。(詳しい手順はここでは説明しませんが、固定IPを設定してください。)

作業用のユーザー作成

作業用のユーザーを作成します。このユーザーは外部からは見えないので、いつも使っているユーザー名でいいです。
rootにログインしてから、次のコマンドを実行してください。(一行目を実行すると、パスワードの設定が求められます。)
adduser --gecos "" [ユーザー名]
adduser [ユーザー名] sudo
これ以降は、作成したユーザーを使ってログインしてください。

ドメインの取得

ドメインを取得します。独自ドメインがあれば、それを使いましょう。 筆者はお金がないので無料なmydnsを使いました。

DDNSの通知設定 [mydnsの場合のみ]

次のコマンドを実行しましょう。
echo "0 * * * * curl http://[mydnsのユーザー名]:[mydnsのパスワード]@ipv4.mydns.jp/login.html"|sudo tee /etc/cron.hourly/mydns

ポート開放 [必要な回線を使っている場合のみ]

ルーターの設定画面から、次のポートをRaspberry Pi 3 Model B+のIPアドレス宛に開放してください。(回線や機種によってやり方が違います。)
  • :80 [TCP]
  • :443 [TCP]

依存しているプログラムのインストール

次のコマンドを実行してください。
curl -fsSL https://deb.nodesource.com/setup_current.x|sudo bash -
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
sudo apt update
sudo apt install nodejs postgresql redis nginx git build-essential cmake
sudo corepack enable
sudo -u postgres psql <<EOF
CREATE ROLE misskey LOGIN CREATEDB PASSWORD 'misskey';
CREATE DATABASE misskey OWNER misskey;
EOF

SSL証明書を作る

次のコマンドを実行して、SSL証明書を作ってください。
sudo systemctl stop nginx
sudo certbot certonly --standalone --email [管理者のメールアドレス] -d [取得したドメイン(サブドメインでも可)]
sudo systemctl start nginx

SSL証明書の更新設定を直す

このままだと、自動的に証明書を更新してくれる機能とmisskeyが衝突してしまうので、衝突を回避するように設定します。
cat <<EOF|sudo tee /etc/cron.d/certbot
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
#
# Important Note!  This cronjob will NOT be executed if you are
# running systemd as your init system.  If you are running systemd,
# the cronjob.timer function takes precedence over this cronjob.  For
# more details, see the systemd.timer manpage, or use systemctl show
# certbot.timer.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root systemctl stop nginx && test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew && systemctl start nginx
EOF

misskeyユーザーを作る

Misskeyは専用ユーザーを作って、その上で実行することが推奨されています。次のようにして、misskeyユーザーを作ってください。(パスワードを聞かれますが、作業用と同じでいいはずです。)
sudo adduser --gecos "" --disabled-password --disabled-login misskey

misskeyユーザーになる

次のコマンドを実行して、作業ユーザーからmisskeyユーザーになります。
sudo su misskey
cd

misskeyをclone

misskeyをcloneします。
git clone https://github.com/misskey-dev/misskey --recursive --depth 1 -b master

Misskey本体のインストール

本来ならここでそのままコマンドを打つのですが、筆者の環境では負荷がかかりすぎてRaspberry Piがフリーズしてしまったので、一旦ここでシャットダウンしてください。
sudo systemctl poweroff

SDカードのマウント

シャットダウンをしたら、SDカードを普通のPCに入れて、第2パーティションをマウントします。
sudo mkdir /mnt/rpi
sudo umount [SDカードのデバイスファイル]2 >/dev/null 2>&1 || true
sudo mount [SDカードのデバイスファイル]2 /mnt/rpi -o exec,suid,dev,rw

SDカードにchroot

マウントしたら、次のコマンドを打って、Raspberry PiのSDカードにchrootしてください。
sudo chroot /mnt/rpi

ユーザー変更

chrootした直後はrootユーザーなので、次のコマンドを実行して、misskeyユーザーになります。
su misskey

依存関係のインストール

ビルドやインストールに必要なライブラリなどをインストールします。
cd misskey
NODE_ENV=production pnpm install --frozen-lockfile

Misskeyのビルド

Misskeyをnode.jsで実行できるようにソースコードを変換します。
NODE_ENV=production pnpm run build

chrootから抜ける

負荷がかかる処理はここまでなので、chrootから抜けます。
exit # 1回目: misskeyユーザーからログアウト
exit # 2回目: chrootから抜ける
sudo rmdir /mnt/rpi
抜けたら、SDカードをアンマウントして取り出してください。

Raspberry Piの起動

取り出したSDカードをRaspberry Piに刺して起動してください。起動したら、作業用のユーザーでログインしてください。

misskeyユーザーになる

次のコマンドでmisskeyユーザーになります。(2回目)
sudo su misskey

misskeyの設定ファイルを作る

次のようにして、misskeyの設定ファイルを作ります。
cd misskey
nano .config/default.yml
このコマンドを打つと、エディターが起動するので、次のように入力してください。
url: https://[取得したドメイン]/
port: 3000
db:
  host: localhost
  port: 5432
  db  : misskey
  user: misskey
  pass: misskey
redis:
  host: localhost
  port: 6379
id: 'aid'
syslog:
  host: localhost
  port: 514

データベースの初期化

さっき作った設定ファイルをもとに、データベースを初期化します。
pnpm run init

リバースプロキシサーバーの設定

Nginxを使って、misskeyをSSLに対応させます。
exit # misskeyユーザーから抜ける
sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/conf.d/misskey.conf
このコマンドを打つと、またもやエディターが起動するので、次のように入力してください。
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 80;
    listen [::]:80;
    server_name [取得したドメイン名];
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name [取得したドメイン名];

    ssl_session_timeout 1d;
    ssl_session_cache shared:ssl_session_cache:10m;
    ssl_session_tickets off;

    ssl_certificate     /etc/letsencrypt/live/[取得したドメイン名]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[取得したドメイン名]/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;
    client_max_body_size 80m;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        proxy_force_ranges on;
        add_header X-Cache $upstream_cache_status;
    }
}
保存したら、次のコマンドで編集を反映させます。
sudo systemctl restart nginx

misskeyを自動起動させる

次のコマンドを使い、misskeyを自動起動させるようにします。
sudo systemctl enable nginx
sudo systemctl enable postgresql
sudo systemctl enable redis-server
cat <<EOF |sudo -u misskey tee /home/misskey/misskey/start.sh
#!/bin/bash
cd /home/misskey/misskey
NODE_ENV=production pnpm run start
EOF
sudo -u misskey chmod +x /home/misskey/misskey/start.sh
cat <<EOF >/tmp/cronfile
@reboot /home/misskey/misskey/start.sh
EOF
sudo crontab -u misskey /tmp/cronfile

これでインストールは終わりです。再起動すると自動的にmisskeyサーバーが起動します。うまく行っていれば。
なにかエラーが出たらコメントに来てください。遅れるかもしれませんが対応します。

Discussion

コメントにはログインが必要です。