社内でGrowiを立ち上げてみた

# はじめに
部署内で情報共有のためWikiを使うとよいのではないか、という話が出ました。最初はMicrosoft TeamsのWikiを使えばよくね？という話でしたが検索機能はないし、バックアップも取れないし、でとても実用にならんだろ、と、調べていくうちにGrowiがよさそうとなりました。（余談：その後TeamsのWikiはあっさりと消えていきました）

https://growi.org/ja/

Qiitaでもお馴染みですね。

https://qiita.com/harutiro/items/7393a7784c24d10522ac

社内でdocker付きで用意されているUbuntu Serverに立ち上げれば、docker-composeでさくっと設定できるとたかを括っていたのですが、docker初心者にはいろいろと落とし穴が待っていたのでした。
# proxyの罠
このGrowiは社内で利用するだけで社外からアクセスはしません。当然会社のproxyの内側に設置します。となると、Ubuntu Serverにツールをインストールするためにproxyを通さねばなりませんので、あれこれproxy設定が必要になります。

ここで特に悩んだのが、dockerのコンテナ内部でキックされるコマンドの場合はどうやってproxyの設定をすればいいのか、でした。（結論から言えば、Dockerfile内にそれぞれのコマンドに対して環境変数で設定する、でした）

補足：この記事を書いている時は出会えなかったのですが、dockerのproxy設定について大変参考になった記事がありました。ぜひご一読をどうぞ。

https://zenn.dev/wsuzume/articles/f9935b47ce0b55


以下の記述で、proxyサーバーは「proxy.example.co.jp:11080」だとします。
　proxyのホスト名がproxy.example.co.jp、ポート番号が11080
　に指定されているということです。ホスト名、ポート番号は会社のIT部門に確認してください
また、Growiのインストールは公式のdocker-composeを使う手順に従って、
/opt/growi　の下にgit cloneしたものとします。

https://docs.growi.org/ja/admin-guide/getting-started/docker-compose.html

docker, docker-comose, gitなどのインストールは省略。
## bash
/root/.bashrcに環境変数を設定します。
```
$ cat /root/.bashrc
export http_proxy="http://proxy.example.co.jp:11080"
export https_proxy="https://proxy.example.co.jp:11080"
$
```
## apt
/etc/apt/apt.conf.d/の下に設定ファイルを追加するのが最近の流儀のようです。
ファイル名はなんでもよくて、同じ内容なら後から読み込んだファイルの内容が有効。
```
$ cat /etc/apt/apt.conf.d/100proxy.conf
Acquire::http::Proxy "http://proxy.example.co.jp:11080";
Acquire::https::Proxy "http://proxy.example.co.jp:11080";
```
## git
gitコマンドで設定します。
```
$ sudo su
# git config --global http.proxy http://proxy.example.co.jp:11080/
# git config --global https.proxy https://proxy.example.co.jp:11080/
```
## docker
```
$ sudo systemctl edit docker
```
でサービス設定ファイルに記載します。
```
[Service]
Environment = 'http_proxy=http://proxy.example.co.jp:11080/' 'https_proxy=https://proxy.example.co.jp:11080/'
```
設定ファイルは
/etc/systemd/system/docker.service.d以下、および
/root/.docker/config.json
に反映されるはずです。
※編集にはデフォルトだと標準エディタのnanoが起動するので、vimで編集したい時は前もって
```
# update-alternatives --config editor
```
を実行してvim.basicを選択しておきます。
## Elasticsearch Plugin
これはdockerのコンテナ内部からproxyを通すことになりますので、GrowiのDockerfileに環境変数でproxyを記述します。
/opt/growiにGitHubからGrowiのソースをcloneしたとしたら、下記2つのファイルです。
/opt/growi/elasticserch/v7/Dockerfile
/opt/growi/elasticserch/v8/Dockerfile
修正するのは使用する方だけでOKです。（初めから立ち上げるならV8のみでOK）
### V7の場合
/opt/growi/elasticserch/v7/Dockerfileの下記の記述を
```
RUN bin/elasticsearch-plugin install analysis-kuromoji
RUN bin/elasticsearch-plugin install analysis-icu
```
次のように書き換える。環境変数にhttp, httpsのホスト名、ポート番号をセットしてプラグインをインストールするわけですね。
```
RUN ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-kuromoji
RUN ES_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-icu
```
### V8の場合
/opt/growi/elasticserch/v8/Dockerfileの書き換えで、v7ではES_JAVA_OPTSのところをCLI_JAVA_OPTSに変えて書き換える（V8で環境変数変わったのわからなくて悩んだ...）
```
RUN CLI_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-kuromoji
RUN CLI_JAVA_OPTS="-Dhttp.proxyHost=proxy.example.co.jp -Dhttp.proxyPort=11080 -Dhttps.proxyHost=proxy.example.co.jp -Dhttps.proxyPort=11080" bin/elasticsearch-plugin install analysis-icu
```
## curl
補足：このパートは最新のGrowi(7.2.x)では不要です。Dockerfile自体がなくなっていました。

これもdockerコンテナ内部からproxyを通す必要があります。
/opt/growi/Dockerfileの中に下記の記載でcurlがキックされますから、
```
RUN apt-get update && apt-get install -y curl \
    && curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
        | tar -xz -C /usr/local/bin

```
上記の行より前に下記を挿入し、環境変数を設定してからcurlが起動するようにします。
```
ENV http_proxy "http:proxy.example.co.jp:11080"
ENV https_proxy "http:proxy.example.co.jp:11080"
RUN apt-get update && apt-get install -y curl \
    && curl -sL https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
        | tar -xz -C /usr/local/bin
```
以上でproxyの設定は完了です。docker-composeを起動してproxyエラーが出たら見直してください。
# dockerの罠
Growiを立ち上げるためにdocker-composeを利用するのですが、そのためには当然dockerを動かす必要があります。dockerはデフォルトブリッジや内部ネットワークを設定してくれるのですが、そのアドレス範囲が172.17.0.0/16です。運悪くこのアドレスが社内ネットワークの自分の部署のIPアドレスとかぶっていたため、dockerコンテナ(Growiサーバー)へのアクセスが不安定になってしまいました。このため、dockerが使用するIPアドレスを他の範囲に変更する必要がありました。

IT部門から提供されているdockerインストール済みUbuntu Serverには「dockerの内部IPアドレスと重なる事業所があるので、その場合はxxx.xxx.0.0/16をdockerで使用するように」と注意書きがあったものの、どうやればIPアドレスを変更できるのかまでは記載されていません。問い合わせても「それは利用部門でよろしく」と丸投げです。（まあIPアドレスかぶりのリスクをアナウンスしてくれていただけでもありがたいですが。）

解決にはこちらを参考にさせていただきました。

https://qiita.com/k1tajima/items/bf8a714e39e857963abc

[余談] うちのIT部門から借り受けたDocker付きUbuntu Serverは、最初から空のコンテナが一つ起動していたため、そいつを止めてコンテナを削除してイメージを消さないと、下記の設定に進めなかったような遠い記憶がありますがもはやうろ覚え(^_^;)
なんでわざわざ空コンテナ立ててたんだ、うちのIT部門

## docker設定
/etc/docker/daemon.json　というファイルを作って、default-address-poolsに所定のアドレス範囲を記述することで、dockerが使用する内部ネットワークのIPアドレスを変更することができます。（ここではIT部門から指定された、他と被らないアドレスである10.123.0.0/16を使用するものとします。）
まずはdockerを停止
```
# systemctl stop docker
```
/etc/docker/daemon.jsonファイルを作成
```
{
    "default-address-pools":[
        {
            "base":"10.123.0.0./16",
            "size":24
        }
    ]
}
```
docker再起動
```
# systemctl daemon-reload
# systemctl restart docker
```
［余談］なにぶんdocker, docker-composeとも初心者なもので設定ファイルをいじる時は一度コンテナを停止させるとかdockerを停止させてからじゃないとおかしなことになる、というのを身をもって体験しました(^_^;)
- docker-composeコマンドを使う時は、docker-compose.ymlファイルの置かれたディレクトリで実行する（up, down, start, stopなどの操作の時）
- docker-compose.ymlファイルを編集する場合は #docker-compose down でコンテナを停止してから行い、コンテナを消去してから#docker-compose buildでコンテナを作り直すべし
- docker-compose.ymlファイルを修正してエラーが出たときは、YAMLチェッカーで文法チェックするとよい。例えば下記

http://yamllint.com
- コンテナを作り直す時はキャッシュクリアした方が確実（#docker-comose --verbose build --no-cache）
- Dockerfileを修正したり、/etc/docker/daemon.jsonを修正したりするときは一度dockerを停止した方がいい（#systemctl stop docker）
修正が終わったらdockerを再開する(#systemctl daemon-reload && systemctl restart docker)

（初心者なので間違ってたらなにとぞご容赦）

# その他
以上で無事docker-composeでGrowiが起動する、、、はずなのですが、
```
$ cd /opt/growi
$ sudo docker-compose up -d
```
でElasticsearchのイメージがうまくbuildできないことがありました。<del>その場合</del>
```
$ cd /opt/growi
$ sudo su
# docker-compose up -d
```
<del>のように、rootになってから起動するとすんなりと起動できるという経験をしました。記載したproxyの設定が不十分なのかもしれません。</del>
どうも、職場のproxyの機嫌が悪いとうまく行かないことがあるみたいなので、しばらく時間をおいてやり直すとよかったようです。


記事中にtypoあったらごめんなさい...
# 補足
Growiの設定とかdocker-composeコマンドとかを補足しました。

https://qiita.com/cohpen/items/d6f2f9da816232798dcc

Growi管理(docker)を習熟するため、練習用ダミーのGrowiを立てました。

https://qiita.com/cohpen/items/318e59a5628b8feb371b

Growiデータのバックアップ、リストア方法をまとめました。

https://qiita.com/cohpen/items/65cf6f2dcabbd9e6a307

# 参考資料

https://zenn.dev/wsuzume/articles/f9935b47ce0b55

[Docker で環境変数をホストからコンテナに渡す方法（ホスト OS 側からゲスト OS に渡す方法各種） #docker-compose - Qiita](https://qiita.com/KEINOS/items/518610bc2fdf5999acf2)

[dockerで環境変数を設定する方法3パターン #Docker - Qiita](https://qiita.com/hiro5963/items/5c8308c26f40a5df5055)