irohaboardをUbuntu環境で構築する

# 注意(2020/05/20追記)
現在、iroha board最新バージョンは `10.4` ですが、本記事は `10.2` に対応したインストール方法です。`10.3` よりインストール方法に変更がありました。ご注意ください。

# はじめに
*Moodle*や*CanvasLMS*、*Sakai*といったe-ラーニング(LMS)システムが世の中にはいくつかありますが、これらは機能が多いものの大規模であり、たとえば社内の1部所だけで必要な教材を管理したい場合にはランニングコストや管理コストの面で不適となるでしょう。
そこで今回は国産軽量LMSの**iroha board**を紹介すると共に、その構築までを記事にまとめます。

また、現在記事として上がっているiroha boardの環境はCentOS上で作られているものが多く、Ubuntu環境のものがあまりなかったこともモチベーションになっております。

# この記事の環境
Ubuntu 18.04

# 必要なパッケージをインストールする
この記事ではApacheからPHPを呼びます。なお、irohaboardのRDBはMySQLのみ対応しているみたいです。

```shell
# パッケージレポジトリの更新
sudo apt-get update
# PHP、Git、MySQL、curlをインストール
sudo apt-get install -y php php-mbstring php-mysql apache2 git mysql-server mysql-client curl 
```

# ソースコードのインストール
つぎにcakephp本体と、irohaboardの本体を`/var/www/cake`と`/var/www/html`に配置します。この階層関係以外の場合では[webroot/index.phpの編集](https://irohaboard.irohasoft.jp/download/faq/#dir)が必要になるようです。

```shell
# ソースコードのダウンロード
curl -o /tmp/cakephp.tar.gz https://codeload.github.com/cakephp/cakephp/tar.gz/2.10.19 
curl -o /tmp/irohaboard.tar.gz https://codeload.github.com/irohasoft/irohaboard/tar.gz/v0.10.2 
# cakeを配置するフォルダの作成
mkdir /var/www/cake
# ファイルの展開
tar xvzf /tmp/cakephp.tar.gz -C /var/www/cake --strip-components=1
tar xvzf /tmp/irohaboard.tar.gz -C /var/www/html --strip-components=1
# アーカイブファイルの削除
rm -f /tmp/cakephp.tar.gz /tmp/irohaboard.tar.gz
```

# apacheを設定する
apacheはウェブサーバーで、外部からのhttpリクエストに反応してphpを実行させることができます。
Ubuntuの環境ではapacheの設定ファイルは`/etc/apache2/`以下に分割されています。
今回はこのフォルダの中の主な設定ファイルである`/etc/apache2/apache2.conf`をファイルを編集し、`/var/www/html`への設定を行います。

デフォルトでは159行目あたりにある、以下の内容を後述する内容に書き換えます。

```apache:apache2.conf(編集前)
<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>
```
この内容に追記して、下記のように変えます。

```apache:apache2.conf(編集後)
<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/html>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
```
ディレクトリーに`/var/www/html`が指定されていて、`AllowOverride All`が設定されていることを確認してください。
その後、以下の操作を行います。

```shell
# apache自身のユーザーであるwww-dataにファイルの所有権を与える
sudo chown -R www-data:www-data /var/www/html /var/www/cake 
a2enmod rewrite && a2enmod headers # apacheのrewriteモジュールとheadersモジュールを有効化する
```
設定しおえたら、以下のコマンドでapacheを起動しましょう。

```shell
service apache2 start # apacheサービスを起動する
```

# MySQLを設定する
irohaboardはMySQLに依存していますので、次はその設定を行います。
以下のコマンドでDBやユーザーの設定を行いましょう。ユーザー名やパスワードの設定はお好みで。後ほどMySQLへの接続の際にこれらの情報を用いるのでどっかに控えてください。

```shell
# irohaboardという名前のDBをutf8の文字設定で作る
mysql -uroot -e 'CREATE DATABASE irohaboard CHARACTER SET utf8;' 
# irohapassというパスワードのirohaadminというユーザーをlocalhostに作る
mysql -uroot -e "CREATE USER 'irohaadmin'@'localhost' IDENTIFIED BY 'irohapass';"
 # 管理者権限を与えて反映させる
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO 'irohaadmin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"
```

# database.phpを設定する
`/var/www/html/Config/database.php`に上の項目で設定したホスト名、DB名、ユーザー名などをここで登録することで、irohaboardがMySQLに接続できるようになります。

localhostのMySQLの場合はSocket通信を行うので、`unix_socket`という設定項目が必要になります。
これはsocketのパスを設定する項目で、デフォルトだと`/var/run/mysqld/mysqld.sock`になります。

```php5:database.php
<?php

class DATABASE_CONFIG {

	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => true,
		'host' => 'localhost',
		'unix_socket' => '/var/run/mysqld/mysqld.sock',
		'login' => 'irohaadmin',
		'password' => 'irohapass',
		'database' => 'irohaboard',
		'prefix' => 'ib_',
		'encoding' => 'utf8'
	);
}
```
# irohaboardへのアクセスとインストール
これまでの設定を終えた後、[http://localhost/install](http://localhost/install)へアクセスすると、irohaboardのインストール画面が出てきますので、画面の指示に従って入力してください！![image-1024x494.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/9318c89e-4141-13ab-78f7-7cbab89e7921.png)


# デバッグ情報
何かエラーが起こった場合、より詳細な情報をみたくなることがあるかと思います。その際は、apacheのエラーなのか、cakephpのエラーなのかで参照するファイルが変わってきます。

* apacheのエラーログは`/var/log/apache2`
* cakeのエラーログは`/var/www/html/tmp/logs`

にあるので、エラったときには参照すると良いでしょう。

# おまけ
上記の環境をherokuにデプロイするべく、Docker上のUbuntuで構築しました。 
また、レポジトリに `apache2.conf` と `database.php` を含めたものを公開しておりますので、参考にされてください。
[herokuへのデプロイ用のレポジトリ](https://github.com/kawadumax/irohaboard-docker-heroku-example)

`Dockerfile` は下記になります。

```dockerfile:Dockerfile

# herokuにデプロイする用のイメージ
FROM heroku/heroku:18

# mysqlインストール時に対話が発生しインストールが止まってしまう場合への処理
ENV DEBIAN_FRONTEND=noninteractive

# install php and some extensions
RUN apt-get update && apt-get install -y php php-mbstring php-mysql apache2 git mysql-client

# debug用のエディタ microコマンドで起動
# RUN cd /usr/bin && curl https://getmic.ro | bash

# ソースコードのインストール
RUN curl -o /tmp/cakephp.tar.gz https://codeload.github.com/cakephp/cakephp/tar.gz/2.10.19 
RUN curl -o /tmp/irohaboard.tar.gz https://codeload.github.com/irohasoft/irohaboard/tar.gz/v0.10.2 
RUN mkdir /var/www/cake
RUN tar xvzf /tmp/cakephp.tar.gz -C /var/www/cake --strip-components=1
RUN tar xvzf /tmp/irohaboard.tar.gz -C /var/www/html --strip-components=1
RUN rm -f /tmp/cakephp.tar.gz /tmp/irohaboard.tar.gz

# apache2とdatabaseの設定をコピーする
COPY apache2.conf /etc/apache2/apache2.conf
COPY database.php /var/www/html/Config/database.php
RUN chown -R www-data:www-data /var/www/html /var/www/cake
RUN a2enmod rewrite && a2enmod headers

# For heroku container debugging
# heroku上のコンテナにbashで入る為に必要
ADD ./.profile.d /app/.profile.d
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 起動しつづけるようにFOREGROUNDで実行する必要がある
# また、heroku環境だとポートが動的に割り振られるので、80番をハードコードすると「同じポートは開けないよ」というエラーがでる
CMD sed -i "s/80/$PORT/g" /etc/apache2/sites-enabled/000-default.conf /etc/apache2/ports.conf && apachectl -D FOREGROUND
```

# さいごに
この記事は以上になります。追加で、herokuへのデプロイ編を予定しておりますが、そちらは未定です。
何かわかりにくいところや間違えているところがありましたらコメントください。

#### 参考リンク
[iroha board公式](https://irohaboard.irohasoft.jp/) 
#### ほしい物リスト
もしこの記事が役に立ったのであれば、本や食料を買っていただけるととても嬉しいです。
https://www.amazon.jp/hz/wishlist/ls/1P644LOPKXCLP?ref_=wl_share
#### Twitter
https://twitter.com/kawadumax