Scoold with Para on Docker by Docker Compose

#Scooldとは
https://scoold.com/
本家いわく
Scoold is an open source Q&A platform written in Java.
とのこと
Java8とVelocityで構成されてるっぽいことがgithubから伺える
https://github.com/Erudika/scoold
DemoページがHeroku上に構築されているので覗いてみるといいかも
https://live.scoold.com/

本記事は公式でDocker-compose用のファイルが公開されたのでそれを使ってみようという記事です。
Docker-composeやそもそもDockerなんかも初心者なので付け焼き刃ですがハマった点が色々あるので参考になれば。
Docker-hubは[こちら](https://hub.docker.com/u/erudikaltd/)
Githubと同じ記事内容なのでImageが公開されているだけだけど

#必要なファイル
- [docker-compose.yml](https://github.com/Erudika/scoold/blob/master/docker-compose.yml)
- para.env
- para-application.conf
- scoold.env
- scoold-application.conf  
docker-compose.ymlは公式のものでいい、と言いたいとこだけど環境次第では修正が必要  

```
   para:
     image: erudikaltd/para
     ports:
       - "8080:8080"
     volumes:
       - type: volume
         source: paraData
         target: /para/data
       - type: bind
         source: ./para-application.conf
         target: /para/application.conf
     restart: always
     env_file: para.env
```

ports: "8080:8080"
がpara側で宣言されているけど、内部のみの公開ポートにする必要があったり、公開ポートが被ってたりすると修正が必要
あと
volumes: paraData:/para/data
がアカウント管理やら投稿や回答のDBがあったり、全データが入ってる
できれば移植性やら考えてローカルに置きたいところ。権限設定には注意

imageファイルのところにはタグが書かれてないので追記が必須
現状だと
image :erudikaltd/para:v1.29.2
image :erudikaltd/scoold:1.29.3
になる
ちなみにpara:v1.29.2はH2DBを利用するものでありv1.29.2-baseでは別途自分でDBを用意して設定する必要がある

## para.env

```
# Para Container's environment variables
BOOT_SLEEP=0
JAVA_OPTS=-Dconfig.file=/para/application.conf
TZ=Asia/Tokyo
# Set environment by proxy server
# FTP_PROXY=http://proxy.com:8080
# HTTP_PROXY=http://proxy.com:8080
# HTTPS_PROXY=http://proxy.com:8080
```
para側の環境設定
BOOT_SLEEPはぶっちゃけ必要ない気もするけど資料読んでるときに必要そうだったので追加
JAVA_OPTSはapplication.confを適用するために必須
bindしてコンテナから見えるようにするだけではだめっぽい
TZは場所に合わせる。さもなくば[WARN]timetoken mismatchみたいな警告が出る
あとはプロキシ設定すること

他にも調べたら必要な環境変数一杯あるんだろうけどとりあえずはこれだけでも動く

## para-application.conf
```
# the name of the root app (This time "Scoold")
para.app_name = "Scoold"
# or set it to 'production'
para.env = "embedded"
# if true, users can be created without verifying their emails
para.security.allow_unverified_emails = true
# if hosting multiple apps on Para, set this to false
para.clients_can_access_root_app = true
# if false caching is disabled
para.cache_enabled = true
# root app secret, used for token generation, should be a random string
# No need to change 
para.app_secret_key = "********************************"
# enable API request signature verification
para.security.api_security = true
# the node number from 1 to 1024, used for distributed ID generation
para.worker_id = 1
# When setting other than the port of Dockerfile
para.port = 8080
```
paraの設定群
[para公式のgithubページ](https://github.com/Erudika/para)の途中にあるクイックスタートそのまま
シークレットキーは好きに設定していいけど空欄は怒られる
公式のやつそのままでもいいけどできれば自分で生成すること推奨
para.portだけ追加しているけど、ポート設定が8080じゃないときだけでいい

## scoold.env
```
# Scoold Container's environment variables
# wait 10sec for stating Para
BOOT_SLEEP=10
JAVA_OPTS=-Dconfig.file=/scoold/application.conf
TZ=Asia/Tokyo
# Set environment by proxy server
# FTP_PROXY=http://proxy.com:8080
# HTTP_PROXY=http://proxy.com:8080
# HTTPS_PROXY=http://proxy.com:8080
```
scooldの環境設定
基本的にはpara.envと一緒
BOOT_SLEEP=10秒はparaの起動を待ってから起動したいため
もっとええ方法があるやろというのはご尤も。何か検討したいところ

## scoold-application.conf
```
para.app_name = "Scoold"
# the port for Scoold
para.port = 8000
# change this to "production" later
para.env = "development"
# the URL where Scoold is hosted, or http://localhost:8000
para.host_url = "http://10.11.12.13:8000"
# the URL of Para - could also be "http://localhost:8080"
para.endpoint = "http://para:8080"
# you can get the accesskey and secretkey when access to "http://para:8080/v1/_setup" after wake up para server.
# access key for your Para app
para.access_key = "app:scoold"
# secret key for your Para app
para.secret_key = "*****************"
# enable or disable email&password authentication
para.password_auth_enabled = true
# if false, commenting is allowed after 100+ reputation
para.new_users_can_comment = true
# the identifier of admin user - check Para user object
para.admins = "admin@domain.com"
# enables syntax highlighting in posts
para.code_highlighting_enabled = true
# If true, the default space will be accessible by everyone
para.is_default_space_public = true
# mail settings (necessary to use mail for account authentication)
para.support_email = "support@scoold.com"
para.mail.host = "smtp.example.com"
para.mail.port = 587
para.mail.username = "user@example.com"
para.mail.password = "password"
para.mail.tls = true
para.mail.ssl = false
```

これもscooldのgithubページにあるクイックスタートそのまま＋α
para.host_urlは任意に設定。localでテストしたいならコメントの通りlocalhostにしておくこと
para.endpointのほうはそのままでいける。
他には
para.adminとか
para.mailほにゃららとか
適度に設定
公式のドキュメントを参照したらいいけど、とりあえずメール登録による認証で良ければ上の設定項目だけでいい
http://paraio.org/docs/
シークレットキーは後で取得するので現時点では空欄でもなんでもいい

# scoold起動
特定のディレクトリ下に上の必要なファイルを置いて普通に
```
$docker-compose up
```
で実行

結果はこんな感じ

```
para_1    |
para_1    |       ____  ___ _ ____ ___ _
para_1    |      / __ \/ __` / ___/ __` /
para_1    |     / /_/ / /_/ / /  / /_/ /
para_1    |    / .___/\__,_/_/   \__,_/  v1.29.2
para_1    |   /_/
para_1    |
para_1    | 2018-06-10 23:27:05 [INFO ] --- Para.initialize() [embedded] ---
para_1    | 2018-06-10 23:27:06 [INFO ] Loaded new DAO, Search and Cache implementations - H2DAO, LuceneSearch and CaffeineCache.
para_1    | 2018-06-10 23:27:07 [INFO ] Created H2 table 'scoold'.
para_1    | 2018-06-10 23:27:07 [WARN ] Server is unhealthy - root app not found. Open /v1/_setup in the browser to initialize Para.
para_1    | 2018-06-10 23:27:07 [INFO ] Instance #1 initialized.
para_1    | 2018-06-10 23:27:08 [INFO ] Starting ParaServer on 988528bb70df with PID 7 (/para/para-war-1.29.2.war started by para in /para)
para_1    | 2018-06-10 23:27:08 [INFO ] The following profiles are active: embedded
para_1    | 2018-06-10 23:27:10 [INFO ] Listening on port 8080...
scoold_1  |                           __    __
scoold_1  |    ______________  ____  / /___/ /
scoold_1  |   / ___/ ___/ __ \/ __ \/ / __  /
scoold_1  |  (__  ) /__/ /_/ / /_/ / / /_/ /
scoold_1  | /____/\___/\____/\____/_/\__,_/     (v1.29.3)
scoold_1  |
scoold_1  | 2018-06-10 23:27:18 [INFO ] Starting ScooldServer v1.29.3 on c69a9c6c2062 with PID 7 (/scoold/scoold-1.29.3.jar started by scoold in /scoold)
scoold_1  | 2018-06-10 23:27:18 [INFO ] The following profiles are active: development
scoold_1  | 2018-06-10 23:27:22 [INFO ] Listening on port 8000...
scoold_1  | 2018-06-10 23:27:24 [INFO ] Initializing Spring embedded WebApplicationContext
scoold_1  | 2018-06-10 23:27:25 [DEBUG] GET /v1/utils/timestamp, params: null
scoold_1  | 2018-06-10 23:27:27 [ERROR] No connection to Para backend - make sure that your keys are valid.
scoold_1  | 2018-06-10 23:27:27 [INFO ] Default language map not set, loading English.
scoold_1  | 2018-06-10 23:27:30 [INFO ] Initializing Spring FrameworkServlet 'dispatcherServlet'
```

注目すべきはここ
[WARN ] Server is unhealthy - root app not found. Open /v1/_setup in the browser to initialize Para.
paraの環境にscooldが登録されてないという警告
なのでparaのRestAPIを叩いて登録
登録内容はparaのところでの設定したものになる(たぶん)
RestAPIは先程のpara docの末尾にある
http://paraio.org/docs/
今回は使うのは

```
http://localhost:8080/v1/_setup
```
もちろんlocalhostは設定次第で変更すること
んで結果がこちら

```
{
  "accessKey" : "app:scoold",
  "message" : "Save the secret key - it is shown only once!",
  "secretKey" : "********************************************************"
}
```
これでscooldのシークレットキーが得られる。
scoold-application.confのとこへ反映する

んでdocker-composeを再起動

```
para_1    |
para_1    |       ____  ___ _ ____ ___ _
para_1    |      / __ \/ __` / ___/ __` /
para_1    |     / /_/ / /_/ / /  / /_/ /
para_1    |    / .___/\__,_/_/   \__,_/  v1.29.2
para_1    |   /_/
para_1    |
para_1    | 2018-06-10 23:53:51 [INFO ] --- Para.initialize() [embedded] ---
para_1    | 2018-06-10 23:53:52 [INFO ] Loaded new DAO, Search and Cache implementations - H2DAO, LuceneSearch and CaffeineCache.
para_1    | 2018-06-10 23:53:55 [INFO ] Server is healthy.
para_1    | 2018-06-10 23:53:55 [INFO ] Found root app 'scoold' and 0 existing child app(s).
para_1    | 2018-06-10 23:53:55 [INFO ] Instance #1 initialized.
para_1    | 2018-06-10 23:53:55 [INFO ] Starting ParaServer on 587b51594e45 with PID 7 (/para/para-war-1.29.2.war started by para in /para)
para_1    | 2018-06-10 23:53:55 [INFO ] The following profiles are active: embedded
para_1    | 2018-06-10 23:53:57 [INFO ] Listening on port 8080...
scoold_1  |                           __    __
scoold_1  |    ______________  ____  / /___/ /
scoold_1  |   / ___/ ___/ __ \/ __ \/ / __  /
scoold_1  |  (__  ) /__/ /_/ / /_/ / / /_/ /
scoold_1  | /____/\___/\____/\____/_/\__,_/     (v1.29.3)
scoold_1  |
scoold_1  | 2018-06-10 23:54:04 [INFO ] Starting ScooldServer v1.29.3 on 5a8d97ea9eb1 with PID 7 (/scoold/scoold-1.29.3.jar started by scoold in /scoold)
scoold_1  | 2018-06-10 23:54:04 [INFO ] The following profiles are active: development
scoold_1  | 2018-06-10 23:54:07 [INFO ] Listening on port 8000...
scoold_1  | 2018-06-10 23:54:08 [INFO ] Initializing Spring embedded WebApplicationContext
scoold_1  | 2018-06-10 23:54:09 [DEBUG] GET /v1/utils/timestamp, params: null
scoold_1  | 2018-06-10 23:54:11 [INFO ] Initialized ParaClient with endpoint http://para:8080 and access key 'app:scoold'.
scoold_1  | 2018-06-10 23:54:11 [DEBUG] PUT /v1/_settings, entity: Entity{entity={gh_app_id=, gh_secret=, security.ldap.bind_dn=, security.ldap.user_dn_pattern=, security.ldap.server_url=, security.ldap.base_dn=, ms_app_id=, security.ldap.bind_pass=, signin_success=http://localhost:8000/signin/success?jwt=?, security.ldap.user_search_filter=, in_app_id=, in_secret=, tw_secret=, security.ldap.user_search_base=, tw_app_id=, security.ldap.active_directory_domain=, ms_secret=, security.ldap.password_attribute=, signin_failure=http://localhost:8000/signin?code=3&error=true}, variant=Variant[mediaType=application/json, language=null, encoding=null], annotations=[]}
scoold_1  | 2018-06-10 23:54:13 [INFO ] Default language map not set, loading English.
scoold_1  | 2018-06-10 23:54:15 [INFO ] Initializing Spring FrameworkServlet 'dispatcherServlet'
scoold_1  | 2018-06-10 23:54:15 [INFO ] Started ScooldServer in 12.085 seconds (JVM running for 15.813)
scoold_1  | 2018-06-10 23:54:31 [DEBUG] GET /v1/question/search/default, params: {q=[*], limit=[30], page=[1], sort=[timestamp], type=[question], desc=[true]}
```

問題なく起動
実際にアクセスしてみるとこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262854/afe1b897-9f2b-6de9-0d1c-9b6c25179811.png)

あとはいい感じに利用するだけ

他にも気づきがあれば適宜更新