<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on 海上共明月</title><link>https://withlia.cn/tags/hugo/</link><description>Recent content in Hugo on 海上共明月</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 09 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://withlia.cn/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>使用宝塔面板私有部署 Twikoo 评论系统</title><link>https://withlia.cn/p/baota-deploy-twikoo/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0800</pubDate><guid>https://withlia.cn/p/baota-deploy-twikoo/</guid><description>&lt;img src="https://withlia.cn/p/baota-deploy-twikoo/0.png" alt="Featured image of post 使用宝塔面板私有部署 Twikoo 评论系统" /&gt;&lt;p&gt;给静态博客(Hugo / Hexo / VuePress 等)接入评论系统时，&lt;a class="link" href="https://github.com/twikoojs/twikoo" target="_blank" rel="noopener"
 &gt;Twikoo&lt;/a&gt; 是一个非常轻量、好看、易用的选择。官方推荐的部署方式有 Vercel、腾讯云 CloudBase 等，但如果你已经有一台自己的服务器并安装了宝塔面板，其实可以完全私有部署，数据 100% 在自己手里，也不受海外网络波动影响。
官方也有&lt;a class="link" href="https://twikoo.js.org/quick-start.html" target="_blank" rel="noopener"
 &gt;开始入门&lt;/a&gt;教程&lt;/p&gt;
&lt;p&gt;本文记录一次从零开始，在宝塔面板上部署 Twikoo 后端服务，并接入到 Hugo 博客的完整过程。&lt;/p&gt;
&lt;h2 id="一准备工作"&gt;一、准备工作
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;一台已安装宝塔面板的 Linux 服务器（本文使用 CentOS 7 + 宝塔 7.x）&lt;/li&gt;
&lt;li&gt;服务器公网 IP 一个，或已备案的域名一个（可选，若使用国内厂商服务器，绑定域名需完成 ICP 备案 + 厂商接入备案），我自己使用的是阿里云的&lt;a class="link" href="https://www.aliyun.com/product/ecs" target="_blank" rel="noopener"
 &gt;服务器&lt;/a&gt;，也是从阿里云买的&lt;a class="link" href="https://wanwang.aliyun.com/domain" target="_blank" rel="noopener"
 &gt;域名&lt;/a&gt;。其实不建议选择.cn 的域名，因为备案太久了，所以不建议使用(因为我买的.cn 域名备案时间太长了)。&lt;/li&gt;
&lt;li&gt;已完成 ICP 备案的域名一个（可选，不用域名也能跑起来）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二安装依赖"&gt;二、安装依赖
&lt;/h2&gt;&lt;p&gt;在宝塔&amp;quot;软件商店&amp;quot;中依次安装以下软件：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;软件&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Node.js 版本管理器&lt;/td&gt;
 &lt;td&gt;用于运行 Twikoo 服务，安装 Node.js 18.x（推荐）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MongoDB&lt;/td&gt;
 &lt;td&gt;Twikoo 的数据存储，安装 4.x 或 5.x 均可&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PM2 管理器&lt;/td&gt;
 &lt;td&gt;用来守护 Node 进程&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Nginx&lt;/td&gt;
 &lt;td&gt;反向代理（宝塔默认已装）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="依赖" class="gallery-image" data-flex-basis="612px" data-flex-grow="255" height="476" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://withlia.cn/p/baota-deploy-twikoo/1.png" srcset="https://withlia.cn/p/baota-deploy-twikoo/1_hu_5f1bc09b333a239.png 800w, https://withlia.cn/p/baota-deploy-twikoo/1.png 1214w" width="1214"&gt;&lt;/p&gt;
&lt;p&gt;Node.js 安装完成后，进入 &lt;strong&gt;Node.js 版本管理器 → 版本管理&lt;/strong&gt;，把某个版本设为默认，然后重开终端确认：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若在 SSH 中 &lt;code&gt;npm: command not found&lt;/code&gt;，可以做个软链：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /www/server/nodejs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 假设装的是 v18.19.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf /www/server/nodejs/v18.19.0/bin/node /usr/bin/node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf /www/server/nodejs/v18.19.0/bin/npm /usr/bin/npm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="三创建-mongodb-数据库"&gt;三、创建 MongoDB 数据库
&lt;/h2&gt;&lt;p&gt;宝塔 → 数据库 → MongoDB → 添加数据库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据库名：&lt;code&gt;twikoo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加至：本地服务器 (127.0.0.1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为 MongoDB 默认只监听 &lt;code&gt;127.0.0.1&lt;/code&gt;，外网连不到，同一台服务器上的 Twikoo 直接连即可，可以不开启认证。连接串是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mongodb://127.0.0.1:27017/twikoo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;如果要开启密码认证，需要在 MongoDB 配置里设置 &lt;code&gt;security.authorization: enabled&lt;/code&gt;，然后重启服务，再回到宝塔数据库列表点&amp;quot;改密&amp;quot;。本文选择本机不认证的方式，简单省事。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="四部署-tkserver"&gt;四、部署 tkserver
&lt;/h2&gt;&lt;p&gt;Twikoo 的私有部署包名叫 &lt;code&gt;tkserver&lt;/code&gt;，直接用 npm 安装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /www/wwwroot/twikoo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /www/wwwroot/twikoo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm init -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install tkserver --registry&lt;span class="o"&gt;=&lt;/span&gt;https://registry.npmmirror.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装完成后，先看一下入口文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat node_modules/tkserver/package.json &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s1"&gt;&amp;#39;&amp;#34;(main|version)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新版 &lt;code&gt;tkserver&lt;/code&gt;（本文时 1.7.14）的入口是 &lt;code&gt;server.js&lt;/code&gt;，本身就是一个完整的启动脚本，会读取 &lt;code&gt;MONGODB_URI&lt;/code&gt;、&lt;code&gt;TWIKOO_PORT&lt;/code&gt; 等环境变量后自启监听。所以我们不需要再包一层 &lt;code&gt;index.js&lt;/code&gt;，直接用 PM2 拉起它即可。&lt;/p&gt;
&lt;h2 id="五用-pm2-启动-twikoo"&gt;五、用 PM2 启动 Twikoo
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /www/wwwroot/twikoo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MONGODB_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mongodb://127.0.0.1:27017/twikoo&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;TWIKOO_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pm2 start node_modules/tkserver/server.js --name twikoo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pm2 save
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看运行状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pm2 list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pm2 logs twikoo --lines &lt;span class="m"&gt;20&lt;/span&gt; --nostream
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日志中应该能看到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Twikoo: Twikoo is using mongo database
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Twikoo: Twikoo function started on host :: port 8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;本地验证：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://127.0.0.1:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;期望返回：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Twikoo 云函数运行正常...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.7.14&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没起来，多半是以下几种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node 版本过低（低于 16），升级即可&lt;/li&gt;
&lt;li&gt;忘了 &lt;code&gt;cd /www/wwwroot/twikoo&lt;/code&gt; 就装的包，导致 &lt;code&gt;node_modules&lt;/code&gt; 装在别处&lt;/li&gt;
&lt;li&gt;MongoDB 服务没启动，&lt;code&gt;systemctl status mongod&lt;/code&gt; 查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六开放端口"&gt;六、开放端口
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;curl http://127.0.0.1:8080&lt;/code&gt; 通了，不代表公网就通了。要让外部能访问，需要&lt;strong&gt;三层&lt;/strong&gt;放行：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 阿里云 / 腾讯云安全组&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在云控制台的实例安全组入方向规则中，放行 TCP &lt;code&gt;8080&lt;/code&gt;。这一步最容易被忽略，也是最常见的踩坑点。
&lt;img alt="安全组" class="gallery-image" data-flex-basis="2613px" data-flex-grow="1088" height="80" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://withlia.cn/p/baota-deploy-twikoo/2.jpg" srcset="https://withlia.cn/p/baota-deploy-twikoo/2_hu_a9f0e6ae7dfb4379.jpg 800w, https://withlia.cn/p/baota-deploy-twikoo/2.jpg 871w" width="871"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 宝塔面板安全&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;宝塔 → 安全 → 添加放行端口 &lt;code&gt;8080&lt;/code&gt;。
&lt;img alt="安全" class="gallery-image" data-flex-basis="764px" data-flex-grow="318" height="384" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://withlia.cn/p/baota-deploy-twikoo/3.jpg" srcset="https://withlia.cn/p/baota-deploy-twikoo/3_hu_ca7d40a408365169.jpg 800w, https://withlia.cn/p/baota-deploy-twikoo/3.jpg 1223w" width="1223"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 系统防火墙 firewalld&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在服务器上执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewall-cmd --list-ports
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没看到 &lt;code&gt;8080/tcp&lt;/code&gt;，执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewall-cmd --permanent --add-port&lt;span class="o"&gt;=&lt;/span&gt;8080/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三层都放行后，浏览器打开 &lt;code&gt;http://你的公网IP:8080&lt;/code&gt;，看到 Twikoo 的 JSON 就成功了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-JSON" data-lang="JSON"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Twikoo 云函数运行正常，请参考 https://twikoo.js.org/frontend.html 完成前端的配置&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.7.14&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="七可选绑定域名--反向代理"&gt;七、（可选）绑定域名 + 反向代理
&lt;/h2&gt;&lt;p&gt;如果只用 IP + 端口方式使用，可以跳过本节。但如果你的博客是 HTTPS 站点，浏览器会拦截 HTTP 的 Twikoo 请求（混合内容），所以建议绑定域名并配置 HTTPS。&lt;/p&gt;
&lt;h3 id="1-域名解析"&gt;1. 域名解析
&lt;/h3&gt;&lt;p&gt;在你的&lt;a class="link" href="https://dnsnext.console.aliyun.com/authoritative/domains" target="_blank" rel="noopener"
 &gt;域名 DNS 控制台&lt;/a&gt;点击解析设置，添加一条 A 记录：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;类型&lt;/th&gt;
 &lt;th&gt;主机记录&lt;/th&gt;
 &lt;th&gt;记录值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;twikoo&lt;/td&gt;
 &lt;td&gt;你的服务器公网 IP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2-阿里云接入备案国内服务器必做"&gt;2. 阿里云接入备案（国内服务器必做）
&lt;/h3&gt;&lt;p&gt;如果服务器在国内（如阿里云），即便主域名已经 ICP 备案，新添加的子域名仍需要在服务器厂商侧完成&amp;quot;接入备案&amp;quot;。否则访问会被厂商网关拦截，页面提示 &lt;strong&gt;&amp;ldquo;该域名当前备案状态不符合访问要求&amp;rdquo;&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里云：控制台 → 备案 → 新增接入&lt;/li&gt;
&lt;li&gt;腾讯云：控制台 → 网站备案 → 补充备案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;审核大概 1~3 个工作日。若急用，可以先按第六节的 IP + 端口方式使用。&lt;/p&gt;
&lt;h3 id="3-宝塔添加站点"&gt;3. 宝塔添加站点
&lt;/h3&gt;&lt;p&gt;宝塔 → 网站 → 添加站点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;域名：&lt;code&gt;twikoo.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PHP 版本：&lt;strong&gt;纯静态&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-反向代理"&gt;4. 反向代理
&lt;/h3&gt;&lt;p&gt;打开该站点 → 设置 → 反向代理 → 添加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标 URL：&lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发送域名：&lt;code&gt;$host&lt;/code&gt;
&lt;img alt="反向代理" class="gallery-image" data-flex-basis="279px" data-flex-grow="116" height="711" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://withlia.cn/p/baota-deploy-twikoo/4.jpg" srcset="https://withlia.cn/p/baota-deploy-twikoo/4_hu_75200d2f086e2609.jpg 800w, https://withlia.cn/p/baota-deploy-twikoo/4.jpg 827w" width="827"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-ssl-证书"&gt;5. SSL 证书
&lt;/h3&gt;&lt;p&gt;站点设置 → SSL → Let&amp;rsquo;s Encrypt，勾选域名一键申请，成功后开启&amp;quot;强制 HTTPS&amp;quot;。(建议去阿里云做这个)&lt;/p&gt;
&lt;h3 id="6-验证"&gt;6. 验证
&lt;/h3&gt;&lt;p&gt;浏览器打开 &lt;code&gt;https://twikoo.example.com&lt;/code&gt;，看到 Twikoo 的 JSON 即可。&lt;/p&gt;
&lt;h2 id="八hugo-博客接入"&gt;八、Hugo 博客接入
&lt;/h2&gt;&lt;p&gt;以 &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener"
 &gt;hugo-theme-stack&lt;/a&gt; 主题为例（主题内置了 Twikoo 支持）。修改 &lt;code&gt;config/_default/params.toml&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;twikoo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;twikoo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;envId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://twikoo.example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lang&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zh-CN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;envId&lt;/code&gt; 填的就是你上面得到的地址：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用域名：&lt;code&gt;https://twikoo.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 IP：&lt;code&gt;http://47.x.x.x:8080&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;region&lt;/code&gt; 只有腾讯云 CloudBase 部署时需要填，私有部署留空即可。&lt;/p&gt;
&lt;p&gt;本地预览：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;打开任一文章页拉到底部，能看到 Twikoo 评论框就成功了。首次访问会提示设置管理员密码，设置好后点击评论框右上角齿轮图标即可进入后台，管理评论、配置邮箱通知、开启防垃圾评论等。&lt;/p&gt;
&lt;h2 id="九常见问题"&gt;九、常见问题
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q: &lt;code&gt;curl http://127.0.0.1:8080&lt;/code&gt; 能通，但外网 IP:8080 无法访问&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;99% 是端口没放行。按第六节逐层排查（云安全组 → 宝塔安全 → firewalld）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 浏览器控制台报 &lt;code&gt;Mixed Content&lt;/code&gt; 错误&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;博客是 HTTPS 但 Twikoo 是 HTTP。要么给博客降级为 HTTP（不推荐），要么给 Twikoo 上 HTTPS（第七节）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: PM2 状态一直是 &lt;code&gt;errored&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pm2 logs twikoo --lines 50 --nostream&lt;/code&gt; 看具体报错。常见的是入口文件路径写错，或 Node 版本过低。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 评论无法发出，一直转圈&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前端 F12 打开控制台看请求是否 500 / CORS 报错&lt;/li&gt;
&lt;li&gt;检查 Twikoo 后端能否连上 MongoDB（&lt;code&gt;pm2 logs twikoo&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="十参考资料"&gt;十、参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://twikoo.js.org/" target="_blank" rel="noopener"
 &gt;Twikoo 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://twikoo.js.org/quick-start.html#%e7%a7%81%e6%9c%89%e9%83%a8%e7%bd%b2" target="_blank" rel="noopener"
 &gt;tkserver 私有部署&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stack.jimmycai.com/config/comments" target="_blank" rel="noopener"
 &gt;hugo-theme-stack 评论配置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，一个完全属于自己的评论系统就搭好了。数据在自己手里，速度也不错，唯一缺点就是要自己扛服务器稳定性 ——不过既然都自建博客了，这点应该也是乐趣的一部分吧。&lt;/p&gt;</description></item></channel></rss>