docker-compose 上の mautic で GeoLite2 の自動更新設定
Published: 2021-06-16 00:04:40

[Maxmind IP lookup database cannot be downloaded anonymously anymore - mautic/mautic](https://github.com/mautic/mautic/issues/8275)

上記の issue でも触れられていますが、mautic がデフォルトにしている MaxMind の GeoLite2 データセットがライセンスキーを必要とするようになったようです。

## MaxMind のライセンスを使った設定

![2021-06-16_08h55_07]
(https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re6nvtid7gfljazp87w4.png)
上記のように `account:password` の区切りで設定できます。

[Maxmind license | Mautic](https://docs.mautic.org/en/setup/maxmind-license)

## 直接 MaxMind の `geoipupdate` を使う

通常行う必要は無いですが、参考までに。

### 対応方法

[[Solved] Maxmind GeoLite2 & GeoIP Database Auto-Update | 2020.](https://mauteam.org/mautic/mautic-admins/solved-maxmind-geolite2-database-not-updating/)

Issue にも貼られていた上記のページが対応方法になります。

[[BUG] Bad cron for geoip db #171 mautic/docker-mautic](https://github.com/mautic/docker-mautic/issues/171)

上記をさらに docker に適用する方法が上記に提案されています。
今回はこれらをベースにします。

ディレクトリ構成
```
Dockefile
GetIP.conf # MaxMind からダウンロードしたライセンスファイル
```

```Dockerfile
FROM mautic/mautic:v3

RUN apt-get update && wget https://github.com/maxmind/geoipupdate/releases/download/v4.6.0/geoipupdate_4.6.0_linux_amd64.deb \
    && dpkg -i geoipupdate_4.6.0_linux_amd64.deb && rm geoipupdate_4.6.0_linux_amd64.deb

COPY GeoIP.conf /etc/GeoIP.conf
RUN sed -i -e '/^"$@" &/i mkdir -p /var/www/html/app/cache/ip_data && geoipupdate -f /etc/GeoIP.conf -d /var/www/html/app/cache/ip_data && chown www-data.www-data -R /var/www/html/app/cache/ip_data' /entrypoint.sh

RUN sed -i '/iplookup/s/^/#/g' /etc/cron.d/mautic && \
    echo '        0 4 15 * *     www-data  geoipupdate -f /etc/GeoIP.conf -d /var/www/html/app/cache/ip_data > /var/log/cron.pipe 2>&1' >> /etc/cron.d/mautic
```

`geoipupdate` に関しては現在 4.7.1 までリリースされているのでバージョンは指定できるようにした方が良いとは思いますが、ここでは上記の issue に合ったものをそのまま使います。

`Dockerfile` のポイントは以下です。
- `/etc/cron.d/mautic` に `geoipupdate` を使ったジョブを追加し、既存の更新処理をコメントアウト
- `/entrypoint.sh` の事前処理の最後に、初回の GeoLite2 データセットのダウンロードを実行
  - `/var/www/html/app` は `/entrypoint.sh` 内で構築されるため、`Dockerfile` 内で処理はできないため、ここに記述している

### cache ディレクトリの注意

上記では最終的に `ip_data` を入れる先を `/var/www/html/app/cache/ip_data` としています。

これは最終的には以下の場所と同じになる必要があります。
https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/MaxmindDownloadLookup.php#L29

`$this->getDataDir().'/GeoLite2-City.mmdb'`

さらに展開すると以下です。
https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/AbstractLocalDataLookup.php#L171

`$dataDir = $this->cacheDir.'/../ip_data';`

`AbstractLocalDataLookup` は `AbstractLookup` を継承しており、初期化は以下の設定が反映されます。
https://github.com/mautic/mautic/blob/de7e701ab2e498e7a8e5129e35a8fa482e1e2ff8/app/bundles/CoreBundle/Config/config.php#L927-L945

つまり、`cacheDir` は `kernel.cache_dir` になります。
例えば私の環境では以下のようになるので、上記の Dockerfile ではここが一致しません。 `/var/www/html/var/cache/ip_data` を指定しなければいけません。

```
# bin/console debug:container --parameter=kernel.cache_dir
 ------------------ ------------------------------
  Parameter          Value
 ------------------ ------------------------------
  kernel.cache_dir   /var/www/html/var/cache/prod
 ------------------ ------------------------------
```