Commento 博客评论系统搭建
盖力维
一个博客网站不能失去评论系统,就像西方不能失去耶路撒冷。
所以我要给自己的网站添加一个评论系统,我看到 Ananke 主题原生支持 Disqus 和 Commento ,而 Disqus 需要付费才能有好的体验,所以我直接选择了在自己的服务器上搭建 Commento 服务 (当然如果你的预算充足,也可以直接购买 Commento/Disqus 的付费服务),为博客网站提供评论功能。
本篇博客记录了我约六个小时的搭建过程、遇到的困难和解决方案。
Commento 博客评论系统搭建
思路设计
我的服务器是 Rocky Linux + Nginx (详见此篇博客 Rocky Linux + Nginx + Hugo + Go 静态博客网站搭建 | 220303’s Blog Site)。
Commento 需要 Postgres 数据库的支持。
[!CAUTION]
postgres14不能使用md5加密,所以必须使用postgres13!由于我的服务器无法访问
docker.io来拉取镜像,所以我只能在本地Windows上用Docker Desktop下载镜像,然后导出成.tar格式,再用SCP传到服务器上,而SCP传输速度特别慢,我最开始用了postgres14,发现不行又改用postgres13,光是传文件就浪费了一个小时。
我打算将二者都运行在容器里,通过映射容器的 8080 端口到服务器的 8080 端口来暴露到公网,然后使用 Ananke 的内联插入 Commento 的功能为文章页插入。
[!CAUTION]
Ananke目前没有实现自定义Commento服务网址这一功能!它不会从配置文件中读取网址然后填充到对应的Javascript代码中,而是会直接填写默认的网址https://cdn.commento.io/!所以我必须通过新建
blog/layouts/partials/commento.html(blog/为我Hugo网站的根目录),并填写以下内容来覆盖掉原Ananke的源代码。这样我就可以在hugo.toml中添加commenoUrl参数来设置我自己的commento服务网址。1{{ if or .Site.Params.commentoEnable .Site.Params.commentoUrl }} 2<div id="commento"></div> 3<script 4 defer 5 src="{{ with .Site.Params.commentoUrl }}{{ . }}{{ else }}https://cdn.commento.io{{ end }}/js/commento.js" 6></script> 7{{ end }}由于文档的缺乏以及
AI的回答始终错误 (几个AI都是错的,甚至Copilot读了源码也没说对),我误解了Ananke文档的意思,导致浪费了三个小时……
搭建服务
更新服务器操作系统,下载所需软件。
Rocky Linux 自带 podman 容器,这里下载的 Docker 软件包实际上是一个 docker 命令到 podman 命令的转换器,因此我们接下来使用熟悉的 Docker 命令。
1# 更新系统
2sudo dnf update -y
3
4# 安装 Docker(docker命令到podman命令的转换器)
5sudo dnf install -y docker
我使用 podman-compose ,因此不要安装 docker-compose 。
在服务器上新建一个目录来放置 Commento 相关文件:
1cd /server
2mkdir commento
3cd commento
4# pwd: /server/commento
由于我的服务器无法访问 docker.io 来拉取镜像,所以我只能在本地 Windows 上用 Docker Desktop 下载镜像,然后导出成 .tar 格式,再用 SCP 传到服务器上,而 SCP 传输速度特别慢,我最开始用了 postgres14 ,发现不行又改用 postgres13 ,光是传文件就浪费了一个小时。
注意以下这块命令在本地电脑上执行!
1# 我直接在docker desktop的GUI界面下载了镜像
2
3# 打包镜像
4docker save -o postgres13.tar postgres:13
5docker save -o commento.tar commento/commento-ce
6
7# 上传到服务器上
8scp "C:\Users\Administrator\Desktop\postgres13.tar" server:/server/commento/
9scp "C:\Users\Administrator\Desktop\commento.tar" server:/server/commento/
注意以下命令回到服务器执行!
在服务器上导入镜像:
1docker load -i commento.tar
2docker load -i postgres13.tar
在 /etc/nginx/conf.d 目录中创建 commento.conf ,内容如下:
# HTTP 自动跳到 HTTPS
server {
listen 80;
server_name commento.220303.work;
# ACME challenge 请求直接返回 Hugo webroot
location /.well-known/acme-challenge/ {
root /server/blog/public;
}
# 其他请求跳转到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS 配置
server {
listen 443 ssl;
server_name commento.220303.work;
ssl_certificate /etc/letsencrypt/live/220303.work/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/220303.work/privkey.pem;
# ACME challenge请求走 Hugo 输出目录
location /.well-known/acme-challenge/ {
root /server/blog/public;
}
location / {
proxy_pass http://127.0.0.1:8080; # Commento 容器端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
在 /server/commento 目录中新建 docker-compose.yml 配置文件用于构建容器,内容如下:
1version: "3.9"
2
3services:
4 db:
5 image: postgres:13
6 container_name: commento-postgres
7 restart: unless-stopped
8 environment:
9 POSTGRES_DB: commento
10 POSTGRES_USER: commento
11 POSTGRES_PASSWORD: G20080212
12 POSTGRES_HOST_AUTH_METHOD: md5 # 添加这一行
13 volumes:
14 - commento-db:/var/lib/postgresql/data
15 networks:
16 - commento-net
17
18 commento:
19 image: commento/commento-ce
20 container_name: commento
21 restart: unless-stopped
22 environment:
23 COMMENTO_ORIGIN: "http://220303.work:8080"
24 COMMENTO_POSTGRES: "postgres://commento:G20080212@db:5432/commento?sslmode=disable"
25 networks:
26 - commento-net
27 ports:
28 - "127.0.0.1:8080:8080"
29
30volumes:
31 commento-db:
32
33networks:
34 commento-net:
在 /server/commento 目录中创建构建脚本 reload.sh :
1#!/bin/bash
2# restart_commento.sh
3# 用于重启 Commento 服务并重载 Nginx
4
5echo "Stopping all services..."
6podman-compose down
7
8echo "Starting all services..."
9podman-compose up -d
10
11echo "Testing Nginx configuration..."
12if sudo nginx -t; then
13 echo "Reloading Nginx..."
14 sudo systemctl reload nginx
15 echo "Done."
16else
17 echo "Nginx configuration test failed. Please fix errors before reloading."
18fi
设置脚本为可执行,调用脚本启动 Commento 服务器:
1# pwd: /server/commento
2chmod +x reload.sh
3./reload.sh
访问 https://commento.220303.work ,注册管理员账号,添加域名 https://220303.work 。
[!CAUTION]
注意不要理会
Commento自动生成的Javascript代码!其中的域名部分始终是undifined,那是错的!
注意以下内容在本地电脑进行!
新建 blog/layouts/partials/commento.html( blog/ 为我 Hugo 网站的根目录),并填写以下内容来覆盖掉原 Ananke 的源代码。这样我就可以在 hugo.toml 中添加 commenoUrl 参数来设置我自己的 Commento 服务网址。
1{{ if or .Site.Params.commentoEnable .Site.Params.commentoUrl }}
2<div id="commento"></div>
3<script
4 defer
5 src="{{ with .Site.Params.commentoUrl }}{{ . }}{{ else }}https://cdn.commento.io{{ end }}/js/commento.js"
6></script>
7{{ end }}
在 blog/hugo.toml 的 [params] 中添加如下配置:
1# 开启 commento 评论系统
2commentoEnable = true
3commentoUrl = "https://commento.220303.work"
执行 build.ps1 脚本以自动更新构建网站。( build.ps1 见此篇博客 Rocky Linux + Nginx + Hugo + Go 静态博客网站搭建 | 220303’s Blog Site)。
1./build.ps1