一. Remark42介绍

Remark42是一个开源的、轻量级、强大的评论系统。

Remark在Github上的源代码

1.1 功能

  • 支持 Markdown emoji
  • 支持匿名、邮箱登录
  • 支持各种OAuth,如GitHub、Google、Facebook、Twitter、Yandex、
  • 颜值也不错,支持浅色和深色模式,带有树和普通演示文稿的多层嵌套评论
  • 支持数据迁移,可以导入Disqus和WordPress的评论数据
  • 强大的管理功能,管理员可以置顶、删除评论和用户禁言
  • 支持投票,个人标示和验证
  • 支持多种评论排序
  • 图片可以可视化导入
  • 支持最近的评论
  • 支持RSS
  • 支持通知
  • 支持手动备份和自动备份,支持备份数据恢复
  • 没有数据库,存储使用单一文件
  • 支持Docker的部署
  • 支持Linux, Windows和MacOS系统
  • 一套评论系统可以用于多个网站
  • 支持HTTPS的访问

1.2 注重隐私

以下注重隐私说明摘自拉斐

  • Remark42试图对任何私有或半私有信息非常敏感。
  • 身份验证从身份验证提供程序请求最小可能的范围。他们返回的所有额外信息将立即丢弃,并且不会以任何形式存储。
  • 通常,remark42仅保留用户ID,用户名和头像链接。这些字段均不直接公开-标识和名称进行了- 哈希处理,并附加了头像。
  • 没有任何形式的跟踪。
  • 登录技工使用存储在cookie(httpOnly,安全)中的JWT。第二个cookie(XSRF_TOKEN)是防止CSRF的随机ID。
  • 没有跨站点登录,即无法在运行remark42的独立站点之间分析用户的行为。
  • 不涉及第三方分析服务。
  • 用户可以要求remark42知道的所有信息并导出到gz文件。
  • 支持彻底清除与用户活动有关的所有信息。
  • Cookie的寿命可以限制为仅会话。
  • 由remark42存储的所有潜在敏感数据都经过哈希处理和加密。

二. 安装

2.1 前提条件

  • 有一个独立IP的服务器
  • 有一个域名,并把这域名绑定到上面ip,假定域名为: remark42.sample.com

2.2 安装remark42

官方提供了两种安装方式,一种是Docker,一种是二进制,这里采用二进制方式,服务器要求低一些。

以下程序在Debian服务器上操作。

1
2
3
4
5
sudo -i
wget https://github.com/umputun/remark42/releases/download/v1.11.3/remark42.linux-386.tar.gz
tar -xvf remark42.linux-386.tar.gz
mv remark42.linux-386 /usr/local/bin
/usr/local/bin/remark42.linux-386 server --secret=12345 --url=http://127.0.0.1:8080

这时候打开 http://remark42.sample.com:8080/web ,应该显示如下

remrk42安装成功

如果显示上面的图片,说明已经安装成功了,安装详情见官网

安装很简单,但是还不能用,存在两个重要的问题:

  1. 没有SSL,不支持https
  2. 不支持通过Google,Facebook,GitHub和Yandex进行社交登录,也不能邮箱登录,什么作用都没有。
    下面来解决这两个问题

2.3 安装SSL证书支持https

2.3.1 申请ssl证书

免费ssl证书一般在Let’s Encrypt申请,是一个免费、开放和自动化的证书颁发机构。
我们用 ACME 来申请。

  1. 切换到root状态,安装并停止nginx。
1
2
apt install nginx
systemctl stop nginx
  1. 安装socat
1
apt -y install net-tools socat
  1. 安装ACME
1
curl  https://get.acme.sh | sh

安装程序会做以下操作:

  • 自动把 acme.sh 安装到 home 的.acme.sh目录下,即~/.acme.sh/

  • 自动创建一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

  • 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.

  1. 更改默认证书
1
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

acme被ZeroSSL收购,其默认的证书方式为ZeroSSL,但此证书生成时会携带邮箱,因此更换为letsencrypt。

当然,也可以在生成证书时加一个–server参数来决定生成什么证书

1
--server letsencrypt
  1. 生成证书,同时验证域名所有权

使用acme.sh –issue命令生成证书,同时会验证域名的所有权。 acme.sh 有两种方式验证:http 和 dns 验证。

验证域名的方法有多种,这里采用自建虚拟webserver的http验证方式,要求服务器没有占用80端口,这也是上面停止nginx的原因。

如果服务器已有80端口的服务,不建议使用自建虚拟webserver,此方式续租时略麻烦需要改造。

1
~/.acme.sh/acme.sh --issue -d remark2.sample.com --standalone

生成并验证证书

注意:如果需要生成泛域名(*.a.com)的证书,不能使用HTTP认证域名,需要改用DNS认证的方式。

  1. copy/安装 证书

默认生成的证书都放在安装目录下: ~/.acme.sh/,但是不要在web服务器中直接引用目录下的证书文件,也不要手动拷贝证书文件到具体的web服务器中,手动拷贝会导致以后不能自动更新证书。

正确方式是使用acme.sh的命令安装证书,acme.sh会自动拷贝证书文件到具体目录中,且记录下来,以后自动更新证书时也会执行此拷贝步骤,从而实现更新证书的完全自动化。

命令格式如下:

1
2
3
4
acme.sh --install-cert -d xxx \
  --cert-file xxx \
  --key-file xxx \
  --fullchain-file xxx\

根据实际情况填入对应的参数,以nginx为例:

  • 创建安装证书的位置目录
1
mkdir /etc/nginx/cert_file
  • 安装证书
1
2
3
~/.acme.sh/acme.sh --installcert -d remark42.sample.com \
  --key-file   /etc/nginx/cert_file/key.pem  \
  --fullchain-file /etc/nginx/cert_file/fullchain.pem

2.3.2. 修改nginx的配置文件

  1. 查看nginx配置文件位置
1
nginx -t

nginx配置文件位置

  • 查看nginx配置文件
1
cat /etc/nginx/nginx.conf

nginx配置文件

  1. 修改nginx配置文件

修改红框位置中的文件,这里修改/etc/nginx/sites-enabled/default, 用Remark42官网 给出的格式替换。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
server {
    listen      443;
    server_name remark42.sample.com;
    ssl    on;
    ssl_certificate        /etc/nginx/cert_file/fullchain.pem;
    ssl_certificate_key    /etc/nginx/cert_file/key.pem;

    gzip on;
    gzip_types text/plain application/json text/css application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml;
    gzip_min_length 1000;
    gzip_proxied any;


    location ~ /\.git {
        deny all;
    }

    location /index.html {
         proxy_redirect          off;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header        Host $http_host;
         proxy_pass              http://remark42.sample.com:8080/web/index.html;
     }

    location / {
         proxy_redirect          off;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header        Host $http_host;
         proxy_pass              http://remark42.sample.com:8080/;
    }

    access_log   /var/log/nginx/remark42.log;

}

server {
  listen 80;
  server_name remark2.sample.com
  return      301 https://remark42.sample.com$request_uri;
}
  1. 启动nginx 和 remark42
1
2
3
systemctl start nginx
exit # 退出root模式,remark42只需要用户模式
./remark42 server --secret=12345 --url=http://127.0.0.1:8080

这时候打开 https://remark42.sample.com/web/,==不需要8080端口号==,就能看到

remrk42安装成功

这时候还能打开 http://remark42.sample.com:8080/web/ ,不过已经不需要了,可以在服务器关闭http流量。

三. Remark42 前端配置

  1. 把以下代码嵌入到需要显示评论的地方
1
<div id="remark42"></div>
  1. 在适当位置添加以下初始化脚本,如footer之类的地方,和上面代码放一起也行。
1
2
3
4
5
6
7
<script>
    var remark_config = {
    host: 'https://remark42.sample.com',
    }
</script>

<script>!function(e,n){for(var o=0;o<e.length;o++){var r=n.createElement("script"),c=".js",d=n.head||n.body;"noModule"in r?(r.type="module",c=".mjs"):r.async=!0,r.defer=!0,r.src=remark_config.host+"/web/"+e[o]+c,d.appendChild(r)}}(remark_config.components||["embed"],document);</script>

详细配置在这里 Remark42前端详细配置

四. Remark42 服务端配置

4.1 实现开机自启动

我们需要用系统服务来实现开机自启动,方法如下:

  1. 建立系统用户 remark42
1
useradd -r remark42
  1. 建立服务目录
1
2
mkdir -m 770 /var/www/remark42
chown :remark42 /var/www/remark42
  1. 建立环境配置文件

注意 SECRET ==不能使用特殊字符==,只能使用大小写字母和数字。

1
vim /var/www/remark42/remark42.conf
1
2
3
4
5
REMARK_URL=https://remark42.sample.com
SECRET=some_secret_key_phrase_1234
SITE=sample
AUTH_ANON=true
EMOJI=true

AUTH_ANON=true 将允许匿名访问和留言。

  1. 建立系统服务
1
vim /etc/systemd/system/remark42.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=remark42 comment engine
After=network.target

[Service]
User=remark42
Group=remark42
EnvironmentFile=/var/www/remark42/remark42.conf
WorkingDirectory=/var/www/remark42
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/remark42.linux-386 server

[Install]
WantedBy=multi-user.target
  1. 激活和启动系统服务
1
systemctl enable --now remark42

4.2 邮箱登录和第三方应用登录

如Github, Google, Telegram, Twitter ….

4.2.1 匿名登录

1
AUTH_ANON=true

4.2.2 Github 登录

  1. 在 “OAuth App”: https://github.com/settings/developers

  2. 点击 “New OAuth App

  3. 输入 “Application Name” 和 “Homepage URL
    Homepage URL里填上面的域名,如 https://remark42.sample.com

  4. 在"Authorization callback URL" 按 域名 + /auth/github/callback 的格式输入, https://remark42.sample.com/auth/github/callback

  5. 点击 “Register application",得到"Client ID"和 “Client secrets”,填入上面的配置文件 /var/www/remark42/remark42.conf

1
vim /var/www/remark42/remark42.conf
1
2
AUTH_GITHUB_CID=120c550d7e13****************
AUTH_GITHUB_CSEC=107e234ee97b10269be7e40dc84ae26e********

4.2.3 Twitter 登录

  1. 在 “OAuth App”: https://developer.twitter.com/en/apps
  2. 点击 “Create an App” ,填写 App Name
  3. 记录好 API Key、API Key Secret 和 Bearer Token
  4. 在 “Dashboard” - “User authentication settings",点击 “Set up
  5. …后面没记
  6. 最后在 Dashboard 里,点击Project App的名字,在 “Consumer Keys“处点击”Regenerate",就生成了API Key and Secret,填入上面的配置文件。
1
2
AUTH_TWITTER_CID=bTuOD2ZmCKWvQiOil********
AUTH_TWITTER_CSEC=4J2VC53Uu4z4qSF2DIUWfsu22Mg7dvu6LJ0pQ6VO4P********

4.2.4 Google 登录

Google登录按官网教程 操作。

1
2
AUTH_GOOGLE_CID=*********************.apps.googleusercontent.com
AUTH_GOOGLE_CSEC=******************

4.2.5 Email 登录

使用邮件相关功能,需要一个smtp服务器,这里以SendGrid 示例。

  1. 在SengGrid获取Api Key
    SendGrid官网 注册登后:

sendgrid sendgrid

记录好这个”Password",填到下面 SMTP_PASSWORD 字段。

  1. 启用邮箱设置
  • 要启用任何邮箱功能,下面四个字段必须有:
1
2
3
4
5
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=465
SMTP_TLS=true
SMTP_USERNAME=apikey
SMTP_PASSWORD=SG.9-FfVdzMSoODgml-UTenZg.OtfpYh233r3na9Ss9ii69CCChMtyqbSJfZtBN0cVI4
  • 启用邮箱登录验证
1
2
3
4
AUTH_EMAIL_ENABLE=true
AUTH_EMAIL_FROM=noreply@matteo.eu.org
AUTH_EMAIL_SUBJ="在 Matteo.eu.org 留言确认"
AUTH_EMAIL_CONTENT_TYPE="text/html"  
  • 启用用户通知
1
2
3
NOTIFY_USERS=email
NOTIFY_EMAIL_FROM=noreply@matteo.eu.org
NOTIFY_EMAIL_VERIFICATION_SUBJ='邮件确认'  
  • 启用管理员通知
1
2
3
NOTIFY_ADMINS=email
NOTIFY_EMAIL_FROM=noreply@matteo.eu.org
ADMIN_SHARED_EMAIL=admin@matteo.eu.org

4.2.6 Teletram 登录

  1. 获取 HTTP API
    @BotFather 聊天
1
/newbot

输入独一无二的机器人名字,Telegram就会给出 HTTP API.

  1. 启用 Telegram 登录
1
AUTH_TELEGRAM=true
  1. 管理员通知

创建一个频道,将上面的机器人作为管理员添加到其中,配置文件中设置频道ID。Telegram私有频道ID获取办法 ,ID是13位数字,以-负号开始

1
2
3
4
NOTIFY_ADMINS=telegram
NOTIFY_TELEGRAM_CHAN=-100**********
NOTIFY_TYPE=telegram
NOTIFY_TELEGRAM_TOKEN=62*****253:AA***********************************
  1. 用户通知
    暂时不能使用

五. 一些高级使用技巧

5.1 SSL证书自动续期

申请的SSL证书有效期只有几个月,超过后就要续期。
上面 申请ssl证书 的安装脚本自带自动续期功能。

5.2 实现开机自启动

见上面 实现开机自启动

5.3 多网站共用一个Remark42系统

从这里得到的方法: 方法来源

5.3.1 步骤一

设置前端代码的 site_id

网站一:

1
2
3
4
5
6
<script>
    var remark_config = {
    host: 'https://remark42.sameple.com',
    site_id: 'mysite1',
    }
</script>

网站二:

1
2
3
4
5
6
<script>
    var remark_config = {
    host: 'https://remark42.sameple.com',
    site_id: 'mysite2',
    }
</script>

5.3.2 步骤二

服务端设置

  1. 网站 id 设置
  • 如果用命令行启动,site参数如下
1
--site=mysite --site=mysite1 --site=mysite2
  • 如果用环境参数启动,
1
SITE=mysite,mysite1,mysite2
  1. 是否跨域设置,可能有以下组合
  • 不设置任何值:在安装Remark42的同一域和子域上可用。

  • ALLOWED_HOSTS设置为一组域,评论仅在列出的域上显示,登录授权在任何地方都不起作用,但在安装 Remark42 的同一域及其子域上可用。self 表示remark所在的域名,这里为 sample.com

1
ALLOWED_HOSTS='self',example1.com,example2.com
  • AUTH_SAME_SITE=None : 评论显示在任何域上,登录授权可以在任何地方使用。
1
AUTH_SAME_SITE=None
  • ALLOWED_HOSTS设置为一组域,且AUTH_SAME_SITE=None:评论显示在列出的域上,登录授权将也适用于这些域。
1
2
ALLOWED_HOSTS='self',sample1.com,example2.com
AUTH_SAME_SITE=None

详细情况见 官网说明

5.4 管理评论

  • 管理员ID在 ADMIN_SHARED_ID 字段设置,可以多个,用 , 隔开。
1
ADMIN_SHARED_ID=github_a0698fa40eexxxxxxxxxxxx,google_0718xxxxxxxxxxxxxxxxxx
  • 怎么获得ID? 在评论区登录后,点击登录的用户名,会打开个人ID,双击可以选择。

  • 管理员在评论区登录后,可以执行管理操作,如删封黑。

5.5 备份和恢复

5.5.1 备份数据

  • 自动备份
    Remark42 默认在${BACKUP_PATH}(default ./var/backup) 下制作每日备份文件。备份最多${MAX_BACKUP_FILES}(默认 10)。每个备份文件都包含导出和 gzip 压缩的内容,即所有注释。
  • 手动备份 手动备份需要设置 ADMIN_PASSWD 并启用 ,注意密码不能使用特殊字符。
1
  ADMIN_PASSWD=4ot8kfgahdGFHH3

备份命令:

1
  ./remark42.linux-386 --url=https://remark42.sample.com --secret=some_secret_key_phrase_1234 backup --site=sample --admin-passwd=4ot8kfgahdGFHH3

5.5.2 恢复数据

恢复数据需要设置 ADMIN_PASSWD 并启用。 恢复命令:

1
./remark42.linux-386 --url=https://remark42.sample.com --secret=some_secret_key_phrase_1234 restore --file=userbackup-matteo-20230208T185724.gz --site=sample --admin-passwd=4ot8kfgahdGFHH3

==恢复命令会删除现有的所有评论==,如要合并现在评论,看官网教程