部署
Dotnify 是一个 Node.js 应用——后端使用 Hono 框架运行在 Node.js 服务器上,数据层使用 Upstash Redis。
Vercel
Vercel 是支持的部署目标之一。
一键部署
点击下方按钮即可将 Dotnify 部署到你的 Vercel 账户。Vercel 将自动克隆仓库并完成部署。
手动部署
1. 导入项目
- Fork Dotnify 仓库(请确保 Fork 的是
main分支)或克隆到本地 - 前往 Vercel 控制台导入仓库
- 将默认分支设为
main,Vercel 将自动检测 Vite 框架
2. 创建 Upstash Redis 数据库
方式 A:Vercel Upstash 集成(推荐)
Vercel 提供内置的 Upstash Redis 集成,可以直接在 Vercel 项目中创建和管理 Redis 数据库:
进入你的 Vercel 项目 → Storage 选项卡
点击 Create Database → 选择 Upstash Redis
选择区域并点击 Create

在 Connect a Project 中选择你的项目,然后点击 Connect 连接项目,Vercel 会自动将
KV_REST_API_URL和KV_REST_API_TOKEN注入项目的环境变量

方式 B:官方或其他第三方 Redis
Dotnify 使用 @upstash/redis SDK,通过 REST 兼容 API 与 Redis 通信。你可以使用任何提供 Upstash REST API 兼容端点的 Redis 服务:
- Upstash — 前往 Upstash 控制台创建新的 Redis 实例,然后复制 REST URL 和 REST Token
- 自建 Redis — 如果你有自己的 Redis 服务器,可以使用 Upstash Redis 兼容服务或通过代理将 Redis TCP 协议转换为 REST API
- 其他 Redis 服务商 — 任何提供 Upstash REST API 兼容接口的服务商(相同的 URL 和 Token 格式)均可直接使用
无论使用哪个服务商,你都需要将 REST URL 和 REST Token 设置为环境变量。
3. 配置环境变量
如果使用了 Vercel Upstash 集成,环境变量已自动设置。否则,在 Vercel 项目设置中手动添加:
| 变量 | 描述 | 必需 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Upstash Redis REST URL | 是 |
UPSTASH_REDIS_REST_TOKEN | Upstash Redis REST 令牌 | 是 |
4. 部署
在 Deployments 中点击最新的部署,选择 Redeploy 重新部署 
Railway
Railway 是一个支持从 GitHub 仓库自动构建并部署的平台。
一键部署
点击按钮后,Railway 将克隆仓库并开始构建。你仍需配置环境变量和启动命令(见下方)。
手动部署
1. 创建 Upstash Redis 数据库
- 前往 Upstash 控制台创建新的 Redis 实例
- 复制 REST URL 和 REST Token——下一步需要用到
如果你已有其他部署中使用的 Upstash Redis 实例,可以直接复用。
2. 部署到 Railway
- 前往 Railway并使用 GitHub 登录
- 点击 New Project → Deploy from GitHub repo
- 选择 Dotnify 仓库(如非自己的仓库请先 Fork
main分支),并选择main分支 - Railway 将自动检测 Node.js 环境
3. 配置环境变量
在 Railway 项目控制台中,进入 Variables 并添加:
| 变量 | 描述 | 必需 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Upstash Redis REST URL | 是 |
UPSTASH_REDIS_REST_TOKEN | Upstash Redis REST 令牌 | 是 |
PORT | 服务器端口(Railway 自动注入 PORT,无需手动设置) | 否 |
4. 配置启动命令
Railway 可能无法自动检测正确的启动命令。在项目 Settings 中,将启动命令设置为:
npm run startRailway 将构建并部署项目。部署完成后,可以在 Settings → Networking 中生成公开域名。
Zeabur
Zeabur 是一个支持从 GitHub 仓库零配置部署的平台。
一键部署
点击按钮后,Zeabur 将克隆仓库并开始构建。你仍需配置环境变量(见下方)。
手动部署
1. 部署到 Zeabur
- 前往 Zeabur并使用 GitHub 登录
- 点击 New Project 并选择区域
- 点击 Add Service → Git → 选择 Dotnify 仓库(如非自己的仓库请先 Fork
main分支),并选择main分支 - Zeabur 将自动检测 Node.js 环境并构建项目
2. 添加 Redis 服务
- 在同一项目中,点击 Add Service → Marketplace → 选择 Redis
- Zeabur 将自动创建 Redis 实例
Zeabur 内置的 Redis 默认不提供 Upstash REST API 兼容端点。你有两种选择:
方式 A:使用 Upstash Redis(推荐)
- 前往 Upstash 控制台创建新的 Redis 实例
- 复制 REST URL 和 REST Token
方式 B:使用 Zeabur Redis + REST 代理
如果需要使用 Zeabur 内置 Redis,需自行搭建 REST API 代理(如 upstash-redis-compatible-server),这需要额外配置。
3. 配置环境变量
在 Dotnify 服务 → Variables 中添加:
| 变量 | 描述 | 必需 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Upstash Redis REST URL | 是 |
UPSTASH_REDIS_REST_TOKEN | Upstash Redis REST 令牌 | 是 |
4. 生成域名
在 Dotnify 服务 → Networking 中,点击 Generate Domain 获取公开访问地址。
Docker
Dotnify 提供预构建的 Docker 镜像,支持 linux/amd64 和 linux/arm64 架构,同时发布到 Docker Hub 和 GitHub Container Registry。
快速启动
Docker Hub:
docker run -d --name dotnify \
-p 3000:3000 \
-e UPSTASH_REDIS_REST_URL="https://your-redis.upstash.io" \
-e UPSTASH_REDIS_REST_TOKEN="your-redis-token" \
airtouch97/dotnify:latestGHCR:
docker run -d --name dotnify \
-p 3000:3000 \
-e UPSTASH_REDIS_REST_URL="https://your-redis.upstash.io" \
-e UPSTASH_REDIS_REST_TOKEN="your-redis-token" \
ghcr.io/airtouch97/dotnify:latest提示: 如果拉取镜像遇到困难,可以考虑使用镜像源。例如将
docker.io替换为镜像源地址,或将ghcr.io替换为对应的 GHCR 镜像源。
docker-compose
创建 docker-compose.yml:
services:
dotnify:
image: airtouch97/dotnify:latest # 或 ghcr.io/airtouch97/dotnify:latest
ports:
- "3000:3000"
environment:
- UPSTASH_REDIS_REST_URL=https://your-redis.upstash.io
- UPSTASH_REDIS_REST_TOKEN=your-redis-token
restart: unless-stopped然后启动服务:
docker compose up -d生产部署
- 构建项目:
npm run build配置环境变量(见下方)。
启动服务器:
npm run start服务器默认监听 http://localhost:3000(可通过 PORT 环境变量配置),同时提供前端静态文件和 API 路由。
环境变量
| 变量 | 描述 | 必需 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Upstash Redis REST URL | 是 |
UPSTASH_REDIS_REST_TOKEN | Upstash Redis REST 令牌 | 是 |
PORT | 服务器端口(默认 3000) | 否 |
当使用 Vercel Upstash 集成时,KV_REST_API_URL 和 KV_REST_API_TOKEN 会被自动注入,优先级高于 UPSTASH_REDIS_REST_* 变量。
本地开发
在本地运行完整的 API:
使用 Vite 开发服务器(推荐)
项目包含自定义 Vite 插件(scripts/vite-plugin-dev-api.ts),在 vite dev 期间将 Hono API 应用挂载到 Vite 开发服务器上,前端和 API 从同一端口提供服务。
- 在项目根目录创建
.env.local文件:
UPSTASH_REDIS_REST_URL="https://your-redis.upstash.io"
UPSTASH_REDIS_REST_TOKEN="your-redis-token"- 启动开发服务器:
npm run dev应用将在 http://localhost:3000 可用。API 修改会在下次请求时生效(无需手动重启)。
使用生产服务器
npm run build && npm run start启动 Hono Node.js 服务器并提供编译后的前端,与生产环境一致。
数据存储
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 从同一部署提供服务