Skip to content

部署

Dotnify 是一个 Node.js 应用——后端使用 Hono 框架运行在 Node.js 服务器上,数据层使用 Upstash Redis。

Vercel

Vercel 是支持的部署目标之一。

一键部署

点击下方按钮即可将 Dotnify 部署到你的 Vercel 账户。Vercel 将自动克隆仓库并完成部署。

Deploy with Vercel

手动部署

1. 导入项目

  1. Fork Dotnify 仓库(请确保 Fork 的是 main 分支)或克隆到本地
  2. 前往 Vercel 控制台导入仓库
  3. 将默认分支设为 main,Vercel 将自动检测 Vite 框架

2. 创建 Upstash Redis 数据库

方式 A:Vercel Upstash 集成(推荐)

Vercel 提供内置的 Upstash Redis 集成,可以直接在 Vercel 项目中创建和管理 Redis 数据库:

  1. 进入你的 Vercel 项目 → Storage 选项卡

  2. 点击 Create Database → 选择 Upstash Redis

  3. 选择区域并点击 Create

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

方式 B:官方或其他第三方 Redis

Dotnify 使用 @upstash/redis SDK,通过 REST 兼容 API 与 Redis 通信。你可以使用任何提供 Upstash REST API 兼容端点的 Redis 服务:

  • Upstash — 前往 Upstash 控制台创建新的 Redis 实例,然后复制 REST URLREST Token
  • 自建 Redis — 如果你有自己的 Redis 服务器,可以使用 Upstash Redis 兼容服务或通过代理将 Redis TCP 协议转换为 REST API
  • 其他 Redis 服务商 — 任何提供 Upstash REST API 兼容接口的服务商(相同的 URL 和 Token 格式)均可直接使用

无论使用哪个服务商,你都需要将 REST URLREST Token 设置为环境变量。

3. 配置环境变量

如果使用了 Vercel Upstash 集成,环境变量已自动设置。否则,在 Vercel 项目设置中手动添加:

变量描述必需
UPSTASH_REDIS_REST_URLUpstash Redis REST URL
UPSTASH_REDIS_REST_TOKENUpstash Redis REST 令牌

4. 部署

Deployments 中点击最新的部署,选择 Redeploy 重新部署

Railway

Railway 是一个支持从 GitHub 仓库自动构建并部署的平台。

一键部署

Deploy on Railway

点击按钮后,Railway 将克隆仓库并开始构建。你仍需配置环境变量和启动命令(见下方)。

手动部署

1. 创建 Upstash Redis 数据库

  1. 前往 Upstash 控制台创建新的 Redis 实例
  2. 复制 REST URLREST Token——下一步需要用到

如果你已有其他部署中使用的 Upstash Redis 实例,可以直接复用。

2. 部署到 Railway

  1. 前往 Railway并使用 GitHub 登录
  2. 点击 New ProjectDeploy from GitHub repo
  3. 选择 Dotnify 仓库(如非自己的仓库请先 Fork main 分支),并选择 main 分支
  4. Railway 将自动检测 Node.js 环境

3. 配置环境变量

在 Railway 项目控制台中,进入 Variables 并添加:

变量描述必需
UPSTASH_REDIS_REST_URLUpstash Redis REST URL
UPSTASH_REDIS_REST_TOKENUpstash Redis REST 令牌
PORT服务器端口(Railway 自动注入 PORT,无需手动设置)

4. 配置启动命令

Railway 可能无法自动检测正确的启动命令。在项目 Settings 中,将启动命令设置为:

npm run start

Railway 将构建并部署项目。部署完成后,可以在 SettingsNetworking 中生成公开域名。

Zeabur

Zeabur 是一个支持从 GitHub 仓库零配置部署的平台。

一键部署

Deploy on Zeabur

点击按钮后,Zeabur 将克隆仓库并开始构建。你仍需配置环境变量(见下方)。

手动部署

1. 部署到 Zeabur

  1. 前往 Zeabur并使用 GitHub 登录
  2. 点击 New Project 并选择区域
  3. 点击 Add ServiceGit → 选择 Dotnify 仓库(如非自己的仓库请先 Fork main 分支),并选择 main 分支
  4. Zeabur 将自动检测 Node.js 环境并构建项目

2. 添加 Redis 服务

  1. 在同一项目中,点击 Add ServiceMarketplace → 选择 Redis
  2. Zeabur 将自动创建 Redis 实例

Zeabur 内置的 Redis 默认不提供 Upstash REST API 兼容端点。你有两种选择:

方式 A:使用 Upstash Redis(推荐)

  1. 前往 Upstash 控制台创建新的 Redis 实例
  2. 复制 REST URLREST Token

方式 B:使用 Zeabur Redis + REST 代理

如果需要使用 Zeabur 内置 Redis,需自行搭建 REST API 代理(如 upstash-redis-compatible-server),这需要额外配置。

3. 配置环境变量

在 Dotnify 服务 → Variables 中添加:

变量描述必需
UPSTASH_REDIS_REST_URLUpstash Redis REST URL
UPSTASH_REDIS_REST_TOKENUpstash Redis REST 令牌

4. 生成域名

在 Dotnify 服务 → Networking 中,点击 Generate Domain 获取公开访问地址。

Docker

Dotnify 提供预构建的 Docker 镜像,支持 linux/amd64linux/arm64 架构,同时发布到 Docker Hub 和 GitHub Container Registry。

快速启动

Docker Hub:

bash
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:latest

GHCR:

bash
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

yaml
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

然后启动服务:

bash
docker compose up -d

生产部署

  1. 构建项目:
bash
npm run build
  1. 配置环境变量(见下方)。

  2. 启动服务器:

bash
npm run start

服务器默认监听 http://localhost:3000(可通过 PORT 环境变量配置),同时提供前端静态文件和 API 路由。

环境变量

变量描述必需
UPSTASH_REDIS_REST_URLUpstash Redis REST URL
UPSTASH_REDIS_REST_TOKENUpstash Redis REST 令牌
PORT服务器端口(默认 3000)

当使用 Vercel Upstash 集成时,KV_REST_API_URLKV_REST_API_TOKEN 会被自动注入,优先级高于 UPSTASH_REDIS_REST_* 变量。

本地开发

在本地运行完整的 API:

使用 Vite 开发服务器(推荐)

项目包含自定义 Vite 插件(scripts/vite-plugin-dev-api.ts),在 vite dev 期间将 Hono API 应用挂载到 Vite 开发服务器上,前端和 API 从同一端口提供服务。

  1. 在项目根目录创建 .env.local 文件:
bash
UPSTASH_REDIS_REST_URL="https://your-redis.upstash.io"
UPSTASH_REDIS_REST_TOKEN="your-redis-token"
  1. 启动开发服务器:
bash
npm run dev

应用将在 http://localhost:3000 可用。API 修改会在下次请求时生效(无需手动重启)。

使用生产服务器

bash
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 从同一部署提供服务