将 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 可以解决该问题:

  1. 两个并行的 bun install 阶段 – 一个安装所有依赖,另一个仅安装生产依赖。
  2. 构建阶段 – 在一个虚拟的 DATABASE_URL 上运行 prisma generate
  3. 精简运行时阶段 – 将生成的 Prisma 客户端层叠在生产 node_modules 之上。
  4. 入口点 – 在 exec 进入 Bun 之前运行迁移,使容器的 PID 1 在 Railway 的 SIGTERM 时能够干净地关闭。

Dockerfile 配方(概要)

  • 阶段 1: FROM bun:latest AS deps-fullbun install(全部依赖)。
  • 阶段 2: FROM bun:latest AS deps-prodbun 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,并设置入口点,使其:
    1. 执行 prisma migrate deploy
    2. exec bun server.ts

Railway 端的细节

  • Postgres 引用变量: 将 Railway 提供的 Postgres URL 绑定到应用的 DATABASE_URL 环境变量。
  • 绑定地址: 明确将服务器绑定到 0.0.0.0,以便 Railway 能正确路由流量。
  • COPY 顺序: 确保在生产 node_modules 之后复制生成的 Prisma 客户端,以便运行时使用正确的客户端版本。

最初发布于 andreasbergstrom.dev — 在那里阅读完整文章。

0 浏览
Back to Blog

相关文章

阅读更多 »

让客户交接轻松的文件夹结构

每家机构都有这样一个版本的故事:团队成员离职、客户升级,或者你在替病假的同事顶班——于是你花了20分钟去搜索……