Skip to main content

【系统设计】用 AWS 部署 Twikoo 评论和说说系统

· loading · loading ·
系统设计 SystemDesign
Jinbo Pan
Author
Jinbo Pan
A Life Explorer
Table of Contents

在之前重搭博客的文章中,提到要用 Twikoo 来搭一个评论系统。折腾几天时间终于找到了自己最喜欢的一套 AWS 部署方案。

【系统设计】用亚马逊云AWS Amplify/Hugo/Blowfish重搭个人博客
· loading · loading
系统设计 SystemDesign

简介
#

twikoojs/twikoo

💬 一个简洁、安全、免费的静态网站评论系统 | A simple, safe, free comment system.

JavaScript
1519
294

Twikoo 官网简介写得很好

一个简洁、安全、免费的静态网站评论系统。

A simple, safe, free comment system.

serverless 服务一般都需要部署到云服务供应商,因为自己整个网站都是用的 AWS 亚马逊云服务,所以也准备把 Twikoo 部署到 AWS。

数据库准备 Mongodb Atlas
#

因为 Twikoo 是 serverless 的服务,所以需要一个 serverless 的数据库来存储所有评论。官方文档推荐 MongoDB Atlas,因为有免费 500MB 的数据容量。由于 Twikoo 在数据库存储的主要是评论字符串,所以完全够用。

看到 Github 一个 issue新功能建议,将图片转换为 base64 编码格式存储储,这个是免图床服务的 一个好想法。但是感觉可能会很快占满免费容量,而且通常数据库存储价格比对象存储贵,同时可能数据库的读取速度会因为读取数据变大受影响。

Twikoo 文档已经很详细了,只需要按照步骤一步一步设置就好。

Mongodb Atals 可以选择 AWS,GCP,Azure 不同的云服务商。由于我所有的资源都将在 AWS us-west-2,所以选择 AWS us-west-2 可以降低延迟。

API 部署 AWS Lambda
#

Twikoo 使用云函数简直是我的心头好!云函数不需要担心硬件底层,只需为函数运行的时间付费,如果云函数闲置,则不需要支付任何费用,而且可以迅速 Scale Up.

自己选用的是 AWS Lambda,因为自己主要用 AWS 云服务,同时 AWS Lambda 的免费档已经完全够用了。

The AWS Lambda free tier includes one million free requests per month and 400,000 GB-seconds of compute time per month, usable for functions powered by both x86, and Graviton2 processors, in aggregate. Additionally, the free tier includes 100GiB of HTTP response streaming per month, beyond the first 6MB per request, which are free.

Twikoo 文档也有很详细的步骤怎么部署到 AWS Lambda。(如何安装需要的工具 Terraform 可以参考 Terraform 文档)

需要注意的是,原来的部署只设置了 Lambda Timeout 为 10 秒,如果有上传图片的需求,这个 timeout 是不够的。 提交了一个Fix把 timeout 改为 60 秒。

我们还可以使用 AWS Cloudwatch Dashboard 来监控 Twikoo API 的运行状况。

主要监测以下四个数据:

  1. Errors 表示 API 一天内的调用错误总数量。理想情况是 0,如果大于 0 可能是有 bug。
  2. Invocations 表示 API 一天内被调用的总次数。如果数量太大可能是网页太受欢迎有很多访问量,所以需要显示评论很多次,或者可能网页被攻击。
  3. Duration 表示 API 的响应时间,用的一天中的最长响应时间,如果响应时间太长,前端则需要花更多时间才能看到评论。
  4. ConcurrentExecutions 表示一天内同一时间调用 API 的最多次数。AWS Lambda 支持很高的并发,但是并发多了可能会有冷启动 (Cold Start) 的问题。

图床设置 Lsky Pro
#

如果想要 Twikoo 支持图片上传功能则需要设置图床服务。读了下 Twikoo 的文档,里面很多第三方图床服务其实都是根据兰空图床 Lsky Pro 搭建的,这个框架是开源的(开源版本已经停止维护了,可能是潜在风险)

lsky-org/lsky-pro

☁️兰空图床(Lsky Pro) - Your photo album on the cloud.

Blade
4069
599

我用的这个 Dockerhalcyonazure/lsky-pro-docker镜像在自己的的 AWS EC2 主机搭建的图床服务。

最爱 Lsky Pro 的一点是这个框架支持把上传的照片自动转换成容量更小的 wepb 格式,然后上传到 AWS S3 同时返回图片 AWS Cloundfront CDN 地址在前端渲染。

这样所有的图片都能以最优的格式存储在对象存储里面,同时 CDN 加速访问,而且不用占主机存储。

表情包设置
#

Twikoo 还支持表情包,自己做了 QQ 表情包和平时工作中自己爱发的 Slack 上面的表情。做表情包不难,只需要一个 json file,text 为表情名字,icon 为表情图片链接。

{
    "QQ":
    {
        "type": "image",
        "container":
        [
            {
                "text": "QQ-1",
                "icon": "<img src='https://media.panjinbo.com/pics/owo/qq/0.gif'>"
            },
            {
                "text": "QQ-2",
                "icon": "<img src='https://media.panjinbo.com/pics/owo/qq/1.gif'>"
            }
        ]
    }
}       

喜欢的话可以拿去使用,owo

HTML 支持 – 说说
#

Twikoo 还能支持渲染 HTML,所以可以在评论里面插入 HTML 来显示图片,音乐和视频等各种多媒体。(会在本文的评论区展示)

这感觉直接让 Twikoo 成为“说说”或者 Twitter 一样可以发状态的工具。

自己弄了一个“说说”的界面。每条“评论”其实是一条状态。

Bulletin Board | 留言板

评论提醒 AWS SES
#

Twikoo 还支持有新评论的时候发送提醒。自己选择了邮件通知,连接 AWS SES 服务,如果评论有新回复,给留言者发邮件。

总结
#

Twikoo 是自己这几年最满意的博客方面的开源项目,感谢每一位开源贡献者!