[{"content":"欢迎来到 Hugo Stack 主题。这是你的第一篇文章。你可以编辑或删除它，然后开始你的写作旅程！\n关于本主题的更多信息，请查看文档：https://stack.jimmycai.com/\n想要拥有一个类似的站点吗？请查看 hugo-theme-stack-stater\n封面图片由 Pawel Czerwinski 拍摄，发布于 Unsplash\n","date":"2022-03-06T00:00:00Z","image":"/p/hello-world/cover.jpg","permalink":"/p/hello-world/","title":"你好，世界"},{"content":"给静态博客(Hugo / Hexo / VuePress 等)接入评论系统时，Twikoo 是一个非常轻量、好看、易用的选择。官方推荐的部署方式有 Vercel、腾讯云 CloudBase 等，但如果你已经有一台自己的服务器并安装了宝塔面板，其实可以完全私有部署，数据 100% 在自己手里，也不受海外网络波动影响。 官方也有开始入门教程\n本文记录一次从零开始，在宝塔面板上部署 Twikoo 后端服务，并接入到 Hugo 博客的完整过程。\n一、准备工作 一台已安装宝塔面板的 Linux 服务器（本文使用 CentOS 7 + 宝塔 7.x） 服务器公网 IP 一个，或已备案的域名一个（可选，若使用国内厂商服务器，绑定域名需完成 ICP 备案 + 厂商接入备案），我自己使用的是阿里云的服务器，也是从阿里云买的域名。其实不建议选择.cn 的域名，因为备案太久了，所以不建议使用(因为我买的.cn 域名备案时间太长了)。 已完成 ICP 备案的域名一个（可选，不用域名也能跑起来） 二、安装依赖 在宝塔\u0026quot;软件商店\u0026quot;中依次安装以下软件：\n软件 说明 Node.js 版本管理器 用于运行 Twikoo 服务，安装 Node.js 18.x（推荐） MongoDB Twikoo 的数据存储，安装 4.x 或 5.x 均可 PM2 管理器 用来守护 Node 进程 Nginx 反向代理（宝塔默认已装） Node.js 安装完成后，进入 Node.js 版本管理器 → 版本管理，把某个版本设为默认，然后重开终端确认：\n1 2 node -v npm -v 若在 SSH 中 npm: command not found，可以做个软链：\n1 2 3 4 ls /www/server/nodejs/ # 假设装的是 v18.19.0 ln -sf /www/server/nodejs/v18.19.0/bin/node /usr/bin/node ln -sf /www/server/nodejs/v18.19.0/bin/npm /usr/bin/npm 三、创建 MongoDB 数据库 宝塔 → 数据库 → MongoDB → 添加数据库：\n数据库名：twikoo 添加至：本地服务器 (127.0.0.1) 因为 MongoDB 默认只监听 127.0.0.1，外网连不到，同一台服务器上的 Twikoo 直接连即可，可以不开启认证。连接串是：\n1 mongodb://127.0.0.1:27017/twikoo 如果要开启密码认证，需要在 MongoDB 配置里设置 security.authorization: enabled，然后重启服务，再回到宝塔数据库列表点\u0026quot;改密\u0026quot;。本文选择本机不认证的方式，简单省事。\n四、部署 tkserver Twikoo 的私有部署包名叫 tkserver，直接用 npm 安装。\n1 2 3 4 mkdir -p /www/wwwroot/twikoo cd /www/wwwroot/twikoo npm init -y npm install tkserver --registry=https://registry.npmmirror.com 安装完成后，先看一下入口文件：\n1 cat node_modules/tkserver/package.json | grep -E \u0026#39;\u0026#34;(main|version)\u0026#34;\u0026#39; 新版 tkserver（本文时 1.7.14）的入口是 server.js，本身就是一个完整的启动脚本，会读取 MONGODB_URI、TWIKOO_PORT 等环境变量后自启监听。所以我们不需要再包一层 index.js，直接用 PM2 拉起它即可。\n五、用 PM2 启动 Twikoo 1 2 3 4 cd /www/wwwroot/twikoo MONGODB_URI=\u0026#34;mongodb://127.0.0.1:27017/twikoo\u0026#34; TWIKOO_PORT=8080 \\ pm2 start node_modules/tkserver/server.js --name twikoo pm2 save 查看运行状态：\n1 2 pm2 list pm2 logs twikoo --lines 20 --nostream 日志中应该能看到：\n1 2 Twikoo: Twikoo is using mongo database Twikoo: Twikoo function started on host :: port 8080 本地验证：\n1 curl http://127.0.0.1:8080 期望返回：\n1 {\u0026#34;code\u0026#34;:100,\u0026#34;message\u0026#34;:\u0026#34;Twikoo 云函数运行正常...\u0026#34;,\u0026#34;version\u0026#34;:\u0026#34;1.7.14\u0026#34;} 如果没起来，多半是以下几种情况：\nNode 版本过低（低于 16），升级即可 忘了 cd /www/wwwroot/twikoo 就装的包，导致 node_modules 装在别处 MongoDB 服务没启动，systemctl status mongod 查看 六、开放端口 curl http://127.0.0.1:8080 通了，不代表公网就通了。要让外部能访问，需要三层放行：\n1. 阿里云 / 腾讯云安全组\n在云控制台的实例安全组入方向规则中，放行 TCP 8080。这一步最容易被忽略，也是最常见的踩坑点。 2. 宝塔面板安全\n宝塔 → 安全 → 添加放行端口 8080。 3. 系统防火墙 firewalld\n在服务器上执行：\n1 firewall-cmd --list-ports 如果没看到 8080/tcp，执行：\n1 2 firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload 三层都放行后，浏览器打开 http://你的公网IP:8080，看到 Twikoo 的 JSON 就成功了。\n1 {\u0026#34;code\u0026#34;:100,\u0026#34;message\u0026#34;:\u0026#34;Twikoo 云函数运行正常，请参考 https://twikoo.js.org/frontend.html 完成前端的配置\u0026#34;,\u0026#34;version\u0026#34;:\u0026#34;1.7.14\u0026#34;} 七、（可选）绑定域名 + 反向代理 如果只用 IP + 端口方式使用，可以跳过本节。但如果你的博客是 HTTPS 站点，浏览器会拦截 HTTP 的 Twikoo 请求（混合内容），所以建议绑定域名并配置 HTTPS。\n1. 域名解析 在你的域名 DNS 控制台点击解析设置，添加一条 A 记录：\n类型 主机记录 记录值 A twikoo 你的服务器公网 IP 2. 阿里云接入备案（国内服务器必做） 如果服务器在国内（如阿里云），即便主域名已经 ICP 备案，新添加的子域名仍需要在服务器厂商侧完成\u0026quot;接入备案\u0026quot;。否则访问会被厂商网关拦截，页面提示 \u0026ldquo;该域名当前备案状态不符合访问要求\u0026rdquo;。\n阿里云：控制台 → 备案 → 新增接入 腾讯云：控制台 → 网站备案 → 补充备案 审核大概 1~3 个工作日。若急用，可以先按第六节的 IP + 端口方式使用。\n3. 宝塔添加站点 宝塔 → 网站 → 添加站点：\n域名：twikoo.example.com PHP 版本：纯静态 4. 反向代理 打开该站点 → 设置 → 反向代理 → 添加：\n目标 URL：http://127.0.0.1:8080 发送域名：$host 5. SSL 证书 站点设置 → SSL → Let\u0026rsquo;s Encrypt，勾选域名一键申请，成功后开启\u0026quot;强制 HTTPS\u0026quot;。(建议去阿里云做这个)\n6. 验证 浏览器打开 https://twikoo.example.com，看到 Twikoo 的 JSON 即可。\n八、Hugo 博客接入 以 hugo-theme-stack 主题为例（主题内置了 Twikoo 支持）。修改 config/_default/params.toml：\n1 2 3 4 5 6 7 8 9 [comments] enabled = true provider = \u0026#34;twikoo\u0026#34; [comments.twikoo] envId = \u0026#34;https://twikoo.example.com\u0026#34; region = \u0026#34;\u0026#34; path = \u0026#34;\u0026#34; lang = \u0026#34;zh-CN\u0026#34; envId 填的就是你上面得到的地址：\n使用域名：https://twikoo.example.com 使用 IP：http://47.x.x.x:8080 region 只有腾讯云 CloudBase 部署时需要填，私有部署留空即可。\n本地预览：\n1 hugo server 打开任一文章页拉到底部，能看到 Twikoo 评论框就成功了。首次访问会提示设置管理员密码，设置好后点击评论框右上角齿轮图标即可进入后台，管理评论、配置邮箱通知、开启防垃圾评论等。\n九、常见问题 Q: curl http://127.0.0.1:8080 能通，但外网 IP:8080 无法访问\n99% 是端口没放行。按第六节逐层排查（云安全组 → 宝塔安全 → firewalld）。\nQ: 浏览器控制台报 Mixed Content 错误\n博客是 HTTPS 但 Twikoo 是 HTTP。要么给博客降级为 HTTP（不推荐），要么给 Twikoo 上 HTTPS（第七节）。\nQ: PM2 状态一直是 errored\npm2 logs twikoo --lines 50 --nostream 看具体报错。常见的是入口文件路径写错，或 Node 版本过低。\nQ: 评论无法发出，一直转圈\n前端 F12 打开控制台看请求是否 500 / CORS 报错 检查 Twikoo 后端能否连上 MongoDB（pm2 logs twikoo） 十、参考资料 Twikoo 官方文档 tkserver 私有部署 hugo-theme-stack 评论配置 至此，一个完全属于自己的评论系统就搭好了。数据在自己手里，速度也不错，唯一缺点就是要自己扛服务器稳定性 ——不过既然都自建博客了，这点应该也是乐趣的一部分吧。\n","date":"2026-07-09T00:00:00+08:00","image":"/p/baota-deploy-twikoo/0.png","permalink":"/p/baota-deploy-twikoo/","title":"使用宝塔面板私有部署 Twikoo 评论系统"},{"content":"本笔记基于 框框老师 的《概率论与数理统计》4 小时速成课整理，每一节配一张手写笔记图，方便快速回顾。\n视频原址：https://www.bilibili.com/video/BV168411Z7pf/\n第一章：随机事件及其概率（一） 第一章：随机事件及其概率（二） 第二章：一维随机变量及其分布（一） 第二章：一维随机变量及其分布（二） 第三章：二维随机变量及其分布 第四章：随机变量的数字特征 第五、六章：中心极限定理与数理统计基本概念 第七章：参数估计 ","date":"2026-07-08T20:44:55+08:00","image":"/p/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/0.png","permalink":"/p/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/","title":"概率论与数理统计"},{"content":"本文提供了可以在 Hugo 内容文件中使用的基本 Markdown 语法示例，同时也展示了 Hugo 主题中基本 HTML 元素是否被 CSS 样式装饰。\n标题 以下 HTML \u0026lt;h1\u0026gt;—\u0026lt;h6\u0026gt; 元素代表六个级别的章节标题。\u0026lt;h1\u0026gt; 是最高级别，\u0026lt;h6\u0026gt; 是最低级别。\n一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.\nItatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.\n引用块 blockquote 元素代表引自其他来源的内容，可选择性地附上引用来源（该来源必须位于 footer 或 cite 元素中），也可以包含行内的注释与缩写等修改。\n无来源署名的引用 Tiam, ad mint andaepu dandae nostion secatur sequo quae. 注意 你可以在引用块内使用 Markdown 语法。\n附有来源的引用 不要通过共享内存来通信，而要通过通信来共享内存。\n— Rob Pike1\n表格 表格并不是 Markdown 核心规范的一部分，但 Hugo 开箱即用地支持它们。\n姓名 年龄 Bob 27 Alice 23 表格内的行内 Markdown 斜体 粗体 代码 italics bold code A B C D E F Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ultricies, sapien non euismod aliquam, dui ligula tincidunt odio, at accumsan nulla sapien eget ex. Proin eleifend dictum ipsum, non euismod ipsum pulvinar et. Vivamus sollicitudin, quam in pulvinar aliquam, metus elit pretium purus Proin sit amet velit nec enim imperdiet vehicula. Ut bibendum vestibulum quam, eu egestas turpis gravida nec Sed scelerisque nec turpis vel viverra. Vivamus vitae pretium sapien 代码块 使用反引号的代码块 1 2 3 4 5 6 7 8 9 10 \u0026lt;!doctype html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt; \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 使用四个空格缩进的代码块 \u0026lt;!doctype html\u0026gt; \u0026lt;html lang=\u0026quot;en\u0026quot;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026quot;utf-8\u0026quot;\u0026gt; \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; Diff 代码块 1 2 3 4 5 [dependencies.bevy] git = \u0026#34;https://github.com/bevyengine/bevy\u0026#34; rev = \u0026#34;11f52b8c72fc3a568e8bb4a4cd1f3eb025ac2e13\u0026#34; - features = [\u0026#34;dynamic\u0026#34;] + features = [\u0026#34;jpeg\u0026#34;, \u0026#34;dynamic\u0026#34;] 单行代码块 1 \u0026lt;p\u0026gt;A paragraph\u0026lt;/p\u0026gt; 列表类型 有序列表 第一项 第二项 第三项 无序列表 列表项 另一项 再一项 嵌套列表 水果 苹果 橙子 香蕉 乳制品 牛奶 奶酪 其他元素 —— abbr、sub、sup、kbd、mark GIF 是一种位图图像格式。\nH2O\nXn + Yn = Zn\n按 CTRL + ALT + Delete 结束会话。\n大多数 蝾螈 是夜行性动物，捕食昆虫、蠕虫及其他小型生物。\n以上引用摘自 Rob Pike 在 2015 年 11 月 18 日 Gopherfest 上的 演讲。\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-09-07T00:00:00Z","image":"/p/markdown-%E8%AF%AD%E6%B3%95%E6%8C%87%E5%8D%97/cover.jpg","permalink":"/p/markdown-%E8%AF%AD%E6%B3%95%E6%8C%87%E5%8D%97/","title":"Markdown 语法指南"},{"content":"Hugo Stack 主题支持使用 Markdown 创建交互式图片画廊。它由 PhotoSwipe 驱动，语法灵感来自 Typlog。\n要使用此功能，图片必须与 Markdown 文件位于同一目录中，因为它使用 Hugo 的页面包（Page Bundle）功能来读取图片尺寸。不支持外部图片。\n语法 1 ![图片 1](1.jpg) ![图片 2](2.jpg) 效果 图片由 mymind 和 Luke Chesser 拍摄，发布于 Unsplash\n","date":"2023-08-26T00:00:00Z","image":"/p/%E5%9B%BE%E7%89%87%E7%94%BB%E5%BB%8A/2.jpg","permalink":"/p/%E5%9B%BE%E7%89%87%E7%94%BB%E5%BB%8A/","title":"图片画廊"},{"content":"更多详细信息，请查看 官方文档。\n哔哩哔哩视频 腾讯视频 YouTube 视频 通用视频文件 Your browser doesn't support HTML5 video. Here is a link to the video instead. GitLab 引用 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n― 某位名人, 他们写的书 封面图片由 Codioful 拍摄，发布于 Unsplash\n","date":"2023-08-25T00:00:00Z","image":"/p/%E7%9F%AD%E4%BB%A3%E7%A0%81-shortcodes/cover.jpg","permalink":"/p/%E7%9F%AD%E4%BB%A3%E7%A0%81-shortcodes/","title":"短代码 Shortcodes"},{"content":"Stack 主题内置支持使用 KaTeX 进行数学公式排版。\n该功能默认未在站点范围内启用，但你可以为单篇文章启用它，只需在 front matter 中添加 math: true。你也可以通过在 config.toml 的 params.article 部分添加 math = true 来在整个站点启用。\n行内公式 这是一个行内数学表达式：$\\varphi = \\dfrac{1+\\sqrt5}{2}= 1.6180339887…$\n1 $\\varphi = \\dfrac{1+\\sqrt5}{2}= 1.6180339887…$ 块级公式 $$ \\varphi = 1+\\frac{1} {1+\\frac{1} {1+\\frac{1} {1+\\cdots} } } $$ 1 2 3 $$ \\varphi = 1+\\frac{1} {1+\\frac{1} {1+\\frac{1} {1+\\cdots} } } $$ $$ f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi $$ 1 2 3 $$ f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi $$ ","date":"2023-08-24T00:00:00Z","image":"/p/%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F%E6%8E%92%E7%89%88/cover.jpg","permalink":"/p/%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F%E6%8E%92%E7%89%88/","title":"数学公式排版"}]