# Next.js 项目基于 GitHub Webhook 与宝塔面板的自动化部署流程文档
## I. 概述
本流程文档详细介绍了如何通过 GitHub 的 Webhook 功能与宝塔面板相结合,实现 Next.js 项目代码的自动化部署。当您向 GitHub 仓库提交代码后,服务器将自动拉取最新代码、安装依赖、构建项目并重启应用,从而实现持续集成与部署(CI/CD),极大地提升开发效率和部署的可靠性。
**核心理念:** 一次性配置宝塔面板的基础环境和网站,后续代码更新通过 GitHub Webhook 触发宝塔面板执行自动化部署脚本。
## II. 前提条件
在开始配置之前,请确保您已具备以下条件:
1. **GitHub 账号**:并已拥有一个托管 Next.js 项目代码的仓库。
2. **宝塔面板服务器**:一台已安装宝塔面板的 Linux 服务器。
3. **已安装环境**:服务器上已通过宝塔面板的软件商店安装了 **Nginx (或 Apache)**、**Node.js (推荐 LTS 版本)** 和 **PM2 管理器**。
4. **Git 环境**:服务器上已安装 Git(通常宝塔面板会自带或可通过软件商店安装)。
5. **域名解析**:您的域名已正确解析到宝塔面板服务器的 IP 地址。
## III. 整体部署流程概览
以下是整个自动化部署流程的高层概览图:
\`\`\`mermaid
graph TD
A[开发者 Push 代码到 GitHub 仓库] --> B(GitHub 仓库);
B -- 代码更新 --> C{GitHub Webhook 触发};
C -- Payload URL & Secret --> D[宝塔面板服务器];
D -- 执行 deploy_webhook.php 脚本 --> E[自动部署脚本:
git pull
npm install
npm run build
pm2 restart];
E --> F[Next.js 应用更新并重启];
F --> G[用户通过域名访问最新网站];
\`\`\`
## IV. 各环节详细流程与配置
### A. 阶段一:开发者本地代码提交与推送
这是您日常开发的工作流程。
\`\`\`mermaid
graph TD
A[开发者本地修改 Next.js 代码] --> B[git add];
B --> C[git commit -m "更新了新功能"];
C --> D[git push origin main];
D --> E(代码推送到 GitHub 远程仓库);
\`\`\`
**操作说明:**
您在本地完成 Next.js 项目开发后,通过标准的 Git 命令将代码提交并推送到 GitHub 仓库的指定分支(例如 `main` 或 `master`)。
### B. 阶段二:宝塔面板服务器环境与网站配置(由您手动完成,一次性)
这是实现自动化部署的基础,需要您在宝塔面板上进行一次性设置。
1. **登录宝塔面板。**
2. **安装 Node.js 和 PM2 管理器:**
* 在宝塔面板左侧菜单选择 `软件商店`。
* 搜索并安装 `Node.js` (推荐安装 LTS 版本,例如 16.x, 18.x, 20.x)。
* 搜索并安装 `PM2 管理器`。PM2 是 Node.js 应用程序的生产级进程管理器,能确保您的 Next.js 应用在服务器上持续运行,并在代码更新后平滑重启。
3. **创建网站与域名:**
* 在宝塔面板左侧菜单选择 `网站` -> `添加站点`。
* 填写您的**域名**(根据截图推测,可能是 `touzhi.quwanzhi.com` 或您实际绑定的域名)。
* `FTP` 和 `数据库` 可以选择不创建(如果您的 Next.js 项目是纯前端或后端分离的)。
* `PHP 版本` 选择 `纯静态`。
* `网站目录`:根据截图,您的项目可能在 `/www/wwwroot/tongzhi`。**请确认并记住这个目录。** 稍后它将是您的 Git 仓库克隆和 `deploy_webhook.php` 脚本存放的目录。
* 点击 `提交`。
4. **配置 Nginx 反向代理 Next.js 应用:**
Next.js 应用通常运行在 Node.js 服务器上,并通过 Nginx 进行反向代理实现外网访问。
* 在宝塔面板 `网站` 列表中,找到您刚刚创建的网站,点击右侧的 `设置`。
* 切换到 `配置文件` 选项卡。
* 在 `server` 配置块中,添加以下 `location` 配置(请将 `3000` 替换为 Next.js 应用实际监听的端口):
\`\`\`nginx
# Nginx 配置示例 (添加到 server 段内)
location / {
proxy_pass http://127.0.0.1:3000; # <--- 替换为 PM2 启动的 Next.js 应用监听的实际端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# 如果您的 Next.js 应用有特殊路由需求,可能需要添加其他配置
}
\`\`\`
* 点击 `保存`。
5. **使用 PM2 管理 Next.js 应用:**
* 在宝塔面板左侧菜单选择 `PM2管理器`。
* 点击 `添加项目`。
* `项目目录`:选择您的网站根目录(根据截图可能是 `/www/wwwroot/tongzhi`)。
* `启动文件`:填写 `node_modules/next/dist/bin/next`。
* `项目名称`:根据截图,您的 PM2 项目名称可能是 `tongzhi` (**请务必记住这个名称,稍后在 Webhook 脚本中会用到**)。
* `启动参数`:填写 `start -p 3000` (这里的 `3000` 是您的 Next.js 应用监听的端口,请与 Nginx 反向代理中的端口保持一致)。
* 点击 `提交`。
* PM2 会自动启动您的 Next.js 应用。您可以点击 `日志` 查看应用启动情况。
6. **配置 Git 部署:**
宝塔面板内置的 Git 部署功能是接收 GitHub Webhook 通知并触发部署脚本的关键。
* 在宝塔面板 `网站` 列表中,找到对应的网站,点击右侧的 `设置`。
* 在网站设置窗口中,找到 `Git` 选项卡,点击进入。
* 勾选 `启用Git部署`。
* `平台` 选择 `Github`。
* `项目地址`:填写您的 GitHub 仓库的 HTTPS 地址。例如:`https://github.com/fnvtk/wztouzhi.git`。
* `分支`:填写您希望自动部署的分支名称,通常是 `main` 或 `master`。
* `Token`:**设置一个随机且复杂的字符串作为密钥**,例如 `your_custom_deploy_secret_wztouzhi_bt`。请务必牢记这个密钥,稍后在 GitHub Webhook 配置和部署脚本中会用到。
* `项目部署目录`:宝塔会自动填写网站的根目录(例如 `/www/wwwroot/tongzhi`),请确保它是您项目代码实际要部署的路径。
* `部署类型`:选择 `拉取`。
* **重要:`部署完成后执行的命令`:这里暂时留空,您将在后续步骤中将我为您生成的脚本内容粘贴到此处。**
* **获取 WebHook 地址:** 配置完上述信息并点击 `保存` 后,宝塔面板会为您生成一个 `WebHook地址`。**复制这个 URL!**
### C. 阶段三:GitHub 仓库 Webhook 配置(由您手动完成,一次性)
这个配置将使得 GitHub 在您推送代码时通知宝塔面板。
\`\`\`mermaid
graph TD
A[登录 GitHub 仓库] --> B[Settings];
B --> C[Webhooks];
C --> D[Add webhook];
D --> E[填写 Payload URL];
E --> F[设置 Secret];
F --> G[选择 'Just the push event'];
G --> H[Add webhook];
H --> I(Webhook 配置完成);
\`\`\`
**操作说明:**
1. **登录 GitHub**,进入您的 `wztouzhi` 项目仓库。
2. 点击仓库顶部的 `Settings`(设置)。
3. 在左侧导航栏中,点击 `Webhooks`。
4. 点击 `Add webhook`(添加 Webhook)。
5. 填写以下信息:
* **Payload URL**:粘贴您在宝塔面板 Git 部署设置中复制的 `WebHook地址`。
* **Content type**:选择 `application/json`。
* **Secret (可选,但强烈推荐)**:粘贴您在宝塔面板 Git 部署中设置的 `Token` (那个强密码)。
* **Which events would you like to trigger this webhook?**:选择 `Just the push event.`(仅推送事件)。
* `Active`:确保此选项被勾选。
6. 点击 `Add webhook` 完成添加。
### D. 阶段四:自动化部署脚本 `deploy_webhook.php` (由我提供,您粘贴到宝塔)
为了实现自动化构建和重启 Next.js 应用,我们需要一个 PHP 脚本来作为宝塔面板 Git 部署的"部署完成后执行的命令"。
我为您生成了以下 `deploy_webhook.php` 脚本。**您需要将此脚本的内容复制,并粘贴到宝塔面板网站设置中 Git 部署的"部署完成后执行的命令"文本框内。**
**脚本内容(已根据您的截图信息优化,请务必根据您的实际情况修改 `SECRET`):**
\`\`\`php
&1');
log_message("Git Pull Output:\n" . $output);
// 检查 Next.js 项目文件 (package.json)
if (file_exists('package.json')) {
log_message('Detected Next.js project. Installing dependencies and building...');
// 安装 Node.js 依赖
log_message('Executing npm install...');
// 使用 --force 强制安装,避免因包版本冲突导致安装失败
$output = shell_exec('npm install --force 2>&1');
log_message("npm install Output:\n" . $output);
// 构建 Next.js 项目
log_message('Executing npm run build...');
$output = shell_exec('npm run build 2>&1');
log_message("npm run build Output:\n" . $output);
// 重启 PM2 进程 (已根据截图更新应用名为 'tongzhi')
$PM2_APP_NAME = 'tongzhi'; // **已根据截图更新:请替换为你在PM2管理器中设置的项目名称**
log_message("Restarting PM2 process '{$PM2_APP_NAME}'...");
$output = shell_exec("pm2 restart {$PM2_APP_NAME} 2>&1");
log_message("PM2 Restart Output:\n" . $output);
} else {
log_message('No package.json found. Skipping Node.js specific commands.');
}
log_message('Deployment completed.');
echo 'Deployment successful!';
} else {
log_message('Event not supported. Only "push" events are processed.');
echo 'Event not supported.';
}
http_response_code(200);
?>
\`\`\`
**脚本流程图:**
\`\`\`mermaid
graph TD
A[GitHub Webhook 请求] --> B{deploy_webhook.php 接收};
B -- 获取 Payload & Headers --> C{验证 Secret};
C -- 签名不匹配 --> D[401 Unauthorised];
C -- 签名匹配 --> E{事件类型为 Push?};
E -- 否 --> F[跳过,不处理];
E -- 是 --> G[切换到项目根目录];
G --> H[执行 git pull];
H --> I{检查 package.json 存在?};
I -- 否 --> J[跳过 Node.js 命令];
I -- 是 --> K[执行 npm install];
K --> L[执行 npm run build];
L --> M[执行 pm2 restart 应用名];
M --> N(部署成功,返回 200 OK);
\`\`\`
### V. 自动化部署完成与验证
完成以上所有配置后,每次您向 GitHub 仓库的指定分支推送代码,就会自动触发部署流程:
1. GitHub 发送 Webhook 请求到宝塔面板。
2. 宝塔面板接收请求并执行 `deploy_webhook.php` 脚本。
3. 脚本在服务器上拉取最新代码,安装/更新 Node.js 依赖,构建 Next.js 项目。
4. PM2 自动重启您的 Next.js 应用。
5. 您的网站内容更新,并能通过您绑定的域名在外网访问到最新版本。
**验证方法:**
* **查看 GitHub Webhook 记录:** 在 GitHub 仓库的 Webhook 设置页面,查看 `Recent Deliveries`,确保每次推送都有成功的绿色勾选。
* **查看宝塔面板 Git 部署日志:** 在宝塔面板网站设置的 `Git` 选项卡中,通常会有部署日志,可以查看详细的执行情况。
* **查看 `deploy.log` 文件:** 脚本会在项目根目录生成 `deploy.log` 文件,记录每次部署的详细信息,方便排查问题。
* **访问您的网站:** 通过域名访问您的网站,确认内容是否已更新到最新。
### VI. 注意事项与优化
* **安全性**:`Secret` 密钥是关键,请妥善保管,不要泄露。
* **权限问题**:确保宝塔面板运行的用户(通常是 `www` 用户)对项目目录有足够的读写权限,以便 `git pull`、`npm install`、`npm run build` 等命令能够正常执行。
* **依赖缓存**:在部署脚本中,`npm install` 会在每次部署时运行。如果您的项目依赖较多,可以考虑在 `Dockerfile` 中构建一个包含依赖的镜像,或者在服务器上对 `node_modules` 进行缓存处理,以加快部署速度(此文档以直接安装为默认)。
* **错误处理**:脚本中已加入了日志记录,您可以通过查看 `deploy.log` 文件来排查部署失败的原因。
* **生产模式**:确保您的 Next.js 应用在 `npm run build` 后是以生产模式构建的。
* **持续学习**:自动化部署是一个持续优化的过程,您可以根据项目需求和服务器性能,不断调整部署脚本。