OpenProject+Mattermost環境のセットアップ

プロジェクト管理ソフトウェアの[OpenProject](https://www.openproject.org/)とチャットソフトウェアの[Mattermost](https://www.mattermost.org/)を同じサーバにセットアップしたいということで構築手順を整理。

![OpenProject_Mattermost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232458/f15cd4df-3f32-a187-b73a-27616e212b6b.png)

# 環境
以下のサーバで構築を進める。

|項目|設定値|備考|
|:--|:--|:--|
|OS|CentOS 7.6|ビルドは1810|
|ServerName(メイン)|op.example.jp|OpenProject用|
|ServerName（サブ）|mm.example.jp|Mattermost用|
|IPv4 Address|192.168.50.10||

OpenProjectがReverseProxyとしてApacheを利用するため、そこにMattermostを相乗りさせる方針。
ただし、どちらもサブディレクトリで出し分けるのがちょっと面倒なのでVirtualHostを利用してサブドメインで振り分ける。
そのためServerNameは名前解決できるようにする必要がある（hostsに記載するなど）。

本稿ではVagrantBoxを利用。

<details><summary>Vagrantfile</summary><div>

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 2
    vb.memory = "8192"
  end
  config.vm.network :private_network, ip: "192.168.50.10"
  config.vm.synced_folder "share/", "/share", owner: "vagrant", group: "vagrant"
  config.vm.provision "shell", inline: <<-SHELL
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    yum -y update
    yum -y install epel-release
  SHELL
end
```
</div></details>

<details><summary>Virtualbox Guest Additions インストール時パッケージ</summary><div>

```
cpp-4.8.5-36.el7_6.1.x86_64
gcc-4.8.5-36.el7_6.1.x86_64
glibc-2.17-260.el7_6.4.x86_64
glibc-common-2.17-260.el7_6.4.x86_64
glibc-devel-2.17-260.el7_6.4.x86_64
glibc-headers-2.17-260.el7_6.4.x86_64
gpg-pubkey-f4a80eb5-53a7ff4b
kernel-devel-3.10.0-957.10.1.el7.x86_64
kernel-devel-3.10.0-957.1.3.el7.x86_64
kernel-headers-3.10.0-957.10.1.el7.x86_64
libgcc-4.8.5-36.el7_6.1.x86_64
libgomp-4.8.5-36.el7_6.1.x86_64
libmpc-1.0.1-3.el7.x86_64
mpfr-3.1.1-4.el7.x86_64
perl-5.16.3-294.el7_6.x86_64
perl-Carp-1.26-244.el7.noarch
perl-constant-1.27-2.el7.noarch
perl-Encode-2.51-7.el7.x86_64
perl-Exporter-5.68-3.el7.noarch
perl-File-Path-2.09-2.el7.noarch
perl-File-Temp-0.23.01-3.el7.noarch
perl-Filter-1.49-3.el7.x86_64
perl-Getopt-Long-2.40-3.el7.noarch
perl-HTTP-Tiny-0.033-3.el7.noarch
perl-libs-5.16.3-294.el7_6.x86_64
perl-macros-5.16.3-294.el7_6.x86_64
perl-parent-0.225-244.el7.noarch
perl-PathTools-3.40-5.el7.x86_64
perl-Pod-Escapes-1.04-294.el7_6.noarch
perl-podlators-2.5.1-3.el7.noarch
perl-Pod-Perldoc-3.20-4.el7.noarch
perl-Pod-Simple-3.28-4.el7.noarch
perl-Pod-Usage-1.63-3.el7.noarch
perl-Scalar-List-Utils-1.27-248.el7.x86_64
perl-Socket-2.010-4.el7.x86_64
perl-Storable-2.45-3.el7.x86_64
perl-Text-ParseWords-3.29-4.el7.noarch
perl-threads-1.87-4.el7.x86_64
perl-threads-shared-1.43-6.el7.x86_64
perl-Time-HiRes-1.9725-3.el7.x86_64
perl-Time-Local-1.2300-2.el7.noarch
```
</div></details>

SELinuxの無効化と既存パッケージのアップデート、EPELレポジトリの設定をしておく。

```
# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# yum -y update
# yum -y install epel-release
# reboot
```

# Postfix設定

配送を自分のサーバで完結するように設定する。

|Domain|配送方法|用途|
|:--|:--|:--|
|@op.example.jp|openprojectユーザにローカル配送|OpenProject用|
|@mm.example.jp|mattermostユーザにローカル配送 |Mattermost用|
|その他|Discard||

不明なユーザ宛を/dev/nullに送るためのalias設定。

```diff:/etc/aliases
+# Catch-All
+no-reply:      /dev/null
```

```shell-session:反映と確認
# newaliases
# db_dump -p /etc/aliases.db  | grep -A1 no-reply
 no-reply\00
 /dev/null\00
```

transportとvirtual aliasを編集。

```:/etc/postfix/transport
localhost               local:
localhost.localdomain   local:
*                       discard: "Discard with transport"
```

```:/etc/postfix/virtual
@op.example.jp          openproject
@mm.example.jp          mattermost
```

```shell-session:反映と確認
# postmap /etc/postfix/transport
# db_dump -p /etc/postfix/transport.db

# postmap /etc/postfix/virtual
# db_dump -p /etc/postfix/virtual.db
```

Postfixで上記の設定を読み込むように設定を変更。

```diff:/etc/postfix/main.cf
+# Catch-All Settings
+local_recipient_maps =
+luser_relay = no-reply
+transport_maps = hash:/etc/postfix/transport
+virtual_alias_maps = hash:/etc/postfix/virtual
```

```shell-session:反映
# systemctl reload postfix.service
```

/var/log/maillogを眺めながらテストメールを送信してみる。まだ転送先ユーザを作成していない場合はno-reply宛になる。

```shell-session:配送確認用のコマンド
# echo "test" | sendmail -f hoge@example.jp -t fuga@xx.example.jp
# echo "test" | sendmail -f hoge@example.jp -t fuga@mm.example.jp
# echo "test" | sendmail -f hoge@example.jp -t fuga@op.example.jp
```

```:未登録ドメイン宛はdiscardされる
May  2 13:39:04 localhost postfix/discard[5960]: 0D3872050460: to=<fuga@xx.example.jp>, relay=none, delay=0.01, delays=0/0.01/0/0, dsn=2.0.0, status=sent ("Discard with transport")
```

```:登録ドメイン宛は所定のユーザにローカル配送
May  2 13:44:29 localhost postfix/local[6088]: 209872050460: to=<mattermost@localhost.localdomain>, orig_to=<fuga@mm.example.jp>, relay=local, delay=0.02, delays=0.01/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
```

```:登録ドメイン宛でも所定のユーザが存在しない場合はno-replyに配送
May  2 13:44:47 localhost postfix/local[6088]: EA8442050460: to=<no-reply@localhost.localdomain>, orig_to=<fuga@op.example.jp>, relay=local, delay=0, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to file: /dev/null)
```

# 証明書作成
最近のブラウザだとHTTPの場合にフォームの入力に警告が出て使いづらいことこの上ないので証明書を発行する。

## プライベートCAの構築
scriptを利用してサクッと作成。

- 秘密鍵のパスワード: P@ssw0rd
- CSRのSubject: /C=JP/ST=Tokyo/O=Example Tech/CN=PrivateCA

```shell-session
# /etc/pki/tls/misc/CA -newca
```

以下のファイルが生成されていることを確認。

- 証明書: /etc/pki/CA/cacert.pem
- 秘密鍵: /etc/pki/CA/private/cakey.pem

証明書はサーバからダウンロードしてブラウザにインストールしておく。

## Webサーバ用証明書の作成

秘密鍵、CSRを作成してプライベートCAで署名。

```shell-session
# openssl genrsa -out /etc/pki/tls/private/WILDCARD.example.jp.key -aes256 -passout pass:wcexamplejp
# openssl req -new -out /etc/pki/tls/certs/WILDCARD.example.jp.csr -key /etc/pki/tls/private/WILDCARD.example.jp.key -passin pass:wcexamplejp -subj "/C=JP/ST=Tokyo/O=Example Tech/CN=*.example.jp"
# openssl ca -out /etc/pki/tls/certs/WILDCARD.example.jp.crt -in /etc/pki/tls/certs/WILDCARD.example.jp.csr -passin pass:P@ssw0rd -batch

# openssl x509 -text -in /etc/pki/tls/certs/WILDCARD.example.jp.crt | grep -e 'Issuer:' -e 'Not After :' -e 'Subject:'
        Issuer: C=JP, ST=Tokyo, O=Example Tech, CN=PrivateCA
            Not After : Apr 30 08:07:34 2029 GMT
        Subject: C=JP, ST=Tokyo, O=Example Tech, CN=*.example.jp
```

サーバ起動時にパスフレーズを聞かれないようにパスワード認証を解除。

```shell-session
# openssl rsa -in /etc/pki/tls/private/WILDCARD.example.jp.key -out /etc/pki/tls/private/WILDCARD.example.jp.key -passin pass:wcexamplejp
```


# PostgreSQLセットアップ
## インストール
サーバがインターネットと接続可能な場合は[Linux Downloads(Red Hat family)](https://www.postgresql.org/download/linux/redhat/)からRepository RPMをダウンロード/インストールしてyum repositoryを設定し、PostgreSQLサーバをインストールする。
オフライン環境の場合はPostgreSQL Repositoryからpostgresql96、postgresql96-libs、postgresql96-serverをダウンロードし、サーバにアップロードして`yum localinstall`などでインストールする[^1]。

[^1]: 別途インターネットに繋がるサーバがある場合は`yum install --downloadonly --downloaddir=/path/to/download`で必要なパッケージをダウンロードしてまとめると楽。

```shell-session
# yum -y install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
# yum -y install postgresql96-server 
```

```shell-session:PostgreSQL9.6パッケージ
# rpm -qa | grep postgresql96
postgresql96-9.6.12-1PGDG.rhel7.x86_64
postgresql96-libs-9.6.12-1PGDG.rhel7.x86_64
postgresql96-server-9.6.12-1PGDG.rhel7.x86_64
```

## 初期設定

DBクラスタの初期化。

```shell-session
# /usr/pgsql-9.6/bin/postgresql96-setup initdb
Initializing database ... OK
```

Unix Socket経由は認証なし、IPv4経由はMD5認証、IPv6経由は認証拒否。

```diff:/var/lib/pgsql/9.6/data/pg_hba.conf
 # "local" is for Unix domain socket connections only
-local   all             all                                     peer
+local   all             all                                     trust
 # IPv4 local connections:
-host    all             all             127.0.0.1/32            ident
+host    all             all             127.0.0.1/32            md5
 # IPv6 local connections:
-host    all             all             ::1/128                 ident
+#host    all             all             ::1/128                 ident
```

PostgreSQLサーバの自動起動設定と起動。

```shell-session
# systemctl enable postgresql-9.6.service
# systemctl start  postgresql-9.6.service
# systemctl status postgresql-9.6.service

# ss -nltp | grep postmaster
LISTEN     0      128    127.0.0.1:5432                     *:*                   users:(("postmaster",pid=3391,fd=4))
LISTEN     0      128        ::1:5432                    :::*                   users:(("postmaster",pid=3391,fd=3))
// 5432/tcpをLISTENしていればOK
```

# OpenProjectセットアップ（インターネット接続環境）
OpenProjectのセットアップでは途中のPackage Configurationでgemやnpm packageのインストールが入ってくる。
HTTP Proxyが使えればまだ頑張れるが、これらをオフライン環境でやるのは苦しいのでインターネットに接続できるサーバでインストールしたあと、ディレクトリを丸ごと固めて持っていく。

## PostgreSQLの設定
OpenProject用のユーザとDBの作成。

```shell-session
# psql -U postgres

postgres=# CREATE DATABASE openproject;
postgres=# CREATE USER opuser WITH PASSWORD 'opuser_password';
postgres=# GRANT ALL PRIVILEGES ON DATABASE openproject TO opuser;
postgres=# \q
```

接続確認。

```shell-session:IPv4経由
# psql -h 127.0.0.1 -d openproject -U opuser
Password for user opuser: opuser_password

openproject=> \q
```

## OpenProjectのインストール
[RHEL7.x向けRepositoryファイル(Ver.8)](https://dl.packager.io/srv/opf/openproject-ce/stable/8/installer/el/7.repo)をダウンロードしてyum repositoryを設定する。

```shell-session
# curl -s -o /etc/yum.repos.d/openproject-ce.repo https://dl.packager.io/srv/opf/openproject-ce/stable/8/installer/el/7.repo
```

（オフライン環境向け準備）パッケージのダウンロード。

```shell-session
# mkdir -p /var/tmp/offline_openproject/00-initial-rpms
# yum -y install openproject --downloadonly --downloaddir=/var/tmp/offline_openproject/00-initial-rpms
```

パッケージのインストール。

```shell-session
# yum -y install openproject
```

```shell-session:OpenProject8.3.2パッケージ
# rpm -qa --last | head -n2
openproject-8.3.2-1556613669.e9ecaa3c.centos7.x86_64 Fri 03 May 2019 03:09:03 AM UTC
dialog-1.2-5.20130523.el7.x86_64              Fri 03 May 2019 03:08:55 AM UTC
```

（オフライン環境向け）次の手順で導入されるパッケージを事前にダウンロードしておく。

```shell-session
# mkdir -p /var/tmp/offline_openproject/01-depend-rpms
# vim /var/tmp/offline_openproject/01-depend-rpms.txt
# cat /var/tmp/offline_openproject/01-depend-rpms.txt | xargs yum install -y --downloadonly --downloaddir=/var/tmp/offline_openproject/01-depend-rpms
```

<details><summary>Package Configurationでインストールされるパッケージ一覧（Virtualbox Guest Additions分が入っていないので注意）</summary><div>

```01-depend-rpms.txt
apr
apr-util
centos-logos
gdbm-devel
git
gnutls
gpg-pubkey
httpd
httpd-tools
libdb-devel
libmodman
libproxy
mailcap
memcached
mod_dav_svn
mod_perl
mod_ssl
neon
nettle
pakchois
perl-BSD-Resource
perl-Business-ISBN
perl-Business-ISBN-Data
perl-Compress-Raw-Bzip2
perl-Compress-Raw-Zlib
perl-Data-Dumper
perl-devel
perl-Digest
perl-Digest-MD5
perl-Digest-SHA
perl-Encode-Locale
perl-Error
perl-ExtUtils-Install
perl-ExtUtils-MakeMaker
perl-ExtUtils-Manifest
perl-ExtUtils-ParseXS
perl-File-Listing
perl-Git
perl-HTML-Parser
perl-HTML-Tagset
perl-HTTP-Cookies
perl-HTTP-Daemon
perl-HTTP-Date
perl-HTTP-Message
perl-HTTP-Negotiate
perl-IO-Compress
perl-IO-HTML
perl-IO-Socket-IP
perl-IO-Socket-SSL
perl-JSON
perl-libwww-perl
perl-Linux-Pid
perl-LWP-MediaTypes
perl-Mozilla-CA
perl-Net-HTTP
perl-Net-LibIDN
perl-Net-SSLeay
perl-TermReadKey
perl-Test-Harness
perl-TimeDate
perl-URI
perl-WWW-RobotRules
pyparsing
subversion
subversion-libs
systemtap-sdt-devel
trousers
```
</div></details>

`DATABASE_URL`を設定する。

```shell-session
# openproject config:set DATABASE_URL="postgresql://opuser:opuser_password@127.0.0.1:5432/openproject"
# openproject config:get DATABASE_URL
postgresql://opuser:opuser_password@127.0.0.1:5432/openproject
```

Package Configurationを実行してウィザードを立ち上げ、セットアップ情報を入力していく。
ウィザードを最後まで回答すると各種パッケージのインストール〜起動まで走る。

```shell-session
# openproject configure
```

|項目|選択/設定値|
|:--|:--|
|postgres/autoinstall         |skip: Skip|
|server/autoinstall           |install: Install apache2 server|
|server/hostname              |op.example.jp|
|server/server_path_prefix    |(設定なし)|
|server/ssl                   |yes: Yes|
|server/ssl_cert              |/etc/pki/tls/certs/WILDCARD.example.jp.crt|
|server/ssl_key               |/etc/pki/tls/private/WILDCARD.example.jp.key|
|server/ssl_ca                |(設定なし)|
|repositories/svn-install     |install: Install Subversion repository support|
|repositories/svn-path        |/var/db/openproject/svn|
|repositories/git-install     |install: Install Git repository support|
|repositories/git-path        |/var/db/openproject/git|
|repositories/git-http-backend|/usr/lib/git-core/git-http-backend|
|smtp/autoinstall]            |skip: Skip|
|memcached/autoinstall        |install: Install new memcached server|

起動確認。

```
# systemctl list-units 'openproject*'
UNIT                         LOAD   ACTIVE SUB     DESCRIPTION
openproject-web-1.service    loaded active running openproject-web-1.service
openproject-web.service      loaded active running openproject-web.service
openproject-worker-1.service loaded active running openproject-worker-1.service
openproject-worker.service   loaded active running openproject-worker.service
openproject.service          loaded active running openproject.service
```

（オフライン環境向け）プロセスを一通り停止させてアーカイブを作成する。

```shell-session
# systemctl list-units 'openproject*' | awk '/ running /{print $1}' | xargs systemctl stop
# systemctl list-units 'openproject*'
0 loaded units listed. Pass --all to see loaded but inactive units, too.
// 起動中のシステムがいないこと

# tar zcf /var/tmp/offline_openproject/opt_openproject.tar.gz /opt/openproject
# tar tvf /var/tmp/offline_openproject/opt_openproject.tar.gz
drwxr-xr-x openproject/openproject 0 2019-05-03 03:09 opt/openproject/
drwxr-xr-x openproject/openproject 0 2019-05-03 03:08 opt/openproject/.bundle/
...
```

(オフライン環境向け）必要なパッケージ類が揃ったので/var/tmp/offline_openprojectをオフライン環境のサーバにアップロードする。

# OpenProjectセットアップ（オフライン環境）
/var/tmp/offline_openproject に必要なパッケージ類がアップロードされた前提。

## PostgreSQLの設定
インターネット接続環境と同じ。

## パッケージのインストール

localinstallで必要なパッケージを事前にインストール。

```shell-session
# yum -y localinstall /var/tmp/offline_openproject/00-initial-rpms/*.rpm
# yum -y localinstall /var/tmp/offline_openproject/01-depend-rpms/*.rpm
```

作成したアーカイブを展開。

```shell-session
# tar zxf /var/tmp/offline_openproject/opt_openproject.tar.gz -C /
```

## 初期設定

`DATABASE_URL`を設定する。

```shell-session
# openproject config:set DATABASE_URL="postgresql://opuser:opuser_password@127.0.0.1:5432/openproject"
# openproject config:get DATABASE_URL
postgresql://opuser:opuser_password@127.0.0.1:5432/openproject
```

reconfigureでPackage Configurationを再実行する。
新たにAPI等のKeyの確認が入ってくるがウィザードが提示する値をそのまま利用すればOK。

```shell-session
# openproject reconfigure
```

起動確認。

```
# systemctl list-units 'openproject*'
UNIT                         LOAD   ACTIVE SUB     DESCRIPTION
openproject-web-1.service    loaded active running openproject-web-1.service
openproject-web.service      loaded active running openproject-web.service
openproject-worker-1.service loaded active running openproject-worker-1.service
openproject-worker.service   loaded active running openproject-worker.service
openproject.service          loaded active running openproject.service
```

# OpenProjectの管理設定
## 管理者ログインとパスワード変更

https://op.example.jp/ にアクセスするとデフォルトの画面が表示されるので、右上の「Sign in」を押して管理者でログインする。

* Login: admin
* Password: admin

初期パスワードから変更するように求められるので変更（10文字以上）。

## Administration

右上のアイコンをクリックして「Administration」から管理画面に移動する。

### System settings > Display
以下の設定をして「Save」をクリックする。

|項目|設定値|
|:--|:-:|
|Available languages |English,日本語を有効化（他はチェックを外す）|
|Users display format|Admin OpenProject|

### System settings > Users
以下の設定をして「Save」をクリックする。

|項目|設定値|
|:--|:-:|
|Default language|日本語|
|Users default time zone|(GMT+09:00)Tokyo|

### System settings > Authentication
以下の設定をして「Save」をクリックする。

|項目|設定値|
|:--|:-:|
|Self-registration|automatic account activation|

## System settings > Email notifications
以下の設定をして「Save」をクリックする。

|項目|設定値|
|:--|:-:|
|Emission email address|admin@op.example.jp|
|Blind carbon copy recipients (bcc)|無効|
|Plain text mail (no HTML)|有効|
|Default notification option|No events|
|Select actions for which email notifications should be sent|Uncheck all|

### Users > OpenProject Admin > General
Usersを開いてadminのリンクをクリックして編集。
以下の設定をして「Save」をクリックする。

|項目|設定値|
|:--|:-:|
|Email|admin@op.example.jp|


# Mattermostセットアップ

[Installing Mattermost on RHEL 7](https://docs.mattermost.com/install/install-rhel-7.html)を参考に。

## PostgreSQLの設定

Mattermost用DBとユーザの作成。

```shell-session
# psql -U postgres

postgres=# CREATE DATABASE mattermost;
postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser_password';
postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;
postgres=# \q
```

接続確認。

```shell-session:IPv4経由
# psql -h 127.0.0.1 -d mattermost -U mmuser
Password for user mmuser: mmuser_password

mattermost=> \q
```

## Mattermostのインストール
[Download](https://mattermost.com/download/)からLinux Installをダウンロードして展開。

```shell-session
# cd /var/tmp && curl -s -O https://releases.mattermost.com/5.10.0/mattermost-5.10.0-linux-amd64.tar.gz
# tar zxf mattermost-5.10.0-linux-amd64.tar.gz -C /opt
# mkdir /opt/mattermost/data
```

mattermostユーザの作成とOwner/Groupの変更。

```shell-session
# useradd --system --user-group mattermost
# chown -R mattermost:mattermost /opt/mattermost
# chmod -R g+w /opt/mattermost
# ls -ld /opt/mattermost/data
drwxrwxr-x 2 mattermost mattermost 6 May  2 11:57 /opt/mattermost/data
```

サーバ設定の変更。

- DB接続の設定をPostgreSQL向けに変更
  - prefixに`postgres://`が必要なので注意
- ConsoleのLogLevelをERRORに変更
  - /var/log/messagesが埋まる
  - INFOが必要であればFileLocationで指定するのが良さそう

```diff:/opt/mattermost/config/config.json
     "SqlSettings": {
-        "DriverName": "mysql",
-        "DataSource": "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",
+        "DriverName": "postgres",
+        "DataSource": "postgres://mmuser:mmuser_password@127.0.0.1:5432/mattermost?sslmode=disable\u0026connect_timeout=10",

     "LogSettings": {
         "EnableConsole": true,
-        "ConsoleLevel": "INFO",
+        "ConsoleLevel": "ERROR",
         "ConsoleJson": true,
```

Unitファイルの作成。

```ini:/etc/systemd/system/mattermost.service
[Unit]
Description=Mattermost
After=syslog.target network.target postgresql-9.6.service

[Service]
Type=simple
WorkingDirectory=/opt/mattermost
User=mattermost
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=300
LimitNOFILE=49152

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

Systemdへの反映、自動起動設定と起動。

```shell-session
# chmod 0644 /etc/systemd/system/mattermost.service
# systemctl daemon-reload

# systemctl enable mattermost.service
# systemctl start  mattermost.service
# systemctl status mattermost.service

# ss -nltp | grep mattermost
LISTEN     0      128         :::8065                    :::*                   users:(("mattermost",pid=4624,fd=14))
```

## Mattermostの設定

http://mm.example.jp:8065/ にブラウザでアクセスするとユーザ作成画面に飛ぶ。
初回のユーザはSystem Adminとして登録される。

|項目|入力値|
|:--|:-:|
|What's your email address?|admin@mm.example.jp|
|Choose your username|admin|
|Choose your password|admin|

「Go to System Console」のリンクをクリックしてSystem Consoleを開く。

### Notifications > Email
以下の設定をして「Save」をクリックする。

|項目|入力値|
|:--|:-:|
|Enable Email Notifications|true|
|Notification Display Name |No-Reply|
|Notification From Address |admin@mm.example.jp|
|SMTP Server|127.0.0.1|
|SMTP Server Port|25|
|Enable SMTP Authentication|false|
|Connection Security|None|
|Enable Security Alerts|false|

### General > Configuration
以下の設定をして「Save」をクリックする。

|項目|入力値|
|:--|:-:|
|Site URL|https://mm.example.jp|

### Security > Sign Up
以下の設定をして「Save」をクリックする。

|項目|入力値|
|:--|:-:|
|Enable Open Server|true|

この設定を行った後ログアウトして再度アクセスすると「Create one now」のリンクが出るようになるので誰でもユーザ作成ができるようになる。


## Apacheの設定
OpenProjectで利用しているApacheにMattermost用のReverseProxyを設定する。
Mattermost用の設定ファイルを配置する。

```apache:/etc/httpd/conf.d/mattermost.conf
<VirtualHost *:80>
  ServerName mm.example.jp
  # Redirect to HTTPS
  RewriteEngine On
  RewriteRule ^/?(.*) https://%{SERVER_NAME}:443/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
  ServerName mm.example.jp
  ErrorLog /var/log/httpd/mm_error_log
  CustomLog /var/log/httpd/mm_ssl_log combined

  # SSL Settings
  Header always set Strict-Transport-Security "max-age=31536000"
  SSLEngine On
  SSLCertificateFile    /etc/pki/tls/certs/WILDCARD.example.jp.crt
  SSLCertificateKeyFile /etc/pki/tls/private/WILDCARD.example.jp.key
  SSLProtocol           all -SSLv2 -SSLv3 -TLSv1
  SSLCipherSuite        DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA
  SSLHonorCipherOrder   on
  SSLCompression        off

  # Reverse Proxy Settings
  Header add Upgrade "Websocket"
  Header add Connection "Upgrade"
  ProxyRequests Off
  ProxyPreserveHost On
  <Location />
    Require all granted
    ProxyPass "ws://127.0.0.1:8065/"
    ProxyPassReverse "ws://127.0.0.1:8065/"
  </Location>
</VirtualHost>
```

不要なconfigは削除。

```shell-session
# rm -f /etc/httpd/conf.d/{autoindex.conf,perl.conf,userdir.conf,welcom.conf}
# ls -l /etc/httpd/conf.d
total 16
-rw-r--r-- 1 root root 1243 May  3 09:16 mattermost.conf
-rw-r----- 1 root root  582 May  3 08:18 openproject.conf
-rw-r--r-- 1 root root  366 Apr 24 13:46 README
-rw-r--r-- 1 root root  969 May  3 09:08 ssl.conf
```

Syntaxチェックして反映。

```shell-session
# httpd -t
Syntax OK

# systemctl reload httpd.service
```

https://mm.example.jp/ にアクセスしてMattermostの画面が出ればOK。

# 終わりに
Mattermostを相乗りさせようとしてOpenProject側のApacheの設定を覗いてたらちょっと微妙なので見直ししたい感。
折角便利なソフトウェアがあっても今のご時世でオフライン環境にてセットアップしなければならない場合があるのはツライ。