docker
docker-compose
scoold

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はこちら
Githubと同じ記事内容なのでImageが公開されているだけだけど

必要なファイル

  • 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ページの途中にあるクイックスタートそのまま
シークレットキーは好きに設定していいけど空欄は怒られる
公式のやつそのままでもいいけどできれば自分で生成すること推奨
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

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

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