CentOS 7 に Discourse をインストールする

## Discourse とは
<img width="300" src="https://www.discourse.org/images/logo.png">
[Discourse](https://www.discourse.org/) はいわゆる掲示板や電子会議室に相当するコミュニティのためのモダンなフォーラムソフトウェア。

主に以下のライブラリで構築されている。

* [Ruby on Rails](https://rubyonrails.org/)
* [Ember.js](https://emberjs.com/)
* [PostgreSQL](https://www.postgresql.org/)
* [Redis](https://redis.io/)

## xfs_info
```bash
xfs_info /var | grep ftype
```
```
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
```
`ftype=0` だと Docker の Storage Driver に OverlayFS が利用できない。

例えば [お名前.com VPS](https://www.onamae.com/server/vps/) のデフォルトインストールでは利用できないので「[お名前.com VPS (KVM) に最新の CentOS をインストールする - Qiita](https://qiita.com/bezeklik/items/399b60589fdfab612b64)」を参考に OS を再インストールする。
CentOS のデフォルトインストールであれば Storage Driver の設定に悩まず進められる。

https://meta.discourse.org/t/cant-run-launcher-rebuild-app-docker-storage-driver-is-unsupported/56927

## DNS の設定
```
discourse    IN    A     192.0.2.1
mail         IN    A     192.0.2.1
             IN    MX    10    mail.example.jp.

mail         IN    A     192.0.2.1
@            IN    MX    10    mail.example.com.

example.jp.  IN    MX    10    mail.example.jp.
```
Discourse は IP アドレスでは動作しないので専用のドメインかサブドメインを用意する必要がある。ここでは `discourse.example.jp` として進める。
また、メールサーバーが必須なため、ここでは `mail.example.jp` とする。

https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247

## 必要パッケージのインストール
### Docker のインストール
```bash
yum --assumeyes install git net-tools yum-utils && \
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
yum --assumeyes install docker-ce && \
systemctl start docker && \
systemctl enable docker
```
#### git
Discrouse のダウンロードに使用する。

#### net-tools
`./discourse-setup` で `netstat` コマンドを使用するため `net-tools` パッケージをインストールする。

#### yum-utils
Docker 公式リポジトリの導入で `yum-config-manager` コマンドを使用するため `yum-utils` パッケージをインストールする。

#### docker-ce
パッケージ名に含まれる `ce` は **C**ommunity **E**dition の略。

## Docker の Storage Driver の確認
### Storage Driver の確認
```bash
docker info | grep Storage
```
```
Storage Driver: devicemapper
```
Docker の Storage Driver が `devicemapper` になっていると `./discourse-setup` 実行時に `Your Docker installation is not using a supported storage driver. If we were to proceed you may have a broken install aufs is the recommended storage driver, although zfs/btrfs/overlay and overlay2 may work as well. Other storage drivers are known to be problematic.` というエラーが出力されてはじかれてしまう。

#### Storage Driver の変更
```bash
echo '{"storage-driver":"overlay2"}' >> /etc/docker/daemon.json
systemctl restart docker
```
CentOS では `aufs` を使用できないため `overlay2` を使用する。
`dockerd -s overlay2`

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-storage-driver

https://docs.docker.com/v17.09/engine/userguide/storagedriver/overlayfs-driver/
https://docs.docker.com/storage/storagedriver/overlayfs-driver/

#### Storage Driver の再確認
```bash
docker info | grep Storage
```
```
Storage Driver: overlay2
```
Storage Driver が `overlay2` に変わっていればよい。

## Discourse のインストール
```bash
mkdir --verbose /var/discourse && \
git clone https://github.com/discourse/discourse_docker.git /var/discourse && \
cd /var/discourse && \
./discourse-setup
```
```
Hostname for your Discourse? [discourse.example.com]: discourse.example.jp
Email address for admin account(s)? [me@example.com,you@example.com]: admin@example.jp
SMTP server address? [smtp.example.com]: mail.example.jp
SMTP port? [587]:
SMTP user name? [user@example.com]: admin@example.jp
SMTP password? [pa$$word]: P@ssw0rd
Optional email address for setting up Let's Encrypt? (ENTER to skip) [me@example.com]:
```

## 後から SSL 対応にする場合
```bash
vi /var/discourse/containers/app.yml
```
```
templates:
  - "templates/web.template.yml"
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
```
```
env:
  LETSENCRYPT_ACCOUNT_EMAIL: 'admin@example.jp'
```
```bash
cd /var/discourse
./launcher rebuild app
```
[Setting up HTTPS support with Let's Encrypt - howto / sysadmin - Discourse Meta](https://meta.discourse.org/t/setting-up-https-support-with-lets-encrypt/40709)