本文档面向第一次在 Vercel 上部署本项目的操作者,按顺序完成即可。
架构说明:本项目前端(Vite + React)和后端(Express API)合并为一个 Vercel 项目部署。
- 前端:Vite 构建为静态文件 → Vercel 静态托管
- 后端:
api/index.js作为 Vercel Serverless Function 入口 → 自动引用backend/src/app.js中的 Express 应用
在开始之前,请确认你已有:
- GitHub 仓库:
https://github.com/aimenng/gifts---couple-connection(代码已推送到main分支) - Supabase 项目(已获取
SUPABASE_URL和SUPABASE_SERVICE_ROLE_KEY) - JWT 密钥(至少 32 位随机字符串)
- (可选)SMTP 邮箱信息,用于发送验证码邮件
- 打开 https://vercel.com
- 点击右上角 Sign Up(已有账号点 Log In)
- 选择 Continue with GitHub,授权 GitHub 账号登录
-
登录后进入 Vercel Dashboard,点击 Add New → Project
-
在 Import Git Repository 页面,找到仓库
aimenng/gifts---couple-connection如果列表中没有看到该仓库,点击 Adjust GitHub App Permissions → 勾选该仓库 → Save
-
点击仓库右侧的 Import 按钮
进入项目配置页面后,按以下内容填写:
| 配置项 | 填写值 |
|---|---|
| Framework Preset | Vite |
| Root Directory | ./ (默认,不需要修改) |
| Build Command | npm run build |
| Output Directory | dist |
| Install Command | npm install(默认) |
注意:Framework Preset 选择
Vite后,Build Command 和 Output Directory 通常会自动填上正确值,确认无误即可。
在同一个配置页面下方,展开 Environment Variables 区域,逐一添加以下变量:
| 变量名 | 示例值 | 说明 |
|---|---|---|
SUPABASE_URL |
https://xxxxx.supabase.co |
Supabase 项目 URL |
SUPABASE_SERVICE_ROLE_KEY |
eyJhbGciOiJI... |
Supabase Service Role Key(在 Project Settings → API 中) |
JWT_SECRET |
your-random-string-at-least-32-chars |
JWT 签名密钥,至少 32 个字符 |
JWT_EXPIRES_IN |
7d |
Token 过期时间 |
JWT_ISSUER |
gifts-backend |
JWT 签发方标识 |
JWT_AUDIENCE |
gifts-app |
JWT 受众标识 |
添加方式:在 Key 输入框输入变量名 → Value 输入框输入值 → 点击 Add → 重复操作
| 变量名 | 默认值 | 说明 |
|---|---|---|
DEFAULT_TOGETHER_DATE |
2021-10-12 |
在一起的日期 |
BODY_LIMIT |
12mb |
请求体大小限制 |
MAX_IMAGE_BYTES |
10485760 |
单张图片最大 10MB |
PASSWORD_HASH_ROUNDS |
10 |
bcrypt 哈希轮数 |
IMAGE_STORAGE_ENABLED |
true |
启用图片云存储 |
SUPABASE_IMAGE_BUCKET |
gifts-memories |
Supabase Storage Bucket 名 |
SUPABASE_IMAGE_BUCKET_PUBLIC |
false |
Bucket 是否公开 |
IMAGE_SIGNED_URL_TTL_SECONDS |
3600 |
图片签名 URL 有效期(秒) |
| 变量名 | 示例值 | 说明 |
|---|---|---|
SMTP_HOST |
smtp.qq.com |
SMTP 服务器地址 |
SMTP_PORT |
465 |
SMTP 端口 |
SMTP_SECURE |
true |
是否使用 SSL |
SMTP_USER |
your-email@qq.com |
发件人邮箱 |
SMTP_PASS |
your-smtp-auth-code |
SMTP 授权码(非登录密码) |
SMTP_FROM |
Gifts App <your-email@qq.com> |
发件人显示名称 |
- 不需要 添加
VITE_API_BASE_URL。前端代码默认请求/api,由vercel.json路由转发到 Serverless Function,同域名零配置。
所有配置填写完毕后,点击页面底部的 Deploy 按钮。
Vercel 将自动执行:
npm install— 安装所有依赖npm run build— Vite 构建前端到dist/目录- 自动识别
api/index.js作为 Serverless Function - 根据
vercel.json配置路由规则
部署过程约 1-3 分钟,可以在页面上实时查看构建日志。
部署完成后,Vercel 会分配一个域名,如 https://gifts-couple-connection.vercel.app。
在浏览器打开:
https://<你的域名>.vercel.app
应能看到登录/注册页面。
在浏览器打开:
https://<你的域名>.vercel.app/api/health
应返回类似:
{
"ok": true,
"service": "gifts-backend",
"time": "2026-02-11T12:00:00.000Z"
}- 注册新账号(收到验证码邮件)
- 登录成功跳转到主页
- 上传回忆(图片能正常显示)
- 纪念日时间轴正常加载
- 两个账号之间的情侣绑定功能
以下是与 Vercel 部署直接相关的文件:
├── vercel.json ← Vercel 路由配置
├── api/
│ └── index.js ← Serverless Function 入口(引用 backend/src/app.js)
├── backend/
│ └── src/
│ ├── app.js ← Express 应用主体(导出 app 对象)
│ ├── index.js ← 仅用于本地开发的 listen 启动
│ ├── config.js ← 环境变量读取与校验
│ └── routes/ ← API 路由文件
├── vite.config.ts ← Vite 前端构建配置
└── package.json ← 构建脚本和依赖声明
路由规则(vercel.json):
/api和/api/*→ 交给api/index.js(Express Serverless Function)- 静态文件(JS/CSS/图片等)→ 直接从
dist/目录返回 - 其他所有路径 → 返回
index.html(前端 SPA 路由)
代码推送到 GitHub main 分支后,Vercel 会自动触发重新部署,无需手动操作。
git add -A
git commit -m "你的提交说明"
git push origin main- 确认仓库根目录有
api/index.js和vercel.json两个文件 - 在 Vercel Dashboard → 项目 → Functions 选项卡中检查是否识别到
api/index.js
- 进入 Vercel Dashboard → 项目 → Logs 选项卡,查看 Function 运行日志
- 最常见原因:必填环境变量缺失(
SUPABASE_URL、SUPABASE_SERVICE_ROLE_KEY、JWT_SECRET等) - 错误信息类似
Missing required environment variables: XXX
- Vercel 修改环境变量后需要重新部署才会生效
- 进入项目 → Deployments 选项卡 → 点击最近一次部署右侧的
...→ Redeploy
- 检查浏览器控制台是否有 JS 错误
- 确认
Build Command是npm run build,Output Directory是dist - 查看 Vercel 构建日志是否有编译错误
- 确认 Supabase 中已创建名为
gifts-memories的 Storage Bucket - 确认
IMAGE_STORAGE_ENABLED为true - 检查
SUPABASE_SERVICE_ROLE_KEY是否有 Storage 权限
- 确认 SMTP 相关 6 个变量全部填写
- QQ 邮箱需使用授权码(非登录密码),在 QQ 邮箱 → 设置 → 账户 → POP3/SMTP 服务 中生成
- 进入项目 → Settings → Domains → 添加你的域名
- 按 Vercel 提示在域名 DNS 中添加 CNAME 记录即可,不需要改代码
