Web(wdCalendar)による情報共有

# スケジュール共有のためにwdCalendar をdocker上に構築

閉鎖環境にMattermostを導入してメンバ間の情報共有を始めようとしているが、スケジュール情報共有機能が十分ではないため、いろいろ探したところ、wdCalendarが使えそうなのでdocker上に環境を構築したときのメモをまとめる。
Googleカレンダーが利用できればそれで問題は解決するのだが、~~Excel方眼紙による情報共有はできれば避けたい。~~ Excel運用が始まってしまったので、お一人様カレンダーになってしまった。

(2017/09/24) mattermostへのポスト機能を追加
(2017/10/01) 課題の対応。
 * 週末の色対応(自分的に絶対外せない課題)
 * 詳細編集機能の復活(ベースにしたソースから削除されていた)
 * 祭日(〜2019/12/31)の初期登録
(2017/10/21) mattermostの情報のバックアップを追記(mattermost環境の構築手順を作成したときに移動)

## 環境

 * CentOS 7.4.1708
 * docker 1.12.6
 * docker-compose 1.9.0

[wdCalendar を Docker で起動する](https://www.snip2code.com/Snippet/818379/wdCalendar---Docker------)を参考にして、wdCalendar をdocker上構築し、サービスを考えた。
ベースとした wdCalendar はmysqlとphpを必要としているが、たかだか十数人程度の情報共有を考えているので、 mysqlのような本格的な RDB は必要ないので、データベースは、php:5.6.31-apacheに含まれるsqlite3を使用する。
ただし、php:5.6.31-apacheには、sqlite3コマンドが無いため、DB作成は php 経由となる。

### コンテナイメージ化

Dockerfileを作成し、dockerのイメージ化にチャレンジ

```:Dockerfile
FROM php:5.6.31-apache

WORKDIR /var/www/html

ADD wdCalendar .

RUN rm -fr .git* && \
    mkdir -p /var/lib/db && \
    echo "[Date]\ndate.timezone ='Asia/Tokyo'" >> /usr/local/etc/php/php.ini

ENTRYPOINT ["/var/www/html/docker-entrypoint"]

EXPOSE 80

CMD ["apache2-foreground"]
```

### イメージ作成手順

```
$ git clone -b locale-jp https://github.com/ir-shin1/wdCalendar.git wdCalendar
$ docker build -t wdcalendar:0.1 .
$ docker images
REPOSITORY       TAG        IMAGE ID            CREATED             SIZE
wdcalendar       0.1        3bb16f9d0cce        6 seconds ago       378.9 MB
```

### 作成したコンテナの実行

SQLiteのDBは、wdCalendarソースを展開した場所のdb配下に作成する。SQLiteのいいところは、DBが単独ファイルで完結するのでバックアップ・リストアは以下の3ステップで済む。

 * コンテナストップ
 * DBのファイルコピー
 * コンテナスタート

コンテナイメージを実行するために docker-compose.yml ファイルを作成する。ネットワーク redmine_network は、mattermost と同じネットワークにするため設定しているため、mattermost と接続しなければ不要。

```:docker-compose.yml
version: '2'

services:
  calendar_sv:
    image: wdcalendar:0.1
    container_name: calendar_sv
    restart: always
    ports:
     - "8088:80"
    volumes:
      - ./db:/var/lib/db
#    environment:
#      MASTERMOST_BOT: <mattermost のIncoming Webhooks URL>
#      MASTERMOST_BOTNAME: <BOTの名前>
    networks:
      - redmine_network

networks:
    redmine_network:
        external: true
```

### dockerコンテナの起動

以前は、DBの作成などを手動で行っていたが、今回は、docker-entrypoint スクリプト内で行うようにした。

```
$ mkdir -pm 777 db
$ chcon -Rt svirt_sandbox_file_t db
$ docker-compose up -d
```

### Webからアクセス

http://localhost:8088 でアクセスするとスケジュール表を表示すると以下の画面になる。

![スクリーンショット 2017-10-01 12.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/137664/34cd146f-cb00-177e-e9bc-f746ae75a055.png)

docker-compose.yml ファイル環境変数MASTERMOST_BOTの <mattermost のIncoming Webhooks URL> の箇所に MattermostのIncoming Webhooks で登録したURLに置き換えると、カレンダーへのスケジュール追加・更新・削除時に、Mattermostに以下のように通知される。

![スクリーンショット 2017-10-01 12.08.31.png](https://qiita-image-store.s3.amazonaws.com/0/137664/658de2a5-5f84-580a-e576-f9c919b6dae0.png)

## Mattermost

カレンダーの更新情報をMattermostで共有しているため、Mattermostデータのバックアップ・リストア方法を記載しておく。
Mattermostの環境構築手順の場で記載する内容だが、まだ作成できていないのでここにメモとして残しておく。

### Mattermostの環境

 * OS:CentOS7.4 (SELinux有効)
 * docker-compose サービス名:mattermost_sv
 * dockerコンテナ名:mattermost_sv
 * dockerイメージ名:mattermost/mattermost-preview:4.2
 * dockerネットワーク名:redmine_network

バックアップは[公式のサイト](https://docs.mattermost.com/administration/backup.html)を参照して、以下の三つをバックアップする。

 * mattermost database (docker イメージのデフォルト mysql)
 * server settings
 * users files

データベースのユーザ、パスワードは、[mattermost イメージのデフォルト](https://hub.docker.com/r/mattermost/platform/~/dockerfile/)(MYSQL_USER/MYSQL_PASSWORD)を使用した場合。変更している場合は、バックアップ・リストアスクリプトを修正すること。

### バックアップ

バックアップ用のスクリプト。

```bash:backup.sh
#!/usr/bin/env bash

BACKUP=$PWD/backup

mkdir -p ${BACKUP}

chcon -t svirt_sandbox_file_t ${BACKUP}

# Mattermost データバックアップ
docker run --rm --entrypoint=bash \
           --volume ${BACKUP}:/backup \
           --volumes-from mattermost_sv:ro \
          mattermost/mattermost-preview:4.2 \
      -c 'cd /mm/mattermost ; tar zcf /backup/mattermost_backup.tar.gz config mattermost-data'


# MYSQLデータバックアップ
docker run --rm --entrypoint=bash \
           --volume ${BACKUP}:/backup \
           --network redmine_network \
          mattermost/mattermost-preview:4.2 \
     -c 'mysqldump -u mmuser --password=mostest -h mattermost_sv -A > /backup/mysql_backup.dmp'
```

### リストア

リストアは、バックアップした環境とは以下の別環境を作成し、そこにリストアする場合のスクリプトとなっている。

#### リストア先の環境

 * docker-compose サービス名:mattermost2_sv
 * dockerコンテナ名:mattermost2_sv
 * dockerイメージ名:mattermost/mattermost-preview:4.3

mattermostのログイン認証は、gitlab-ceとのSSOを利用しているため、単純にリストアしただけでは正常に動作しなかった。以下の二つの作業が必要になる。

 * gitlab-ceへのアプリケーション登録、および、Secret、Application Idの作成	
 * mattermostの設定ファイル(/mm/mattermost/config/config_docker.json)へのSecret、Application Idの登録

```bash:restore.sh
#!/usr/bin/env bash

BACKUP=$PWD/backup

if [ -f ${BACKUP}/mattermost_backup.tar.gz -a -f ${BACKUP}/mysql_backup.dmp ] ; then

   chcon -R -t svirt_sandbox_file_t ${BACKUP}

   # Mattermost データリストア
   docker run --rm --entrypoint=bash \
           --volume ${BACKUP}:/backup:ro \
           --volumes-from mattermost2_sv \
          mattermost/mattermost-preview:4.3 \
      -c 'cd /mm/mattermost ; tar xvf /backup/mattermost_backup.tar.gz'

   # MYSQLデータリストア
   docker run --rm --entrypoint=bash \
           --volume ${BACKUP}:/backup:ro \
           --network redmine_network \
          mattermost/mattermost-preview:4.3 \
     -c 'mysql -u mmuser --password=mostest -h mattermost2_sv < /backup/mysql_backup.dmp'

fi
```

## 課題
 * 縦方向のサイズ変更に対応していないらしく、縦方向のウインドウサイズを変更してもスケジュールが追従してくれない。
 * 10分〜15分間隔でいいので、自動的に画面を更新したい。

# 参考

 * [jQuery/wdCalendar](https://web.chaperone.jp/w/index.php?jQuery%2FwdCalendar)
 * [wdCalendar を Docker で起動する](https://www.snip2code.com/Snippet/818379/wdCalendar---Docker------)
 *