在 NAS 本地用 Docker 部署 Artalk 并接入 Hexo 博客的 NexT 主题中
前言
这篇文章记录我如何把评论系统 Artalk 跑在家用 NAS 的 Docker 中,不开公网端口,借助 Cloudflare Tunnel 让公网域名(HTTPS)直达内网服务,最后在 Hexo 的 NexT 主题中一键启用评论。全过程覆盖:部署、联通、主题集成、常见坑与优化。
适用读者:习惯自建的博客站长、希望掌控数据与隐私、家庭宽带或公司网络无法放行 80/443 的情况。
架构与思路
1 | [浏览器] |
- 不开放家里路由器端口,所有入站流量由 Cloudflare 边缘网关“反拨”到内网。
- Tunnel 可按主机名分发到不同内网服务:例如
talk.example.com→ Artalk,alist.example.com→Alist。 - Artalk 后端建议使用 SQLite 入门,后续可平滑迁移到 MySQL/PostgreSQL。
前置条件与工具
- 一个已接入 Cloudflare 的域名(可免费)
- NAS 一台(x86/ARM 均可),已安装 Docker(Compose 可选)
- Cloudflare Tunnel 客户端:cloudflared(用 Docker 运行即可)
- Hexo + NexT 主题的博客仓库(本文即以本站为例)
参考链接:
- Cloudflare Tunnel 文档(官方):https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/
- Artalk 文档(官方):https://artalk.js.org/
- NexT 文档(Artalk 部分,主题集成):https://theme-next.js.org/
在 NAS 上通过 Docker 部署 Artalk(精简方案)
只需要一个 Compose 文件即可:
1 | version: '3.8' |
安全小贴士:首次以环境变量创建管理员后,建议将密码从 Compose 中移除并为账号更换新密码,避免明文泄露;ATK_TRUSTED_DOMAINS 请包含你的评论服务域名和博客访问域名以及本地测试地址,中间用空格隔开,以通过跨域校验。
启动:
1 | docker compose up -d |
启动后,内网访问 http://NAS_IP:8080 检查 Artalk 是否工作正常。
用 Cloudflare Tunnel 把内网服务暴露到公网
这里采用 Token 方式(最简单),不需要为 cloudflared 写 Compose:
1)打开 Cloudflare Dashboard(Zero Trust):https://one.dash.cloudflare.com
2)导航:网络 → Tunnels → 创建隧道 → 选择 Cloudflared → 平台选择 Docker,复制安装命令(命令中带有 Token)。
3)在 NAS 上通过SSH以root身份执行此命令。
4)在 Cloudflare 的 Tunnels → Public Hostnames 中新增主机名:
artalk.your-domain.com→ 服务填写http://NAS_IP:8080
片刻后即可通过 https://artalk.your-domain.com 访问,无需在路由器上暴露任何端口。
在 NexT 主题中启用 Artalk(使用 hexo-next-artalk 插件)
我使用 hexo-next-artalk 插件来对接 NexT,步骤如下:
1)在博客根目录安装插件:
1 | npm i hexo-next-artalk --save |
2)在站点根目录编辑 /_config.next.yml(或你的 NexT 配置入口),加入插件配置:
1 | # Artalk Config File |
3)生成并预览:
1 | hexo clean; hexo g; hexo s |
若页面已出现评论框但网络请求报错,请核对 ATK_TRUSTED_DOMAINS 是否同时包含博客域名与评论服务域名。
常见问题与排错
- 无法从公网访问,但本地正常:
- 检查 Tunnel 状态是否
HEALTHY; - 在 Tunnels → Public Hostnames 中的服务目标请填写
http://NAS_IP:8080(因为我们将容器端口映射到了宿主 8080); - 若 cloudflared 用 Docker 运行且未加入与 Artalk 相同网络,建议使用宿主机 IP + 暴露端口,而非容器名。
- 检查 Tunnel 状态是否
- NexT 已开启却不显示评论:
- 清缓存
hexo clean再生成; - 确认已安装
hexo-next-artalk插件,并在配置中artalk.enable: true且server指向正确域名; - 浏览器控制台是否报跨域(CORS):在 Artalk 后端的
ATK_TRUSTED_DOMAINS包含博客域名与评论域名。
- 清缓存
- 管理后台登录/创建管理员:
- 首次访问后台时根据引导创建;若版本需要预设账号,按官方文档设置环境变量或配置文件;
- 若邮件/验证码失败,请在后端正确配置 SMTP / 人机校验服务。
- 数据库选择:
- SQLite 入门足够;高并发或多设备写入建议切换到 MySQL/PostgreSQL,并开启定期备份。
性能与安全优化(可选)
- 开启 Cloudflare 缓存与安全规则:对静态资源与 Artalk JS 做缓存,加上基本 WAF;
- 速率限制(Rate Limit):在 Cloudflare 或反向代理层限制单 IP 评论频率;
- 反垃圾/审核:Artalk 后台开启敏感词、审核工作流,或接入 Akismet 等第三方;
- 备份:
- SQLite:将
data目录纳入 NAS 的快照/备份计划; - MySQL/PG:使用
mysqldump/pg_dump定时任务;
- SQLite:将
- 监控告警:Cloudflared 日志、容器健康检查、评论量异常告警。
一次性速查清单
- 启停 Artalk:
docker compose up -d/docker compose logs -f artalk - 启停 cloudflared:
docker ps/docker logs -f cloudflared - 公网域名:Cloudflare → Zero Trust → Tunnels → Public Hostnames →
artalk.your-domain.com→http://NAS_IP:8080 - NexT 接入:安装
hexo-next-artalk→ 在/_config.next.yml配置artalk块
参考资料
- Artalk 官方文档与镜像说明:https://artalk.js.org/
- Cloudflare Tunnel(cloudflared)官方指南:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/
- NexT 主题官方文档(第三方评论):https://theme-next.js.org/
- hexo-next-artalk 插件仓库:https://github.com/leirock/hexo-next-artalk
- 少数派相关参考文章:https://sspai.com/post/79278
总结
- 在 NAS 上 Docker 跑 Artalk,数据自己掌握;
- 用 Cloudflare Tunnel 安全把内网带到公网,不开路由器端口也能全站 HTTPS;
- NexT 内置适配让前端接入非常顺滑,必要时可用手动注入定制更深。
如步骤中镜像名/键名与你的版本不一致,请以官方文档为准;文中示例已改为“一份 Compose + cloudflared Token 命令”的精简方案。