使用Scoold作为Stack Overflow克隆的问答网站
首先
这篇文章是TIS Advent Calendar 2018第十天的文章。
写在书里的内容
在本篇文章中,我将简要介绍类似于Stack Overflow的Scoold,并且稍微谈一谈它的内部构造。
问答网站?
在日常工作中,当遇到技术问题或需要咨询时,你会如何处理?
我认为有许多种方法,但作为知识积累和内容对任何人都可见且能产生亲近感的选择之一,我认为还有问答网站。
因此,我們在公司內部引入了一個類似Stack Overflow的平台Scoold,讓我們可以進行技術性問題的發布和回答等活動。
尽管这种方法本质上是公司内部封闭的,但可以在内部向他人寻求帮助,也存在心理上的高门槛,考虑到朝着更开放的环境发展,我觉得这样的解决方案也不错,对吧?
校园
Scoold 是 Erudika 公司提供的开源问答平台。
斯库尔校 Scoold
Scoold是一款用Java编写的开源问答平台。
写着受到 Stack Overflow 启发的事情。
Scoold是受到StackOverflow启发并实现了大部分的功能。
许可证为Apache许可证第2.0版。
Erudika/Scoold 可以被简单描述为一种知识共享和学习平台。
有商业版可选。
OSS版本的功能清单。
-
- データベースが選択可能で、クラウドへのデプロイにも最適化している
-
- 全文検索
-
- 分散オブジェクトキャッシュ
-
- Locationの情報を使って、「自分に近い位置」の投稿をフィルタリングできる
-
- 多言語サポート
-
- 評価と投票によるバッヂシステム
-
- スペース(チーム) … 質問やユーザーをグループで分割できる
-
- jQueryベースの最小限のフロントエンド
-
- Materialize CSSによるモダンでレスポンシブなデザイン
-
- よく似た質問に対するサジェストをして、重複した質問する前にヒントを出す
-
- 回答やコメントがあった時のメール通知
-
- Spring BootによるUber JAR
-
- LDAP認証のサポート
-
- ソーシャルログイン(Facebook, Google, GitHub, LinkedIn, Microsoft, Twitter)とGravatarのサポート
-
- コードのシンタックスハイライト、GitHub Flavored Markdownのサポート
-
- 絵文字のサポート
- SEOフレンドリー
一旦商用版本,似乎会增加这方面的内容。
-
- 好きな投稿をSticky(固定)にする
-
- SAMLサポート
-
- 匿名ユーザーの投稿
-
- 無制限のスペース
-
- 複数の管理者を設定可能
-
- 複数のドメインをサポート
-
- より高度なハイライト
-
- 画像アップロード
- セキュリティ通知
在Qiita上也有一篇使用Scoold的文章,可能自建QA网站适合在团队内部或组织内使用。
建议在公司内使用问答系统来管理咨询。
虽然Scoold不是唯一的选择,但也可以考虑其他方法,比如使用Stack Overflow for Teams。
团队版的Stack Overflow
开始提供可以创建团队专用的私人问答网站“Stack Overflow for Teams”。月费从10美元起。
嗯,由於這次的主題是Scoold,所以我們將深入探討。
Scoold需要与名为Para的API服务器进行后端配合,才能正常运行。
以下是中文翻译的内容:
Para
Erudika/重述
与 Scoold 相同,这个软件也采用了 Apache License 2.0 版本的许可证。
Scoold将使用Para的REST API进行访问。
Para是一个通用的API服务器应用程序。简单来说,Scoold负责UI,Para负责数据操作。
云端的通用后端框架
虽然被称为通用,但它确实针对相应的特定目的而设计。
尝试安装
让我们安装Scoold并在本地启动问答网站。
顺便提一下,如果只是想简单评估一下Scoold的话,可以试试他们的演示网站,这样会比较好。
如上所述,Scoold需要使用Para作为后端。
虽然Para也提供在paraio.com作为服务,但这次我们计划在本地启动Para。
执行环境
操作系统是Ubuntu Linux 18.04 LTS。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
另外,鉴于Scoold和Para的源代码,似乎更适合选择针对Java 8版本,因此我选择Java 8。
https://github.com/Erudika/scoold/blob/1.31.0/pom.xml#L9-L13
https://github.com/Erudika/para/blob/v1.31.0/pom.xml#L145-L146
请查看以下链接:
https://github.com/Erudika/scoold/blob/1.31.0/pom.xml#L9-L13
https://github.com/Erudika/para/blob/v1.31.0/pom.xml#L145-L146
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
此外,在使用命令行工具时,需要安装Node.js。
Para的安装
按照GitHub的QuickStart指南进行Paran的安装即可。
开始 / 快速入门
关于Pará,由于有详细的文件,所以您可以查看这些文件并继续进行。
翻译成中文:
Para Docs – 麻醉医生
Para的下载。
$ wget https://oss.sonatype.org/service/local/repositories/releases/content/com/erudika/para-jar/1.31.0/para-jar-1.31.0.jar
此外,Para还创建了可执行的WAR文件,可以使用WAR文件进行启动。
按照文档的指示,创建配置文件。
应用程序配置文件
# the name of the root app
para.app_name = "Para"
# or set it to 'production'
para.env = "embedded"
# 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 = true
# 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 = "b8db69a24a43f2ce134909f164a45263"
# 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
顺便提一下,我们将使用Typesafe Config来读取设置文件。
启动。
$ java -jar -Dconfig.file=./application.conf para-jar-1.31.0.jar
在启动时,日志将输出以下内容到屏幕上。
2018-12-09 18:25:48 [WARN ] Server is unhealthy - root app not found. Open /v1/_setup in the browser to initialize Para.
请访问/v1/_setup,并使用curl或浏览器进行访问。
$ curl localhost:8080/v1/_setup
{
"accessKey" : "app:para",
"message" : "Save the secret key - it is shown only once!",
"secretKey" : "3rB4SvKiTsMaSd2g7qXvGdPtezFmkROhWwCgyxV48OMtSKlVXklpMQ=="
}
接着,将获得secretKey。请记住这个值。
Scoold的安装
接下来,我们将安装Scoold。请参考快速入门指南。
Scoold/ Quick Start 系统快速启动
首先,使用para-cli在Para上创建一个新应用程序。在这个过程中,使用先前设置Para时的信息。
$ npm install -g para-cli
$ para-cli setup
Secret key not provided. Make sure you call 'signIn()' first.
Para Access Key: app:para
Para Secret Key: 3rB4SvKiTsMaSd2g7qXvGdPtezFmkROhWwCgyxV48OMtSKlVXklpMQ==
Para Endpoint: http://localhost:8080
✔ New JWT generated and saved in /$HOME/.config/para-cli-nodejs/config.json
✔ Connected to Para server v1.31.0 on http://localhost:8080. Authenticated as: app Para (app:para)
「新的应用程序」是什么?这是关于Para的通用后端服务器的讨论,Scoold是使用Para的一种应用程序。
所以,这次我创建了一个名为“Para”的应用程序。
确认。
$ para-cli ping
✔ Connected to Para server v1.31.0 on http://localhost:8080. Authenticated as: app Para (app:para)
创建一个新的应用程序。
$ para-cli new-app "scoold" --name "Scoold"
✔ App created:
{
"accessKey": "app:scoold",
"message": "Save the secret key - it is shown only once!",
"secretKey": "JZODlJVH1F5pb6vKA6qae8XQYP7MaGOgrXnK3RN6nMZoemSMVmbnag=="
}
这条信息同样非常重要,所以请我们记住吧。
下载Scoold。
$ wget https://github.com/Erudika/scoold/releases/download/1.31.0/scoold-1.31.0.jar
我已根据Quick Start内容创建了设置文件,省略了需要Google等API Key的部分,并将连接目标Para和Scoold的URL设置为localhost。
应用程序配置文件
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://localhost:8000"
# the URL of Para - could also be "http://localhost:8080"
para.endpoint = "http://localhost:8080"
# access key for your Para app
para.access_key = "app:scoold"
# secret key for your Para app
para.secret_key = "JZODlJVH1F5pb6vKA6qae8XQYP7MaGOgrXnK3RN6nMZoemSMVmbnag=="
# enable or disable email&password authentication
para.password_auth_enabled = false
# if false, commenting is allowed after 100+ reputation
para.new_users_can_comment = true
# If true, the default space will be accessible by everyone
para.is_default_space_public = true
在这里,para.access_key和para.secret_key是指定刚刚创建的新应用程序信息的参数。
这里也会使用Typesafe Config来读取设置文件。
开始。
$ java -jar -Dconfig.file=./application.conf scoold-1.31.0.jar
当您访问http://localhost:8000时,您可以看到启动的Scoold的界面。
儘管我是說英語的!!
我认为在下一个版本中应该能够实现日本语化。
还有,如何才能顺利登录呢…?
哎?可能会被认为社交登录在哪里呢?但是这是可以通过Scoold的设置来控制的。只是这次我没有准备各种社交渠道的密钥,所以就不使用了。
使用Scoold账号通过邮件地址和密码登录,然后发布问题。
這次,我們打算使用電子郵件地址和密碼進行認證。
暂停一次 Para 和 Scoold,然后修改各自的 application.conf 文件。
通常情况下,需要进行邮件地址认证,需要发送邮件通知和进行验证,但这次我们关闭了这个功能。
Para侧的application.conf
# if true, users can be created without verifying their emails
para.security.allow_unverified_emails = true
Scoold允许使用电子邮件地址和密码进行认证。
# enable or disable email&password authentication
para.password_auth_enabled = true
在这种情况下启动Para和Scoold后,当进入登录页面时,会出现登录表单。
选择“注册”,然后进行用户注册。
雖然透過類似寄送郵件的畫面(由於沒有本地的SMTP伺服器,所以會顯示郵件發送失敗的錯誤記錄…),但在這種狀態下可以進行登錄。
现在,我们来尝试发布一个问题吧。
Markdown的预览功能。
投稿后的问题。
提交了回答之后。
在问题页面中有一个回答的提交表单。
更改Para的结构
我到目前为止只介绍了如何安装和简单运行Scoold和Para。但要真正开始使用,还需要更加深入一步。
Scoold和Para都将数据库、搜索引擎和缓存作为插件,可以根据部署环境进行选择。
默认情况下,它在H2数据库、Apache Lucene和Caffeine上运行。
您可以通过查看Para文档来了解可以选择哪些选项。
你可以从以下选项中选择。
-
- データベース
Apache Cassandra
DynamoDB
MongoDB
RDBMS
H2 Database
検索エンジン
Elasticsearch
Apache Lucene
キャッシュ
Caffeine
Hazelcast
让我们将数据库更换为MongoDB。
$ wget https://oss.sonatype.org/service/local/repositories/releases/content/com/erudika/para-dao-mongodb/1.31.0/para-dao-mongodb-1.31.0-shaded.jar
JAR文件是从插件的GitHub发布页面获取的。
我将取得的JAR文件放入Para的JAR文件中。
$ mkdir -p BOOT-INF/lib
$ mv para-dao-mongodb-1.31.0-shaded.jar BOOT-INF/lib
$ jar -u0f para-jar-1.31.0.jar BOOT-INF
我們在Docker上準備了MongoDB。
$ docker container run -it --rm --name mongo -p 27017:27017 mongo:4.1
然后,通过更改Para的配置来使用MongoDB,并启动Para。
para.dao = "MongoDBDAO"
由于切换了数据库,Para的数据已经丢失,因此需要再次访问/v1/_setup。请确保也获取了与Scoold相关的密钥。
顺便说一句,这次我们选择直接更新Uber JAR文件的方式,但也可以使用Maven等工具重新构建JAR(或WAR)文件。
在这种情况下,您可以参考Para的JAR或WAR配置,自己创建归档文件会更好。
https://github.com/Erudika/para/blob/v1.31.0/para-jar/pom.xml#L85-L94 可以被”para-jar”文件夹中的POM文件的第85到94行所代表。
https://github.com/Erudika/para/blob/v1.31.0/para-war/pom.xml#L26-L37 可以被”para-war”文件夹中的POM文件的第26到37行所代表。
Scoold和Para的构造性讨论
由于Para可以更改数据的存储位置和搜索引擎等,因此它在架构方面具有灵活性。
然而,在实际进行導入的时候,您可能希望进行各种定制化。
最后简要谈一下Scoold和Para的结构方面。
校园
这是一个使用Spring Boot和Spring Web MVC构建的应用程序。主要由以下的框架和库组成。
-
- Spring Boot(コンテナはJetty)
-
- Spring Framework
-
- Apache Velocity
-
- Typesafe Config
-
- jQuery
-
- Materialize CSS
-
- Font Awesome
- SimpleMDE
此外,该应用程序完全不具备处理数据的功能,所有与数据保存、检索等相关的操作都是通过向Para发送请求来完成的。
习近平是中国现任主席,他是中国共产党的领导人。
Para是一个使用Google Guice构建的DI容器,API采用Jersey的应用程序。
-
- Google Guice
-
- Jersey
-
- Typesafe Config
-
- Spring Boot(一部のみ利用、コンテナはJetty)
-
- Spring Framework
-
- Spring Security
- flexmark-java
虽然如此,不知何故只有部分出现了Spring Framework相关的名称。有些地方使用了Spring作为Servlet容器和认证方面的工具。
UI不包含任何功能。
另外,插件的机制是建立在服务提供程序的框架上的。
Scoold和Para之间有着完全不同的设计。尽管Para在结构上更为复杂,但我认为如果你真的想要进行自定义,那么Scoold可能更适合,因为它具有更多的用户交互功能,例如用户界面等。
Para是一个专注于数据操作和搜索的工具,因此其功能本身相对简单。
我们自己也使用Scoold和Para进行定制,但绝大部分的定制内容都是在Scoold上完成的。
-
- 利用する人に合わせたUIの改修、改善
- メール通知の機会の追加
进行以上述活动。
结束时
作为构建QA网站的实现方式,我介绍了Stack Overflow的克隆版Scoold。只要进行构建和安装,就并不难。
但是,是否能够真正被使用起来又是另一回事了。
在团队或组织内,即使有问题也会被忽视,这样一来,它会逐渐衰落,所以我觉得如何将其作为一种文化扎根是很重要的。
不仅限于Scoold,如果要引入这种工具的话,最好能够成为一个让用户能够轻松提问和回答的平台。