使用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的界面。

儘管我是說英語的!!

範囲を選択_050.png

我认为在下一个版本中应该能够实现日本语化。

还有,如何才能顺利登录呢…?

哎?可能会被认为社交登录在哪里呢?但是这是可以通过Scoold的设置来控制的。只是这次我没有准备各种社交渠道的密钥,所以就不使用了。

範囲を選択_051.png

使用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后,当进入登录页面时,会出现登录表单。

範囲を選択_052.png

选择“注册”,然后进行用户注册。

範囲を選択_053.png

雖然透過類似寄送郵件的畫面(由於沒有本地的SMTP伺服器,所以會顯示郵件發送失敗的錯誤記錄…),但在這種狀態下可以進行登錄。

範囲を選択_054.png
範囲を選択_055.png

现在,我们来尝试发布一个问题吧。

範囲を選択_062.png

Markdown的预览功能。

範囲を選択_060.png

投稿后的问题。

範囲を選択_061.png

提交了回答之后。

範囲を選択_063.png

在问题页面中有一个回答的提交表单。

範囲を選択_064.png

更改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,如果要引入这种工具的话,最好能够成为一个让用户能够轻松提问和回答的平台。

广告
将在 10 秒后关闭
bannerAds