背景

LeanCloud 官方公告将于 2027 年 1 月 12 日停止对外提供服务。作为 Valine 评论系统的数据存储后端,这意味着所有依赖 LeanCloud 的 Valine 评论数据将面临丢失风险。

我的博客之前使用 Valine + LeanCloud 的组合,必须在此之前完成迁移。经过调研,最终选择了 Waline 作为替代方案。

为什么选择 Waline

Waline 是 Valine 的继任者,主要优势:

  • 数据迁移简单:支持从 LeanCloud 直接导入评论数据
  • 功能更丰富:支持邮件通知、微信通知、垃圾评论过滤、评论管理后台
  • 部署灵活:支持 Vercel、Railway、自建服务器等多种部署方式
  • 兼容 Valine:前端配置几乎一样,迁移成本低
  • 持续维护:活跃的开源社区,定期更新

部署步骤

1. 部署 Waline 到 Vercel

  1. 访问 Waline 官网
  2. 点击「部署到 Vercel」按钮
  3. 授权 Vercel 访问 GitHub
  4. 创建仓库并部署

部署完成后会获得一个 Vercel 域名,如 https://your-project.vercel.app

2. 创建数据库

Waline 需要一个数据库存储评论数据。Vercel 已集成 Neon(PostgreSQL 云数据库),可以直接在 Vercel 中创建:

  1. 在 Vercel 项目中进入 StorageCreate Database
  2. 选择 Neon Postgres
  3. 选择区域(建议选 Singapore 或 Tokyo,延迟较低)
  4. 创建完成后会自动生成环境变量

Neon 免费版提供:

  • 0.5 GB 存储
  • 自动休眠(无访问时暂停,访问时自动唤醒)
  • 足够个人博客使用

3. 配置环境变量

创建 Neon 数据库后,Vercel 会自动注入 DATABASE_URL 环境变量,无需手动配置。

如果需要手动添加,在 Vercel 项目 SettingsEnvironment Variables 中添加:

变量名 说明
DATABASE_URL Neon 连接字符串

配置完成后 Redeploy 项目。

4. 绑定自定义域名(可选)

  1. Vercel 项目 → Settings → Domains
  2. 添加你的域名,如 comments.yourdomain.com
  3. 在域名服务商处添加 CNAME 记录指向 Vercel

5. 修改博客配置

修改 Hexo 的 Butterfly 主题配置文件 _config.butterfly.yml

1
2
3
4
5
6
7
8
9
10
comments:
use:
- Waline

waline:
serverURL: https://comments.yourdomain.com/
avatar: retro
visitor: false
option:
lang: zh-CN

数据迁移

1. 导出 LeanCloud 数据

  1. 登录 LeanCloud 控制台
  2. 选择应用 → 数据存储 → _Comment
  3. 点击「导出数据」→ 选择 JSON 格式

2. 转换数据格式

LeanCloud 导出的数据格式与 Waline 不同,需要转换。可以使用以下脚本:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const fs = require('fs');

const valineFile = 'Comment.0.jsonl';
const outFile = 'waline_import.json';

const raw = fs.readFileSync(valineFile, 'utf8').trim();
const valineArr = raw.split(/\r?\n/).filter(l => l.trim()).map(l => JSON.parse(l));

const idMap = new Map();
valineArr.forEach((v, index) => {
const oldId = v._id ?? v.objectId;
if (oldId) idMap.set(String(oldId), index + 1);
});

const toWalineId = (rawId) => {
if (!rawId) return null;
return idMap.get(String(rawId)) ?? null;
};

const comments = valineArr.map((v, index) => ({
user_id: null,
comment: v.comment || '',
ip: v.ip || '',
link: v.link || '',
mail: v.mail || '',
nick: v.nick || '匿名',
pid: toWalineId(v.pid),
rid: toWalineId(v.rid),
status: 'approved',
ua: v.ua || '',
url: v.url || '',
objectId: index + 1,
insertedAt: v.insertedAt?.$date || v.createdAt,
createdAt: v.createdAt,
updatedAt: v.updatedAt || v.createdAt
}));

const walineExport = {
__version: '1.39.3',
type: 'waline',
version: 1,
time: Date.now(),
tables: ['Comment', 'Counter', 'Users'],
data: {
Comment: comments,
Counter: [],
Users: []
}
};

fs.writeFileSync(outFile, JSON.stringify(walineExport, null, 2));
console.log(`转换完成: ${comments.length} 条评论`);

运行脚本:

1
node convert.js

3. 导入到 Waline

  1. 访问你的 Waline 管理后台:https://comments.yourdomain.com/ui
  2. 首次访问设置管理员账号
  3. 进入「管理」→「导入」
  4. 上传转换后的 waline_import.json 文件

配置邮件通知

Waline 支持评论邮件通知,以 QQ 邮箱为例:

1. 获取授权码

  1. 登录 QQ 邮箱网页版
  2. 设置 → 账户 → POP3/IMAP/SMTP服务
  3. 开启「IMAP/SMTP服务」
  4. 生成授权码

2. 配置环境变量

在 Vercel 中添加:

变量名
SMTP_SERVICE QQ
SMTP_USER 你的QQ邮箱
SMTP_PASS 邮箱授权码(不是密码)
SMTP_SECURE true
SITE_NAME 博客名称
SITE_URL 博客地址
AUTHOR_EMAIL 博主邮箱(接收通知)

配置后 Redeploy 项目即可生效。

总结

从 Valine 迁移到 Waline 的完整流程:

  1. 在 Vercel 部署 Waline 服务
  2. 创建数据库并配置环境变量
  3. 从 LeanCloud 导出评论数据
  4. 转换格式后导入 Waline
  5. 修改博客配置指向新的评论服务
  6. 可选:配置邮件通知和头像

Waline 相比 Valine 功能更完善,社区更活跃,是目前博客评论系统的不错选择。如果你的博客也在使用 Valine + LeanCloud,建议尽早迁移,避免数据丢失。