部署
Dotnify 是一个无服务器应用——后端使用无服务器函数,数据层使用 Upstash Redis。无需传统服务器或数据库。
Vercel
Vercel 是主要部署目标。项目包含预配置的 vercel.json,包含路由重写和函数设置。
一键部署
点击下方按钮即可将 Dotnify 部署到你的 Vercel 账户。Vercel 将自动克隆仓库、配置 Upstash Redis 集成并完成部署。
部署过程中,Vercel 会提示你通过其内置集成创建 Upstash Redis 实例——无需单独注册 Upstash 账户。
手动部署
1. 创建 Upstash Redis 数据库
方式 A:Vercel Upstash 集成(推荐)
Vercel 提供内置的 Upstash Redis 集成,可以直接在 Vercel 项目中创建和管理 Redis 数据库:
- 进入你的 Vercel 项目 → Storage 选项卡
- 点击 Create Database → 选择 Upstash Redis
- 选择区域并点击 Create
- Vercel 会自动将
UPSTASH_REDIS_REST_URL和UPSTASH_REDIS_REST_TOKEN注入项目的环境变量——无需手动配置
Vercel Upstash 集成是最简单的方式,因为:
- 无需单独注册 Upstash 账户——一切都在 Vercel 内管理
- 环境变量自动关联到你的项目
- 可以直接在 Vercel 控制台查看 Redis 指标
- 免费额度包含每天 10,000 次命令,个人使用完全足够
方式 B:独立 Upstash 账户
- 前往 Upstash 控制台创建新的 Redis 实例
- 复制 REST URL 和 REST Token——这些将作为环境变量使用
2. 导入项目
- Fork 或克隆 Dotnify 仓库
- 前往 Vercel 控制台导入仓库
- Vercel 将自动检测 Vite 框架
3. 配置环境变量
如果使用了 Vercel Upstash 集成,环境变量已自动设置。否则,在 Vercel 项目设置中手动添加:
| 变量 | 描述 | 必需 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Upstash Redis REST URL(如 https://xxx.upstash.io) | 是 |
UPSTASH_REDIS_REST_TOKEN | Upstash Redis REST 令牌 | 是 |
4. 部署
点击 Deploy。Vercel 将构建项目并部署。构建使用 npm run build,通过 Vite 编译 React 前端。
Vercel 配置
项目包含 vercel.json,配置如下:
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": "vite",
"rewrites": [
{ "source": "/api/(.*)", "destination": "/api/$1" },
{ "source": "/((?!api/).*)", "destination": "/index.html" }
],
"functions": {
"api/**/*.ts": {
"memory": 256,
"maxDuration": 10
}
}
}- Rewrites:API 路由直接提供服务;所有其他路由回退到 SPA
- Functions:每个无服务器函数分配 256 MB 内存和 10 秒超时
本地开发
在本地运行完整的 API:
方式 A:使用 Vite 开发服务器(推荐)
项目包含自定义 Vite 插件(scripts/vite-plugin-dev-api.ts),在 vite dev 期间直接提供 API 函数,无需 vercel dev。
- 在项目根目录创建
.env.local文件:
UPSTASH_REDIS_REST_URL="https://your-redis.upstash.io"
UPSTASH_REDIS_REST_TOKEN="your-redis-token"- 启动开发服务器:
npm run dev应用将在 http://localhost:5173 可用。API 修改会在下次请求时生效(无需手动重启)。
方式 B:使用 Vercel Dev
npm run dev:api这使用 vercel dev,在本地模拟 Vercel 无服务器环境。它从 .env.local 读取环境变量。
数据存储
Dotnify 使用三个 Redis 键存储所有应用状态:
| 键 | 描述 |
|---|---|
dotnify:admin | 管理员凭据(用户名 + scrypt 密码哈希) |
dotnify:session:<token> | 活跃会话(7 天 TTL,自动过期) |
dotnify:providers | 已配置 DNS 服务商的 JSON 数组 |
无需数据库模式或迁移。Upstash Redis 是无服务器的,按请求计费,适合低流量的管理工具。
安全注意事项
- 密码哈希:管理员密码在存储前使用 scrypt(64 字节密钥长度)进行哈希
- 会话令牌:32 字节随机令牌,Redis 中 7 天 TTL
- 时序安全比较:密码验证使用
crypto.timingSafeEqual防止时序攻击 - API 密钥掩码:服务商 API 密钥在 API 响应中被掩码(仅显示最后 4 个字符)
- Bearer 令牌认证:所有 API 端点(除
/api/auth/me和/api/auth/setup)需要有效的 Bearer 令牌 - 无 CORS 配置:API 仅限同源——SPA 和 API 从同一部署提供服务