手把手教你用 Docker Compose 部署 Twikoo 评论系统

前言

博客搭建完成的那一刻,你满怀期待地写下第一篇文章,想象着读者会在评论区留下怎样的反馈。你希望他们能在这里畅所欲言,希望每一篇技术分享都能引发讨论,希望每一个作品展示都能收获真实的评价。然而当页面加载完毕,评论区却空空荡荡------不是因为没人看,而是因为根本没有评论区。

静态博客的痛点在于此。它速度快、部署简单、安全性高,但缺少了那个让读者"开口说话"的地方。Halo 博客系统虽然自带评论功能,但你可能会发现:新评论无法触发邮件通知,只有回复才能收到提醒;恶意评论来袭时,系统缺乏有效的拦截手段;后台的评论统计常常与实际数量不符。这些问题让人头疼------你的博客就像一间没有交谈区的咖啡馆,读者来了看看就走了。这正是 Twikoo 要解决的问题。

Twikoo 是一个简洁、安全、免费的静态网站评论系统,它不仅功能强大(支持邮件通知、垃圾评论过滤、自定义表情、代码高亮等现代评论系统所需的核心功能),更重要的是,你可以把它部署在自己的服务器上,把数据完全掌握在自己手里。

这篇文章会带你一步步完成 Twikoo 的 Docker Compose 私有化部署,包括两种数据存储方案(便捷的 LokiJS 和专业的 MongoDB)、Nginx 反向代理配置等。读完你就能拥有一个完全属于自己的评论服务------用自己的域名访问,跑在自己的服务器上,数据完全听你的。

一、部署前的准备

动手之前,先确保你有以下几点:

  • 一台有公网 IP 的服务器(云服务器、VPS、NAS 都可以,我推荐使用雨云的服务器,支持一元试用,7天无理由退款,操作界面简洁直观,感兴趣的朋友可通过我的邀请链接注册后购买使用)
  • 服务器上已安装 Docker 和 Docker Compose(如果还没装,可以先搜一下教程搞定)
  • 一个域名(如果想通过域名访问,这一步不能少)
  • 如果要使用 MongoDB,还需要先有一个 MongoDB 实例(可以在服务器上自建,也可以用免费的 MongoDB Atlas 云服务)

二、两种数据存储方案,你选哪个?

Twikoo 支持两种数据存储方案,选哪个完全取决于你的需求和接受程度。

🗃️ 方案一:LokiJS(零配置,随拿随用)

如果你只想快速跑起来,不想折腾数据库,那 LokiJS 就是为你准备的。

这种方案直接使用内嵌的 LokiJS 数据库,数据会以 JSON 文件的形式存放在服务器的目录里,你根本不用操心数据库安装的问题------Twikoo 默认就帮你处理好了。

简单说就是:Docker 跑起来,存数据的文件就自动生成了,完全不需要额外配置。

听起来很省心?确实省心。但在开始之前,有两件事得说清楚:

  1. 数据是以纯文本形式存的:也就是说,任何能登录你服务器的人都能看到邮箱地址这类信息,心里要有个底。
  2. 数据文件在系统异常断电时可能会损坏:虽然 Twikoo 本身会自动保存,但为了保险起见,强烈建议你定期备份。

对于个人博客、小型网站来说,LokiJS 够用了。免费、省事、不需要操心额外的数据库维护。

🏦 方案二:MongoDB(专业版,数据稳稳当当)

如果你的博客访问量越来越大,或者你比较在意数据安全,那 MongoDB 会是更安心的选择。Twikoo 很早就支持把数据存到 MongoDB 了。

MongoDB 的好处是:

  • 数据更可靠,不用担心服务器意外断电就把数据搞丢
  • 读写性能更好,评论多了也不怕
  • 方便备份和迁移

三种获取 MongoDB 的方式:

  • 方法 1(推荐) :用免费的 MongoDB Atlas 云服务。免费账户有 500MiB 的空间,存普通个人博客的评论完全够用。
  • 方法 2:在自己的服务器上用 Docker 单独跑一个 MongoDB 容器。
  • 方法 3:用你服务器上自带的 MySQL 手动换成 MongoDB(不过有点麻烦,不建议尝试)。

一句话总结:数据量不大且图省事 → 选 LokiJS;追求稳定可靠或数据比较宝贵 → 选 MongoDB。


三、开始实战:用 Docker Compose 部署

Docker Compose 最大的好处在于,不管后面你想用 LokiJS 还是 MongoDB,后面换数据存储方案只需要改几行配置就行,不用从头再来。

📁 创建项目目录

先在服务器上找一个合适的地方,创建 Twikoo 的目录:

bash 复制代码
mkdir -p /opt/twikoo && cd /opt/twikoo

📝 编写 docker-compose.yml

配置一:用 LokiJS(不折腾数据库的方案)

这种方式最简单,一把就能跑起来,数据就存在当前目录下的 ./data 文件夹里。

yaml 复制代码
services:
  twikoo:
    container_name: twikoo
    image: imaegoo/twikoo:1.7.9
    restart: always
    network_mode: bridge
    ports:
      - 8080:8080
    volumes:
      - ./data:/app/data
    environment:
      - TWIKOO_THROTTLE=1000
      - TWIKOO_PORT=8080

配置二:用 MongoDB(数据放外部数据库的方案)

这种配置更专业、更稳妥。数据全部交给 MongoDB,即便 Twikoo 容器出了问题被删掉,重启之后评论也还在,接上数据库就能继续用。

yaml 复制代码
services:
  twikoo:
    container_name: twikoo
    image: imaegoo/twikoo:1.7.9
    restart: always
    network_mode: bridge
    ports:
      - 8080:8080
    volumes:
      - ./data:/app/data
    environment:
      - TWIKOO_THROTTLE=1000
      - TWIKOO_PORT=8080
      - MONGODB_URI=mongodb://你的用户名:你的密码@你的MongoDB地址:端口号/twikoo

提醒 :两种方案都在最后挂载了 ./data:/app/data。这一步非常关键------即便用了 MongoDB,这个目录仍然会存放 Twikoo 运行时的一些状态文件,把它挂载出来,将来更新版本或者迁移服务器的时候会更方便。

🚀 启动服务

/opt/twikoo 目录下执行以下命令:

bash 复制代码
docker compose up -d

✅ 检查运行状态

跑完上面的命令,先看一眼容器是不是正常启动了:

bash 复制代码
docker ps | grep twikoo

如果能看见 UP 字样,说明容器已经成功跑起来了。

然后,在浏览器里访问 http://你的服务器IP:8080,如果看到下面这样的 JSON 输出,那就是大功告成了:

json 复制代码
{
  "code": 100,
  "message": "Twikoo 云函数运行正常,请参考 https://twikoo.js.org/frontend.html 完成前端的配置",
  "version": "1.7.9"
}

四、配置 Nginx 反向代理

到这一步,你的 Twikoo 后端服务已经在 IP:8080 上跑起来了。但这还不够好看,也不够安全------直接暴露端口访问总归不太体面,而且没有 HTTPS,传输也不安全。所以下一步就是配上 Nginx,用域名优雅地访问你的评论服务。

原理很简单 :你访问一个二级域名(比如 twikoo.yourdomain.com),Nginx 收到请求后,会把请求偷偷转给在你服务器本机 8080 端口跑着的 Twikoo 容器。Twikoo 处理完了,再把结果原路返回给你,全程你完全感知不到背后发生了什么。

Nginx 核心配置(简版)

在你的 Nginx 配置文件里(通常是 /etc/nginx/conf.d/twikoo.conf)写入以下内容:

nginx 复制代码
server {
    server_name twikoo.yourdomain.com;   # 把这里换成你自己的二级域名

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

提醒 :配置里的 proxy_set_header 那一堆参数一定要加上。它们的作用是把真实的访客 IP 和原始请求信息透传给 Twikoo。少写了这几行,你在管理后台看到的评论 IP 就会全是 127.0.0.1,文章的热力图统计也全都乱套了。

加上 HTTPS

配完了基础的反向代理,强烈建议把 HTTPS 也开起来。步骤很简单:

  1. 去域名服务商那儿给 twikoo.yourdomain.com 申请一个 SSL 证书(Let's Encrypt 有免费的)。
  2. 把申请到的证书文件上传到服务器对应的 Nginx 证书目录里。
  3. 在 Nginx 配置里加上 listen 443 ssl;,然后指定 ssl_certificatessl_certificate_key 路径。
  4. 顺手加一个 return 301 https://$server_name$request_uri; 来强制把 HTTP 请求转到 HTTPS。
  5. 最后执行 nginx -t 检查语法对不对,没问题的话 systemctl reload nginx 重载配置。

这样以后访问 https://twikoo.yourdomain.com 就能看到那个熟悉的 Twikoo JSON 输出了。


五、前端接入:让你的博客"长"出评论

后端部署好了,还得让博客站点知道去哪找这个评论服务。方法其实很简单,在你的博客主题或者插件的 Twikoo 配置项里,把 envId(环境 ID)设为你的 Twikoo 服务端地址就行。如果配了 Nginx 反向代理,那直接填你的二级域名(比如 https://twikoo.yourdomain.com)。

以Hexo框架Anzhiyu主题为例,配置方法可参考下图框内所示:

接入成功后,随便点开一篇文章,评论区应该就能正常加载了。然后你就可以点击评论区右下角那个不起眼的小齿轮图标,第一次进去会提示你设置管理员密码。这个密码很重要,一定要记好。

六、给你的评论区加点料------配置表情包

有了评论功能,再配上一套自己喜欢的表情包,评论区就活泼多了。Twikoo 的表情包配置非常简单------你只需要提供一个指向表情包配置的 JSON 文件地址。

怎么做呢?分三步:

  1. 拿到现成的表情包配置 :GitHub 上有个叫 Twikoo-Magic 的项目,里面有好多已经整理好的表情包,直接拿 JSON 地址就能用。
  2. 放到自己的 CDN 上(可选):为了保证加载速度,可以把 JSON 文件放到 CDN 上。暂时没有 CDN 的话,用 GitHub 的 raw 地址也行。
  3. 去 Twikoo 后台填一下:点击博客评论区右下角的齿轮图标进管理面板 → 「配置管理」→「插件」,在「EMOTION_CDN」那一栏填上你准备好的 JSON 文件地址。

配置好后,刷新评论区页面,就能在表情选择器里看到新的表情包了。如果 JSON 文件地址在公网上,一定要确保它能被正常访问。

小提醒:表情包 JSON 文件里存的是图片链接,不是直接把图片存进去。所以要确保那些图片链接都是能公开访问的,不然别人就看不到表情了。


七、一些你可能用得上的小技巧

🧹 1. 定期备份,有备无患

  • LokiJS 方案 :直接把 data 文件夹打包备份就行。
  • MongoDB 方案 :用 mongodump 命令来导出数据备份,或者用 mongorestore 来恢复。

🔄 2. 升级 Twikoo 版本

以后想升级 Twikoo 到最新版,执行下面两条命令就行:

bash 复制代码
docker compose down
docker compose pull twikoo
docker compose up -d

因为有数据目录挂载,所以升级不会丢评论。

🐛 3. 常见问题排查

  • 访问 http:IP:8080 没反应:检查一下服务器防火墙和安全组的 8080 端口有没有放行。
  • 博客接入时报错:去浏览器的开发者工具(F12)的控制台里看看有没有报 403 或者 404 之类的错误,顺着提示去排查会更快。
  • 反向代理不生效 :先检查 nginx -t 有没有报语法错误,然后确认一下你的域名 A 记录有没有正确解析到服务器 IP。

写在最后

到这儿,你已经完成了 Twikoo 从部署到上线的一条龙操作。从跑起 Docker 容器,到决定用哪种数据库存数据,再到配上域名和 HTTPS,每一步都走完了。现在你的博客有了一个完全自己掌控的评论区,不用受第三方的限制。往后你要做的,就是偶尔去管理后台逛逛,跟留言的读者互动互动,这正是做独立博客的意义所在!

相关推荐
微擎应用市场1 小时前
微擎面板 W7Panel:一站式云原生管理平台,让 Kubernetes 触手可及
云原生·容器·kubernetes
张洛闻Eren1 小时前
云原生k8s【第一课】: Docker 容器技术
运维·云原生·容器·k8s
量化分析1 小时前
迁移docker部署的wordpress
运维·docker·容器
懒人82 小时前
8月18日更新 | 2026 最新可用 Docker 国内镜像源加速列表(Linux 环境下拉取镜像的方式进行演示)
docker
三言老师2 小时前
K8s集群运行时自动化运维全覆盖落地实操(上)
docker·容器·kubernetes
梅孔立3 小时前
Docker 部署 Python3\.11 Flask爬虫项目 终极稳定教程(解决线程报错/挂载失效/pip报错)
爬虫·docker·flask
DevHub3 小时前
电视盒子刷 Armbian 教程:30 元旧盒子变 NAS 跑 Docker,200+ 机型可刷
linux·嵌入式硬件·docker·容器·开源·电视盒子
聊浮游4 小时前
运维2026全套最新学习资料
运维·微服务·云原生·容器
资源大佬星 课it13 小时前
重学C++ ,重构你的C++知识体系
vue.js·docker·django