在自己的服务器上托管 Next.js,git push 即部署
在自己的服务器上托管 Next.js,简单的做法是安装 Coolify 这样的部署面板,并连接您的 GitHub 仓库。之后,每次 git push 都会构建应用,并通过 HTTPS 让新版本上线。根据 Next.js 文档,使用 Node.js 服务器或 Docker 容器部署时,所有功能都能用,所以您不会被绑定在某个特殊平台上。
在自己的服务器上哪些功能可以用?
官方文档中的表格很简短:Node.js 服务器和 Docker 支持所有功能,静态导出则有限制。在单台服务器上,实际意味着:
- 服务器组件、API 路由和流式响应,通过
next start都能工作。 next/image不需要额外设置,图片在服务器上处理。- 在有持久磁盘的单台服务器上,缓存和增量静态再生成(ISR)会自行工作。如果您运行多个副本,就必须在它们之间共享缓存。
- 官方建议在前面放一个反向代理,而不是直接暴露 Next.js。Coolify 为此自带 Traefik,证书也由 Traefik 来获取。
服务器需要多强的配置?
决定您需要多少内存的是构建,而不是运行中的应用。next build 会出现峰值,应用启动后需要的内存要少得多。Coolify 本身也会占用内存。以下是我们在真实服务器上测得的数值:
| 配置 | 小型项目 | 软件包很多的项目 |
|---|---|---|
| 2 GB,1 vCPU | 350 秒,1.4 GB 内存和 0.5 GB swap | 构建时内存不足 |
| 4 GB,2 vCPU | 213 秒,2.2 GB 内存和 0.2 GB swap | 223 秒,3.5 GB 内存和 0.9 GB swap |
小型项目是 Coolify 的示例 Next.js 应用。较大的那个是用 Next.js 16 写的 AI 聊天应用,约有 85 个软件包,在 2 GB 上于 TypeScript 检查阶段内存不足。服务器配有 2 GB swap,表中的数字是峰值。首次构建后的磁盘占用为 13-18 GB。这些是我们自己的测量结果,您的项目会有所不同。如果构建因内存不足而失败,请先升级,之后如果可以再降配。
分步操作
1. 连接仓库
登录 Coolify,在 Projects 页面中打开您的项目,点击 New resource。对于公开仓库,选择 Public Git Repository,输入地址并点击 Check repository。
2. 如果仓库是私有的,添加密钥
在左侧菜单的 Keys & Tokens 下进入 Private Keys,用 Generate ED25519 创建一个密钥。把公钥添加到 GitHub 上该仓库 Settings 页面的 Deploy keys 中。然后使用 New resource,选择 Private Git Repository (with Deploy Key),输入 [email protected]:user/project.git。Build pack 保持为能识别 Next.js 的 Railpack,端口保持 3000。Coolify 把 Railpack 标为 beta,所以如果遇到问题,请选择您自己的 Dockerfile。
3. 填写环境变量
在 Environment Variables 页面中,切换到 Developer view,粘贴您的 .env 文件的内容。这里有一个细节很重要:名称以 NEXT_PUBLIC_ 开头的变量会在构建时写入代码。修改其中一个后,请点击 Redeploy:面板会发现构建设置变了,从而重新构建。千万不要给不该让浏览器看到的密钥加这个前缀。
4. 绑定您的域名
在您的域名服务商处创建一条指向服务器 IP 地址的 A 记录。在 Coolify 中进入 Domains 页面,点击 Add domain,协议选择 https,输入您的域名,保存并重新部署。证书会自动申请和续期。80 和 443 端口必须开放。
5. 部署
点击 Deploy。Deployments 页面会实时显示构建日志。构建完成后,在新容器就绪之前,旧容器会继续提供服务。
git push 如何变成一次部署?
每次推送时,GitHub 都会向面板发送一个带签名的请求。面板会验证签名,并为该分支重新构建应用,签名有误的请求会被拒绝。设置方法如下:
- 在应用的 Webhooks 页面,复制 GitHub 部分的 Webhook URL,在 Webhook secret 中填入至少 16 个字符的随机值并保存。
- 在 GitHub 上,打开仓库的 Settings,进入 Webhooks,点击 Add webhook。
- 把地址填入 Payload URL,同样的值填入 Secret。把 Content type 设为
application/json,并且只保留 push 这一个事件。
试一试:
git commit --allow-empty -m "deploy test"
git push
新的构建会出现在 Deployments 页面。在小型示例项目上,得益于构建缓存,一次新提交在 41 秒内就上线了。GitHub 必须能访问面板的地址,由于面板是带公网 HTTPS 地址安装的,不需要任何额外设置。
常见错误
| 现象 | 原因 | 解决办法 |
|---|---|---|
构建因 Killed 或 heap out of memory 而中断 | 内存不足 | 升级服务器 |
新的 NEXT_PUBLIC_ 值没有生效 | 这个值已经固化在构建里 | 使用 Redeploy |
| 构建时因缺少变量而失败 | 代码在构建期间读取了这个变量 | 在面板中添加它,并让它在构建时也可用 |
| 没有收到证书 | A 记录有误,或者还没有生效 | 检查记录,生效后重新部署 |
| 线上网站出现 502 错误 | 应用监听的是另一个端口 | 在 General 页面中更正端口 |
选择 Seturack 的 Next.js 选项时,Coolify 已经装好:本地服务器已通过验证,欢迎向导已经跳过,面板通过 HTTPS 打开。地址和密码显示在您的面板中,您从连接 GitHub 开始。root 权限在您手里,如果愿意,也可以全部在面板中管理。每日备份已包含在价格中,流量不限。您可以在 Next.js VPS 页面用滑块设置配置。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。