Remark42:自托管、轻量级评论引擎

2020-07-21 16:56:39

Remark42是一个自托管的、轻量级的、简单的(但功能强大的)评论引擎,它不会监视用户。它可以嵌入到博客、文章或任何其他读者添加评论的地方。

从DockerHub中拉出准备好的图像,然后开始-docker-composp&;&;docker-compose up-d。

环境中由、分隔的多个参数或使用命令行键重复,如--site=s1--site=s2...。

以下命令行选项列表已被弃用,将从它们被弃用的版本中删除2个次要版本或1个主要版本(以距离较近的版本为准)。在Common42版本更新之后,请检查一次启动日志以获得弃用警告,以避免将来出现无法识别的命令行选项的问题。

大多数参数都有合理的默认值,不需要自定义。用户只需定义几个参数:

版本:';2';服务:comm42:图像:umputun/Commp42:最近重新启动:始终容器名称:";Commp42";环境:-REMARK_URL=https://demo.remark42.com#指向您的comm42服务器-SITE=YOUR_SITE_ID#站点ID,与用于`SITE_ID`的相同,请参阅您网站上的";设置";-SECRET=abcd-123456-xyz-$%^&;#SECURE KEY-AUTH_GITHUB_CID=12345667890#OAuth2客户端ID-AUTH_GITHUB_CSEC=abcdefg12345678#OAuth2客户端密码卷:-./var:/srv/var#存储所有Comm42数据的持久卷。

要验证Rmark是否已正确安装,请查看位于${REMARK_URL}/web URL的演示页面。确保在${site}列表中包含备注站点ID。

由外部提供程序处理的身份验证。您应该为所有(或部分)用户设置OAuth2,以允许用户发表评论。不是强制要全部配置,但至少应该正确配置一个。

从右上角的项目下拉列表中选择新项目(仅当选择了另一个项目时)。

在中央窗格中,选择OAuth同意屏幕选项卡。填写向用户显示的产品名称,然后单击保存。

在中央窗格中,选择“凭据”选项卡。授权重定向URI是OAuth2/Callback的位置,构造为DOMAIN+/AUTH/GOOGLE/CALLBACK,例如:https://remark42.mysite.com/auth/google/callback。

在";授权回调URL";下,输入构造为domain+/auth/gihub/callback的正确url。IE https://remark42.mysite.com/auth/github/callback。

在";Facebook登录";/";设置";填充";有效的OAuth重定向URI下,将您的回调url构造为域+/auth/facebook/callback。

选择";App Review";并打开PUBLIC标志。此步骤可能会要求您提供隐私策略的链接。

从右上角的项目下拉列表中选择新项目(仅当选择了另一个项目时)。

在回调URL字段中,输入回调处理程序的正确URL,例如domain+/auth/twitter/callback

在Key和Tokens下,注意Consumer API Key和Consumer API Secret Key。它们将用作AUTH_Twitter_CID和AUTH_Twitter_CSEC。

在Platforms下选择";Web services";,然后输入构建为domain+/auth/Yandex/callback的回调URI#1";。IE https://remark42.mysite.com/auth/yandex/callback。

或者,可以打开匿名访问。在这种情况下,额外的匿名提供商将允许在没有任何社交登录的情况下,使用满足两个条件的任何名称进行登录:

名称必须以字母开头,并且只能包含字母、数字、下划线和空格。

备注支持从Disqus、WordPress或本地备份格式导入备注。所有导入的备注都将导入字段设置为true。

Disqus将您站点上的所有评论导出为g压缩文件。您可以在Disqus Admin&>;Setup&>Export(Disqus Admin&>导出)的仲裁面板中找到此信息。导出将被发送到队列中,然后在准备就绪后通过电子邮件发送到与您的帐户关联的地址。指向导出的直接链接将类似于https://<;siteud>;.disqus.com/admin/discussions/export/.。有关详细信息,请参阅导入-导出。

运行import命令-docker exec-it notic42 import-p disqus-f{disqus-export-name}.xml-s{您的站点ID}。

安装WordPress插件以导出评论并按照说明操作。该插件应产生一个基于XML的文件与网站内容,包括评论。

运行import命令-docker exec-it notic42 import-p wordpress-f{wordpress-export-name}.xml-s{您的站点ID}。

Remark42默认情况下将每日备份文件放在${BACKUP_PATH}(默认值./var/backup)下。备份最多保留${MAX_BACKUP_FILES}(默认值为10)。每个备份文件都包含导出和压缩的内容,即所有注释。在任何时候,用户都可以恢复这样的备份,并将所有注释恢复到所需状态。注意:还原过程将清除当前数据存储,并将所有注释替换为备份文件中的注释。

出于安全和安保原因,默认情况下,还原功能不会在服务器外部公开。建议从备份恢复的方式是使用提供的脚本/restore-backup.sh。它可以在容器内运行:

除了自动备份之外,用户还可以手动进行备份。默认情况下,此命令使userbackup-{site id}-{timeStamp}.gz。

RESTORE将首先清除所有注释,然后从给定文件完全导入进行处理。

备份文件是一个文本文件,所有导出的注释均以EOL分隔。每个备份记录都是一个有效的json,所有键/值都从注释struct中解组(见下文)。

管理员/版主应在docker-compose.yml中定义为用户ID列表或在命令行中传递。

要获取用户ID,只需登录并单击您的用户名或您想要提升为管理员的任何其他用户。它将展开登录信息并显示完整的用户ID。

版本:';2';服务:comm42:图像:umputun/Commp42:最新重新启动:始终容器名称:";Commp42";环境:-APP_UID=2000#运行非默认uid-time_zone=gtc#将容器时间设置为utc-remark_url=https://demo.remark42.com#url指向您的comm42服务器-SITE=YOUR_SITE_ID#站点ID,与用于`SITE_ID`相同,请参阅&#。-SECRET=abcd-123456-xyz-$%^&;#密钥-AUTH_GITHUB_CID=12345667890#OAuth2客户端ID-AUTH_GITHUB_CSEC=abcdefg12345678#OAUT2客户端密码卷:-./var:/srv/var#用于存储所有Comm42数据的永久卷。

<;script>;var remark_config={HOST:";REMARK_URLE";,//备注服务器的主机名,与后端配置中的REMARK_URL值相同,例如";https://demo.remark42.com";SITE_ID:';YOUR_SITE_ID';,Components:[';Embed';],//要加载的组件可选参数。默认为[";Embed";]//要加载所有组件将组件定义为[';Embed';,';Last-Comments';,';Counter';]//可用组件为://-';Embed';:Basic Comments Widget//--';Last-Comments';:Last-Comments&39;请参阅下面的//-&';Counter&#。:计数器widget,参见下面的`Counter`部分url:';page_url';,//可选的param;如果没有定义//`window.location.Origin+window.location.pathname`,/注意如果您使用查询参数作为url的重要部分//(实际改变页面内容的部分)//您需要手动配置url来保留查询参数,如//`window.locatione`。不包含查询参数和//哈希。例如,`https://example/com/example-post?id=1#hash`//的默认URL将是`https://example/com/example-post`.。/查询参数的问题在于,它们通常包含由//各种跟踪器添加的无用参数(UTM参数),并且没有定义顺序,因此REMERM会以不同的方式处理//所有这些示例://https://example.com/?postid=1&;date=2007-02-11//https://example.com/?date=2007-02-11&;postid=1//https://example.com/?date=2007-02-11&;postid=1&;UTM_SOURCE=GOOGLE/如果您处理查询参数,请确保只传递其中的重要部分//按照定义良好的顺序max_show_Comments:10,//可选的param;如果不是,将使用定义的默认值(15)主题:';暗;,//可选的param;如果没有定义的默认值(';light&39;)将使用page_title:';移动到Remark42。如果没有定义`document。title`将使用locale:';en&39;//设置区域设置和语言,如果没有定义,将使用默认值(';en';)};(function(C){for(var i=0;i<;c..。长度;i++){var d=文档,s=d。CreateElement(#39;脚本);s。SRC=REMARK_CONFIG。主机/web/';+c[i]+';.js';s。DEFER=TRUE;(d.。头部||d。身体)。AppendChild;}})(remark_config。组件||[';Embed';]);<;/script>;

然后将此节点添加到要查看Remark42小部件的位置:

目前备注有两个主题:亮和暗。您可以使用配置对象选择一个主题,但也可以在运行时在主题之间切换。为此,备注添加到名为REMARK42的窗口对象中,该对象包含函数changeTheme。只需调用此函数并传递要打开的主题的名称:

现在remark被翻译成en、ru(部分)、de和fi语言,您可以使用Configuration Object进行选择。

将此代码段添加到网页底部,或调整已有的REMARK_CONFIG以在组件列表中具有最后注释:

<;script&>var remark_config={HOST:";REMARK_URLE";,//备注服务器的主机名,与后端配置中的REMARK_URLE相同,例如";https://demo.remark42.com";SITE_ID:';YOUR_SITE_ID';,Components:[';Last-Comments';]};(Function(C){For(var i=0;我<;c。长度;i++){var d=文档,s=d。CreateElement(#39;脚本);s。SRC=REMARK_CONFIG。主机/web/';+c[i]+';.js';s。DEFER=TRUE;(d.。头部||d。身体)。AppendChild;}})(remark_config。组件||[';Embed';]);<;/script>;

然后将此节点添加到您想要查看上次评论小部件的位置:

将此代码段添加到网页底部,或调整已有的REMARK_CONFIG以使计数器出现在组件列表中:

<;script&>var remark_config={HOST:";REMARK_URLE";,//备注服务器的主机名,与后端配置中的REMARK_URLE相同,例如";https://demo.remark42.com";SITE_ID:';YOUR_SITE_ID';,Components:[';COUNTER';]};(Function(C){For(var i=0;我<;c。长度;i++){var d=文档,s=d。CreateElement(#39;脚本);s。SRC=REMARK_CONFIG。主机/web/';+c[i]+';.js';s。DEFER=TRUE;(d.。头部||d。身体)。AppendChild;}})(remark_config。组件||[';Embed';]);<;/script>;

然后在您想要查看大量注释的位置添加一个节点,如下所示:

您可以根据需要使用任意多个这样的节点。脚本将通过类remark__counter找到所有这些节点,并且它将使用data-url属性来定义带有注释的页面。

此外,脚本还可以使用remark_config对象中的url属性,如果未定义其他内容,则可以使用window.location.Origin+window.location.pathname。

要构建单个二进制文件以直接执行-使OS=<;Linux|WINDOWS|Darwin>;Arch=<;AMD64|386>;。此步骤将生成嵌入了所有内容的可执行Common42文件。

您可以使用功能齐全的本地版本来开发和测试前端和后端。它需要至少2 GB RAM或启用交换。

#如果主要工作在backenddocker-compose-f compose-dev-backend.yml builddocker-compose-dev-backend.yml up#如果主要工作在front docker-compose-f compose-dev-front tend.yml builddocker-compose-dev-front tend.yml up

它在127.0.0.1:8080上启动Remark42并添加本地OAuth2提供程序“dev”。要访问UI演示页面,请转到127.0.0.1:8080/web。默认情况下,您将以dev_user身份登录,定义为admin。您可以在相应的YML文件中调整任何支持的参数。

后台Docker编写配置默认跳过运行前端相关测试,前端Docker编写配置默认跳过运行后台相关测试,设置前端构建NODE_ENV=DEVICATION。

要在本地运行后端(开发模式,不带Docker),必须安装最新稳定的Go工具链。

要运行BACKEND-CD BACKEND;请运行APP/Main.go服务器--dbg--SECRET=12345--URL=http://127.0.0.1:8080--ADMIN-PASSWD=PASSWORD--SITE=COMIT使用基本身份验证启动后端服务,并嵌入存储在端口8080上的螺栓,允许直接验证和运行请求,如下所示:HTTP http://admin:[email protected]:8080/api/v1/find?site=remark&;sort=-active&;format=tree&;url=http://127.0.0.1:8080。

注运行NPM install将在您的git存储库中设置预提交钩子,它用于在每次提交之前使用SPECTER和lint重新格式化您的前端代码,并使用eslint和style elint来重新格式化您的前端代码。

对于热重载的本地开发模式,使用npm start而不是npm run build。在这种情况下,webpack将在localhost:9000上使用webpack-dev-server提供文件。通过访问127.0.0.1:9000/WEB,您将获得一个包含主要评论控件的页面,与运行在https://demo.remark42.com.But上的演示服务器后台通信,由于安全原因,您将无法登录任何OAUTH提供商。

使用受支持的提供商之一获取/auth/{provider}/login?from=http://url&;site=site_id&;session=1-Performance&Social&34;登录并重定向到URL。会话(任何非零值)的存在会更改默认Cookie过期时间,并使其仅限于会话。

Type user struct{name string`json:";name";`ID string`json:";id";`图片字符串`json:";picture";`admin bool`json:";admin";`阻止bool`json:";block";`已验证bool`json:";verfied";`}

类型注释struct{ID string`json:";id";`//注释ID,只读ParentID字符串`json:";pid";`//父ID文本字符串`json:";text";`//注释文本,多维处理原始字符串`json:";orig";`//原始注释文本用户`json:";user";`//用户信息,读取。`//发布定位器分数int`json:";core";`//评论分数,只读投票int`json:";Vote";`//为当前用户投票,-1/1/0。争议浮动64`json:";争议,省略空的`//评论争议,只读时间戳时间。时间`json:";time";`//时间戳,只读编辑*编辑`json:";edit,omitEmpty";bson:";edit,omitEmpty";`//json响应引脚中默认为空的指针`json:";pin";`//固定状态,只读删除bool`json:";删除";`//删除状态,读取。`//post title}type Locator struct{SiteID string`json:";site";`//site id url string`json:";url";`//post url}type Edit struct{时间戳时间。时间`json:";time";bson:";time";`摘要字符串`json:";Summary";`}。

这是UI用来显示给定帖子评论的主要调用。它可以返回两种格式的评论-普通格式和树格式。在普通格式下,结果将被排序的评论列表。在树形格式中,这将是具有以下结构的树形对象:

类型树结构{Nodes[]Node`json:";Comments";`Info store。PostInfo`json:";info,omitEmpty";`}类型Node struct{注释存储。评论`json:";评论";`回复[]节点`json:";回复,省略空";`}。

排序可以是时间、活动或分数。支持前缀为-/+的排序顺序,即-time。对于树模式,排序将仅应用于顶级评论,所有回复始终按时间排序。

PUT/api/v1/comment/{id}?site=site-id&;url=post-url-编辑注释,允许在创建后的EDIT_TIME分钟内编辑一次。正文为EditRequest json。

Type EditRequest struct{text string`json:";text";`//更新后的text Summary字符串`json:";Summary";`//可选,编辑删除bool的摘要`json:";delete";`//delete flag}{}。

获取/api/v1/last/{max}?site=site-id&;since=ts-msec-获取最多{MAX}条最后评论,因为(纪元时间,毫秒)是可选的。

Post/api/v1/count?site=siteID-从帖子正文获取帖子的评论数量(帖子ID列表)

Get/api/v1/list?site=site-id&;limit=5&;skip=2-List评论帖子,返回数组或帖子信息,Limit=0将返回所有帖子。

类型PostInfo struct{url string`json:";url";`count int`json:";count";`ReadOnly bool`json:";read_only,omitEmpty";`FirstTS time。时间`json:";First_Time,省略空的`LastTS时间。时间`json:";last_time,省略空";`}。

Type Config struct{version string`json:";version";`EditDuration int`json:";edit_uration";`MaxCommentSize int`json:";max_ment_size";`admins[]string`json:";admins";`Admine Email string`json:";admin_email";`Auth[]string`json:";admins";`Admins[]string`json:";admin_email";`Auth[]string`json:";admins";Critical_Score";`PositiveScore bool`json:";PositiveScore";`ReadOnlyAge int`json:";readonly_age";`MaxImageSize int`json:";max_image_size";`EmojiEnabled bool`json:";emoji_enable";`}。

Get/api/v1/stream/info?site=site-idd&;url=post-url&;since=unix_ts_msec-返回包含站点和URL的PostInfo记录的流(Event:Info)。因为是可选的。

Get/api/v1/stream/last?site=site-id&;since=unix_ts_msec-返回带有站点注释的更新流(Event:Last),因为是可选的。

数据:{";url";:";https://radio-t.com/blah1";,";计数";:2,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.142872-05:00";}event:信息数据:{";Url";:";https://radio-t.com/blah1";,";count";:3,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.157709-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数";:4,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.172991-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数";:5,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.188429-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数";:6,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.204742-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数";:7,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.220692-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数";:8,";first_time";:";2019-06-18T12:53:48.125686-05:00";,";last_time";:";2019-06-18T12:53:48.23817-05:00";}event:信息数据:{";url";:";Https://radio-t.com/blah1";,";计数"。

.