新しいRaspberryPi4にMisskeyサーバを建立する

技術記録

おひさしぶりです。

唐突ですが、ラズベリーパイ4bを手に入れました。理由は簡単で、Twitterの移住先を作るためです。
なので今回はMisskeyサーバをこの新しい

嘘つきました。新しくはないです。一度Misskeyサーバはたててたんですが、どうにもSSDにI/Oエラーが頻発しており、新しいSSDへのデータ移行もかなわず、結局のところ一から再度構築を行いたいと考えた次第。

用意した環境

  • RaspberryPi4b 8GBメモリ版
  • M.2 SSD WD Black 2TB
  • Ubuntu server 22.04 LTS

RaspberryPi4b(以下RP4)へのOS書き込みはRaspberry Pi Imager を使いました。こちらに関しては難しくはないので説明を割愛します。RP4からSSDでのOS立ち上げが可能になっているので今回はできるだけ長く使うつもりで2TBのSSDをそのままSDカードの代わりとして使います。

言い忘れたんだけど、OS焼く際にログインのユーザ名とパスワードは設定しておきました。あとロケールも日本にしてあります。

注意かも

玄人志向のM.2ケースとADATAのLEGEND800は相性が悪かったのか、単品で動かすとどちらも動きますが、併せて使うとWindowsから反応を貰えなくなるので、別のメーカーのもので何とかしてください(1敗)

あと別に関係ないし知らなかったんだけどUbuntuってCentOSとかと違って最初はrootが無効になってるのね。

Ubuntuをアプデする

sudo apt update
sudo apt upgrade
sudo apt autoremove

まずは電源を入れてログインします。そして上のコマンドでよくある最新にしておきます

sudo systemctl start ufw
sudo systemctl enable ufw

ファイヤーウォールのufwを起動して、自動起動もONにしておきます。このままだとそとからSSHができないのと今後ブラウザから見えないので22、80、443、くらいは開けておきます。

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443

前回のセットアップではdocker-composeを使いましたが、今回はなんか手作業でやってみたくなったので、Ubuntu詳細説明版の説明のページの通りにMisskeyサーバを建立していきます。

やることとやらないこと

  • CloudFlareは使いません(お金と手間をかけたくないし、そこまで利用者を増やす予定もない)
  • ファイルはnanoではなくvimを使います(いまから使い慣れないnano使いたくない)
  • 建立する敷地はドメインを用意した本番環境です(ドメインは頑張って用意して)
  • オブジェクトストレージは使いません(お金かけたくない)

いろいろインストールしていく

そのまえにMisskeyサーバ用のアカウントを作るよ。

sudo adduser --disabled-password --disabled-login misskey
色々出てくるものにエンター連打

作り終わったら下記で確かめる

#ユーザ変更
sudo su - misskey

#ログアウト(元のユーザに戻る)
exit

misskey アカウントに変更できていたらOK

curlが入ってるかを確認して、入ってなかったら説明の通りインストール。自分の環境では入ってたのでインストール手順は飛ばしました。

curl --version

次はnode.js。ただ、これはaptでインストールすると結構古いのが入れられるみたいなので手動で最新版をインストールする。方法はここを参考にした。ただしca-certificatesもgnupgもcurlも最新版が入ってたのですっ飛ばしました。

#GPG KEYをとってくる(?)
sudo mkdir /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

#バージョン指定(今回は何となく20を選択)
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

#レポジトリを更新してインストールする
sudo apt-get update
sudo apt-get install nodejs -y

#インストールされているか確認する
apt show nodejs

ERR? node -v ではエラーが返ってきますね…

node: error while loading shared libraries: libatomic.so.1:cannot open shared object file: No such file or directory

このページを見ると、どうやらlibatomic1というのが入ってないっぽいので入れてあげると解決した

sudo apt install libatomic1

ついでにこれも書いてあったのでやっておく

#corepack enable
sudo corepack enable

次のインストールはPostgreSQL。これも書いてあるとおりに進める

sudo apt install -y postgresql-common
sudo sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -i -v 15;

どうやらまたエラーが出た。

jammy-pgdg-testing InRelease doesn't support architecture 'armhf'

こんな感じの。

だからとりあえず上までの流れは置いておいてここに書いてあるインストール方法も試す

#レポジトリ追加
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

#鍵の追加
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg

もやっぱり駄目だったので普通に入れます(諦め)14.xのやつ入れるのちょっと癪だけどまあいいや

#インストール
sudo apt install postgresql

#入ったか確認
psql --version

#自動起動をオン
sudo systemctl enable postgresql

postgresqlにログインしてMisskey用のユーザとデータベースを作成する

#デフォルトユーザでログイン
sudo -u postgres psql

#ユーザを作成
CREATE ROLE misskey LOGIN PASSWORD 'hoge';#misskey, hogeは適宜変更

#データベースを作成
CREATE DATABASE mk1 OWNER misskey;#mk1は適宜変更、misskeyは先ほどのユーザ

#ログアウト
\q

redisのインストール

ここを参考にしたので読みつつやってほしい。レポジトリの追加、こっちはうまくいった。

#まだ入ってないlsb_releaseだけインストールした
sudo apt install lsb_release

#レポジトリとGPGをちょこちょこ
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

#レポジトリの更新とredisのインストール
sudo apt update
sudo apt install redis-server

#起動確認と自動起動のオンとバージョン確認
redis-server --version
systemctl status redis-server
sudo systemctl enable redis-server

次にnginxをインストールする。参照先はここです。ただし事前に必要なものは既にインストール済みなので、直接作業に入る。

#例によってGPGのあれこれ
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

#レポジトリを登録(であってるのかなこの作業)
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

#何してるかわからんけどこれをやる
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx

#レポジトリの更新とインストール
sudo apt update
sudo apt install nginx

またarmhfをサポートしてないって言われてしまったので、ここを参考に手動でビルドします。このサイトではrootになってたけど全部sudo 使っていくよ。

#必要なものをインストールする
sudo apt install build-essential

#レポジトリを登録?
echo "deb-src [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
#これ最初のdebがdeb-srcになっただけだね

#レポジトリを更新
sudo apt update

#依存関係のものをインストールする
sudo apt build-dep nginx

#ソースパッケージをビルドしていく
sudo mkdir /usr/local/src/nginx
sudo chmod 777 /usr/local/src/nginx
cd /usr/local/src/nginx
pwd #今いるカレントディレクトリの確認 /usr/local/src/nginxならOK
sudo apt source nginx
cd nginx-1.24.0/ #今の最新版のバージョン
pwd
sudo sed -i 's/--with-ld-opt="$(LDFLAGS)"/--with-ld-opt="$(LDFLAGS)" --with-ipv6/g' debian/rules

#ビルドの実行
sudo dpkg-buildpackage -uc -b

#debファイルのインストール
cd ..
pwd #/usr/local/src/nginx
sudo apt install ./nginx_1.22.0-1~jammy_armhf.deb

#確認その他もろもろ
nginx -V
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systmectl status nginx #activeならOK

さて、その他のところにあるものは既に入ってたので、それは飛ばして一気にMisskeyのインストールに行きます。

sudo su - misskey
git clone -b master https://github.com/misskey-dev/misskey.git --recurse-submodules
cd misskey/
git checkout master

#npm
NODE_ENV=production pnpm install --frozen-lockfile

できたかな

nginxを設定していく。まずは元のアカウントに戻る。

exit

デフォルトの設定をコピーしてMisskey用に設定していく

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/misskey.conf
sudo vim /etc/nginx/conf.d/misskey.conf

#追記
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

#変更
- servername localost;
+ servername example.ltd;

#シンタックステスト
sudo nginx -t #OK

#再起動
sudo systemctl restart nginx

Let’s Encryptの導入

httpsにしたいからこれも入れる。

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.ltd
#更新情報などの連絡先を入力
#規約に同意
#なんか我々に協力しないか?(ン拒否するぅ)
#Successfully何たらって出たら完了

Misskeyのビルドをする。 Yes we can…

sudo su - misskey
cd misskey
NODE_ENV=production pnpm run build

エラーとか出てなければできたのではないでしょうか(出なかった)

データベースの初期化をする

ここでエラー出ました(何回目だ

pnpm run init

ここでエラー出ました(何回目ですかね)default.ymlに書いたsyslog:のインデントがおかしいって出たので修正します。余計な空白isゴミ。でもまだおかしかった。今度はDBのユーザ名。たぶん大文字にしてたけどうまく設定されてないなこれ。default.ymlの設定の方を小文字にします。USER_a→user_a

……うまくいきました。

じゃあMisskeyを建立します。

NODE_ENV=production pnpm run start

Now listening on port 3000 on http://example.tld と表示されたら、設定したURLにアクセスする。

Misskeyのウェルカムページが表示されるはずだ。

とあるんですが、nginxのウェルカムページが表示されているんですね。たぶんmisskey.confの描き方がまずいのかな……

わかりました(30分経過)

location / {} のディレクティブを二つ書いてたからですね。一個にしましょう。で、rootとかは要らなかったね。duplicateの訳語が重複なのになぜか古い(推奨されない)だと思い込んでた。

起動できて、ページが表示されるのが確認したら、元のユーザに戻って下記を実行

sudo vim /etc/systemd/system/misskey.service

[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=misskey
Restart=always

[Install]
WantedBy=multi-user.target

保存して、デーモンを更新して実行

sudo systemctl daemon-reload
sudo systemctl enable misskey
sudo systemctl start misskey

一旦おつかれさまでした

何やダメでした

どうやら1番目にユーザ登録ができていなかったのか管理者権限が無かった……やり直そう(公式サイトにはやるなって書いてあるけどDBフッ飛ばしてやり直すよ)

元のユーザに戻ってから作業開始

sudo -u postgres psql

drop database mk1;
create database mk1 owner misskey;
\q

このあともう一回Misskeyのアカウントに入って、ビルドをしなおします。

真っ先にログインをすればコンパネが使えるようになってるはずです。

その他機能の追加

プッシュ通知

sudo npx web-push generate-vapid-keys

生成されたPub KeyとPriv KeyをMisskeyに登録する。この作業は本体よりも別のブラウザが使えるPCやタブレットからSSHで接続してやるとよい。

メール設定

これ未だによくわかってない

Gmailをメールサーバにして何とかしたいやつ。独自ドメインのメールアドレス持ってるので、misskey@example.ltdでGmailがごにょごにょできるようにしておいて、メール配信機能をオンにする。

SMTPホスト:smtp.gmail.com
PORT:465
USERNAME:Gmailアカウント
PASSWORD:Gmailアカウントのパスワード
SMTP接続に…使用する:オン

あとは sudo ufw allow 465 で配信が可能なはずなんだけど、上手くいかない。

で、ここまで書いて、前のストレージ不良だと思ってたものがSSD固有の機能であるAPSTが有効になっているからであるということが分かったのでこの話はここでおしまい。

そっちについてはまた別途まとめるよ。それでは

タイトルとURLをコピーしました