GROWIをUbuntuで構築した

# 概要
社内Wikiを検討していました。面白そうなOSSがあったためご紹介します。
※画面とかは後々アップロードすると思う。

# 要件
要件とその理由は以下の通りです。
- Markdown記法が使える：楽に記述できる環境が欲しい
- クラウドサービスではない：クラウドサービス利用は会社での稟議が厳しい
- ユーザ管理ができる：誰が何を書いたかがわかる
- バックアップや復旧が容易(ソフトウェア or インフラにて）：データが消えたら困る

# 候補
いくつか調査しました。どれを選んでも良いとは思いますし一長一短だなと思いました。
- GROWI →今回の紹介,ElasticSearchを用いた検索可能
　公式HP：https://growi.org/ja/
- Outline →NotionのようなWiki。よさそうだがユーザ管理にハードル有
　公式HP：https://www.getoutline.com/
- DokuWiki　→有名どころだが、MarkDownでは記述できない
　公式HP：https://www.dokuwiki.org/ja:dokuwiki
- Knowledge →Qiitaみたいに使える。開発が結構前に止まっており脆弱性などの管理が怖い
　公式HP：https://information-knowledge.support-project.org/ja/#google_vignette

 # 環境(マシン)
 PromoxVEの上に以下スペックの仮想マシンを構築しました。
 - OS：Ubuntu 24.04 LTS
 - CPU：2 コア(host:Ryzen7 4750 ※MongoDBにはAVXが要)
 - メモリ：4 GB
 - ストレージ：32 GB

# 環境(ソフトウェア）
公式ドキュメントにも記載されています。私の環境では以下のバージョンで導入しました。
- node.js 20.15.0
- npm 10.7.0
- yarn 1.22.22
- MongoDB 4.4 以上 (6.0 以上を推奨)

# 導入作業(各種ソフトウェア導入）
## Node.js
公式URL:https://deb.nodesource.com/

```:bash
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs
sudo npm install -g yarn
sudo yarn global add turbo
```

## ElasticSearch
### 本体のインストール
公式ホームページの通りに行えばインストールできる。JDKのインストール方法は以下で可能だが、場合によっては別途インストールが必要かもしれない。(`java -version`でインストール済みか確認できる)
公式URL：https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html
```:bash
sudo apt install openjdk-17-jdk sudo bash -
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch
dpkg -l elasticsearch #インストール後のバージョン確認
+++-==============-============-============-=====================================================
ii  elasticsearch  8.14.2       amd64        Distributed RESTful search engine built for the cloud
```

### JVMヒープサイズの設定
ヒープサイズは、そこまで大きくなくてよい。
```:bash
sudo vim /etc/elasticsearch/jvm.options
# IMPORTANT: JVM heap size のコメントブロックの後に追記
# 以下は1GBのヒープサイズに設定
-Xms1G
-Xmx1G
```
### TLSの無効化
```:bash
# 以下ファイルを編集する。
/etc/elasticsearch/elasticsearch.yml

# 編集個所は三か所
# 1. Xpackのセキュリティ設定無効化
xpack.security.enabled: true
↓
xpack.security.enabled: false

# 2.HTTPSのAPIを無効化
enabled: true
↓
enabled: false

# 3.クラスタノード間の相互認証を無効化
enabled: true
↓
enabled: false
```
### ElasticSearchプラグインのインストール
```:bash
# analysis-kuromoji のインストール
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
# analysis-icu plugin のインストール
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
```
### ElasticSearchの起動
```:bash
sudo systemctl enable --now elasticsearch
# うまく起動しているか確認
$ curl http://localhost:9200/
{
  "name" : "localhost.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "_na_",
  "version" : {
    "number" : "8.13.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "617f7b76c4ebcb5a7f1e70d409a99c437c896aea",
    "build_date" : "2024-04-29T22:05:16.051731935Z",
    "build_snapshot" : false,
    "lucene_version" : "9.10.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
```
## MongoDBのインストール
公式URL：https://www.mongodb.com/docs/v6.0/tutorial/install-mongodb-on-ubuntu/
```:bash
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \
   --dearmor
   
# Ubuntu 22.04(LTS)のコマンド
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl enable --now mongod
```

## GROWIのインストール
```:bash
# git-lfsの導入
sudo apt update && sudo apt install git-lfs
sudo mkdir -p /opt/
cd /opt/
sudo git clone https://github.com/weseek/growi /opt/growi
cd /opt/growi
sudo git tag -l
=======
1.0.0-RC3
@growi/core-styles@1.0.0
@growi/core@1.0.0
@growi/pluginkit@1.0.0
v1.0.0
・
・
・
v7.0.7
v7.0.8
v7.0.9
v7.0.x-base
=====
# RC がついていない最新版を利用(上記だと7.0.9)
sudo git checkout -b v7.0.9 refs/tags/v7.0.9
cd /opt/growi
sudo yarn
# yarmでビルドを行う。そこそこ時間がかかる
sudo yarn app:build
```
### 起動確認:
```:bash
sudo \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
yarn app:server
# 以下のメッセージが表示されるまでしばらく待つ
{"name":"growi:crowi","hostname":"growi-server","pid":29259,"level":30,"msg":"[production] Express server is listening on port 3000","time":"2024-04-30T21:50:05.549Z","v":0}
```

## GROWIへの接続
http://\<hostname or ip address\>:3000 にアクセスして初回セットアップ画面が出ることを確認する。
管理者ユーザを作成する。

# systemdによる自動起動の設定(公式サイトと相違有)
公式で紹介されているsystemdのユニットファイルは、CentOSをもとに紹介されている。Ubuntuの場合、相違点があるのでサンプルとして記載しておく。
```:bash
sudo vim /etc/systemd/system/growi.service
```
Ubuntuの場合、ユニットファイルは以下のようになる。
```:bash:/etc/systemd/system/growi.service
[Unit]
Description=Growi
After=network.target mongod.service

[Service]
WorkingDirectory=/opt/growi
Environment=PORT=3000\
MONGO_URI=mongodb://localhost:27017/growi\
ELASTICSEARCH_URI=http://localhost:9200/growi
ExecStart=/usr/bin/yarn app:server

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

・GROWIの起動
```:bash
sudo systemctl start growi
```
・自動起動の有効化
```:bash
sudo systemctl enable growi
```
インストールについてはここまで。以降は、作業していて気づいたことを記載する。

## 雑メモ：(気づいたこと)
・GROWIには、`draw.io`で記入した図を挿入できる。ただしこれにはサーバがインターネットにつながっている必要がある。
・MongoDBは、AVXが必要。そのため、CPUがAVXに対応していないCPU(kvm64)だと起動に失敗する。(エラー文は失念したが、AIに確認すると`WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!`と表示されるらしい）
・APIも対応しているので、今後使い方を考えようと思う。

# 参考URL
GROWI公式ドキュメント：
https://docs.growi.org/ja/admin-guide/