オープンソースのグループウェア「GroupSession」をAWS EC2のAmazon Linux2環境に構築してみる

# 概要

とある事情から、あまりお金が掛からない、若しくは無料のグループウェアが無いか調べることとなりました。
完全無料のグループウェアで[R-GROUP](https://jp.r-group.com/)という製品があり、これはSaaSで提供される本当にいろんなものが無制限で利用できる非常に魅力的なグループウェアでした。
ただ、サイボウズLiveのこともあり、完全無料とはいえ、またどこかで移行しなきゃいけない事案が発生したらどうしよう。。。などと不安もあり、他に手は無いものかと調べていたら、オープンソースのグループウェア[GroupSession](https://groupsession.jp/index.html)を見つけました。

さくらVPSでも契約して、ちゃちゃっと作ってもよかったのですが、GroupSession単体の構築はあんまり難しくなさそうだったので、せっかく検証するなら、自分のスキルアップにも役立てたいと思い、AWS EC2のインスタンスを作り、そこにGroupSessionの環境を構築してみようと思います。

# 環境情報

- GroupSession 4.9.6
- AWS EC2
- インスタンスのOSは Amazon Linux2 x86_64
- AdoptOpenJDK 11.0.7 ※GroupSessionの仕様で、AdoptOpenJDKのver11が指定されているため。
- Tomcat 9.0.35

# 事前準備

[【AWS】 知識ゼロから無料で始めるEC2](https://www.acrovision.jp/service/aws/?p=243)を参考に、AWSの無料アカウント作成や、IAMユーザーの作成→ログインまでの手順は済ませた状態にしておきます。

# AWS EC2の環境構築

## EC2のインスタンスを新規作成

仮想マシンを起動するを押下
<img width="864" alt="スクリーンショット 2020-06-05 20.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/6f3415f1-57a7-03c9-ab26-70220bc9b010.png">

念のため`無料利用枠のみ`のチェックを付けて、`Amazon Linux 2 AMI`を選択
<img width="1406" alt="スクリーンショット 2020-06-05 20.40.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/54fb0e33-4623-db47-a72a-696dff4bd9dd.png">

`t2.micro`を選択して確認と作成ボタンを押下
<img width="1406" alt="スクリーンショット 2020-06-05 20.43.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9ea135ba-7659-5815-fd52-2dcd83b6ce0f.png">

起動ボタンを押下
<img width="1435" alt="スクリーンショット 2020-06-05 20.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/324ac401-c04b-168c-1588-f417470a9cce.png">

新しいキーペアの作成を指定し、任意のキーペア名を入力してから、必ずキーペアのダウンロードを行い、その後インスタンスの作成ボタンを押下する。
<img width="767" alt="スクリーンショット 2020-06-05 20.46.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/cb5e6bef-8aa9-b142-02c1-0740fef5b77f.png">

インスタンスの作成ボタン押下後はこんな画面の表示になります。
ついでに、予想請求額の通知を受け取るという設定があるようなので、`請求アラートの作成`リンクを押下して設定しておきます。
<img width="1012" alt="スクリーンショット 2020-06-05 20.48.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/17d6047e-0817-4c73-bb78-2795ec79ed7d.png">
<img width="1012" alt="スクリーンショット 2020-06-05 20.49.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/37fafc36-7abe-ea06-4f80-c68303b018ab.png">

## SSHでインスタンスに接続

ダウンロードしたキーペアのファイルを、以下のコマンドを実行してコピーし、権限を変更する。

```shell-session
$ cp -p ./YamaEC2KeyPair.pem ~/.ssh/
$ chmod 400 ~/.ssh/YamaEC2KeyPair.pem 
```

デフォルトで作成されているユーザー`ec2-user`で初回はアクセスします。

```shell-session
$ ssh -i ~/.ssh/YamaEC2KeyPair.pem ec2-user@ec2-3-19-218-51.us-east-2.compute.amazonaws.com
The authenticity of host 'ec2-3-19-218-51.us-east-2.compute.amazonaws.com (3.19.218.51)' can't be established.
ECDSA key fingerprint is SHA256:/A0EkFRSlC/QxREuiCLULK71rhGO7FulAt+/AoQAFk8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-3-19-218-51.us-east-2.compute.amazonaws.com,3.19.218.51' (ECDSA) to the list of known hosts.
Last login: Fri Jun  5 21:05:14 2020 from softbank060125073203.bbtec.net

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-24-75 ~]$ 
```

`ec2-3-19-218-51.us-east-2.compute.amazonaws.com`の部分はEC2のインスタンスのパブリックDNSの部分を指定します。
<img width="1061" alt="スクリーンショット 2020-06-06 15.50.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/5b5d0e87-2d4a-8653-452e-5a4e673fd097.png">


## 初期設定をいろいろ

```shell-session
## まずはパッケージのアップデート
$ sudo yum update -y

## タイムゾーンをAsia/Tokyoに変更
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
      Local time: 金 2020-06-05 21:11:00 JST
  Universal time: 金 2020-06-05 12:11:00 UTC
        RTC time: 金 2020-06-05 12:11:00
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

## 日本語ロケールの設定
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106
$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

特に`ec2-user`はそのまま残して、別途ユーザーを追加したり削除したり、という面倒な作業は今回割愛します。

## いったんスナップショットを作成

初期設定まで完了したので、いったんスナップショットを作成します。（この後も色々といじるし、怖いので。）
EC2ダッシュボードにアクセスして、アクション -> インスタンスの状態 -> 停止から、インスタンスを停止します。
<img width="972" alt="スクリーンショット 2020-06-05 21.21.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/037105e6-cbad-324d-f967-83ed73b740c8.png">

停止すると`stopped`となります。
<img width="972" alt="スクリーンショット 2020-06-05 21.23.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9311bc91-1441-b29b-28f3-cfa1b9e96ec2.png">

インスタンスの画面下部にある情報から、ルートデバイス -> /dev/xvda -> EBS IDを選択する
<img width="972" alt="スクリーンショット 2020-06-05 21.25.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/4402562f-8cf2-c3c9-b9b7-67839dca7562.png">

ボリュームの画面に遷移するので、アクション -> スナップショットの作成を選択する
<img width="935" alt="スクリーンショット 2020-06-05 21.26.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/770c1f33-63d0-dd26-885f-88c63ae52b6d.png">

適当に説明を入力して、スナップショットの作成ボタンを押下する。
<img width="1311" alt="スクリーンショット 2020-06-05 21.28.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2f6546d8-0ee3-9174-6208-2f30a800bfde.png">

なんか、日本語入れたら怒られたんで、英語でコメントを入れてスナップショットを作成します。
<img width="1318" alt="スクリーンショット 2020-06-05 21.29.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a821171e-2e4e-dda3-c916-04cbf002e238.png">

スナップショットの作成が完了すると以下のようになります。
<img width="1072" alt="スクリーンショット 2020-06-05 21.29.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/706bf6bb-5d6d-e77f-4189-6a0cffc0e4ee.png">

## オープンソースグループウェア GroupSession のセットアップ

### AdoptOpenJDKのインストール

https://groupsession.jp/support/setup_linux.html
のインストール手順として、AdoptOpenJDKのバージョン１１がインストールされている必要があるとのこと。

AdoptOpenJDKをAmazonLinux2に対してyumでインストールしたいので、リポジトリを追加する。

```shell-session
[ec2-user@ip-172-31-24-75 yum.repos.d]$ sudo cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
> [AdoptOpenJDK]
> name=AdoptOpenJDK
> baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/amazonlinux/2/$(uname -m)
> enabled=1
> gpgcheck=1
> gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
> EOF
-bash: /etc/yum.repos.d/adoptopenjdk.repo: Permission denied
```

`ec2-user`でやったらエラーになったので、`root`にsuして実行する。

```shell-session
$ sudo su -
[root@ip-172-31-24-75 ~]# cat <<EOF > /etc/yum.repos.d/adoptopenjdk.repo
> [AdoptOpenJDK]
> name=AdoptOpenJDK
> baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/amazonlinux/2/$(uname -m)
> enabled=1
> gpgcheck=1
> gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
> EOF

# cat /etc/yum.repos.d/adoptopenjdk.repo
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=http://adoptopenjdk.jfrog.io/adoptopenjdk/rpm/amazonlinux/2/x86_64
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
```

リポジトリを追加したので、リストを確認してみる。

```shell-session
# yum list adoptopenjdk*

読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
利用可能なパッケージ
adoptopenjdk-11-hotspot.x86_64                                                    11.0.7+10-1                                                              AdoptOpenJDK
adoptopenjdk-11-hotspot-jre.x86_64                                                11.0.7+10-1                                                              AdoptOpenJDK
adoptopenjdk-11-openj9.x86_64                                                     11.0.7+10.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-11-openj9-jre.x86_64                                                 11.0.7+10.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-11-openj9xl.x86_64                                                   11.0.7+10.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-11-openj9xl-jre.x86_64                                               11.0.7+10.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-12-hotspot.x86_64                                                    12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-12-hotspot-jre.x86_64                                                12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-12-openj9.x86_64                                                     12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-12-openj9-jre.x86_64                                                 12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-12-openj9xl.x86_64                                                   12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-12-openj9xl-jre.x86_64                                               12.0.2+10-1                                                              AdoptOpenJDK
adoptopenjdk-13-hotspot.x86_64                                                    13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-13-hotspot-jre.x86_64                                                13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-13-openj9.x86_64                                                     13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-13-openj9-jre.x86_64                                                 13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-13-openj9xl.x86_64                                                   13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-13-openj9xl-jre.x86_64                                               13+33-1                                                                  AdoptOpenJDK
adoptopenjdk-14-hotspot.x86_64                                                    14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-14-hotspot-jre.x86_64                                                14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-14-openj9.x86_64                                                     14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-14-openj9-jre.x86_64                                                 14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-14-openj9xl.x86_64                                                   14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-14-openj9xl-jre.x86_64                                               14.0.1+7-1                                                               AdoptOpenJDK
adoptopenjdk-8-hotspot.x86_64                                                     8u252_b09-1                                                              AdoptOpenJDK
adoptopenjdk-8-hotspot-jre.x86_64                                                 8u252_b09-1                                                              AdoptOpenJDK
adoptopenjdk-8-openj9.x86_64                                                      8u252_b09.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-8-openj9-jre.x86_64                                                  8u252_b09.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-8-openj9xl.x86_64                                                    8u252_b09.openj9_0.20.0-1                                                AdoptOpenJDK
adoptopenjdk-8-openj9xl-jre.x86_64                                                8u252_b09.openj9_0.20.0-1                                                AdoptOpenJDK
```

version11が指定されているので、`adoptopenjdk-11-hotspot.x86_64`をインストールする。

```shell-session
# yum -y install adoptopenjdk-11-hotspot.x86_64
# java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)
```

yumでインストールされたjavaは`/usr/lib/jvm/adoptopenjdk-11-hotspot/`に格納されているっぽいですね。

```shell-session
https://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.35/bin/apache-tomcat-9.0.35.tar.gz

# cd /usr/local/src
# wget https://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.35/bin/apache-tomcat-9.0.35.tar.gz
# tar -xzvf apache-tomcat-9.0.35.tar.gz
# mv apache-tomcat-9.0.35 /usr/local
# ln -s /usr/local/apache-tomcat-9.0.35 /usr/local/tomcat
# useradd -s /sbin/nologin tomcat
# chown -R tomcat:tomcat /usr/local/apache-tomcat-9.0.35
# chown -h tomcat:tomcat /usr/local/tomcat
```

tomcat.serviceを新規で作成する。

```shell-session:/usr/lib/systemd/system/tomcat.service
# Systemd unit file for default tomcat
#
# To create clones of this service:
# DO NOTHING, use tomcat@.service instead.

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=oneshot
PIDFile=/usr/local/tomcat/tomcat.pid
RemainAfterExit=yes
#EnvironmentFile=/etc/tomcat/tomcat.conf
#Environment="NAME="
#EnvironmentFile=-/etc/sysconfig/tomcat
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReStart=/usr/local/tomcat/bin/shutdown.sh;/usr/local/tomcat/bin/startup.sh
SuccessExitStatus=143
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
```

Tomcatを自動起動にする。

```shell-session
# systemctl enable tomcat.service
```

Tomcatを起動する

```shell-session
# systemctl start tomcat.service
```

EC2で8080ポートを開放する。

<img width="1061" alt="スクリーンショット 2020-06-06 16.35.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/100620b3-fc66-6df6-47ac-7513ba7a3c3e.png">
<img width="1172" alt="スクリーンショット 2020-06-06 16.36.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/4ec664e7-e688-8912-54b2-aa1a04b04d2a.png">
<img width="1359" alt="スクリーンショット 2020-06-06 16.38.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/0022628b-8a79-5aa3-50cf-77376245d34e.png">
※ここでも日本語を使うとエラーになるので注意

Tomcatにアクセスしてみます。
http://ec2-3-19-218-51.us-east-2.compute.amazonaws.com:8080
<img width="997" alt="スクリーンショット 2020-06-06 16.39.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/6728cf9b-ca4b-3890-5950-60fd3360937d.png">
これでTomcatまでの環境構築が完了。

## GroupSessionをセットアップ

GroupSessionのwarファイルをダウンロードしてホットデプロイするだけのようです。

```shell-session
# cd /usr/local/src
# wget http://dl1.gs.sjts.co.jp/v4/download/files/4.9.6/gsession.war
# cp -p /usr/local/src/gsession.war /usr/local/tomcat/webapps/
# systemctl stop tomcat
# systemctl start tomcat
```

以下にアクセスすることでGroupSessionのログインページが表示されます。
http://ec2-3-19-218-51.us-east-2.compute.amazonaws.com:8080/gsession
<img width="1176" alt="スクリーンショット 2020-06-06 16.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/945f7bd2-83c2-ef25-501e-2d44953623db.png">

admin / admin でログインすることができるようです。
ログインするとこんな画面になっています。
<img width="1202" alt="スクリーンショット 2020-06-06 16.49.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9ca3fb86-9173-0f40-70ed-8197e37b2970.png">

あとはユーザーを追加したりするだけっぽいですね。

## あとがき

adminでログインした後、グループを１つ作り、ユーザーを１つ作り、ユーザーでログインすると以下のような画面が出てきました。
adminだと管理者としての機能しか触れないようで、一般ユーザーで入ると、ちゃんとグループウェアっぽい画面となりました。

<img width="1439" alt="スクリーンショット 2020-06-06 17.02.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/719813fe-134c-27da-1a0f-e23afbbce926.png">

GSモバイルという有償オプションがあり、それを利用するとスマホ対応のブラウザ表示や、Android/iPhoneアプリからのGroupSessionへのアクセスが可能となるようです。
特に無償のままでも、PC版の画面のままであれば、スマホのブラウザからもアクセスできました。