Railway로 RAG API 서버 배포하기: Docker 없이 5분 만에
퀀트 리서치용 RAG 시스템을 Railway에 배포하는 방법입니다. GitHub 연동으로 push하면 자동 배포되고, 비용도 Heroku보다 훨씬 저렴합니다.
왜 배포가 귀찮은가
RAG 시스템을 로컬에서 만들었습니다. LangChain + Qdrant + Claude API 조합으로 금융 문서 검색이 잘 됩니다. 그런데 팀원이 쓰려면 서버에 올려야 합니다.
선택지는 보통 이렇습니다:
- EC2에 SSH 접속해서 수동 세팅 — 번거롭고 관리가 힘듦
- Docker + ECS/Kubernetes — 과도한 복잡성
- Heroku — 비쌈 (무료 플랜도 없어짐)
- Railway — 이걸 쓰게 됐습니다
Railway가 편한 이유
Railway는 GitHub 리포지토리를 연결하면 main 브랜치 push 시 자동으로 빌드·배포합니다. Dockerfile이 있으면 그걸 쓰고, 없으면 언어를 감지해서 자동으로 빌드합니다.
Python FastAPI 프로젝트 기준:
- GitHub에 코드 올림
- Railway에서 “Deploy from GitHub” 선택
- 리포지토리 선택
- 완료
환경변수는 Railway 대시보드에서 설정합니다. ANTHROPIC_API_KEY, QDRANT_URL 같은 민감한 값을 코드에 넣지 않아도 됩니다.
FastAPI RAG 서버 예시
# main.py
from fastapi import FastAPI
from anthropic import Anthropic
from qdrant_client import QdrantClient
import os
app = FastAPI()
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
qdrant = QdrantClient(url=os.environ["QDRANT_URL"])
@app.post("/query")
async def query(question: str) -> dict:
# 1. Qdrant에서 관련 문서 검색
results = qdrant.search(
collection_name="research_docs",
query_vector=embed(question),
limit=5
)
context = "\n\n".join([r.payload["text"] for r in results])
# 2. Claude로 답변 생성
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1000,
messages=[{
"role": "user",
"content": f"컨텍스트:\n{context}\n\n질문: {question}"
}]
)
return {"answer": response.content[0].text}
Railway에 requirements.txt만 있으면 Python 환경을 자동으로 잡아줍니다.
비용 계산
Railway 가격 (2026년 4월 기준):
- Hobby 플랜: $5/월 — 512MB RAM, 1vCPU, 1GB 디스크
- Pro 플랜: $20/월 — 8GB RAM, 8vCPU, 100GB 디스크
- 실제 사용량 기반으로만 과금 (켜놓는 시간 × 리소스)
가벼운 RAG API (퀀트 팀 내부용)는 Hobby $5/월로 충분합니다. FastAPI는 메모리를 많이 먹지 않고, Qdrant는 별도 인스턴스(Qdrant Cloud 무료 플랜)로 빼면 됩니다.
Heroku 대비 비교:
- Heroku Basic: $7/월 (512MB RAM, 한 서버만)
- Railway Hobby: $5/월 + 사용량 기반, 여러 서비스 배포 가능
실제 세팅 순서
1. 코드 구조
my-rag-api/
├── main.py
├── requirements.txt
└── (Dockerfile 선택)
requirements.txt:
fastapi==0.115.0
uvicorn==0.32.0
anthropic==0.40.0
qdrant-client==1.12.0
2. Railway 배포
- railway.app 접속 (GitHub으로 로그인)
- New Project → Deploy from GitHub repo
- 리포지토리 선택
- 환경변수 추가:
ANTHROPIC_API_KEY,QDRANT_URL - 자동 배포 완료
Railway가 main.py에서 FastAPI를 감지하면 자동으로 uvicorn main:app --host 0.0.0.0 --port $PORT 형태로 실행합니다.
3. 커스텀 도메인 (선택)
기본 도메인은 xxx.railway.app 형태입니다. 커스텀 도메인은 Railway 대시보드에서 CNAME 설정으로 연결됩니다.
유용한 패턴: 슬랙 웹훅 연동
퀀트 팀 내부 RAG 봇으로 쓸 때 Slack 슬래시 커맨드와 연결하면 편합니다.
@app.post("/slack/command")
async def slack_command(
text: str = Form(...),
response_url: str = Form(...)
) -> dict:
# 비동기로 처리하고 Slack에 결과 전송
asyncio.create_task(
process_and_respond(text, response_url)
)
return {"text": "분석 중... (잠시 후 결과가 전송됩니다)"}
슬랙에서 /rag 오늘 BTC 온체인 요약해줘 하면 RAG가 저장된 문서를 검색해 답변합니다.
결론
Railway는 복잡한 DevOps 없이 Python 서버를 배포하기 좋은 서비스입니다. GitHub 연동으로 CI/CD가 자동화되고, 환경변수 관리도 깔끔합니다.
내부 리서치 도구나 팀 공유용 API 서버 정도의 용도라면 Hobby $5/월로 충분합니다. 트래픽이 많아지면 Pro 플랜으로 올리거나 인스턴스 수를 늘리면 됩니다.
Railway 가입 링크 — 레퍼럴로 가입하면 $20 크레딧이 제공됩니다.