Astro搭建Twikoo评论系统+自建EasyImage图床

发布于 2026-06-03 20:30 2665 字 14 min read

在Astro博客上搭建自托管Twikoo评论系统以及自建EasyImage图床教程及踩坑实录

前言

一个博客如果少了评论总觉得会缺了点什么,于是我开始配置评论系统……
本文详细介绍了twikoo评论引擎在Astro-koharu主题上的配置方法以及自建EasyImage图床的部署过程。

twikoo评论系统

twikoo是一个简洁、安全、免费、轻量的博客评论系统,这也是我选中它的原因。
如果按照twikoo官网的步骤搭建,则需要配置云函数前端两部分;
简单来说就是一个云函数后端托管着你的评论数据库,然后再在你的网页前端集成twikoo的样式代码就可以了。

twikoo文档
twikoo文档

如果按照twikoo文档云函数部署的方法来进行配置,则你有非常多的免费云端数据库可以选择,但是我考虑到安全性以及免费额度的问题还是决定在本地私有化部署

部署方式
部署方式

私有化部署

私有化部署分为通过Node.js通过Docker两种方式进行部署,鉴于Docker镜像在国内不忍直视的访问性,加上近期国内镜像站的全军覆没,我选择了通过Node.js部署的方法。
还好,在我的树莓派3B+上使用Node来运行twikoo不会造成太大的编译负担。
树莓派上的系统是RaspberryPi-OS,基于Debian11,安装Node18就好。

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs npm

跑完运行一下node -vnpm -v看看是否安装成功。

然后,我们再来安装一下tkserver,-g会让tkserver命令全局可用。

sudo npm install -g tkserver

tkserver就是twikoo的后端,本质是一个HTTP服务器,负责执行其核心功能,会在本地自动生成数据库,也可以配置外部的MongoDB。
之后推荐创建一个工作目录。

mkdir ~/twikoo && cd ~/twikoo
#运行tkserver
tkserver

如果看到输出有"code":100就代表tkserver启动成功,至此后端服务部署完成。
8080是tkserver的默认端口,我们在nginx中配置相关规则,以此作为前端访问后端的网络路径。

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

前端设置

后端部署完成,我们还需要配置前端,由于koharu主题已经为我们集成了twikoo的前端代码,只需要在config/site.yaml中进行修改就可以在构建的时候自动包含评论区的html代码和样式。

comment:
  provider: twikoo #指定服务商!
  twikoo:
    envId: https://odonata.top/twikoo/ # Twikoo 环境 ID (腾讯云) 或 Vercel 环境地址 (必填) #这里写本地托管
    #region: ap-shanghai              # 环境地域,默认为 ap-shanghai
    #path: location.pathname          # 用于区分不同文章的自定义 js 路径
    lang: zh-CN                     # 语言 (默认: 'zh-CN')

之后就可以在博客中看见twikoo的评论框了,点击右下角小齿轮以进入管理后台,在这里你可以管理评论,还能进行配置的自定义修改。

评论框样式
评论框样式

评论区不能发图片会是一大痛点,在管理配置的“插件”中,可以设置评论区图片所要使用的图床。

twikoo后台
twikoo后台

因为我对图片的自主权有很高的要求,不希望使用稳定性与访问性欠佳的免费公共图床,看来自建图床才是最佳选择。
这个人折腾完了后端但是构建了四五次都发现没有样式出来,最后发现provider未定义(源文件里provider到底下twikoo中间有很多其他服务商的注释代码)

EasyImage图床

EasyImage图床功能强大,同时也是非常轻量的,甚至无数据库;
首先我们要安装所需要的依赖:PHP7.4,不过官方源里是没有的,所以我们需要添加第三方源再用包管理器下载。

本地安装依赖及源文件

#添加PHP源
sudo apt install -y lsb-release apt-transport-https ca-certificates curl
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update && upgrade

#安装PHP7.4及扩展
sudo apt install -y php7.4 php7.4-fpm php7.4-cli php7.4-common php7.4-mbstring php7.4-gd php7.4-intl php7.4-xml php7.4-zip php7.4-curl

fileinfogd是EasyImage必须的扩展,上面命令已经包含。
如果不装 gd,访问图床会白屏并报Call to undefined function imagecreatefromjpeg()
安装完成后,PHP-FPM 会自动启动并设为开机自启。
PHP默认只允许上传2MB的文件,而图片常可能超过这一限制,更改:

sudo nano /etc/php/7.4/fpm/php.ini

搜索upload_max_filesize,并修改以下三行(改成30M限制)

upload_max_filesize = 30M
post_max_size = 30M
memory_limit = 128M

记得保存并重启,sudo systemctl restart php7.4-fpm

然后来下载EasyImage的核心组件。

#创建你的网站根目录(下面是我的)
sudo mkdir -p /var/www/image.odonata.top
cd /var/www/image.odonata.top
sudo wget https://github.com/icret/EasyImages2.0/archive/refs/heads/master.zip
sudo unzip master.zip
sudo mv EasyImages2.0-master/* . && sudo rm -rf EasyImages2.0-master master.zip

这样EasyImage的文件就会在你的网站根目录下了。

Nginx配置

我是要把图床服务托管在我的子域名image.odonata.top下的,所以还需要配置Nginx规则。

#创建配置文件
sudo nano /etc/nginx/sites-available/image.odonata.top
server {
    listen 80;
    server_name image.odonata.top;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    http2 on; # 这里要根据nginx版本来,如果你是1.25.1及以上的新版Nginx,那就按照这种写法;如果是旧版,就并入第一行写成listen 443 ssl http2;
    server_name image.odonata.top;

    ssl_certificate     /etc/nginx/ssl/image.odonata.top.crt; # 申请的证书(记得改名)
    ssl_certificate_key /etc/nginx/ssl/image.odonata.top.key;

    root /var/www/image.odonata.top; # 指定网站根目录
    index index.php;

    client_max_body_size 20M;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    # 跨域配置(给 Twikoo 调用 API 用)
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'Authorization, Content-Type';
}

以上代码里有很多是我的配置,别忘了改成你的。
再启用站点。

sudo ln -s /etc/nginx/sites-available/image.odonata.top /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

SSL证书配置

我给nginx用的证书都放在/etc/nginx/ssl下,用的是acme.sh来申请的证书,由于是通过frp穿透的,所以不能用常规的HTTP-01验证方式,必须用DNS-01 challenge
DNS-01验证是什么呢,简单来说,DNS-01 的验证流程是:acme.sh 向证书颁发机构(Let’s Encrypt)发起申请 → CA 返回一个挑战令牌 → acme.sh 自动在你的域名解析中添加一条特定的 TXT 记录 → CA 查询这条 TXT 记录是否匹配 → 匹配则颁发证书。

这种方式的好处是:不需要服务器开放任何端口,内网机器也能申请证书,而且完全支持泛域名证书。acme.sh 通过 DNS 服务商提供的 API,可以自动添加和删除验证记录,整个过程无需人工干预,非常方便。

接下来要在你的域名服务商处获取一个API密钥,即Access Key;

  • 先登陆域名服务商的RAM控制台,可以创建主账号的RAM用户,也可以新开一个RAM子账户,创建完成后会给你Access Key IDSecret只显示一次,记得保存好。
  • 接下来要给这个账户授予权限,在用户详情页点击”添加权限”,搜索“DNSFullAccess”,这会使得该账户获得访问,读取,修改你的DNS记录的完全权限。

获取到 Key 和 Secret 后,在服务器上用环境变量配置即可。

下载acme.sh

# 会自动安装到 ~/.acme.sh,并配置好环境变量和定时续期任务
curl https://get.acme.sh | sh -s email=你的邮箱@example.com

# 重载环境变量
source ~/.bashrc

# 记得验证安装
acme.sh --version

申请证书

由于我的服务商是阿里云,所以以下命令含有大量“ali”,注意改成你的。

# 设置阿里云 API 密钥(acme.sh 会自动将其保存到 ~/.acme.sh/account.conf)
export Ali_Key="你的AccessKey ID"
export Ali_Secret="你的AccessKey Secret"

# 申请证书
acme.sh --issue --dns dns_ali -d image.odonata.top --keylength ec-256 --force

证书申请成功后,会存放在~/.acme.sh/odonata.top_ecc/,但我们不能直接在 Nginx 配置中引用这个路径,因为acme.sh目录的结构可能会变化,而且续签后 Nginx不会自动加载新证书。正确做法是用--install-cert命令把证书复制到固定路径,并指定续签后自动重载Nginx。

acme.sh --install-cert -d image.odonata.top --ecc \
    --key-file       /etc/nginx/ssl/image.odonata.top.key \
    --fullchain-file /etc/nginx/ssl/image.odonata.top.crt

这样就配置完成了。

权限设置

安装完毕记得设置权限,这是很重要的一步,权限不对会导致各种500错误或无法写入。

cd /var/www/image.odonata.top
sudo chown -R www-data:www-data .
sudo find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \;
sudo chmod 755 upload.php i config
sudo mkdir -p admin/logs && sudo chmod 755 admin/logs

完成安装向导

在浏览器中访问你的图床地址,首次访问会出现安装界面,需要填写:

  • 网站域名
  • 网站连接域名
  • 管理员账号
  • 管理员密码

点击安装,安装成功后,程序会自动生成config/config.php。

这里会遇到一些问题,写在下面

  1. 页面加载混乱(CSS/JS 缺失)
    你可能会看见白屏,同时F12查看浏览器控制台报错:“混合内容”,这是因为EasyImage生成的资源链接是HTTP而站点是HTTPS;
    需要nano一下/var/www/image.odonata.top/index.php,在<?php后面第一行写

    $_SERVER['HTTPS'] = 'on';
  2. 无法登录
    通常是写完上述所有信息之后一直无法进入主界面,且报密码错误,无限循环;原因是新版EasyImage使用SHA256 存储密码,但安装向导可能没有正确生成哈希。
    我当时可能是下载到2.7.6以前版本了,导致了这个诡异现象,安装新版即可。

图床首页
图床首页

之后进入图床管理后台,填写一些信息,同时要进入“系统管理”→“API设置”,生成一个Token,再编辑config/config.php
'apiStatus'=>1下方添加:

'api_token_list' => ['你的Token'],

这样才不会在API上传时返回错误201,就是没有配置允许的Token。
保存并退出,重启PHP-FPM,sudo systemctl restart php7.4-fpm

图床设置
图床设置

在twikoo中使用自建图床

转到twikoo管理后台,配置管理插件中找到IMAGE_CDN,选择EasyImage
IMAGE_CDN_URL填写你的URL,我的是https://image.odonata.top/api/index.php
IMAGE_CDN_TOKEN中填写你的Token。
点击下方保存,在评论框中上传图片就会使用你的图床了!

配置管理
配置管理

结语

至此,Twikoo评论系统和自建EasyImage图床就全部部署完成了,如果你也用Astro或其他静态博客,希望能对你有些帮助!

Astro搭建Twikoo评论系统+自建EasyImage图床
作者: Odonata
发布于: 2026年6月3日
许可协议: CC BY-NC-SA 4.0

喜欢的话,留下你的评论吧~

© 2026 Holo icon Odonata @Alights
Powered by theme astro-koharu · Inspired by Shoka