Exment を docker-compose でお手軽インストール

# この記事の概要
doker-compose で Exment をインストールします。docker の環境があらかじめ用意されていれば10分もかからずに Exment を使い始めることができます。

# Exment について
Exment は Webデータベース と呼ばれるカテゴリーのソフトウェアです。Webデータベースは管理する項目や入力内容等をいろいろカスタマイズできるので経理や勤怠管理、顧客管理などの専用システムがカバーしていない隙間として残ってしまっている業務をどうにかこうにかシステム化したいときにとても便利です。

方向性やできることは多少違うのですが、大きなくくりでは kintone と同じようなものと理解してもらえれば良いのではないかと思います。kintone は今まで世間にあまり知られていなかったこのカテゴリーを確立し、世間に広めたということで評価されるべきだし、良いサービスだとは思いますが、kintone を適用させたい用途と一人あたりの月額利用料がなかなかバランスが取れなくて採用に二の足を踏んでしまいます。kintone に顧客管理などの主要業務をやらせるのであれば月額利用料の価値はあるような気がするのですが、隙間の業務だけやらせるにはちょっともったいないような気がしています。

そこで無料で使える OSS を探すのですが、なぜかこのカテゴリーには世界的なデファクトスタンダードとなっているようなものがなかなかなくて、選択肢はこの Exment か Pleasanter （どちらも日本製）くらいになってしまいます。どちらを選ぶかは好みの問題ですが、私は Exment が気に入っています。

Exment も Pleasanter も有料のサービスが提供されているので、最初は自分でサーバーを立てて無料で使ってみて、適用範囲や利用者が増えてきたら有料サービスに移行するということでも良いのではないかと思います。有料サービスは Exment は kintone のざっくり半額程度になるのではないかと思います。

# docker版の Exment について

Exment を Docker で動作させる環境を最初に作成して公開したのは Qiita にも記事を書かれている @yamada28go さんのようです。
* [Qiita－ExmentのDocker環境を作ってみた](https://qiita.com/yamada28go/items/c5b8173be71df9bc1ab7)

その後、@yamada28go さんのものをベースにして Exment公式から dockerイメージが提供されているのでそれをインストールすれば良いということになります。

* [Github－exment-git/docker-exment](https://github.com/exment-git/docker-exment)

ただし、Exment公式は dockerイメージの提供にはあまり熱心ではないのか、現在提供されているものはそのままではインストール中にエラーになってしまい、簡単にはインストールできません。

この記事はそのエラーを解消してインストールする方法について記載しています。

# インストール
docker の環境の構築についてはそこら中に記事が転がっているのでそちらを参照していただくとして、ここでは詳細は記載しません。あらかじめ docker の環境が用意されていることを前提として Exment のインストールについてだけ記載していきます。

## インストールした環境
OS や docker のバージョン等に制限はなのではないかと思いますが、参考に今回インストールした環境の情報を記載します。

* サーバー ESXi 上の VM にインストールします
```shell
ESXi バージョン: 7.0.0
ESXi ビルド番号: 16324942
```

* OS 
```shell
# cat /etc/redhat-release
AlmaLinux release 8.5 (Arctic Sphynx)
```

* docker
```shell
# docker -v
Docker version 20.10.14, build a224086
```
* docker-compose
```shell
# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
```


## ダウンロード

* Exment公式から dockerイメージをダウンロードします

```shell
# curl -OL https://github.com/exment-git/docker-exment/archive
/refs/heads/master.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   140  100   140    0     0    411      0 --:--:-- --:--:-- --:--:--   412
100  113k    0  113k    0     0   150k      0 --:--:-- --:--:-- --:--:--  295k

# ll
-rw-r--r--. 1 root root 116135  4月 30 00:02 master.zip
```

* zip を解凍します

```shell
# unzip master.zip
-bash: unzip: コマンドが見つかりません
```

* AlmaLinux を最小限でインストールすると unzip 入ってませんでした。やり直します。

```shell
# dnf install -y unzip
・
・
インストール済み:
  unzip-6.0-45.el8_4.x86_64

完了しました!

# unzip master.zip
Archive:  master.zip
941b725966e3ffa775bfaba264966b99e7c41e93
   creating: docker-exment-master/
 extracting: docker-exment-master/.gitignore
・
・

# ll
drwxr-xr-x. 5 root root    239  4月 13  2021 docker-exment-master
-rw-r--r--. 1 root root 116135  4月 30 00:02 master.zip

```

# docker-compose で起動

* 構築したい環境によってフォルダが分かれていますが、今回は PHP7.4 で データベースは mariadb を使用します
* 対象のフォルダに移動します
```shell
# cd docker-exment-master/build/php74_mariadb
```

* フォルダ内には複数の ymlファイルがあって、それを組みあわせることで様々なパターンの環境を構築できます
* 今回は mariadb もdocker で起動し、それを　Exment から使用します

```shell
# docker-compose -f docker-compose.mariadb.yml -f docker-compose.yml up -d
・
・

  Problem 1
    - Root composer.json requires exceedone/exment ^4.4 -> satisfiable by exceed
one/exment[v4.4.0].
    - exceedone/exment v4.4.0 requires laravel/framework ^8.0 -> found laravel/f
ramework[v8.0.0, ..., 8.x-dev] but it conflicts with your root composer.json req
uire (^6.20.26).

```

* なんかエラーになりました
* エラーメッセージによると laravel のバージョンが合っていないようです
* 設定ファイルで laravel の記述を探してみると Dockerfile にそれらしい記述があるので修正してみます

```shell
# vi php/Dockerfile

FROM php:7.4-fpm
ARG LARAVEL_VERSION="6.*"          ←　6.* を 8.* に修正する
ARG EXMENT_VERSION="~4.0"
```

* Dockerfile を修正したら再実行
```shell
# docker-compose -f docker-compose.mariadb.yml -f docker-compose.yml up -d
・
・

  Problem 1
    - Root composer.json requires exceedone/exment ^4.4 -> satisfiable by exceed
one/exment[v4.4.0].
    - exceedone/exment v4.4.0 requires laravel/framework ^8.0 -> found laravel/f
ramework[v8.0.0, ..., 8.x-dev] but it conflicts with your root composer.json req
uire (^6.20.26).
```

* エラー直りませんでした
* もう一度設定ファイルに laravel の記述がないか探してみると .env というファイルに記述が見つかりました
```shell
# vi .env

#### WebServer
EXMENT_DOCKER_FRONT_DOMAIN=localhost
EXMENT_DOCKER_HTTP_PORTS=80
EXMENT_DOCKER_LARAVEL_VERSION=6.*                 ←　6.* を 8.* に修正する
EXMENT_DOCKER_EXMENT_VERSION=~4.0

```

* .env を修正したら再実行

```shell
# docker-compose -f docker-compose.mariadb.yml -f docker-compose.yml up -d

Creating php74_mariadb_mariadb_1 ... done
Creating php74_mariadb_php_1     ... done
Creating php74_mariadb_web_1     ... done
```

* うまくいったらしい

## Exment 初期設定

* ブラウザでアクセスします

![Exment01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/8fe1705f-8ca7-f04f-3618-d2a4fc9e374f.png)

* 「Next」をクリックして次に進みます

![Exment02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/1e356669-d54c-b3a2-eb37-8fe3594685a2.png)

* データベースの設定をして次に進みます

|項目|設定値|
|---|---|
|データベース種類|MariaDB|
|ホスト名|mariadb|
|ポート|3306|
|データベース|exment_database|
|ユーザー名|exment_user|
|パスワード|secret|

![Exment03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/3e768c8a-f2ae-fb38-191e-1d48ce6b2065.png)

* 「.env」 というファイルが書き込み禁止らしい
* 先ほど laravel の設定を変更したファイルか？

```shell
# ll -a
・
-rw-r--r--.  1 root root 920  4月 30 00:43 .env
・
```

* 書込禁止になっているので変更します

```shell
# chmod 666 .env

# ll -a
合計 28
・
-rw-rw-rw-.  1 root root 920  4月 30 00:43 .env
・
```

* もう一度実行してみたけど変わりませんでした
* よくよく考えてみると、VM側から見て書き込み権限が不足しているのを修正しないとダメなのかもしれません
* docker の VM に入ってみることにします

```shell
# docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
490459ce6a57   nginx:latest        "/docker-entrypoint.…"   32 minutes ago   Up 32 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp           php74_mariadb_web_1
dd3d70cf7b31   mariadb:10.4        "docker-entrypoint.s…"   32 minutes ago   Up 32 minutes               0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   php74_mariadb_mariadb_1
a29c04dabda3   php74_mariadb_php   "docker-php-entrypoi…"   32 minutes ago   Up 32 minutes               9000/tcp                                    php74_mariadb_php_1
975b4bcf5422   3035d5c4af2f        "/bin/sh -c 'COMPOSE…"   40 minutes ago   Exited (2) 40 minutes ago                                               cool_zhukovsky
e7d2fe82a887   9fad9711e200        "/bin/sh -c 'COMPOSE…"   55 minutes ago   Exited (2) 55 minutes ago                                               nostalgic_panini
```

* ゴミみたいなのが残っているのは後で消すとして、php74_mariadb_php_1 に入ってみます

```shell
# docker exec -it php74_mariadb_php_1 bash

root@a29c04dabda3:/var/www/exment# ls -al
・
-rw-r--r--.  1 root     root        703 Apr 13  2021 .env
・
```

* .env がありました。これを書き込みできるようにします

```shell
root@a29c04dabda3:/var/www/exment# chmod 666 .env
root@a29c04dabda3:/var/www/exment# ls -al
・
-rw-rw-rw-.  1 root     root        703 Apr 13  2021 .env
・
```

* 権限変更できたら再実行します

![Exment03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/e0348f2e-1263-9363-ece7-172da8922169.png)

* うまくいったようなので、「次へ」 をクリックして進みます

![Exment04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/476f73b7-a608-1c7c-7255-ed79ca9dea10.png)

* 「インストール実行」をクリックして進みます

![Exment05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/46f1d086-b807-ded4-38c2-964597c54e30.png)


* サイト名、管理アカウント名等を入力して進みます

![Exment09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406456/b64e98c2-e0c7-8a65-dfbf-9a5326d97407.png)

* Exment が起動したので完了です

# 結論
* Exment公式からダウンロードするだけで簡単にインストールできるとまではいきませんが、修正は下記の3点だけなのでそれほどの手間でもありません

|ファイル|変更内容|
|---|---|
|php/Dockerfile|ARG LARAVEL_VERSION="6.*" → 8.*|
|.env|EXMENT_DOCKER_LARAVEL_VERSION=6.* → 8.*|
|VM内の.env|chmod 666 .env|


# 課題
* ユーザー管理のために LDAP と連携させたいのですが、そのためには php-ldap を入れなければならないようで、この docker の環境に php-ldap を入れる方法がよくわかりません。（LDAPサーバーは外部に構築予定なので必要なのは laravel から　LDAPサーバーにアクセスする設定）LDAP の導入に成功された方がおられましたら是非情報を公開していただけたらと思います。