Skip to content

GitHub Actions 自动部署配置指南

本项目已配置 GitHub Actions 工作流,可自动部署到 Cloudflare Workers、Vercel 和 GitHub Container Registry (ghcr.io)。

工作流说明

1. Build and Push Docker Image (.github/workflows/build-docker.yml)

  • 触发条件:推送以 v 开头的版本标签(如 v1.0.0
  • 手动触发:支持通过 GitHub Actions 界面手动触发
  • 部署目标:GitHub Container Registry (ghcr.io)
  • 支持架构:linux/amd64, linux/arm64

2. Deploy to Cloudflare Workers (.github/workflows/deploy-cloudflare.yml)

  • 触发条件:推送以 v 开头的版本标签(如 v1.0.0
  • 手动触发:支持通过 GitHub Actions 界面手动触发
  • 部署目标:Cloudflare Workers

3. Deploy to Vercel (.github/workflows/deploy-vercel.yml)

  • 触发条件:推送以 v 开头的版本标签(如 v1.0.0
  • 手动触发:支持通过 GitHub Actions 界面手动触发
  • 部署目标:Vercel

4. Deploy VitePress site to Pages (.github/workflows/deploy-docs.yml)

  • 触发条件:推送到 main 分支
  • 部署目标:GitHub Pages(文档站点)

5. Create GitHub Release (.github/workflows/create-release.yml)

  • 触发条件:推送以 v 开头的版本标签(如 v1.0.0
  • 手动触发:支持通过 GitHub Actions 界面手动触发
  • 功能:自动从 docs/CHANGELOG.md 提取发布说明并创建 GitHub Release

配置步骤

零、Docker 镜像构建配置

Docker 镜像会自动构建并推送到 GitHub Container Registry (ghcr.io)。

权限配置

GitHub Actions 默认已有推送到 GHCR 的权限,无需额外配置。镜像将自动发布到:

ghcr.io/<your-username>/imagine-server:latest
ghcr.io/<your-username>/imagine-server:v1.0.0
ghcr.io/<your-username>/imagine-server:1.0
ghcr.io/<your-username>/imagine-server:1

使用 Docker 镜像

bash
# 拉取最新版本
docker pull ghcr.io/<your-username>/imagine-server:latest

# 拉取特定版本
docker pull ghcr.io/<your-username>/imagine-server:v1.0.0

# 运行容器
docker run -d \
  -p 3000:3000 \
  -e API_TOKEN=your-token \
  -e HUGGINGFACE_TOKENS=hf_token1,hf_token2 \
  -e GITEE_TOKENS=gitee_token1,gitee_token2 \
  -e MODELSCOPE_TOKENS=ms_token1,ms_token2 \
  -e REDIS_URL=redis://your-redis:6379 \
  --name imagine-server \
  ghcr.io/<your-username>/imagine-server:latest

设置镜像为公开(可选)

默认情况下,GHCR 镜像是私有的。如果想让镜像公开访问:

  1. 进入 GitHub 个人主页
  2. 点击 Packages 标签
  3. 找到 imagine-server
  4. 点击 Package settings
  5. Danger Zone 中选择 Change visibilityPublic

一、Cloudflare Workers 部署配置

1. 获取 Cloudflare API Token

  1. 登录 Cloudflare Dashboard
  2. 进入 My ProfileAPI Tokens
  3. 点击 Create Token
  4. 选择 Edit Cloudflare Workers 模板
  5. 配置权限:
    • Account Resources: Include → 选择你的账户
    • Zone Resources: IncludeAll zones
  6. 点击 Continue to summaryCreate Token
  7. 复制生成的 Token(只显示一次)

2. 获取 Cloudflare Account ID

  1. Cloudflare Dashboard 首页
  2. 选择你的账户
  3. 在右侧栏找到 Account ID,点击复制

3. 创建 KV Namespaces

在本地运行以下命令创建 KV Namespaces:

bash
# 登录 Cloudflare
pnpm run wrangler login

# 创建 TOKEN_STATUS_KV
pnpm run wrangler kv:namespace create "TOKEN_STATUS_KV"
# 输出示例:
# 🌀 Creating namespace with title "imagine-server-TOKEN_STATUS_KV"
# ✨ Success!
# Add the following to your configuration file in your kv_namespaces array:
# { binding = "TOKEN_STATUS_KV", id = "1234567890abcdef1234567890abcdef" }

pnpm run wrangler kv:namespace create "TOKEN_STATUS_KV" --preview
# 输出示例:
# 🌀 Creating namespace with title "imagine-server-TOKEN_STATUS_KV_preview"
# ✨ Success!
# Add the following to your configuration file in your kv_namespaces array:
# { binding = "TOKEN_STATUS_KV", preview_id = "1234567890abcdef1234567890abcdef" }

# 创建 VIDEO_TASK_KV
pnpm run wrangler kv:namespace create "VIDEO_TASK_KV"
pnpm run wrangler kv:namespace create "VIDEO_TASK_KV" --preview

重要:记录生成的 ID,将在下一步配置 GitHub Secrets 时使用。

注意

  • 对于本地开发,可以将 ID 填入 wrangler.toml 文件
  • 对于 GitHub Actions 部署,将 ID 配置为 GitHub Secrets(推荐)

4. 配置 GitHub Secrets

进入 GitHub 仓库的 SettingsSecrets and variablesActions,添加以下 Secrets:

Secret 名称说明必需获取方式
CLOUDFLARE_API_TOKENCloudflare API Token步骤 1 获取
CLOUDFLARE_ACCOUNT_IDCloudflare Account ID步骤 2 获取
API_TOKEN应用 API 访问令牌⚠️自定义生成(可选,不设置则不需要认证)
HUGGINGFACE_TOKENSHugging Face API Tokens(逗号分隔)⚠️Hugging Face
GITEE_TOKENSGitee AI API Tokens(逗号分隔)⚠️Gitee AI
MODELSCOPE_TOKENSModel Scope API Tokens(逗号分隔)⚠️Model Scope

说明

  • ✅ 必需:必须配置才能部署
  • ⚠️ 可选:不配置也可以部署,但功能会受限
    • API_TOKEN 不配置时,API 不需要认证即可访问
    • Provider tokens 不配置时,对应的模型将不可用

KV Namespace IDs 配置说明

GitHub Actions 会在部署时自动将这些 ID 注入到 wrangler.toml 中,无需手动修改配置文件。

四、GitHub Pages 部署配置

1. 启用 GitHub Pages

  1. 进入 GitHub 仓库的 SettingsPages
  2. Source 部分,选择 GitHub Actions
  3. 保存设置

2. 触发部署

推送到 main 分支会自动触发文档部署:

bash
git add .
git commit -m "Update documentation"
git push origin main

3. 访问文档站点

部署成功后,文档将发布到:

https://<your-username>.github.io/<repository-name>/

4. 故障排查

如果遇到 "Get Pages site failed" 错误:

  1. 确认已在 SettingsPages 中启用 GitHub Pages
  2. 确认 Source 设置为 GitHub Actions(不是 Deploy from a branch)
  3. 检查仓库是否为公开仓库(私有仓库需要 GitHub Pro)
  4. 等待几分钟后重试,GitHub Pages 初次启用可能需要时间

三、Vercel 部署配置

1. 获取 Vercel Token

  1. 登录 Vercel Dashboard
  2. 进入 SettingsTokens
  3. 点击 Create Token
  4. 输入 Token 名称(如 GitHub Actions
  5. 选择 Scope(建议选择特定项目)
  6. 点击 Create 并复制 Token

2. 获取 Vercel Organization ID 和 Project ID

方法一:通过 Vercel CLI

bash
# 安装 Vercel CLI(如果未安装)
npm i -g vercel

# 登录
vercel login

# 在项目目录下运行
vercel link

# 查看 .vercel/project.json 文件
cat .vercel/project.json

方法二:通过 Vercel Dashboard

  1. 进入项目的 Account SettingsTokens
  2. Organization ID 可以在 SettingsGeneralTeam ID
  3. Project ID 可以在 vercel 项目中的 SettingsGeneralProject ID

3. 配置 Vercel 环境变量

在 Vercel Dashboard 中配置环境变量:

  1. 进入项目的 SettingsEnvironment Variables
  2. 添加以下环境变量(Production、Preview、Development 都选上):
变量名说明
API_TOKEN应用 API 访问令牌
HUGGINGFACE_TOKENSHugging Face API Tokens(逗号分隔)
GITEE_TOKENSGitee AI API Tokens(逗号分隔)
MODELSCOPE_TOKENSModelScope API Tokens(逗号分隔)
NODE_ENV设置为 production

4. 配置 GitHub Secrets

添加以下 Secrets:

Secret 名称说明获取方式
VERCEL_TOKENVercel API Token步骤 1 获取
VERCEL_ORG_IDVercel Organization ID步骤 2 获取
VERCEL_PROJECT_IDVercel Project ID步骤 3 获取

推荐使用 Vercel CLI 进行获取

部署流程

版本发布部署

推送版本标签会自动触发所有部署流程:

bash
# 1. 确保所有更改已提交
git add .
git commit -m "Release version 1.0.0"

# 2. 创建并推送版本标签
git tag v1.0.0
git push origin v1.0.0

# 3. GitHub Actions 会自动:
#    - 构建并推送 Docker 镜像到 ghcr.io
#    - 部署到 Cloudflare Workers
#    - 部署到 Vercel

查看部署进度:

  • 进入 GitHub 仓库的 Actions 标签页
  • 查看对应的工作流运行状态

自动部署

  1. 创建版本标签并推送
  2. GitHub Actions 会自动触发所有部署流程
  3. 可以在 Actions 标签页查看部署进度

手动部署

  1. 进入 GitHub 仓库的 Actions 标签页
  2. 选择要运行的工作流:
    • Build and Push Docker Image - 构建 Docker 镜像
    • Deploy to Cloudflare Workers - 部署到 Cloudflare
    • Deploy to Vercel - 部署到 Vercel
  3. 点击 Run workflow → 选择分支 → Run workflow

使用 Docker 镜像

从 GitHub Container Registry 拉取

bash
# 拉取最新版本
docker pull ghcr.io/<your-username>/imagine-server:latest

# 拉取特定版本
docker pull ghcr.io/<your-username>/imagine-server:v1.0.0

# 拉取主版本(自动获取最新的 1.x.x)
docker pull ghcr.io/<your-username>/imagine-server:1

运行容器

使用环境变量

bash
docker run -d \
  -p 3000:3000 \
  -e API_TOKEN=your-secret-token \
  -e HUGGINGFACE_TOKENS=hf_token1,hf_token2 \
  -e GITEE_TOKENS=gitee_token1,gitee_token2 \
  -e MODELSCOPE_TOKENS=ms_token1,ms_token2 \
  -e REDIS_URL=redis://your-redis:6379 \
  --name imagine-server \
  ghcr.io/<your-username>/imagine-server:latest

使用 .env 文件

bash
# 创建 .env 文件
cat > .env << EOF
API_TOKEN=your-secret-token
HUGGINGFACE_TOKENS=hf_token1,hf_token2
GITEE_TOKENS=gitee_token1,gitee_token2
MODELSCOPE_TOKENS=ms_token1,ms_token2
REDIS_URL=redis://localhost:6379
EOF

# 运行容器
docker run -d \
  -p 3000:3000 \
  --env-file .env \
  --name imagine-server \
  ghcr.io/<your-username>/imagine-server:latest

使用 Docker Compose

yaml
# docker-compose.yml
version: "3.8"

services:
  app:
    image: ghcr.io/<your-username>/imagine-server:latest
    ports:
      - "3000:3000"
    environment:
      - API_TOKEN=${API_TOKEN}
      - HUGGINGFACE_TOKENS=${HUGGINGFACE_TOKENS}
      - GITEE_TOKENS=${GITEE_TOKENS}
      - MODELSCOPE_TOKENS=${MODELSCOPE_TOKENS}
      - REDIS_URL=redis://redis:6379
    depends_on:
      - redis
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

volumes:
  redis-data:

运行:

bash
docker-compose up -d

验证部署

bash
# 检查容器状态
docker ps

# 查看日志
docker logs imagine-server

# 测试健康检查
curl http://localhost:3000/api/health

# 查看可用模型
curl http://localhost:3000/api/v1/models

更新镜像

bash
# 拉取最新镜像
docker pull ghcr.io/<your-username>/imagine-server:latest

# 停止并删除旧容器
docker stop imagine-server
docker rm imagine-server

# 启动新容器
docker run -d \
  -p 3000:3000 \
  --env-file .env \
  --name imagine-server \
  ghcr.io/<your-username>/imagine-server:latest

多架构支持

镜像支持以下架构:

  • linux/amd64 - x86_64 架构(Intel/AMD)
  • linux/arm64 - ARM64 架构(Apple Silicon, ARM 服务器)

Docker 会自动选择适合你系统的架构。

验证部署

Cloudflare Workers

bash
# 查看部署状态
pnpm run wrangler deployments list

# 查看实时日志
pnpm run wrangler tail

访问你的 Cloudflare Workers URL 测试 API。

Vercel

  1. 在 Vercel Dashboard 查看部署状态
  2. 访问 Vercel 提供的 URL 测试 API

故障排查

GitHub Pages 部署失败

错误: "Get Pages site failed. Please verify that the repository has Pages enabled"

解决方案:

  1. 进入 SettingsPages
  2. Source 部分选择 GitHub Actions(不是 Deploy from a branch)
  3. 确保仓库是公开的,或者你有 GitHub Pro(私有仓库需要)
  4. 保存后等待几分钟,然后重新运行工作流

Docker 镜像推送失败

错误: "denied: permission_denied: write_package"

解决方案:

  1. 检查工作流文件中的 permissions 配置是否包含 packages: write
  2. 确认 GitHub Actions 有权限访问 GitHub Container Registry
  3. 如果是 fork 的仓库,需要在自己的仓库中重新配置

Cloudflare 部署失败

错误: "Value for secret GITEE_TOKENS not found in environment"

解决方案:

  1. 这些 secrets 现在是可选的,不配置也可以部署
  2. 如果要使用对应的 provider,需要在 GitHub Secrets 中配置相应的 token
  3. 不配置某个 provider 的 token,该 provider 的模型将不可用

其他常见问题:

  1. 检查 CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID 是否正确
  2. 确认 API Token 有足够的权限
  3. 检查 wrangler.toml 中的 KV Namespace ID 是否已填写
  4. 查看 GitHub Actions 日志获取详细错误信息

Vercel 部署失败

  1. 检查 VERCEL_TOKENVERCEL_ORG_IDVERCEL_PROJECT_ID 是否正确
  2. 确认 Vercel 项目已创建并关联
  3. 检查环境变量是否在 Vercel Dashboard 中正确配置
  4. 查看 GitHub Actions 日志获取详细错误信息

构建失败

  1. 检查 package.json 中的构建脚本是否正确
  2. 确认所有依赖都已正确安装
  3. 本地运行 pnpm run build 测试构建是否成功

注意事项

  1. 敏感信息安全

    • 不要在代码中硬编码 API Token 和密钥
    • 使用 GitHub Secrets 和环境变量管理敏感信息
    • 定期轮换 API Token
  2. 成本控制

    • Cloudflare Workers 免费套餐有请求限制
    • Vercel 免费套餐有带宽和构建时间限制
    • 监控使用情况,避免超出限额
  3. 环境隔离

    • 建议为开发和生产环境使用不同的 Token
    • 可以创建不同的分支触发不同的部署环境
  4. 回滚策略

    • Cloudflare Workers 支持版本回滚
    • Vercel 支持一键回滚到之前的部署

相关资源

Released under the MIT License.