GLPI 0.85.5をDocker環境へ移行

資産管理にGLPIを使用しています。
昨年Docker環境へ移行した際の記録です。
事前にGLPIの過去のsql dumpを準備しました。
Dockerのインストール作業はわかりやすい記事が沢山ありますので省略しています。

##環境
GLPI 0.85.5
Docker version 18.03.1-ce
docker-compose version 1.18.0
hostOS:CentOS7-minimal

一つのホストにdocker composeで2つのコンテナを起動

ベースイメージ
https://github.com/driket/docker-glpi

##ディレクトリ構成
/glpi855
├docker-compose.yml
├glpi.env  #データベースの設定
├db
　├Dockerfile
　├db_backup.sh   #DBのバックアップスクリプト
　└yyyymmdd.sql  #データベースのバックアップファイル（リストア用）
└app
　├Dockerfile
　└start.sh




##docker-compose.yml
※オリジナルからの変更点１：タイムゾーンを追加
※オリジナルからの変更点２：バックアップしたsqlファイルのコピー

```docker
version: '2'
  services:
    glpi:
      build: ./app
      ports:
      - "8080:80"
      links:
      - mysql:db
     environment:
     - "TZ=Japan"
     env_file:
     - ./glpi.env
     volumes:
     - glpi_data:/var/www/html/glpi

   mysql:
     build: ./db
     env_file:
     - ./glpi.env
    volumes:
    - mysql_data:/var/lib/mysql
    - mysql_backup:/backup
    environment:
    - "TZ=Japan"
 
  volumes:
    glpi_data: {}
    mysql_data: {}
    mysql_backup: {}
```


##Dockerfile   #db　
※オリジナルからの変更点１：vimインストールと日本語化を追記
※オリジナルからの変更点２：db_backup.shのコピーと権限付与

```dockerfile
FROM mariadb
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y vim locales
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP.utf8
COPY db_backup.sh /opt/
COPY *.sql  /opt/
RUN chmod +x /opt/db_backup.sh
RUN usermod -u 1000 www-data
RUN mkdir backup
```

#Dockerfile   #app
※オリジナルからの変更点：プラグインファイル(datainjection)のコピーを追記

```dockerfile
FROM ubuntu:trusty
MAINTAINER cedric@zestprod.com
RUN apt-get update
RUN apt-get install -y apache2

RUN sudo apt-get install -y software-properties-common \
 && add-apt-repository ppa:ondrej/php \
 && apt-get update

RUN apt-get install -y --force-yes \
 wget \
 php5.6 \
 php5.6-mysql \
 php5.6-ldap \
 php5.6-xmlrpc \
 curl \
 php5.6-curl \
 php5.6-gd \
 php5.6-mbstring \
 php5.6-simplexml \
 php5.6-xml \
 php5.6-apcu \
 php5.6-imap

RUN a2enmod rewrite && service apache2 stop
WORKDIR /var/www/html
COPY start.sh /opt/
COPY glpi-datainjection-2.4.2.tar.gz /opt/
RUN chmod +x /opt/start.sh
RUN usermod -u 1000 www-data
CMD /opt/start.sh
EXPOSE 80
```

#start.sh
※オリジナルからはバージョン部分だけ変更しています。
※一部抜粋

```shell
APACHE_DIR="/var/www/html"
GLPI_DIR="${APACHE_DIR}/glpi"
GLPI_SOURCE_URL=${GLPI_SOURCE_URL:-"https://forge.glpi-project.org/attachments/download/2093/glpi-0.85.5.tar.gz"}
```

##glpi.env
※バージョン部分はstart.shに合わせました

```shell
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=glpi
MYSQL_USER=glpi
MYSQL_PASSWORD=glpipassword
GLPI_SOURCE_URL=https://forge.glpi-project.org/attachments/download/2093/glpi-0.85.5.tar.gz
```

##サービス起動
1.docker-compose.ymlのあるディレクトリに移動する。
2.コンテナのビルド 

```
$ docker-compose build
```

3.コンテナ起動 

```
$ docker-compose up -d
```

4.GLPIインストール 
IPアドレス:8080へアクセス 
GUIでDB作成まで完了させる。 
DB名:　mysql 
ユーザー名:　glpi 
パスワード:　glpi.envに記載 

##DBのリストア
予め準備しておいたバックアップファイルをリストアする。
execコマンドで外から実行を試みましたがうまくいきませんでした。

1.コンテナへアクセス

```
$ docker exec -it  [コンテナ名]  /bin/bash
```

2.リストア実行

```
$ mysql -u root -p glpi < /opt/yyyymmdd.sql  　#バックアップファイルのパス
```

##バックアップの設定　※hostOSでの作業
ホスト側にてcrontabを設定
build時に格納した/opt/db_backup.shを定時で起動する。
バックアップもうまい方法が見つからず外からスクリプトを呼ぶことにしました。

```
$ crontab -e
```

※今回は[names]=glpi855_mysql_1

```shell

SHELL=/bin/bash
30 18 * * * docker exec [names] /opt/db_backup.sh 
```

##db_backup.sh

```shell

#!/bin/sh
# バックアップの保存場所
dirpath='/backup/'

#作業用ファイル作成
tmpfile="`mktemp`"
errormessage="`mktemp`"

#ファイル名を記入
echo "[`date +%Y/%m/%d`" "`date +%H\:%M\:%S`]" >> ${tmpfile}

#バックアップファイル名
filename=`date +%Y%m%d%H%M`

#バックアップ実行
mysqldump -uglpi --opt --password=glpipaswd glpi> $dirpath/$filename.sql 2>${errormessage}

#一時ファイルとバックアップファイルの削除（30日間保存）
cleandir='tmp/'
find $cleandir -type f -name "*tmp.*" -mtime +30 | xargs rm -f
find $dirpath -type f -name "*.sql" -mtime +30 | xargs rm -f
```


##プラグインの有効化
唯一使っているプラグインは[data injections]
このプラグインを有効化します。
アプリ関連ディレクトリの作成はGLPIインストール後となると思われます。
そのためDockerfileにはファイルを/optへコピーだけしています。
docker exec -it [コンテナ名] /bin/bash

```bash

# mv /opt/glpi-datainjection-2.4.2.tar.gz /var/www/html/glpi/plugins/
# tar zxvf /var/www/html/glpi/plugins/glpi-datainjection-2.4.2.tar.gz 
```

セットアップメニューのプラグインより有効化を行います。


##課題
1. 初期設定時にデータベースのバックアップを読み込む
上記DBのリストア作業をなくしたいです。

2. timezone
GLPI上の履歴を確認すると7時間遅れのタイムスタンプとなっていました。
原因はappコンテナのPHPのタイムゾーン設定でした。
手動で対応したので、Dockerfileへ設定を書きたいです。

3. バージョンアップ
085.5を092系へバージョンアップしたいです。
092系コンテナを準備して085系のDBをリストアするとエラーで前進できません。
公式ドキュメント記載のツールもうまく起動しません。

4. DBバックアップを内部でうまく行う
外からバックアップを取る運用で逃げているので環境を移行した際にバックアップ部分を
別途対応する必要があります。
うまい方法を考えたいです。