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のインストールまでの手順は次の記事に書いています。
- RancherOSをインストールしたときの手順
- Rancherのインストールとシングルノードで運用するときの設定
- RancherとGitLabでCI/CD環境と運用環境を構築した (GitlabでCI/CD環境を構築した時の記事ですが、全体の流れが書いてあります)
名前空間について
growi(任意)などの名前を付けて、以降の作業で同じ名前空間を使用してください。
永続ボリュームの作成
今回はNFSを永続ボリュームとして使用しますが、要件に応じて別のボリュームを作成しても構いません。
以下は、NFSサーバーのホストが nas.home
として名前解決でき、データの保存先を /Server/rancher/growi
とする場合の設定内容です。 環境に合わせて読み替えてください。
永続ボリュームを作成するには、Rancherのメニューからクラスターを選択し、「ストレージ」 > 「永続ボリューム」をクリック、「ボリュームを追加」ボタンをクリックします。
項目 | 入力例 | 備考 |
---|---|---|
名前 | growi | 任意の名前 |
ボリュームプラグイン | NFS共有 | |
パス | /Server/rancher/growi | 任意のパス |
サーバー | nas.home | 任意のホスト |
ワークロードの作成
Rancherメニューからプロジェクトを選択して、「ワークロード」の「デプロイ」をクリックしてワークロードを作成します。
MongoDBワークロードの作成
項目 | 入力例 | 備考 |
---|---|---|
名前 | mongo | 任意の名前 |
イメージ | mongo:3 | GROWIが対応しているバージョンを指定 https://hub.docker.com/_/mongoを参照 |
ラベル | backup=mongo | バックアップタスクがこのコンテナを見つけるためのラベル(後で説明) |
ボリューム
まずは、「ボリュームを追加」ボタンから「新しい永続ボリューム(要求)を作成」を選択して、作成済みの永続ボリュームに対する要求を作成します。 ここでは growi という名前で作成した前提で進めます。 その後、次の内容でボリュームを作成します。
項目 | 入力例 | 備考 |
---|---|---|
ボリューム名 | growi | 任意の名前 |
ボリュームタイプ | 永続ボリューム要求 | |
永続ボリューム要求 | growi | 前記の手順で作成 |
マウントポイント | ボリューム内サブパス |
---|---|
/data/db | mongo/data/db |
/var/mongo/backups | backups/mongo |
この記事で紹介する方法でバックアップ運用を行う場合は、バックアップ用のシェルを参照するボリュームを追加します。 バックアップシェルは他の名前空間とも共有できるようにエフェメラルボリュームとしてマウントしました(理解が浅いのでこれが適切なのかは不明)。 シェルが実行できればどのようにマウントしても構いません。
マウント先には「MongoDBのバックアップの作成と古いバックアップを削除するシェル」の記事で紹介している mongo-backup.sh
を配置してください。
項目 | 入力例 | 備考 |
---|---|---|
ソース | NFS 共有 | |
パス | /Server/rancher/common | シェルのディレクトリのパス |
サーバー | nas.home | 任意のホスト |
読み取り専用 | はい |
項目 | 入力例 | 備考 |
---|---|---|
ボリューム名 | mongo | 任意の名前 |
マウントポイント | /srv/common | シェルのディレクトリをマウントするパス |
ボリューム内サブパス | 空欄 | |
読み取り専用 | チェック |
Redisワークロードの作成
項目 | 入力例 | 備考 |
---|---|---|
名前 | redis | 任意の名前 |
イメージ | redis:3-alpine | GROWIが対応しているバージョンを指定 https://hub.docker.com/_/redis/を参照 |
ボリューム
項目 | 入力例 | 備考 |
---|---|---|
ボリューム名 | growi | 任意の名前 |
ボリュームタイプ | 永続ボリューム要求 | |
永続ボリューム要求 | growi | 前記の手順で作成 |
マウントポイント | ボリューム内サブパス |
---|---|
/data | redis/data |
Elasticsearchワークロードの作成
項目 | 入力例 | 備考 |
---|---|---|
名前 | elasticsearch | 任意の名前 |
イメージ | elasticsearch:6.7.1 | GROWIが対応しているバージョンを指定 https://hub.docker.com/_/elasticsearchを参照 |
環境変数
discovery.type=single-node
ES_JAVA_OPTS=-Xms512m -Xmx512m
ボリューム
項目 | 入力例 | 備考 |
---|---|---|
ボリューム名 | growi | 任意の名前 |
ボリュームタイプ | 永続ボリューム要求 | |
永続ボリューム要求 | growi | 前記の手順で作成 |
マウントポイント | ボリューム内サブパス |
---|---|
/usr/share/elasticsearch/data | elasticsearch/data |
/usr/share/elasticsearch/plugins | elasticsearch/plugins |
起動に失敗する場合は、ボリュームにマウントしたディレクトリの権限が適切か確認してください。
Elasticsearchが起動したら、GROWIが要求する次のプラグインをインストールします。Rancherのワークロードのメニューから「シェルを実行」でシェルに入れます。
./bin/elasticsearch-plugin install analysis-kuromoji
./bin/elasticsearch-plugin install analysis-icu
インストールが完了したらワークロードを再起動(Redeploy)するとプラグインが有効になります。
GROWIワークロードの作成
項目 | 入力例 | 備考 |
---|---|---|
名前 | growi | 任意の名前 |
イメージ | weseek/growi:3.6 | https://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 | 前記の手順で作成 |
マウントポイント | ボリューム内サブパス |
---|---|
/data | growi/data |
コマンド
npm run server:prod
イングレスの作成
Rancherメニューからプロジェクトを選択して、「ロードバランサー」の「イングレスを追加」をクリックしてイングレスを作成します。
GROWIのイングレスを作成
項目 | 入力例 | 備考 |
---|---|---|
名前 | growi | 任意の名前 |
ルール | 「使用するホスト名を指定する」 | |
リクエストホスト | growi.home | 任意のホスト名 |
パス | 空欄 | |
ターゲット | growi | GROWIワークロードの名前 |
ポート | 3000 |
リクエストホストはRancherサーバーのIPに解決されるようにDNSを設定してください。
バックアップ運用
Rancherのクーロンスケジュールを使って自動で定期的にバックアップを実行できるようにします。
バックアップワークロードの作成
ワークロードの作成手順についてはこちらの記事を参考に、シェルは次のものに置き換えてください。 このシェルでGROWIのDBをバックアップします。
#!/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
ディレクトリの内容をバックアップから戻します。