在 NAS 本地用 Docker 部署 Artalk 并接入 Hexo 博客的 NexT 主题中

前言

这篇文章记录我如何把评论系统 Artalk 跑在家用 NAS 的 Docker 中,不开公网端口,借助 Cloudflare Tunnel 让公网域名(HTTPS)直达内网服务,最后在 Hexo 的 NexT 主题中一键启用评论。全过程覆盖:部署、联通、主题集成、常见坑与优化。

适用读者:习惯自建的博客站长、希望掌控数据与隐私、家庭宽带或公司网络无法放行 80/443 的情况。

架构与思路

1
2
3
4
5
6
7
[浏览器]
| HTTPS
v
Cloudflare Edge ←→ Cloudflare Tunnel (cloudflared, 运行在 NAS)
|
v
http://NAS_IP:8080 → Artalk (Docker 容器: artalk/artalk-go)
  • 不开放家里路由器端口,所有入站流量由 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 主题的博客仓库(本文即以本站为例)

参考链接:


在 NAS 上通过 Docker 部署 Artalk(精简方案)

只需要一个 Compose 文件即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3.8'
services:
artalk:
container_name: artalk
image: artalk/artalk-go
restart: unless-stopped
ports:
- 8080:23366 # 将容器 23366 暴露到宿主 8080,供 Tunnel 访问
volumes:
- ./data:/data # SQLite 等数据将保存在此目录
environment:
- TZ=Asia/Shanghai
- ATK_LOCALE=zh-CN
- ATK_SITE_DEFAULT=你的站点名
- ATK_SITE_URL=https://你的博客域名
- ATK_TRUSTED_DOMAINS=https://artalk.your-domain.com https://你的博客域名 http://localhost:8080
- ATK_ADMIN_USERS_0_NAME=Admin
- [email protected]
- ATK_ADMIN_USERS_0_PASSWORD=<请替换强密码>
- ATK_ADMIN_USERS_0_BADGE_NAME=作者
- ATK_ADMIN_USERS_0_BADGE_COLOR=#0083FF

安全小贴士:首次以环境变量创建管理员后,建议将密码从 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Artalk Config File
## For more information: https://artalk.js.org

artalk:
enable: true

# Backend server API(你的 Artalk 服务域名)
server: https://artalk.your-domain.com

# Site name(可留空以使用默认站点)
site:

# 前端资源可直接走后端内置的 /dist(也可改为你偏好的 CDN)
jsUrl: https://artalk.your-domain.com/dist/Artalk.js
cssUrl: https://artalk.your-domain.com/dist/Artalk.css

# 统计
pvCount: true
commentCount: true

# 深浅色
darkMode: auto

# 使用后端配置进行集中控制
useBackendConf: true

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 + 暴露端口,而非容器名。
  • NexT 已开启却不显示评论:
    • 清缓存 hexo clean 再生成;
    • 确认已安装 hexo-next-artalk 插件,并在配置中 artalk.enable: trueserver 指向正确域名;
    • 浏览器控制台是否报跨域(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 定时任务;
  • 监控告警: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.comhttp://NAS_IP:8080
  • NexT 接入:安装 hexo-next-artalk → 在 /_config.next.yml 配置 artalk

参考资料


总结

  • 在 NAS 上 Docker 跑 Artalk,数据自己掌握;
  • 用 Cloudflare Tunnel 安全把内网带到公网,不开路由器端口也能全站 HTTPS;
  • NexT 内置适配让前端接入非常顺滑,必要时可用手动注入定制更深。

如步骤中镜像名/键名与你的版本不一致,请以官方文档为准;文中示例已改为“一份 Compose + cloudflared Token 命令”的精简方案。