自鯖備忘録

# グラポリ鯖を建てたときのメモ

このメモではArch Linuxを用いてサーバーを建てたときの備忘録です。環境に応じてお好きなように読み替えてください。また、こちらはいつか別の鯖を建てるときの備忘録として記述したものなのでこの記事を過信せずにお願いします…

## Groundpolis

GroundpolisはMisskeyのフォークの一つに位置づけられるミニブログソフトウェアです。

Misskeyの機能を改善して独自にペイントツールやMFMを簡単に扱うことができる関数ビルダーなどを内包しています。詳しくはGitHubの[README](https://github.com/Groundpolis/Groundpolis/blob/master/README-ja.md)へ

[公式インスタンス](https://groundpolis.app/)

鯖を建てる際のマニュアルは[こちら](https://github.com/Groundpolis/Groundpolis/wiki/for-admin)を読んでおくと良いです

## 必要なもの

- 動かす為のサーバー(筆者はLinodeを使っています)
- ドメイン
- 調べる力
- 気力
- 諦めない心

## 作業用ユーザーを作るまで

`sudo pacman -S nodejs postgresql redis git`

pacmanですので依存パッケージも自動で拾ってくれます。

私の環境ではYarnとnginxをオプションで入れています

`sudo pacman -S yarn nginx`

マニュアルの通りにやっているとおそらくユーザーのログインで引っかかると思います。なので、

`su - groundpolis --shell=/bin/bash`

参考記事:http://pocketstudio.jp/log3/2012/02/16/to_switch_nologin/


## Groundpolisをインストールと設定ファイルの編集

といってもマニュアル通りに進めていくだけです。

```
cd ~
git clone -D master git://github.com/Groundpolis/Groundpolis.git
yarn install
```

次は.config/example.ymlを同ファイル内にdefault.ymlとしてコピーしてそれを編集します。

cdで移動してからでも良いのですが、ビルド時にはGroundpolisディレクトリにいる必要があるため、移動せずにコピーして編集します。

`cp ./.config/example.yml ./.config/default.yml`

設定する部分はURL(これが鯖のドメインになります)、PortとTLSの設定(ここではnginxを使うので1番をコメントアウト、nginxの設定は後述)、Postgresql(dbの名前とAuthの部分、これは次の項目で詳細に記述します)、Redis(ここは基本いじらなくても大丈夫)、ElasticSearch(オプション。ElasticSearch自体かなり重いのでよほどのことが無い限り個人や少人数規模の鯖では導入はしなくても大丈夫です)あたりです。

##　sudo権限が無い場合

この部分は基本読み飛ばしても問題はないですが、万が一groundpolisにsudo権限が無い場合、sudoが使えるグループ(基本wheelグループ)に属してあげる必要があります。

一応sudo権限を付与するため、念の為にパスワードを設定したほうがいいでしょう。

`passwd groundpolis`

rootに戻って作業します。(`exit`もしくは`logout`、筆者はこれの違いは良くわかってないです…)

`useradd -m -G wheel -s /bin/bash groundpolis`

普通ならこれで大丈夫なのですが、VPSによってはwheelにsudo権限が与えられていない場合があります。

`EDITOR=任意のエディタ visudo`

おそらくコメントアウトされているだけなのでwheelグループにsudo権限を与えてあげましょう。

参考文献:Arch Wiki([Sudo](https://wiki.archlinux.jp/index.php/Sudo)と[ユーザーとグループ](https://wiki.archlinux.jp/index.php/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97))

## postgreSQLの設定

ここらへんが初心者にとっての一番の鬼門です。気をしっかりと持ちましょう。

`sudo systemctl start postgresql`と`sudo systemctl start redis`をしておきましょう。私はこれを忘れて1日ぐらい費やしました(自分語り)

順番が前後しますが、基本default.ymlで記述した内容=実際に設定する内容にします。しかし、私がハマった点ではディレクトリやリモートで接続しているユーザー名と一緒にするのは避けておいたほうが良いです。理由としてインストールガイド時にpostgreの設定でユーザー名とDB名を指定するコマンドがありますが、最初ユーザー名はrequinにして設定をしようとしていたのですが、`createuser: error: creation of new role failed: ERROR: role "requin" already exists.`と表示されてしまいました。

これはrequinというロールはもう作られているよという意味のエラーなんですが、もちろん作った記憶なんて無いし、調べてみても前に同じようにユーザーを作るときにエラーを返されたけど内部では間違って生成されている可能性があるの一点しかヒットしなかったため、疑問に思いつつも削除してみることに。
`dropuser requin`を入力すると`role "requin" cannot be dropped because some objects depend on it. DETAIL: owner of database groundpolis`とのメッセージが。

？？？？だから作ってないが？？？？？？？？？

このときは友人から別の名前でcreateuserしたほうが良いと言われて別の名前で作るとそのままユーザー作成することができました。次にcreatedbコマンドを打つときにまた同じようなエラーが発生しましたので、おそらくディレクトリやユーザー名で被るとエラーが発生します。気をつけましょう。

## swapファイルを作成する

Misskey(Groundpolis)ではビルド時にかなりのリソースを消費します。構成にもよりますがメモリ2GBだとだいたいコケますのでスワップファイルを作ってやりましょう。

rootで作業します。例えば2GBのスワップファイル作成するとするなら以下の作業を行います。

```
fallocate -l 2G /swapfile   #2GBのスワップファイルを作成
chmod 600 /swapflie         #パーミッションを設定します
mkswap /swapfile            #スワップにフォーマットします
swapon /swapflie            #スワップの有効化をします
```

これでスワップがされるようになりました。

## nginxを設定する(オプション)

ここらへんはFediverseで大いなる活動実績のある[のえるさんの記事](https://blog.noellabo.jp/entry/2019/08/14/8i3RHuZ1wJNDinIn)を参照していきます。

ファイアウォールを設定するために`sudo pacman -S ufw`を入れていきます。

ufwでポート80と443を開放します。

```
sudo ufw allow 80
sudo ufw allow 443
```

nginxの導入に入る前に少しだけ自鯖の話を。今回の環境構築につきましてcloudflareでドメインを管理していきます。cloudflareはDNSサーバーや証明書、リバースプロキシ、CDNを受け持ってくれる大変便利サービスです。初心者には難しいと言われていますが、いろいろ楽だと思います。LinodeとCloudflareはなんか相性が悪いらしいですけど…(詳しくは調査中)

でも導入する手間を考えても割と楽だったりするので参考記事を元に導入をお願いします。基本セットアップはcloudflareの指示に従って設定してください。

さてnginxを設定していきます。`sudo pacman -S nginx`でnginxをインストールします。

misskey(groundpolis)ではサンプルファイルが用意されているため、これらをnginxのディレクトリに配置していきます。

[サンプルファイル](https://github.com/syuilo/misskey/blob/develop/docs/examples/misskey.nginx)

冒頭部分にsite-availableにconfファイルを配置してsite-enableにシンボリックリンクを作るかconf.dに同じようにconfファイルを配置する形になります。

しかし、Arch Linuxではインストール直後だとnginxディレクトリ直下にconf.dやsite-availableとsite-enableディレクトリが無いため先に作っておきます。

またここからの作業はsudo権限が必要ですが、いろいろディレクトリ間でやりくりするため、ここの作業はrootでやっても良いかもしれません。しかし絶対に分からない状態でファイルの変なところをいじるのはやめましょう。変なところいじって死ぬのはまずいので…

話を戻してsite-availableとsite-enableディレクトリ(もしくはconf.d)を作成します。

`sudo mkdir /etc/nginx/site-{available,enable}`もしくは`sudo mkdir /etc/nginx/{site-available,conf.d}`

サンプルファイルには絶対パスで`/home/groundpolis/Groundpolis/docs/examples/misskey.nginx`にあります

これをまず/etc/nginx/site-availableディレクトリにコピーします。

`sudo cp /home/groundpolis/Groundpolis/docs/examples/misskey.nginx /etc/nginx/site-available/grpl.conf`

ファイル名は自分が分かるようであれば好きに変えてください(今回の場合ですと、groundpolis.confにすべきだとは思いますが長いのでgrpl.confと省略しています)。

ファイルはURLと証明書のパスを書き換えるだけで大丈夫です。証明書は記事を見ると基本Certbotが取得したものを適応しているものが多いのですが、別途他のところから証明書を取得しても問題ありません。私はcloudflareから取得しました。

設定を書き換えたら`nginx -t`でテストします。エラーがでなければnginxデーモンを再起動させましょう。

`sudo systemctl restart nginx`

`sudo systemctl status nginx`でステータスがActiveになっていれば大丈夫です。 

最後に`systemctl enable nginx`をして自動起動できるようにしておきましょう。

## ビルド

ここまで来たら実際に鯖が建つまで少しの辛抱です。

`yarn build-product`でソフトウェアをビルドします。次に`yarn run init`でサーバーを初期化したら、`NODE_ENV=production yarn start`を実行すると問題が無ければ鯖が起動します。このときに実際にブラウザからURLを入力すると管理者用アカウントの作成を促されます。

## systemdで自動的に起動できるようにする

ここではrootで実行します。

`/etc/systemd/system/groundpolis.service`を作成します。

```systemd
[Unit]
Description=Groundpolis daemon

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

[Install]
WantedBy=multi-user.target
```

`systemctl daemon-reload; systemctl enable groundpolis`を実行してsystemdを再読込してサービスを有効化します。

`systemctl start groundpolis`でサービスを起動します。問題なければ起動します。

お疲れ様でした。

## 最後に

力尽きたので途中は投げやりになってしまいましたが、気力が戻ったらちゃんと追記したいと思います。これが誰かの鯖建てにお力添えできれば幸いです。長文失礼致しました。