TanStack Start와 Bun을 Railway에 배포

발행: (2026년 5월 5일 AM 04:45 GMT+9)
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. 엔트리포인트 – 컨테이너가 Railway의 SIGTERM을 받을 때 PID 1이 깔끔하게 종료되도록, Bun을 exec하기 전에 마이그레이션을 실행합니다.

Dockerfile recipe (summary)

  • Stage 1: FROM bun:latest AS deps-fullbun install (전체 의존성).
  • Stage 2: FROM bun:latest AS deps-prodbun install --production.
  • Stage 3: FROM deps-full AS build → 더미 DATABASE_URL을 설정하고 prisma generate를 실행한 뒤, Vite/TanStack Start 번들을 빌드합니다.
  • Stage 4: FROM bun:slim AS runtimedeps-prod에서 node_modules를 복사하고 build에서 생성된 Prisma 클라이언트를 복사한 뒤, server.ts를 추가하고 다음을 수행하는 엔트리포인트를 설정합니다:
    1. prisma migrate deploy 실행
    2. exec bun server.ts

Railway‑side details

  • Postgres reference variable: Railway에서 제공하는 Postgres URL을 앱의 DATABASE_URL 환경 변수에 연결합니다.
  • Binding address: 서버를 0.0.0.0에 명시적으로 바인딩하여 Railway가 트래픽을 올바르게 라우팅하도록 합니다.
  • COPY order: 런타임이 올바른 클라이언트 버전을 사용하도록, 생성된 Prisma 클라이언트를 프로덕션 node_modules 후에 복사합니다.

Originally published at andreasbergstrom.dev — read the full post there.

0 조회
Back to Blog

관련 글

더 보기 »

개발자로서 당신의 Fear Score는?

두려움은 우리에게 모든 것을 앗아갑니다. 나는 한 번 “You miss 100% of the shots you don’t take”라는 말을 들었고, 그것이 내 경력 전반에 울려 퍼졌습니다. 돌아보면, 나는 man…