部署上线一个 Web 项目

这是一条可以从头照着做的部署流程。我们用 GitHub 仓库 snowykami/neo-blog 做例子,把博客服务从源码构建成镜像,发布到集群,再为前端创建访问入口。

neo-blog 是一个前后端分离项目:

服务目录Dockerfile端口说明
前端web/web/Dockerfile3000Next.js,对外访问入口指向它。
后端仓库根目录Dockerfile8888Go/Hertz,只给前端和集群内访问。
数据后端数据目录后端数据卷-默认可用 SQLite 数据文件;需要 PostgreSQL 时再按项目配置切换。

开始前先确认三件事,缺一项都可能让后面的步骤卡住:

  • 平台 API 和 worker 都在运行。
  • 已经配置可用的运行集群。
  • 已经配置镜像站,并且构建任务有权限推送镜像。

1. 创建项目空间

进入“项目空间”,创建一个新的空间。这个空间用来放博客的前端、后端、数据配置和访问入口。

创建项目空间

建议这样填:

字段示例说明
名称Neo Blog页面展示用,写人能看懂的名字。
标识neo-blog用英文、小写和短横线。
成员先保留自己跑通后再邀请团队成员。

创建完成后,进入这个项目空间继续操作。

2. 创建应用

在项目空间里创建两个应用:

创建应用

应用标识用途
Neo Blog Frontendneo-blog-frontend对外访问的前端服务。
Neo Blog Backendneo-blog-backend提供 API 和后台逻辑。

数据不用急着单独建应用。neo-blog 默认可以把数据放在后端的 /app/data,第一次上线时优先用后端部署配置里的数据卷解决;之后需要外部 PostgreSQL,再接入单独数据库服务。

3. 绑定 GitHub 仓库

进入前端或后端应用的仓库设置,选择 GitHub,绑定:

snowykami/neo-blog

绑定 GitHub 仓库

建议先确认:

建议
默认分支main
Webhook开启,后续 push 可以自动触发构建。
仓库权限至少能读取源码;如果要自动配置 Webhook,需要对应写权限。

同一个仓库只需要绑定一次。前端和后端部署配置都可以引用这个仓库,只是 Dockerfile 和构建上下文不同。

4. 创建后端部署配置

先创建后端,因为前端需要知道后端地址。

字段示例
应用neo-blog-backend
来源从仓库构建
仓库snowykami/neo-blog
DockerfileDockerfile
构建上下文.
Dockerfile Build Args可选,例如 EMBED_WEB=true
服务端口8888
镜像仓库选择你的推送镜像站
镜像标签latest${GIT_SHA}
副本数1
CPU / 内存第一次可用 1C / 1Gi

后端环境变量至少建议设置:

变量示例说明
MODEprod生产运行模式。
PORT8888和服务端口保持一致。
BASE_URLhttps://blog.example.com用户最终访问的博客地址。
PASSWORD_SALT一段稳定随机值上线后不要随意改。
JWT_SECRET一段稳定随机值上线后不要随意改。

如果先用 SQLite,给后端加一个数据卷:

挂载路径容量示例说明
/app/data1Gi保存 SQLite 数据文件和运行数据。

5. 创建前端部署配置

前端使用仓库里的 web/Dockerfile

创建部署配置

字段示例
应用neo-blog-frontend
来源从仓库构建
仓库snowykami/neo-blog
Dockerfileweb/Dockerfile
构建上下文web
Dockerfile Build Args可选,例如 VERSION=${{ github.sha }}
服务端口3000
镜像仓库选择你的推送镜像站
镜像标签latest${GIT_SHA}
副本数1

Dockerfile Build Args 会作为 BuildKit build-arg 传入 Dockerfile 的 ARG 指令,并随每次构建记录保存快照。它适合放 EMBED_WEB=trueVERSION=${{ github.sha }}、构建模式这类非密钥值;密码、Token、私有 npm 凭据等敏感值请放到项目空间“构建变量”里的密钥项。

前端环境变量建议设置:

变量示例说明
BACKEND_URLhttp://neo-blog-backend:8888前端服务端访问后端用。实际服务名以平台下发的 Service 为准。
NODE_ENVproduction前端生产模式。

如果平台展示的后端服务名不是 neo-blog-backend,用部署后的 Service 名替换 BACKEND_URL

6. 触发构建并发布

先构建后端,再构建前端。

触发构建并发布

推荐顺序:

  1. 在后端部署配置里点击“触发构建”。
  2. 等构建状态变成成功。
  3. 创建后端 Release,等待运行状态正常。
  4. 在前端部署配置里点击“触发构建”。
  5. 等前端构建成功后创建 Release。
  6. 打开应用部署列表,确认前端和后端都处于正常状态。

如果构建失败,先看构建日志末尾。常见原因:

现象先看哪里
拉不到基础镜像构建网络、镜像站、DNS。
pnpm install 失败前端构建网络或 npm registry。
Go module 下载失败构建网络或 Go proxy。
构建内存不足调大部署配置里的构建内存。

7. 创建访问入口

只给前端创建访问入口。后端保持集群内访问即可。

创建访问入口

字段示例
应用neo-blog-frontend
部署配置前端部署配置
域名blog.example.com
路径/
服务端口3000
TLS按你的网关和证书策略选择

创建后,等访问入口状态正常,再打开:

https://blog.example.com

如果页面能打开,但登录、文章或接口请求异常,优先检查前端的 BACKEND_URL 和后端的 BASE_URL

8. 确认跑通后再打开自动化

第一次上线建议手动构建、手动发布。确认没有问题后,再逐步打开:

  • 仓库 Webhook 自动触发构建。
  • 构建成功后自动发布。
  • 分支匹配,例如只让 main 自动发布生产环境。
  • 标签匹配,例如 v* 发布稳定版本。

逐项开启后,每一步出了问题都容易定位,回滚也更清楚。