Scoold と Apache

Posted on
Scoold Q&A Apache

Scoold のインストールに手こずったのでその備忘録。必須モジュールとして、Apache、OpenJDK、Node.js が必要。事前に導入しておく。

まず前提として、Para をインストール。バックエンドのデータベースはいろいろ選べるが、今回は MongoDB をチョイス。MongoDB 用の DAO モジュール も併せてダウンロードしておく。ただし、面倒くさかったら、ホスティングサービス もあるので、それを利用してもよし。

Para 起動用のユーザーを作成して、su する。ホームディレクトリは、仮に /srv/para とする。

Para の jar モジュールをホームディレクトリに配置。plugins ディレクトリを作成し、DAO モジュールをそこに配置する。

設定ファイル application.conf を作成。以下のような感じ。

# the name of the root app
para.app_name = "Para"
# or set it to 'production'
para.env = "production"
# Plugins
para.plugin_folder = "plugins/"
# database
para.dao = "MongoDBDAO"
para.mongodb.host = "127.0.0.1"
para.mongodb.database = "para"
para.mongodb.user = "para"
para.mongodb.password = "para_mongo_password"
# Google
para.gp_app_id = "xxxx"
para.gp_secret = "xxxx"
# Facebook
para.fb_app_id = "xxxx"
para.fb_secret = "xxxx"
# Twitter
#para.tw_app_id = ""
#para.tw_secret = ""
# Github
para.gh_app_id = ""
para.gh_secret = ""
# Administrator
para.admin_ident = "admin@example.com"
# Support email
para.support_email = "admin@paraenv.com"
# if true, users can be created without verifying their emails
para.security.allow_unverified_emails = false
# if hosting multiple apps on Para, set this to false
para.clients_can_access_root_app = false
# if false caching is disabled
para.cache_enabled = true
# root app secret, used for token generation, should be a random string
para.app_secret_key = "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
# system email address
para.mail.host = "localhost"
para.mail.port = 25
para.mail.tls = false
para.mail.ssl = false
# enable SMTP debug logging
para.mail.debug = true

起動用の systemd サービスファイルを作成する。こんな感じ。

[Unit]
Description=Para
After=network.target

[Service]
Type=simple
WorkingDirectory=/srv/para
User=para
ExecStart=/usr/bin/java -Dconfig.file=/srv/para/application.conf -jar para.jar
PrivateTmp=true
Restart=on-abort

[Install]
WantedBy=multi-user.target

application.conf で指定したデータベースを作成する。その後、起動。

外部からアクセスできるように、Apache でリバースプロキシを行う。ここがはまりどころ。 ドメイン名は、paraenv.com をとった。

<VirtualHost *:80>
	ServerName paraenv.com
	ServerAlias www.paraenv.com
	RewriteEngine On
	RewriteCond %{SERVER_NAME} =paraenv.com [OR]
	RewriteCond %{SERVER_NAME} =www.paraenv.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

	ServerName paraenv.com
	ServerAlias www.paraenv.com
	ServerAdmin webmaster@paraenv.com

	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile /etc/letsencrypt/live/paraenv.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/paraenv.com/privkey.pem

	RewriteEngine On
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ https://%1/$1 [R=301,L,NE]

	RequestHeader set X-Forwarded-Proto "https"
	ProxyPreserveHost On
	ProxyRequests Off
	ProxyPass / http://localhost:8080/ nocanon
	ProxyPassReverse / http://localhost:8080/ nocanon

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

ProxyPass に指定した nocanon がポイント。これがないと、URL エンコードされた文字列を mod_proxy がデコードしてしまい、正常にユーザー登録ができなくなってしまう。

ここで、初期設定を行う。curl -X GET https://paraenv.com/v1/_setup を実行し、表示されるアプリケーション鍵と秘密鍵を控えておく。

次に、para のクライントをインストールする。root になって、npm install -g para-cli を実行。

インストールできたら、para-cli の初期設定を実行する。

para-cli setup

アプリケーションID (多分、app:para)、秘密鍵 (事前に実行した curl で表示された値)、エンドポイント (この場合、https://paraenv.com) を入力する。

次に、Scoold 用の鍵と秘密鍵を作成する。

para-cli new-app "scoold" --name "Scoold"

鍵が表示されるので、これを控えておく。後で、Scoold の設定ファイルに書き込む必要があるので。

Para の設定は以上。続けて、Scoold をインストールする。専用のユーザーを作成し、su する。ホームディレクトリは仮に /srv/scoold とする。

Scoold の jar ファイルをホームディレクトリに配置し、設定ファイル (application.conf) を作成する。割り当てるドメインに、usercounsel.com を取得しておいた。

para.app_name = "Scoold"
# the port for Scoold
para.port = 18080
# Session cookie name
para.auth_cookie = "scoold-auth"
# change this to "production" later
para.env = "production"
# the URL where Scoold is hosted, or http://localhost:8000
para.host_url = "https://usercounsel.com"
# the URL of Para - could also be "http://localhost:8080"
para.endpoint = "https://paraenv.com"
# access key for your Para app
para.access_key = "app:scoold"
# secret key for your Para app
para.secret_key = "scoold_secret_key"
# enable or disable email and password authentication
para.password_auth_enabled = true
# if false, commenting is allowed after 100+ reputation
para.new_users_can_comment = true
# if true, posts by new users require approval from moderator
para.posts_need_approval = false
# reputation needed for posts to be auto-approved
para.posts_rep_threshold = 100
# needed for geolocation filtering of posts
para.gmaps_api_key = "xxxx"
# Enable/disable near me feature (geolocation)
para.nearme_feature_enabled = false
# the identifier of admin user - check Para user object
para.admins = "admin@example.com"
# GA code
para.google_analytics_id = ""
# enables syntax highlighting in posts
para.code_highlighting_enabled = true
# Facebook - create your own Facebook app first!
para.fb_app_id = "xxxx"
# Google - create your own Google app first!
para.google_client_id = "xxxx"
# If true, the default space will be accessible by everyone
para.is_default_space_public = true
# If true, users can change their profile pictures
para.avatar_edits_enabled = true
# If true, users can change their names
para.name_edits_enabled = true
# Enable/disable webhooks support
para.webhooks_enabled = true
# Enable/disable wiki style answers
para.wiki_answers_enabled = true
# Comment limits
para.max_comments_per_id = 1000
para.max_comment_length = 255
# Post body limit (characters)
para.max_post_length = 20000
# Sets the default tag for new questions
para.default_question_tag = "question"
# system email address
para.support_email = "no-reply@usercounsel.com"
para.mail.host = "127.0.0.1"
para.mail.port = 25
para.mail.tls = false
para.mail.ssl = false
# enable SMTP debug logging
para.mail.debug = true
#

para.secret_key に指定する値は、para-cli new-app 実行時に取得した秘密鍵。

para.admins に管理者とするユーザーのユーザーID (メールアドレス) を指定する。Google や Facebook の Oauth でログインするユーザーを指定する場合は、fb:123456 などのように、サービスタグとユーザートークンを指定すればよい。

ユーザー登録の際、メール確認が必須なので、para.mail.* に、メールサーバーを間違えずに指定しておく。メールでの確認が不要なら、para.security.allow_unverified_emails = true を追記しておく。なお、SMTP 認証が必要なら、

para.mail.host = "smtp.example.com"
para.mail.port = 587
para.mail.username = "user@example.com"
para.mail.password = "password"
para.mail.tls = true

といった内容も追記する。

次に、systemd 起動ファイルを作成する。

[Unit]
Description=Scoold
After=network.target

[Service]
Type=simple
WorkingDirectory=/srv/scoold
User=scoold
ExecStart=/usr/bin/java -Dconfig.file=/srv/scoold/application.conf -jar scoold.jar
PrivateTmp=true
Restart=on-abort

[Install]
WantedBy=multi-user.target

Apache も設定する。むろん、URL デコードの罠を回避するキーワード nocanon を指定するのを忘れない。

VirtualHost *:80>
	ServerName usercounsel.com
	ServerAlias www.usercounsel.com
	RewriteEngine On
	RewriteCond %{SERVER_NAME} =www.usercounsel.com [OR]
	RewriteCond %{SERVER_NAME} =usercounsel.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

	ServerName usercounsel.com
	ServerAlias www.usercounsel.com
	ServerAdmin webmaster@usercounsel.com

	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile /etc/letsencrypt/live/usercounsel.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/usercounsel.com/privkey.pem

	RewriteEngine On
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ https://%1/$1 [R=301,L,NE]

	Alias /privacy.html	/srv/scoold/docs/privacy.html
	Alias /terms.html	/srv/scoold/docs/terms.html
	<Directory "/srv/scoold/docs">
		Require all granted
	</Directory>

	RequestHeader set X-Forwarded-Proto "https"
	ProxyPreserveHost On
	ProxyRequests Off
	ProxyPass /privacy.html !
	ProxyPass /terms.html !
	ProxyPass / http://localhost:18080/ nocanon
	ProxyPassReverse / http://localhost:18080/ nocanon

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Alias で指定したファイルは、OAuth 認証を取得する際に求められる、プライバシーポリシーと利用規約を記したファイル。

以上で設定は完了。ブラウザでサイトを表示し、ユーザー登録を行う。