資産管理に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
※オリジナルからの変更点1:タイムゾーンを追加
※オリジナルからの変更点2:バックアップしたsqlファイルのコピー
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
※オリジナルからの変更点1:vimインストールと日本語化を追記
※オリジナルからの変更点2:db_backup.shのコピーと権限付与
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)のコピーを追記
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
※オリジナルからはバージョン部分だけ変更しています。
※一部抜粋
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に合わせました
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=/bin/bash
30 18 * * * docker exec [names] /opt/db_backup.sh
##db_backup.sh
#!/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
# 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
セットアップメニューのプラグインより有効化を行います。
##課題
-
初期設定時にデータベースのバックアップを読み込む
上記DBのリストア作業をなくしたいです。 -
timezone
GLPI上の履歴を確認すると7時間遅れのタイムスタンプとなっていました。
原因はappコンテナのPHPのタイムゾーン設定でした。
手動で対応したので、Dockerfileへ設定を書きたいです。 -
バージョンアップ
085.5を092系へバージョンアップしたいです。
092系コンテナを準備して085系のDBをリストアするとエラーで前進できません。
公式ドキュメント記載のツールもうまく起動しません。 -
DBバックアップを内部でうまく行う
外からバックアップを取る運用で逃げているので環境を移行した際にバックアップ部分を
別途対応する必要があります。
うまい方法を考えたいです。