Vercel 留言板搭建与部署完整教程(Upstash Redis 持久化版)
使用 Upstash Redis 存储留言和图片,冷启动不丢数据。支持头像上传、图片上传、表情选择。
一、功能特性
- ✅ 发布留言(昵称 + 内容 + 表情 + 图片 + 头像)
- ✅ 自定义头像上传(永久保留,下次留言自动使用)
- ✅ 图片上传(存 Redis,90 天过期)
- ✅ 6 大类表情选择器
- ✅ 数据持久化(冷启动不丢)
- ✅ 响应式设计(手机/电脑都能用)
- ✅ 自动刷新(30 秒轮询)
- ✅ 管理员删除留言
二、架构说明
1 | ┌─────────────────────────────────────────────┐ |
为什么用 Upstash Redis 而不是 Vercel Blob?
- Vercel KV 已迁移到 Marketplace,无法通过 API Token 创建
- Vercel Blob 的 BLOB_READ_WRITE_TOKEN 需要手动在 Dashboard 配置
- Upstash Redis 通过 Vercel Marketplace 一键安装,环境变量自动注入
- 图片以 base64 存 Redis,90 天自动过期,无需额外存储服务
三、项目结构
1 | guestbook/ |
四、Vercel 配置步骤
4.1 创建 Upstash Redis 数据库
- 登录 vercel.com/dashboard
- 进入你的项目 → Storage 标签
- 找到 Upstash → 点 Browse 或 Install
- 跳转到 Upstash 页面,创建 Redis 数据库:
- 名称:
guestbook-kv - 区域:选 Asia Pacific (Tokyo) 或最近的区域
- 点 Create
- 名称:
- 回到 Vercel Dashboard → Storage → 找到刚创建的 Redis
- 点 Connect to Project → 选 guestbook → 勾选全部环境 → Connect
注入的环境变量:
1 | KV_REST_API_URL = https://xxx.upstash.io |
4.2 验证环境变量
进入 Settings → Environment Variables,确认以下变量存在:
KV_REST_API_URLKV_REST_API_TOKEN
五、完整源码
5.1 package.json
1 | { |
5.2 api/messages.js
1 | import { Redis } from '@upstash/redis'; |
Redis 操作说明:
redis.lpush(key, value)— 从左侧插入(新留言在前)redis.lrange(key, 0, -1)— 获取全部留言redis.llen(key)— 获取留言总数redis.ltrim(key, 0, N-1)— 只保留前 N 条redis.del(key)— 删除整个列表redis.set(key, value, { ex: seconds })— 设置带过期时间的键值
5.3 api/upload.js
1 | import { Redis } from '@upstash/redis'; |
5.4 api/image.js
1 | import { Redis } from '@upstash/redis'; |
5.5 index.html
1 |
|
5.6 style.css 和 script.js
由于篇幅较长,完整代码请参考项目源文件。关键点:
style.css:
.avatar-upload— 头像上传区域,左侧圆形预览.avatar-preview— 64px 圆形头像,hover 变色.msg-avatar img— 留言卡片里的自定义头像
script.js:
avatarInput监听 change 事件,读取文件转 base64selectedAvatar存储头像数据,提交时一起上传- 头像上传后保留,下次留言自动使用
- 留言列表渲染时,有
avatarUrl显示图片,否则显示首字母
六、部署
6.1 CLI 部署
1 | cd guestbook |
6.2 关联 Git 仓库
1 | git init |
七、API 接口
| 接口 | 方法 | 说明 |
|---|---|---|
/api/messages |
GET | 获取所有留言 |
/api/messages |
POST | 发布新留言 |
/api/messages |
DELETE | 删除留言(管理员) |
/api/upload |
POST | 上传图片/头像 |
/api/image?id=xxx |
GET | 读取图片 |
POST /api/messages 请求体:
1 | { |
POST /api/upload 请求体:
1 | { |
返回:{ "url": "https://xxx/api/image?id=img_xxx.jpg" }
八、免费额度
Upstash Redis Free Plan:
| 资源 | 免费额度 | 说明 |
|---|---|---|
| 命令数 | 10,000 次/天 | 读写都算 |
| 存储 | 256 MB | 约可存 5 万条留言 |
| 带宽 | 无限 | - |
图片以 base64 存储,一张约 100-500KB。256MB 约可存 500-2500 张图片(含留言数据)。
九、常见问题
Q: 环境变量没注入?
A: 在 Vercel Dashboard → Storage → 找到 Redis 数据库 → Connect to Project → 勾选全部环境。
Q: 图片上传报错”不能超过 1MB”?
A: Redis 存 base64 有大小限制。压缩图片后再上传,或调整 api/upload.js 中的 sizeKB > 1024 限制。
Q: 图片过期了怎么办?
A: 默认 90 天过期。可在 api/upload.js 中修改 ex: 7776000(秒数)。
Q: 冷启动后数据还在吗?
A: 在。数据存在 Upstash Redis 云端,不依赖本地内存。
Q: 如何查看 Redis 中的数据?
A: Upstash Dashboard → Data Browser,可以看到所有 key 和值。
Q: 如何清空所有留言?
A: 在 Upstash Data Browser 中删除 guestbook:messages key。
教程作者:彭金涛 | 最后更新:2026-05-04
