Docker部署Waline评论系统 (SQLite版)
最近为了给博客增加评论功能,折腾了一下 Waline。虽然官方文档很全,但在实际的 Docker + SQLite + Cloudflare Tunnel 架构下,还是踩了不少坑。
特别是“数据库文件 0kb”和“无限密码错误”这两个问题,花了不少时间排查。这里记录一下完整的部署流程和避坑经验。
1. 为什么选择 Self-Hosted (Docker + SQLite)?
虽然 Waline 提供了 Vercel 免费部署方案,但我最终选择了在自己的 Ubuntu 服务器上用 Docker 部署,原因有三:
- 响应速度:Vercel 免费版有冷启动延迟(3-5秒),而 Docker 常驻内存是毫秒级响应。
- 数据掌控:数据就在本地的一个
.sqlite文件里,备份迁移极其方便,不用担心云服务商改政策。 - 隐私安全:所有数据都在自己的服务器闭环,不经过第三方。
2. 核心配置:Docker Compose
这是经过修正后,完全可用的 docker-compose.yml。
目录结构
~/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】文件夹 而不是文件。
解决方法:
- 删除坏文件:手动删除那个 0kb 的文件或者文件夹。
Terminal window sudo rm data/waline.sqlitedocker-compose down && docker-compose up -d - 下载文件:必须直接去
https://github.com/walinejs/waline/blob/main/assets/waline.sqlite下载waline.sqlite文件 放入SQLITE_PATH里面
坑位二:换个网络/电脑登录,提示“密码错误”
现象: 在公司电脑注册好管理员账号,回家用家里电脑登录,死活提示密码错误。Waline 并没有 IP 锁定的功能,这很不科学。
原因:
- JWT_TOKEN里面写了个【%】,特殊字符可能每次解析的结果不一致。
- 如果在
docker-compose.yml里变量名写错(或者没写死),Waline 每次重启或在不同环境下可能会生成临时的 Key。 - 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)。
原因:
- 浏览器处于安全考虑,禁止网页直接读取本地硬盘文件。
- Pixiv 等网站有防盗链机制,不允许第三方网站引用图片。
解决方法:
将头像放在博客项目的 public/assets 目录下,部署后使用博客的公网 URL。
4. 总结
虽然折腾了一下午,如果你也遇到了 0kb 数据库或者 403 报错,希望这篇文章能帮你节省几个小时的调试时间。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
记忆转储