intra-mart実践入門の作成記録 #010 執筆用intra-mart環境構築

# intra-mart環境クイックガイド
　「3分で作る～」とか言いたいところですが、さすがに無理なので「クイック」と抽象的な言葉でお茶を濁しましょう。操作に慣れて迷いがなければ30分程度で終わります。前提とするのは以下の3点です。書籍では含めますが、ここではセキュリティ対策等の運用で必要となる機能については記述しません。

1. [CentOS 7 minimal](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso)のインストール完了
2. [IM-Juggling](https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/create_war/create_project.html)のセットアップ完了
3. ファイル転送可能なSSHクライアントがセットアップ完了

## WARファイル準備
### 新しいPJの作成
　プロジェクト名を決めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/63083fd2-b6d8-9802-db93-ea1fd0a35e1e.png)

　ベースモジュールはEnterpriseライセンスを購入している前提なので当然「Advanced Edition」です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/5820c9b9-fdbf-84de-0007-26a0d72ca5a1.png)

　アプリケーションの選択では以下の三つを選びます。

* IM-formaDesinger for Accel Platform
* IM-BIS for Accel Platform
* IM-Workflow アプリケーション汎用アーカイブ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/5410b098-e39a-a243-5be6-73976c2248e3.png)

　利用するプラットフォームはResin 4.0.xを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/f02959c9-adbc-059b-4818-7245018e73ff.png)

　終了を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/a7e52658-3d30-8ad0-8200-1a22bdcaca8e.png)

### WARファイルの設定変更
　プロジェクトのモジュール構成が表示されます。最小限の構成にするために[IMBox](https://www.intra-mart.jp/download/product/iap/imbox/imbox_administrator_guide/texts/about/about.html)と[IM-ContentsSearch](https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/create_war/configuration_file_solr.html)を除外します[^1]。[IMBox モジュールを外す方法](https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/create_war/how_to_remove_imbox_module.html#how-to-remove-imbox-module)を参考にしましょう。IMBoxと同様にIM-ContentsSearchコアライブラリも除外します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/4f1483cc-576b-d033-6dfb-76d876d5ed78.png)

　resin-web.xmlのデータベース接続文字列のDB名、ユーザー名、パスワードを入力します。

```xml:resin-web.xml
	<database jndi-name="jdbc/default">
		<driver>
			<type>org.postgresql.Driver</type>
			<url>jdbc:postgresql://localhost:5432/your_db_name</url>
			<user>your_db_user_name</user>
			<password>your_db_user_password</password>
			<init-param>
				<param-name>preparedStatementCacheQueries</param-name>
				<param-value>20</param-value>
			</init-param>
		</driver>
		<max-connections>20</max-connections>
		<prepared-statement-cache-size>8</prepared-statement-cache-size>
	</database>
```

　storage-config.xmlの「root-path-name」を変更します。

```xml:storage-config.xml
  <storage-info>
    <root-path-name>/your/intra-mart/storage</root-path-name>
    <system-directory-name>system</system-directory-name>
    <public-directory-name>public</public-directory-name>
    <group-directory-name>groups</group-directory-name>
    <configuration-directory-name>conf</configuration-directory-name>
    <conpatible-directory-name>public</conpatible-directory-name>
    <storage-directory-name>storage</storage-directory-name>
    <temporary-directory-name>temp</temporary-directory-name>
  </storage-info>
```

　変更を保存します。適切な変更理由を入力しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/9b169118-8640-6ee3-4c23-dfda1b2ace7e.png)

　保存するとパッチの適用ができるようになります。存在する場合は当てておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/939d75f8-eb6f-ce10-2ac1-b079eb2ce330.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/a0011343-04a3-e66b-cb5f-290a1fa0be89.png)

　もう一度、変更を保存しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/8b165be2-53b6-2b9a-0bf3-beb0395c0db2.png)

### WARファイルのビルド
　ビルドウィザードを選択するとサーバ製品の選択肢が表示されます。「Resin 4.0.x」を選択して「次へ」ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/417f1735-c35d-c9e5-7940-187ce94413fa.png)

　WARファイルの出力先とファイル名を入力します。特に__ファイル名はデプロイ後のコンテキストルートになるため、運用環境構築時は慎重に検討__しましょう。初めて触るときは「サンプルを含める」にチェックを入れてもいいですが、最小構成時のデータが分かりにくくなる[^2]ので、初めて触るとき以外は入れない方が良いと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/e1939918-8937-753f-5113-3b56b61ca4b1.png)

　ライセンスの使用条件に同意します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/ed28d42b-6d91-7da5-c738-cd22ba22f8f5.png)

　「終了」を選択すると、WARファイルのビルドが行われ、指定したディレクトリに出力されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/a677ec82-8c57-30da-b64a-76e3a4afc726.png)

　出力されたファイルはSCP等でintra-martをセットアップするサーバに転送しておきます。これでWARファイルの準備は完了です。

## ミドルウェア準備
　OSのインストールが終わっていれば、次のステップはコマンドを流すだけです。例によってシェルスクリプト風に載せておきます。コピー＆ペーストしたらお茶でも飲んで待っていましょう。

```shell:site_setup_minimal.sh
#!/bin/bash
# SELinuxの無効化
setenforce 0
sed -i.bak -e "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 

# パスワードなしsudo可能な管理ユーザーの追加
useradd admin_user_name -g wheel -c "管理ユーザー"
sed -i     -e "$ a %wheel ALL=NOPASSWD: ALL" /etc/sudoers
sed -i     -e "$ a Defaults:admin_user_name \!requiretty" /etc/sudoers

# 管理ユーザーでログイン
su admin_user_name -l

# intra-martで使用するポートのFirewall設定変更
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --zone=public --permanent --add-port=6600/tcp
sudo firewall-cmd --zone=public --permanent --add-port=5432/tcp
sudo firewall-cmd --reload

# PostgreSQLのインストール
sudo sed -i -e "$ a export PGDATA='/var/lib/pgsql/10/data'" /etc/profile
sudo rpm -ivh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
sudo yum -y install postgresql10-server-10.1 postgresql10-devel-10.1 postgresql10-contrib-10.1
sudo su -l postgres -c "/usr/pgsql-10/bin/initdb -D /var/lib/pgsql/10/data --encoding=UTF8 --locale=ja_JP.utf8"
sudo systemctl start postgresql-10
sudo systemctl enable postgresql-10

# PostgreSQLの設定
sudo su -l postgres -c "sed -i.bak -e \"s|^#listen_addresses *= *'localhost'|listen_addresses = '*'|g\" /var/lib/pgsql/10/data/postgresql.conf"
sudo su -l postgres -c "sed -i.bak -e \"$ a host all all 0.0.0.0/0 md5\" /var/lib/pgsql/10/data/pg_hba.conf"

# JDKのインストール
sudo yum -y install wget
sudo wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -q -O /tmp/jdk.rpm "http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.rpm"
sudo rpm -ivh /tmp/jdk.rpm
sudo rm -f /tmp/jdk.rpm
sudo sed -i -e "$ a export JAVA_HOME='/usr/java/jdk1.8.0_162'" /etc/profile
sudo sed -i     -e "$ a export PATH=\$JAVA_HOME/bin:\$PATH" /etc/profile

# Resinのインストール
sudo yum -y install wget openssl-devel gcc make
mkdir /tmp/resin
sudo wget -q -O - http://caucho.com/download/resin-pro-4.0.55.tar.gz | tar zxv -C /tmp/resin --strip-components=1
cd /tmp/resin
sudo ./configure --prefix=/usr/resin --enable-64bit --enable-ssl
sudo make
sudo make install
cd ~/
sudo rm -r -f /tmp/resin
sudo sed -i -e "$ a export RESIN_HOME='/usr/resin'" /etc/profile

# Resinの設定 
sudo wget -q -P /usr/resin/lib "https://jdbc.postgresql.org/download/postgresql-42.2.1.jre6.jar"
sudo mkdir -p /var/resin-tmp
sudo sed -i.bak -e "s|^app.http *:.*$|app.http : 80|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^# app.https *:.*$|app.https : 443|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^web.http *:.*$|web.http : 80|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^# web.https *:.*$|web.https : 443|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^# log_level *: *.*$|log_level : info|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^dev_mode *: *.*$|dev_mode : false|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^# dependency_check_interval *:.*$|dependency_check_interval : 10s|g" /usr/resin/conf/resin.properties
jvm_args="-Xms2048m -Xmx2048m -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/var/resin-tmp"
sudo sed -i     -e "s|^# jvm_args *: *.*$|jvm_args : ${jvm_args}|g" /usr/resin/conf/resin.properties
sudo sed -i     -e "s|^#JAVA_HOME=.*$|source /etc/profile|g" /etc/init.d/resin
sudo systemctl daemon-reload
sudo systemctl start resin
sudo systemctl enable resin
```

## intra-mart初期化
　ここまで来たらあと一歩です。WARファイルのデプロイまでサラッと済ませましょう。

```shell:initialize_intra-mart.sh
#!/bin/bash
# intra-martで使うストレージの初期化
sudo rm -r -f /your/intra-mart/storage
sudo mkdir -p /your/intra-mart/storage

# intra-martで使うDBの作成
sudo su -l postgres -c "psql -c \"CREATE ROLE your_db_user_name WITH LOGIN SUPERUSER CREATEDB PASSWORD 'your_db_user_password';\""
sudo su -l postgres -c "createdb -O your_db_user_name -U postgres your_db_name"

# WARファイルのデプロイ
sudo /usr/resin/bin/resinctl deploy /your/managed/directory/context_root_name.war
```
　デプロイ完了後[http://server_name/context_root_name/system/login](http://server_name/context_root_name/system/login)にアクセスしてみましょう。初期設定が終わっていないため[http://server_name/context_root_name/system/initialsetting](http://server_name/context_root_name/system/initialsetting)にリダイレクトされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/f64507b9-d9e6-026f-3bd6-2c9bd223f7ab.png)

　システム管理者情報を入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/2e2849aa-118e-550c-2128-e90129dc95be.png)

　テナント情報を入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/d8b60c3c-1c48-1d9e-2ec7-3eacd29c5390.png)

　テナント環境情報を入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/7ec8c393-8364-b6f8-df56-c2fd4e900b90.png)

　パスワード保存方式設定を入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/1a791608-4cf6-205b-c7ba-667e41aee100.png)

　テナント管理者情報を入力して「次へ」を押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/1202171a-cea1-4109-d9c7-26c6e57d3d84.png)

　「登録」を押下してテナント環境のセットアップを開始します。[WARファイルの設定変更](https://qiita.com/hiroaki-kushida/items/f3202d8d1a794e47ea70#war%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4)で__IMBoxを除外していない場合、ここで[Apache Cassandra](http://cassandra.apache.org/)や[Apache Solr](http://lucene.apache.org/solr/)の接続情報が必須項目となり詰みます__。ここは公式ドキュメントでは詳しく説明されていないので注意してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/4e460112-8e00-8135-94a3-f296dc04c0c8.png)

　テナント環境セットアップはかなりの確率で失敗します[^3]。失敗しても焦らなくても大丈夫です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/5d9f237c-a661-d887-a61d-59dd459f940c.png)

　「メニュー > システム環境構築 > テナント環境セットアップ」から何度でもリトライできます。成功するまで粘り強くリトライしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/db0a8c63-e583-0b65-1fb2-2c3758155d74.png)

　テナント環境セットアップに成功したら完了です…、と言いたいところですが先ほどのテナント環境セットアップで一度でも失敗している場合は注意点があります。テナント管理者の作成がキャンセルされているため、自分で作ってやる必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/9d69c6a5-c31c-53bd-a8ba-8c1fd5d1cea5.png)

　「メニュー　> システム管理 > 一般ユーザ管理」からテナント管理者となるユーザーを作成しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/382f566e-9cdf-3433-7976-fc8a69623cfa.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228081/28351d2a-3426-fca1-23a7-2ced4ce1438e.png)

　これでようやく準備完了です。


[^1]: intra-martのセットアップが難しくなっているのは、APサーバやDBMSだけでも難易度が高いというのに、公式が出している[セットアップガイド](https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/index.html)を参考にすると[Apache Cassandra](http://cassandra.apache.org/)や[Apache Solr](http://lucene.apache.org/solr/)もセットアップしようとしてしまうことが原因と思います。[5.1.4. モジュールの選択](https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/create_war/create_project.html#create-project-choice-of-module)がサラッと書かれているだけに余計に…。
[^2]: ある程度慣れてくると、DBを直接除いて依存関係を調べたくなるので、不要なデータがあると混乱するのです。
[^3]: これまでに100回以上テナント作ってきましたが、3～5割は失敗します。