GROWIをRancherでインストールする手順

GROWIというマークダウンで記述できるWikiタイプのWebサービスをRancher(Docker)でインストールする手順です。バックアップ運用の構築も行います。

GROWIとは

GROWIはマークダウンで記事を書くことができるWikiタイプのWebサービスです。 コードハイライトに対応しており、開発関連の情報を記録したり共有するのに向いています。 オープンソースで開発されており、自社構築する場合は無料で利用できます(ここでは触れませんが、0円からのクラウドサービスもあります)。

Rancherによる運用について

GROWIは短いスパンで変更をリリースする開発方針のようで、数日置きにアップデートがリリースされることもあります。 それゆえにデグレードに遭遇することもありますが、その修正も早いです。
頻繁なアップデートに追従したり、場合によっては一端バージョンを戻すような運用を考えると、デプロイ作業を簡単に行えると運用しやすいです。

GROWIは公式のDockerイメージが公開されており、使用しているミドルウェアもDocker Hubから取得できるため、この記事で説明するRancher(Dockerコンテナの管理ツール)を使った運用は相性がいいと思います。

インストールの前提

この手順で使用するバージョン

  • GROWI 3.6
  • Rancher 2.x

GROWIが使用するミドルウェア

  • Redis
  • MongoDB
  • Elasticsearch

Rancherは既に稼働している前提です。 Rancherのインストールまでの手順は次の記事に書いています。

名前空間について

growi(任意)などの名前を付けて、以降の作業で同じ名前空間を使用してください。

永続ボリュームの作成

今回はNFSを永続ボリュームとして使用しますが、要件に応じて別のボリュームを作成しても構いません。

以下は、NFSサーバーのホストが nas.home として名前解決でき、データの保存先を /Server/rancher/growi とする場合の設定内容です。 環境に合わせて読み替えてください。

永続ボリュームを作成するには、Rancherのメニューからクラスターを選択し、「ストレージ」 > 「永続ボリューム」をクリック、「ボリュームを追加」ボタンをクリックします。

項目入力例備考
名前growi任意の名前
ボリュームプラグインNFS共有
パス/Server/rancher/growi任意のパス
サーバーnas.home任意のホスト

ワークロードの作成

Rancherメニューからプロジェクトを選択して、「ワークロード」の「デプロイ」をクリックしてワークロードを作成します。

MongoDBワークロードの作成

項目入力例備考
名前mongo任意の名前
イメージmongo:3GROWIが対応しているバージョンを指定 https://hub.docker.com/_/mongoを参照
ラベルbackup=mongoバックアップタスクがこのコンテナを見つけるためのラベル(後で説明)

ボリューム

まずは、「ボリュームを追加」ボタンから「新しい永続ボリューム(要求)を作成」を選択して、作成済みの永続ボリュームに対する要求を作成します。 ここでは growi という名前で作成した前提で進めます。 その後、次の内容でボリュームを作成します。

項目入力例備考
ボリューム名growi任意の名前
ボリュームタイプ永続ボリューム要求
永続ボリューム要求growi前記の手順で作成
マウントポイントボリューム内サブパス
/data/dbmongo/data/db
/var/mongo/backupsbackups/mongo

この記事で紹介する方法でバックアップ運用を行う場合は、バックアップ用のシェルを参照するボリュームを追加します。 バックアップシェルは他の名前空間とも共有できるようにエフェメラルボリュームとしてマウントしました(理解が浅いのでこれが適切なのかは不明)。 シェルが実行できればどのようにマウントしても構いません。

マウント先には「MongoDBのバックアップの作成と古いバックアップを削除するシェル」の記事で紹介している mongo-backup.sh を配置してください。

項目入力例備考
ソースNFS 共有
パス/Server/rancher/commonシェルのディレクトリのパス
サーバーnas.home任意のホスト
読み取り専用はい
項目入力例備考
ボリューム名mongo任意の名前
マウントポイント/srv/commonシェルのディレクトリをマウントするパス
ボリューム内サブパス空欄
読み取り専用チェック

Redisワークロードの作成

項目入力例備考
名前redis任意の名前
イメージredis:3-alpineGROWIが対応しているバージョンを指定 https://hub.docker.com/_/redis/を参照

ボリューム

項目入力例備考
ボリューム名growi任意の名前
ボリュームタイプ永続ボリューム要求
永続ボリューム要求growi前記の手順で作成
マウントポイントボリューム内サブパス
/dataredis/data

Elasticsearchワークロードの作成

項目入力例備考
名前elasticsearch任意の名前
イメージelasticsearch:6.7.1GROWIが対応しているバージョンを指定 https://hub.docker.com/_/elasticsearchを参照

環境変数

discovery.type=single-node
ES_JAVA_OPTS=-Xms512m -Xmx512m

ボリューム

項目入力例備考
ボリューム名growi任意の名前
ボリュームタイプ永続ボリューム要求
永続ボリューム要求growi前記の手順で作成
マウントポイントボリューム内サブパス
/usr/share/elasticsearch/dataelasticsearch/data
/usr/share/elasticsearch/pluginselasticsearch/plugins

起動に失敗する場合は、ボリュームにマウントしたディレクトリの権限が適切か確認してください。

Elasticsearchが起動したら、GROWIが要求する次のプラグインをインストールします。Rancherのワークロードのメニューから「シェルを実行」でシェルに入れます。

./bin/elasticsearch-plugin install analysis-kuromoji
./bin/elasticsearch-plugin install analysis-icu

インストールが完了したらワークロードを再起動(Redeploy)するとプラグインが有効になります。

GROWIワークロードの作成

項目入力例備考
名前growi任意の名前
イメージweseek/growi:3.6https://hub.docker.com/r/weseek/growi/を参照

環境変数

MONGO_URI=mongodb://mongo:27017/growi
REDIS_URL=redis://redis:6379/growi
ELASTICSEARCH_URI=http://elasticsearch:9200/growi
PASSWORD_SEED=changeme
FILE_UPLOAD=local
MATHJAX=1

ドキュメント: https://docs.growi.org/ja/admin-guide/admin-cookbook/env-vars.html

ボリューム

項目入力例備考
ボリューム名growi任意の名前
ボリュームタイプ永続ボリューム要求
永続ボリューム要求growi前記の手順で作成
マウントポイントボリューム内サブパス
/datagrowi/data

コマンド

npm run server:prod

イングレスの作成

Rancherメニューからプロジェクトを選択して、「ロードバランサー」の「イングレスを追加」をクリックしてイングレスを作成します。

GROWIのイングレスを作成

項目入力例備考
名前growi任意の名前
ルール「使用するホスト名を指定する」
リクエストホストgrowi.home任意のホスト名
パス空欄
ターゲットgrowiGROWIワークロードの名前
ポート3000

リクエストホストはRancherサーバーのIPに解決されるようにDNSを設定してください。

バックアップ運用

Rancherのクーロンスケジュールを使って自動で定期的にバックアップを実行できるようにします。

バックアップワークロードの作成

ワークロードの作成手順についてはこちらの記事を参考に、シェルは次のものに置き換えてください。 このシェルでGROWIのDBをバックアップします。

growi-backup.sh
#!/bin/bash

readonly POD_NAME=$(kubectl get pods -n growi -l backup=mongo -o jsonpath='{.items[*].metadata.name}')
if [ -z "${POD_NAME}" ]; then
  echo 'ERROR: pod not found'
  exit 1
fi
kubectl exec -n growi ${POD_NAME} /srv/common/mongo/mongo-backup.sh localhost 27017 growi /var/mongo/backups 1

アップロードファイルのバックアップについては、ファイルサーバーにマウントしている前提でファイルサーバー側のバックアップに委ねます。

/data/uploadsディレクトリにアップロードファイルが保存されるので、こちらをバックアップしてください。

リカバリー手順

DBをリカバリーします。 MongoDBワークロードのシェルから操作します。

既にDBが存在する場合は次のコマンドで削除しておきます。

mongo
> use growi;
> db.dropDatabase();
> quit();

バックアップしたダンプファイルからDBの内容を復元します。 変数部分は実際のファイル名に置き換えてください。

mongorestore --gzip --archive=${TIMESTAMP}-growi-dbdump.gz -d growi

アップロードファイルは、/data/uploadsディレクトリの内容をバックアップから戻します。