一通りソースコードを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
この手順を踏まないと面倒です。実は、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」が正しいので修正しました。
ユーザーの作成
ログインしたユーザのホームディレクトリ配下に構築することもできるとは思いますが、ここでは新たに「ログインできないユーザー」を新規作成することにします。
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
rubyでpostgresqlに接続するために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
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
master.keyを作成する
config/master.keyがないとrailsの各コマンドが実行できません。そのため、再作成します。
rm config/credentials.yml.enc EDITOR=vim bin/rails credentials:edit
EDITOR環境変数に指定している「vim」は、自分が使い慣れているエディタに置き換えてよいと思います。現時点ではcredentials.yml.encがリポジトリに含まれていますが、今後取り除きます。
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ブラウザからアクセスして、以下の文字列が表示されたら問題ないはずです。
問題ないなら一度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」にアクセスすると、先ほど試してみた以下の画面がまた表示されるはずです。
さて、これで構築はできました。でも、データがないので本当に動いているのか不安ですよね?これから先はテストデータを投入してみて検索できるか試す話です。
テストデータを入れてみる
ここからは、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」のように検索すると、次のように表示されます。
WebUIとcrawlerが動かないと正直使えないのですが、そちらはまた日を改めて記事にします。