Docker部署Waline评论系统 (SQLite版)

1031 字
5 分钟
Docker部署Waline评论系统 (SQLite版)
2026-01-17
浏览量 加载中...

最近为了给博客增加评论功能,折腾了一下 Waline。虽然官方文档很全,但在实际的 Docker + SQLite + Cloudflare Tunnel 架构下,还是踩了不少坑。

特别是“数据库文件 0kb”和“无限密码错误”这两个问题,花了不少时间排查。这里记录一下完整的部署流程和避坑经验。

1. 为什么选择 Self-Hosted (Docker + SQLite)?#

虽然 Waline 提供了 Vercel 免费部署方案,但我最终选择了在自己的 Ubuntu 服务器上用 Docker 部署,原因有三:

  1. 响应速度:Vercel 免费版有冷启动延迟(3-5秒),而 Docker 常驻内存是毫秒级响应。
  2. 数据掌控:数据就在本地的一个 .sqlite 文件里,备份迁移极其方便,不用担心云服务商改政策。
  3. 隐私安全:所有数据都在自己的服务器闭环,不经过第三方。

2. 核心配置:Docker Compose#

这是经过修正后,完全可用的 docker-compose.yml。

目录结构#

Terminal window
~/docker/waline/
├── docker-compose.yml
└── data/ # 自动挂载的数据目录

配置文件 (docker-compose.yml)#

version: '3'
services:
waline:
image: lizheming/waline:latest
container_name: waline
restart: always
ports:
- "8360:8360"
volumes:
# 挂载数据目录
- ./data:/app/data
environment:
# --- 数据库配置 (关键点) ---
- SQLITE_PATH=/app/data/
# --- 安全配置 ---
# 建议使用单引号,防止特殊字符(如%)被Shell误读
- JWT_TOKEN='Your_Long_Secure_Random_String_2026'
# --- 基础配置 ---
- TZ=Asia/Tokyo
# 安全域名白名单
# 只有来自这些域名的请求才会被允许,其他域名引用会报错
- SECURE_DOMAINS=blog.jcaonet.com,localhost,127.0.0.1

注意:启动命令为 docker-compose up -d。

3. 实战避坑:我遇到的那些奇葩问题#

坑位一:生成的 waline.sqlite 是 0kb,无法写入表#

现象: 容器启动看似正常,但查看日志报错 SQLITE_ERROR: no such table: wl_Comment。检查本地 data 目录,发现 waline.sqlite 文件大小为 0kb。 问AI,结果AI一直在说是数据库文件必须指定到具体的文件名,不能只写目录!【SQLITE_PATH=/app/data/waline.sqlite】

原因: 被AI坑的极为惨烈,照着AI做的话 无论如何都是会生成一个【waline.sqlite】文件夹 而不是文件。

解决方法:

  1. 删除坏文件:手动删除那个 0kb 的文件或者文件夹。
    Terminal window
    sudo rm data/waline.sqlite
    docker-compose down && docker-compose up -d
  2. 下载文件:必须直接去https://github.com/walinejs/waline/blob/main/assets/waline.sqlite下载waline.sqlite文件 放入SQLITE_PATH里面

坑位二:换个网络/电脑登录,提示“密码错误”#

现象: 在公司电脑注册好管理员账号,回家用家里电脑登录,死活提示密码错误。Waline 并没有 IP 锁定的功能,这很不科学。

原因:

  1. JWT_TOKEN里面写了个【%】,特殊字符可能每次解析的结果不一致。
  2. 如果在 docker-compose.yml 里变量名写错(或者没写死),Waline 每次重启或在不同环境下可能会生成临时的 Key。
  3. Key 变了,密码的哈希值就对不上了。

解决方法: 确保JWT_TOKEN其值是一个固定的、用单引号包裹的字符串(防止 YAML 解析特殊字符)。


坑位三:403 Forbidden 与 Cloudflare 页面规则#

现象: 由于使用了 Cloudflare Tunnel,为了防止别人直接访问后端首页,我在 Cloudflare 设置了页面重定向规则。结果导致博客前端发评论、更新头像时报 403 Forbidden。

原因: 我的规则写成了 XXX.com*(带了星号),这把 API 请求(/api/comment)也给拦截重定向了。

正确的 Cloudflare Page Rule:

  • URL: XXX.com/ (注意末尾斜杠,且不要加星号)
  • Setting: Forwarding URL (301) -> https://blog.jcaonet.com/

坑位四:头像显示 “React blocked…” 或裂图#

现象: 在个人资料里填入本地路径 /home/jcao/images/me.jpg,报错被拦截;填入 Pixiv 外链,显示裂图 (403)。

原因:

  1. 浏览器处于安全考虑,禁止网页直接读取本地硬盘文件。
  2. Pixiv 等网站有防盗链机制,不允许第三方网站引用图片。

解决方法: 将头像放在博客项目的 public/assets 目录下,部署后使用博客的公网 URL。

4. 总结#

虽然折腾了一下午,如果你也遇到了 0kb 数据库或者 403 报错,希望这篇文章能帮你节省几个小时的调试时间。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

最后更新于 2026-01-17,距今已过 272 天

部分内容可能已过时

评论区

Profile Image of the Author
加菲魚
堆内存中的一个持久化对象。
分类
标签
站点统计
文章
23
分类
5
标签
16
总字数
27,576
访问量
...
访客数
...
运行时长
0 天
最后活动
0 天前

目录