将 TanStack Start 和 Bun 部署到 Railway
发布: (2026年5月5日 GMT+8 03:45)
3 分钟阅读
原文: Dev.to
Source: Dev.to
Problem
Railway 的 Nixpacks 自动构建能够检测到 Bun 项目,但它无法处理本站点所需的顺序:
- 构建时运行
prisma generate - Vite + TanStack Start 插件
- 自定义的
server.ts入口点 - 启动时执行
prisma migrate deploy
让 Nixpacks 编排所有这些要比使用直接的多阶段 Dockerfile 更复杂。
Solution
一个四阶段的 Dockerfile 可以解决该问题:
- 两个并行的
bun install阶段 – 一个安装所有依赖,另一个仅安装生产依赖。 - 构建阶段 – 在一个虚拟的
DATABASE_URL上运行prisma generate。 - 精简运行时阶段 – 将生成的 Prisma 客户端层叠在生产
node_modules之上。 - 入口点 – 在
exec进入 Bun 之前运行迁移,使容器的 PID 1 在 Railway 的SIGTERM时能够干净地关闭。
Dockerfile 配方(概要)
- 阶段 1:
FROM bun:latest AS deps-full→bun install(全部依赖)。 - 阶段 2:
FROM bun:latest AS deps-prod→bun install --production。 - 阶段 3:
FROM deps-full AS build→ 设置一个虚拟的DATABASE_URL,运行prisma generate,随后构建 Vite/TanStack Start 包。 - 阶段 4:
FROM bun:slim AS runtime→ 从deps-prod复制node_modules,并从build复制生成的 Prisma 客户端,添加server.ts,并设置入口点,使其:- 执行
prisma migrate deploy exec bun server.ts
- 执行
Railway 端的细节
- Postgres 引用变量: 将 Railway 提供的 Postgres URL 绑定到应用的
DATABASE_URL环境变量。 - 绑定地址: 明确将服务器绑定到
0.0.0.0,以便 Railway 能正确路由流量。 - COPY 顺序: 确保在生产
node_modules之后复制生成的 Prisma 客户端,以便运行时使用正确的客户端版本。
最初发布于 andreasbergstrom.dev — 在那里阅读完整文章。