---
title: "12.1 部署到 EdgeOne Pages"
---

# 12.1 部署到 EdgeOne Pages

> **本节目标**：把你的 Next.js 项目部署到腾讯云 EdgeOne Pages，获得一个公网可访问的链接。

小明的朋友发来消息："你上次给我看的那个链接又打不开了。"小明这才意识到，Cloudflare Tunnel 的临时链接关了终端就没了。他需要一个**永久在线**的地址——不管自己的电脑开不开机，任何人随时都能打开。

这就是"部署"要做的事。部署的本质很简单：**让云端的电脑替你跑你本地跑过的那些命令**。你在本地 `pnpm install` 装依赖、`pnpm build` 构建项目，部署平台做的是完全一样的事——只不过它 24 小时不关机，而且有一个公网地址。

EdgeOne Pages 是腾讯云的边缘部署平台，国内访问速度快，对 Next.js 支持好，免费额度足够个人项目使用。小明决定从这里开始。

## 部署前的三个确认

在点击"部署"之前，小明需要确认三件事。这不是走流程，每一项都有实际原因。

**第一，代码已经推到 GitHub。** 部署平台需要从 GitHub 拉取你的代码。如果代码只在本地，平台拿不到。这一步在第十一章已经完成了。

**第二，本地 `pnpm build` 能成功。** 这是最重要的一步。如果本地构建都跑不通，云端一定也跑不通——云端做的事和你本地一模一样。在终端里运行一次 `pnpm build`，看到 "Build completed" 就说明没问题。

**第三，记录好 `.env` 里的环境变量。** 你在第六章学过，`.env` 文件被 `.gitignore` 排除了，不会上传到 GitHub。这意味着部署平台拉到的代码里没有数据库密码、没有认证密钥——你需要在平台上手动配置这些变量。现在打开本地的 `.env` 文件，确认你知道里面有哪些变量、每个变量的值是什么。

## 注册并连接 GitHub

打开 [EdgeOne Pages 控制台](https://console.cloud.tencent.com/edgeone/pages)，用微信扫码或腾讯云账号登录。如果是第一次使用腾讯云，需要完成实名认证。

![image-20260227003947136](/images/Advanced/image-20260227003947136.png)

点击 **导入 Git** 仓库，选择 **连接 GitHub**。

首次连接会跳转到 GitHub 的授权页面。这里有一个选择：授权所有仓库，还是只授权特定仓库？

小明选了"Only select repositories"，只授权了"个人豆瓣"这一个仓库。这是**最小权限原则**——只给平台它需要的权限，不多给。如果以后要部署其他项目，再回来加授权就行。这个习惯在第八章安全那一节就提过，到了部署环节同样适用。

授权完成后，你能看到自己的仓库列表。选择要部署的项目，点击 **下一步**。

当然，点击直接上传也是可以的，平台会通常会自动识别项目架构。

![image-20260227005154181](/images/Advanced/image-20260227005154181.png)

## 配置构建设置

这一步是告诉平台"怎么构建你的项目"。EdgeOne 会根据你选的框架自动填充推荐配置，但你需要理解每一项的含义，这样出问题时才知道去哪里改。

![image-20260227005228223](/images/Advanced/image-20260227005228223.png)

**框架预设**选 Next.js。选了之后，平台会自动帮你填好构建命令和输出目录——就像你在手机上打开 .pdf 文件时系统自动用 PDF 阅读器打开一样，平台识别了你用 Next.js，就自动知道该怎么构建。

**根目录**保持默认的 `./`。如果你的项目代码不在仓库根目录（比如在 `apps/web/` 子目录下），才需要改这个。小明的项目就在根目录，不用动。

**构建命令**是 `pnpm build`（或 `npm run build`）。这就是你在本地跑过的那个命令——平台在云端执行完全一样的操作。

**输出目录**是 `.next`。这是 Next.js 构建后生成文件的位置，平台需要知道去哪里找构建产物。

**Node 版本**——EdgeOne 通常默认是 Node 22，大多数 Next.js 项目直接用默认值就能构建通过。一般先不改，**只有当日志里出现 Node 版本不兼容报错时，再改成和你本地一致的版本**。

![image-20260227005254177](/images/Advanced/image-20260227005254177.png)

## 配置环境变量

在构建设置页面下方，找到 **环境变量** 区域。

还记得刚才说的吗？`.env` 文件没有上传到 GitHub，所以你需要在这里手动把变量填进来。EdgeOne Pages 支持**批量导入**——直接把 `.env` 文件的内容粘贴进去，平台会自动解析成键值对![image-20260227005320209](/images/Advanced/image-20260227005320209.png)。



小明的项目需要这几个变量：

```bash
DATABASE_URL="postgresql://..."        # 数据库连接字符串，没有它应用连不上数据库
BETTER_AUTH_SECRET="xxx"               # 认证密钥，没有它登录功能会报错
BETTER_AUTH_URL="https://你的域名"      # 认证回调地址，先留空，部署成功拿到链接后再改
```

每个变量都有它的作用。`DATABASE_URL` 缺了，应用启动时就会报 "Cannot connect to database"；`BETTER_AUTH_SECRET` 缺了，用户登录会直接 500 错误。如果你不确定需要哪些变量，打开本地的 `.env` 文件，里面有的这里都要有。

::: tip 环境变量修改后需要重新部署
修改环境变量不会自动生效。你需要点击"重新部署"，平台才会用新的变量值重新构建。
:::

## 选择加速区域

这是国内部署平台特有的一步，和 ICP 备案有关。

![image-20260227005154181](/images/Advanced/image-20260227005154181.png)

简单来说：如果你选了包含"中国大陆"的加速区域，就需要 ICP 备案。你在很多国内网站底部都能看到一串"京ICP备xxxxxxxx号"之类的文字，那就是 ICP 备案号。国内法规要求，服务器在中国大陆的网站必须完成备案才能对外访问。个人也可以申请，但需要一到两周的审核时间。

小明不想等，选了**"全球（不含中国大陆）"**。这个选项不需要备案，部署后立刻就能用。虽然名字里说"不含中国大陆"，但绑定自定义域名后国内也能正常访问——域名配置的事留到第十三章再说。

## （可选）如果构建失败，怎么排查

一切配置完毕后，正常情况下首次部署会直接成功。

![image-20260302003046402](/images/Advanced/image-20260302003046402.png)

如果你也遇到红色的 **Failed**，再看这一小节就行。**构建日志是最重要的信息源——答案通常在最后几行。**

例如，常见的一类报错是：

```
error engine "node" is incompatible with this module
```

这表示 Node 版本不兼容。处理方式很简单：回到构建设置，把 Node 版本改成和项目要求一致，然后点击**重新部署**。

![image-20260227005254177](/images/Advanced/image-20260227005254177.png)

重新部署后，通常就会顺利走到绿色的 **Success**。

## 部署成功：拿到链接

构建成功后，平台生成了一个预览链接，格式类似 `xxx.edgeone.dev`。

![image-20260302003255608](/images/Advanced/image-20260302003255608.png)

小明点开链接，看到了自己的"个人豆瓣"——和本地一模一样，但这次是在公网上。他把链接发给朋友，朋友秒开了页面，回了一句："终于能打开了！"

这是整个教程到目前为止最有成就感的时刻：**你写的代码，现在全世界都能访问了。**

::: warning 预览链接的限制
如果你选的是"全球（不含中国大陆）"加速区域，默认域名可能有访问限制（3 小时有效期）。**绑定自定义域名后就没有这个限制了**。域名配置详见 [第十三章](../13-domain-dns/index.md)。
:::

## 常见构建失败排查

小明的 Node 版本问题只是最常见的一种。如果你也遇到了构建失败，先看日志最后几行的报错关键词：

| 报错关键词 | 原因 | 解决方案 |
|-----------|------|---------|
| `engine "node" is incompatible` | Node 版本不匹配 | 在设置里调整 Node 版本 |
| `Cannot find module` | 依赖没装上 | 检查 `package.json` 和锁文件是否提交到 GitHub |
| `DATABASE_URL is not defined` | 环境变量没配 | 在环境变量页面添加 |
| `Build failed` + 无具体信息 | 构建命令错误 | 确认构建命令和本地一致 |
| `ENOENT: no such file` | 路径错误 | 检查根目录配置 |

遇到看不懂的报错？把日志复制给 Claude Code，让它帮你诊断。构建日志里的信息通常足够定位问题。

## 推送即部署

连接 GitHub 后，每次你 `git push` 到主分支，EdgeOne Pages 会自动触发重新部署。你不需要手动操作——这就是 CI/CD 的雏形，我们在 [12.3](./03-cicd-automation.md) 会详细展开。

## 使用部署 Skill

本教程提供了 EdgeOne 部署 Skill，安装后告诉 Claude Code "帮我把项目部署到 EdgeOne Pages"，它会引导你完成整个流程。

安装方式：把下面的链接发给 Claude Code，它会自动识别并安装这个 Skill：

```
https://cnb.cool/nfeyre/default-dev-env/-/git/raw/main/.claude/skills/edgeone-deploy/SKILL.md
```

但理解上面这些手动步骤仍然重要——当自动化出问题时，你需要知道去哪里排查。



---

::: info 下一步
EdgeOne 部署搞定了。如果你的用户主要在海外，或者想了解更多平台选择，继续看 [12.2 部署到类 Vercel 平台](./02-deploy-vercel-platforms.md)。
:::
