プログラミングなんてわからないんですけど〜

元プログラマによるプライベートでのプログラミング日記。1/3のつもりだけどソフト関連はここがメイン

fediversesearchの構築手順をまとめてみる(その1:fediversesearch-server)

一通りソースコードgithubにアップロードしたので、テスト環境を構築しながら構築手順をまとめてみます。
まずは、fediversesearch-serverについてまとめます。

今回対象とするOS

今回対象とするOSは、Ubuntu 20.04.2 LTSとします。

構築手順

OSの最新化

まずは、OSを最新の状態にしておきます。

sudo apt update
sudo apt upgrade -y

個人的には、tmux上で作業する方がsshのセッションが切れても問題ないので安心だと思っています。

OSを再起動するかどうかは、以下のコマンドで確認するとよいでしょう。

cat /var/run/reboot-required

必要なら、「*** システムの再起動が必要です ***」という感じのメッセージが表示されます。再起動が必要ならrebootコマンドで再起動しましょう。

sshがらみの話

sshのセキュリティ設定については色々やらなければならないケースもあるかとは思いますが、サーバーを外部に公開するかどうかなどによって違いますし、どう設定するかは好みというか使い方によるので各自で調べてください。

yarnをインストールする

fediversesearch-serverではnode.jsのパッケージマネージャーであるyarnを使用しています。そこで、この時点でyarnをインストールします。

curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn


linuxhint.com

この手順を踏まないと面倒です。実は、yarnという名前のコマンドはcmdtestというパッケージにも含まれるため、上記の内容を実行しないとパッケージマネージャーのyarnではなくcmdtestパッケージのyarnが入ってしまうことがあります。
(2021/9/23追記)「echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list」が正しいので修正しました。


packages.ubuntu.com

ユーザーの作成

ログインしたユーザのホームディレクトリ配下に構築することもできるとは思いますが、ここでは新たに「ログインできないユーザー」を新規作成することにします。

sudo -i
adduser fediversesearch --disabled-login -q --gecos ""

これで、 「fediversesearch」というユーザーが作成されます。今回はfull nameなどの入力確認メッセージは省略するために-qオプションと-gecosオプションを使用しています。

postgresqlのインストール

fediversesearch-serverでは、データの格納先としてpostgresqlを使用しています。そのため、事前にパッケージをインストールします。

apt install postgresql

postgresqlサービスを登録して起動しておきましょう。

systemctl enable postgresql
systemctl start postgresql

rubypostgresqlに接続するためにpgというgemを使用しています。そのgemを構築するために使用するファイルが含まれているパッケージもインストールしておきます。

apt install libpq-dev

fediversesearch-serverでは全文検索エンジンとしてPGroongaを使用しています。そのため、こちらもインストールします。

add-apt-repository -y ppa:groonga/ppa
apt update
apt install -y -V postgresql-12-pgroonga

pgroonga.github.io

postgresqlにユーザーを登録する

fediversesearch-serverがpostgresqlにアクセスするためのユーザーをpostgresqlに登録します。

su - postgres
psql -c "CREATE USER fediversesearch WITH PASSWORD 'fediversesearchpassword';"

ここでは、「fediversesearch」というユーザーを「fediveresesearchpassword」というパスワードを指定してpostgresqlに登録しています。ユーザー名やパスワードは任意ですので、自分で決めてもらって構いません。ここで指定した値は、のちほど「.env.production」ファイルに書きます。「CREATE ROLE」という文字列が表示されれば成功です。

次に、作成したユーザーにDBの作成権限を付与します。

psql -c "ALTER ROLE fediversesearch CREATEDB;"

「fediversesearch」のところは、各自作成したユーザーに置き換えてください。「ALTER ROLE」という文字列が表示されれば成功です。

作業が終わったら、rootユーザーに戻ります。

exit

rubyのインストール

fediversesearchユーザーになって、rubyをインストールします。

apt install -y build-essential libssl-dev zlib1g-dev
su - fediversesearch

rbenvを動かすために必要なパッケージをインストールしてからfediversesearchユーザーになっています。

rbenv経由でrubyをインストールしますので、まずはrbenvをインストールします。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

rubyは2.7.3での動作を確認していますのでこちらをインストールします。

rbenv install 2.7.3
rbenv global 2.7.3
rbenv rehash


qiita.com
k-koh.hatenablog.com

「rbenv rehash」はおまじないです。もしかしたら、実行しなくても「ruby -v」でrubyのバージョンが表示されれば問題ないと思います。

fediversesearch-serverのソースコードのダウンロード

githubリポジトリからfediversesearch-serverのソースコードをダウンロードします。展開先はserverディレクトリとしています。

git clone https://github.com/kaias1jp/fediversesearch-server.git server

bundlerのインストール

fediversesearch-serverでは、bundleコマンドを使用してgemをインストールします。そのため、まずはbundlerをインストールします。

gem install bundler

必要なgemのインストール

serverディレクトリに移動して、必要なgemをインストールします。

cd server
bundle install

master.keyを作成する

config/master.keyがないとrailsの各コマンドが実行できません。そのため、再作成します。

rm config/credentials.yml.enc
EDITOR=vim bin/rails credentials:edit

EDITOR環境変数に指定している「vim」は、自分が使い慣れているエディタに置き換えてよいと思います。現時点ではcredentials.yml.encがリポジトリに含まれていますが、今後取り除きます。

qiita.com

yarn installの実行

yarn installを実行します。

yarn install

.env.productionファイルを作成する

サーバー個別の設定ファイルである「.env.production」ファイルを作成します。ファイルの中身はこんな感じです。
.env.production

DB_HOST = "localhost"
DB_USERNAME = "fediversesearch"
DB_PASSWORD = "fediversesearchpassword"
DB_NAME = "fediversesearchdb"

fediversesearch-serverで使用するDBを作成する

postgresqlにfediversesearch-serverで使用するDBを作成します。

RAILS_ENV=production bundle exec rails db:create

作成したDBに対してpgroongaを使えるようにする

一度rootユーザーに戻って、fediversesearch-serverが使用するDBでpgroongaを使用できるようにします。

exit
su - postgres
psql -d fediversesearchdb -c "CREATE EXTENSION pgroonga;"
exit

DBにテーブルなどを登録する

fediversesearchユーザーになって、作成したDBに必要なテーブルなどを登録します。

su - fediversesearch
cd server
RAILS_ENV=production bundle exec rails db:migrate

実行結果に「ERROR」の文字列がなければうまくいっているはずです。

試しにfediversesearch-serverを立ち上げてみる

DBの準備ができたなら試しにfediversesearch-serverを立ち上げてみましょう。

RAILS_ENV=production rails s -b 0.0.0.0

「-b 0.0.0.0」をつけることで、インストールしたマシン以外からfediversesearch-serverにアクセスできるようになります。
count APIを呼び出してみましょう。「http://サーバーのIPアドレス:3000/api/v1/count」にWebブラウザからアクセスして、以下の文字列が表示されたら問題ないはずです。
f:id:kaias1jp:20210922154155p:plain

問題ないなら一度fediversesearc-serverを停止します。sshで接続している画面に戻って「Ctrl+c」(Ctrlキーを押しながらcキーを押す)を実行すると、「Exiting」と文字列が表示された後にコマンドが入力できる状態に戻ります。

fediversesearch-serverをサービスとして登録する

一応動くことが確認できたら、fediversesearch-serverをサービスとして登録しましょう。rootユーザーに戻ってserviceファイルを作成します。作成するファイルは「fediversesearch-server.service」とします。「/etc/systemd/system/」の下に作成してください。

fediversesearch-server.service

[Unit]
Description=fediversesearch-server
After=network.target

[Service]
Type=simple
User=fediversesearch
WorkingDirectory=/home/fediversesearch/server
Environment="RAILS_ENV=production"
Environment="PORT=18000"
ExecStart=/home/fediversesearch/.rbenv/shims/bundle exec puma -C config/puma.rb
ExecReload=/bin/kill -SIGUSR1 $MAINPID
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

環境変数に「PORT=18000」を指定していますが、ポート番号に決まりはありませんので変更してかまいません。ファイルの作成が終わったら、サービスとして登録してから起動します。

systemctl daemon-reload
systemctl enable fediversesearch-server
systemctl start fediversesearch-server

問題なければ、Webブラウザで「http://サーバーのIPアドレス:18000/api/v1/count」にアクセスすると、先ほど試してみた以下の画面がまた表示されるはずです。
f:id:kaias1jp:20210922154155p:plain



さて、これで構築はできました。でも、データがないので本当に動いているのか不安ですよね?これから先はテストデータを投入してみて検索できるか試す話です。

テストデータを入れてみる

ここからは、rootユーザーで実行します。
テストデータは私のgistに上げてあります。ここでは、サーバーの「/tmp」にダウンロードします。

cd /tmp
wget https://gist.githubusercontent.com/kaias1jp/87e7eaf500d5c60f6d4d74d0451221d8/raw/2120d8f45c7f5f7eb76ffc14e708216d3598c3e4/softwares.csv
wget https://gist.githubusercontent.com/kaias1jp/87e7eaf500d5c60f6d4d74d0451221d8/raw/2120d8f45c7f5f7eb76ffc14e708216d3598c3e4/sites.csv
cd

まずは、ソフトウェア種別のデータを登録します。

sudo -u postgres psql -d fediversesearchdb -c "COPY softwares FROM '/tmp/softwares.csv' WITH CSV DELIMITER ',' HEADER;"

「COPY 10」と表示されればOKです。次はサイトデータです。試しに10件作っています。

sudo -u postgres psql -d fediversesearchdb -c "COPY sites FROM '/tmp/sites.csv' WITH CSV DELIMITER ',' HEADER;"

「COPY 10」と表示されればOKです。Webブラウザで「http://サーバーのIPアドレス:18000/api/v1/count」にアクセスすると、5件と出力されるはずです。なぜ5件なのかというと、10件中dns_statusがNOERRORなのが5件だからです。ここでsearch APIにキーワードとして「mastodon」を指定して「http://サーバーのIPアドレス:18000/api/v1/search?keyword=mastodon」のように検索すると、次のように表示されます。
f:id:kaias1jp:20210922163551p:plain


WebUIとcrawlerが動かないと正直使えないのですが、そちらはまた日を改めて記事にします。