把 Next.js 应用从 Vercel 迁移到自己的服务器
要把 Next.js 应用从 Vercel 迁移到自己的服务器,请把同一个 GitHub 仓库连接到服务器上的 Coolify 面板,复制环境变量,替换 Vercel 特有的部分(定时任务、统计、存储),在临时地址上测试,最后再切换域名的 A 记录。Next.js 文档说,在 Node.js 服务器上所有功能都能工作。切换之前,您的 Vercel 部署一直保持在线,所以您有退路。
说到底,这是一个计费模式的选择。Vercel 的文档解释说,基础设施按传输的数据量、请求数和计算时长计费。服务器则按您选择的 RAM、CPU 和磁盘收取固定月费。我们的对比文章展示了如何用自己的数字算账。
迁移后有什么变化?
| 项目 | Vercel | 您的服务器 |
|---|---|---|
| 计费 | 按用量 | 固定月费,流量不限,每日备份已包含在价格中 |
| 位置 | 全球分发网络 | 一台服务器,位于伊斯坦布尔 |
| 流量高峰 | 由平台承接,账单随之增长 | 容量用完时网站会变慢,由您来升级 |
| 构建 | 在平台的机器上 | 在同一台服务器上,所以构建决定了您需要的内存 |
| 维护 | 平台的工作 | 操作系统更新、软件包更新和监控由您负责,root 权限也归您 |
| 预览 | 分支自动生成 | 在 Coolify 中单独启用 |
| 网络安全 | Vercel Firewall | 由您管理服务器的防火墙 |
说得直白一点:只有一台服务器,没有全球边缘分发,维护也变成了您的事。谁不会介意?如果您的访问者主要在土耳其及周边国家,一个位置就够了。如果您的页面都从同一个数据库读取,无论代码在哪里运行,响应都要等这个数据库。仪表盘、内部工具和流量可预测的产品,很少需要自动扩容。如果您的受众遍布全球、流量高峰很猛,或者您完全不想碰维护,Vercel 可能更适合。
准备新服务器
- 从 Next.js VPS 页面订购。服务器自带 Coolify。
- 连接仓库。简便的做法:在 Claude Code 或 Cursor 中打开项目,粘贴概览标签页上的粘贴到您的 AI 工具一行,由工具来部署。您也可以手动完成。
- 用
package.json中的engines.node固定您的 Node 版本。 - 拉取您的变量:
vercel env pull .env.move --environment=production。机密值无法回读,所以 CLI 会写入占位符,需要您从原来的来源获取这些值。不要把这个文件放进仓库,把它的内容填入 Coolify 的 Environment Variables 下,并让NEXT_PUBLIC_的值在构建时可用。 - 搜索 Vercel 特有的代码:
grep -n "@vercel/" package.json和grep -rnE "VERCEL_|x-vercel-" app src。VERCEL_URL这样的系统变量在您的服务器上并不存在,请改用您自己的。
Next.js 功能和 Vercel 特有的部分
| 部分 | 在您的服务器上 | 操作 |
|---|---|---|
| 图片优化 | 通过 next start 工作,无需设置 | 使用您服务器的 CPU 和内存 |
| ISR 和缓存 | 在有本地磁盘的单个实例上会自行工作 | 多个实例必须共享缓存,而且每次部署后缓存都要重新填充 |
| Middleware(Next.js 16 中的 Proxy) | 通过 next start 工作,无需设置 | 请求现在在伊斯坦布尔处理 |
| 定时任务 | 不会读取 vercel.json | 在 Coolify 的 Scheduled Tasks 中调用同一个路径:curl -fsS -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron。Vercel 的定时任务按 UTC 运行,而 Coolify 使用服务器的时区 |
| 重定向和响应头 | 不会读取 vercel.json | 把它们移到 next.config 中 |
| Web Analytics、Speed Insights | 依赖 Vercel 添加到部署中的路由 | 移除这些组件,改用 Umami 这样的工具 |
| AI Gateway | 可以从任何服务器调用 | 设置 AI_GATEWAY_API_KEY |
Postgres、KV 和 Blob 怎么办?
- Postgres 和 KV:Vercel 的文档说这些产品已经下线,旧的数据库已迁到 Marketplace 提供商那里,所以您的数据放在一个独立的提供商处,通过环境变量访问。把这个变量带过去,应用就能访问同一个数据库。如果计费是通过您的 Vercel 账户进行的,请在关闭账户之前先取出您的数据。数据库离得远,每次查询都会加上这段距离。
- 迁移到您的服务器:在 Coolify 中创建 PostgreSQL,用
pg_dump -Fc "OLD-DATABASE-URL" --no-owner --no-privileges -f backup.dump导出,并在数据库的 Backups 页面用 Import backup 上传归档文件。如果 Redis 只是缓存,从空的开始通常没问题。 - Blob:
BLOB_READ_WRITE_TOKEN在其他主机上也能使用,所以您可以不动它。要把文件迁到您的服务器上,请修改代码,并用 Persistent Storage 挂载文件夹。
不停机地迁移域名
- 在 Coolify 给您的 HTTPS 地址上测试:登录、表单、支付、图片,以及用 Execute now 测试定时任务。
dig NS example.com +short会显示您的记录在哪里:如果列出的是 Vercel 的域名服务器,就在 Vercel 的 Domains 页面,否则在您的 DNS 服务商处。- 降低根域名和
www记录的 TTL,例如降到 300 秒,并等待旧的 TTL 过去。 - 如果数据库也要迁移,请停止写入并载入最后一份副本。
- 把 A 记录指向服务器的 IP 地址。邮件相关的 MX 和 TXT 记录请不要动。
- 在 Coolify 的 Domains 页面用
https添加域名,并点击 Redeploy。证书会自动签发。 - 让 Vercel 的部署再保留几天。缓存了旧记录的访问者会到那里,需要的话,您还可以把记录指回去。
- 流量迁移完成后,从 Vercel 项目中移除域名,用 Disconnect 断开 Git 连接,并恢复 TTL。
证书只有在域名指向服务器之后才会签发,所以最早的访问者可能会短暂看到证书警告。请在安静的时段切换。
常见问题
一开始该选什么配置?
销售页面推荐至少 4 GB RAM、2 vCore 和 40 GB 磁盘。一个小项目在 2 GB 上完成了构建,而一个有 85 个软件包的项目在 2 GB 上内存不足,在 4 GB 上完成了构建。您可以在面板中升级。
每月费用是多少?
这个配置每月约 $6(含增值税),在土耳其以外以美元付款。流量不限。
在 Vercel 买的域名需要转出吗?
不需要。Vercel 的文档把注册和 DNS 当作两件独立的事。在 Vercel 更改 A 记录就够了,您的记录会覆盖默认的记录。
迁移后如何更新?
设置了 webhook 的话,git push 会构建并发布每个版本。如果某个版本出了问题,Coolify 的 Rollback 页面可以让您回到之前的镜像。
可以不迁移数据库吗?
可以,而且这是风险最低的顺序。先迁移应用,之后再迁移数据库。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。