大人の事情でSlackが使えないのでRocket.ChatをBasic認証ありでdocker-composeで起動した

# Background
チャットツール、便利ですよね。
でも大人の事情でSaaSを利用できないこともあるかと思います。プライベートではSlackなどを使っているのですが、大人の事情でビジネスでは使えず...
Rocket.Chatはそんな悩みを解決してくれるOSSのチャットツールの一つです。
この記事ではRocket.Chatをdocker-composeで起動してみます。これをオンプレや大人の事情をクリアしたクラウド上で起動すれば便利なチャットツールをGetできます！

この記事ではlocalhostの前提で書いてますが、オンプレやクラウドでもアクセスURLがドメインとかになるだけで基本一緒です。

# Rocket.Chatを起動する
Rocket.Chatについては「[Rocket.Chat/docker-compose.yml at develop · RocketChat/Rocket.Chat · GitHub](https://github.com/RocketChat/Rocket.Chat/blob/develop/docker-compose.yml)」を参考にします。下の`docker-compose.yml`だと`services.app`、`services.mongo`、`services.mongo-init-replica`がそれにあたります。

```yaml:docker-compose.yml
version: '2'

services:
  app:
    container_name: rocketchat_app
    image: rocketchat/rocket.chat:latest
    command: bash -c 'for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)'
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000 #TODO：実際のURLに更新
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
    depends_on:
      - mongo
    ports:
      - 3000:3000

  mongo:
    container_name: rocketchat_db
    image: mongo:4.0
    restart: unless-stopped
    volumes:
      - ./data/db:/data/db
      - ./data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
  
  mongo-init-replica:
    image: mongo:4.0
    command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval \"rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})\" && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)"'
    depends_on:
      - mongo
```

```
$ docker-compose up
```

`http://localhost:3000`にアクセスすればRocket.Chatにアクセスできるはずです。

# Basic認証をかける
Rocket.ChatにBasic認証をかけるために「[GitHub - dtan4/nginx-basic-auth-proxy: Docker image of Nginx Proxy with Basic Auth](https://github.com/dtan4/nginx-basic-auth-proxy)」を利用させていただきます。Basic認証を設定できるPROXYを立ち上げることができます。下の`docker-compose.yml`の`services.nginx`がそれにあたり、`BASIC_AUTH_USERNAME`、`BASIC_AUTH_PASSWORD`がBasic認証の設定です。また、`app`には`nginx`を介してアクセスするようにしたいので`app`の`ports`設定を削除してます。

```yaml:docker-compose.yml
version: '2'

services:
  nginx:
    container_name: rocketchat_nginx
    image: quay.io/dtan4/nginx-basic-auth-proxy:latest
    ports:
      - 80:80
    environment:
      - BASIC_AUTH_USERNAME=xxxxxxxx #TODO: Basic認証のusername
      - BASIC_AUTH_PASSWORD=xxxxxxxx #TODO: Basic認証のpassword
      - PROXY_PASS=http://app:3000
    depends_on:
      - app

  app:
    container_name: rocketchat_app
    image: rocketchat/rocket.chat:latest
    command: bash -c 'for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)'
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=http://localhost:3000 #TODO：実際のURLに更新
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
    depends_on:
      - mongo

  mongo:
    container_name: rocketchat_db
    image: mongo:4.0
    restart: unless-stopped
    volumes:
      - ./data/db:/data/db
      - ./data/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
  
  mongo-init-replica:
    image: mongo:4.0
    command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval \"rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})\" && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)"'
    depends_on:
      - mongo
```

```
$ docker-compose up -d
```

これで`http://localhost`にアクセスするとBasic認証を聞かれます。Basic認証をクリアするとRocket.Chatにアクセスできるはずです。
ちなみに`http://localhost:3000`には直接アクセスできなくなっています。

# Reference
- [Rocket.Chat Documentation - Docker Compose](https://rocket.chat/docs/installation/docker-containers/docker-compose/)
- [Rocket.Chat/docker-compose.yml at develop · RocketChat/Rocket.Chat · GitHub](https://github.com/RocketChat/Rocket.Chat/blob/develop/docker-compose.yml)
- [Basic 認証かけるだけのプロキシサーバ Docker image 作った - 端子録](http://dtan4.hatenablog.com/entry/2017/02/10/005335)
- [GitHub - dtan4/nginx-basic-auth-proxy: Docker image of Nginx Proxy with Basic Auth](https://github.com/dtan4/nginx-basic-auth-proxy)