---
title: "Deploy LangServe RAG API + pgvector"
description: "LangServe RAG API with FastAPI, Postgres, pgvector, and auth."
category: "AI/ML"
url: https://railway.com/deploy/langserve-pgvector-rag
---

# Deploy LangServe RAG API + pgvector

LangServe RAG API with FastAPI, Postgres, pgvector, and auth.

**[Deploy LangServe RAG API + pgvector on Railway](https://railway.com/template/langserve-pgvector-rag)**

- **Creator:** leodev
- **Category:** AI/ML

## Template content

### langserve

- **Image:** python:3.12-slim
- **Start command:** `/bin/sh -c 'set -eu; mkdir -p /app; echo aW1wb3J0IGhhc2hsaWIKaW1wb3J0IG1hdGgKaW1wb3J0IG9zCmltcG9ydCB1dWlkCmZyb20gdHlwaW5nIGltcG9ydCBBbnkKCmltcG9ydCBwc3ljb3BnCmZyb20gZmFzdGFwaSBpbXBvcnQgRGVwZW5kcywgRmFzdEFQSSwgSGVhZGVyLCBIVFRQRXhjZXB0aW9uCmZyb20gbGFuZ2NoYWluX2NvcmUucnVubmFibGVzIGltcG9ydCBSdW5uYWJsZUxhbWJkYQpmcm9tIGxhbmdzZXJ2ZSBpbXBvcnQgYWRkX3JvdXRlcwpmcm9tIHBzeWNvcGcudHlwZXMuanNvbiBpbXBvcnQgSnNvbmIKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsLCBGaWVsZAoKCkRBVEFCQVNFX1VSTCA9IG9zLmVudmlyb25bIkRBVEFCQVNFX1VSTCJdCkVNQkVERElOR19ESU1FTlNJT05TID0gaW50KG9zLmdldGVudigiRU1CRURESU5HX0RJTUVOU0lPTlMiLCAiNjQiKSkKQ09MTEVDVElPTiA9IG9zLmdldGVudigiTEFOR1NFUlZFX0NPTExFQ1RJT04iLCAicmFpbHdheV9kb2NzIikKUkVRVUlSRV9BUElfS0VZID0gb3MuZ2V0ZW52KCJSRVFVSVJFX0FQSV9LRVkiLCAidHJ1ZSIpLmxvd2VyKCkgPT0gInRydWUiCkFQUF9BUElfS0VZID0gb3MuZ2V0ZW52KCJBUFBfQVBJX0tFWSIsICIiKQpPUEVOQUlfQVBJX0tFWSA9IG9zLmdldGVudigiT1BFTkFJX0FQSV9LRVkiLCAiIikKT1BFTkFJX01PREVMID0gb3MuZ2V0ZW52KCJPUEVOQUlfTU9ERUwiLCAiZ3B0LTQuMS1taW5pIikKCgpjbGFzcyBJbmdlc3RSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgdGV4dDogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIG1ldGFkYXRhOiBkaWN0W3N0ciwgQW55XSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQoKCmNsYXNzIFNlYXJjaFJlcXVlc3QoQmFzZU1vZGVsKToKICBxdWVyeTogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIGs6IGludCA9IEZpZWxkKGRlZmF1bHQ9NCwgZ2U9MSwgbGU9MTIpCgoKY2xhc3MgUmFnSW5wdXQoQmFzZU1vZGVsKToKICBxdWVzdGlvbjogc3RyID0gRmllbGQobWluX2xlbmd0aD0xKQogIGs6IGludCA9IEZpZWxkKGRlZmF1bHQ9NCwgZ2U9MSwgbGU9MTIpCgoKY2xhc3MgUmFnT3V0cHV0KEJhc2VNb2RlbCk6CiAgYW5zd2VyOiBzdHIKICB1c2VkX2xsbTogYm9vbAogIGNvbnRleHRzOiBsaXN0W2RpY3Rbc3RyLCBBbnldXQoKCmRlZiByZXF1aXJlX2FwaV9rZXkoYXV0aG9yaXphdGlvbjogc3RyIHwgTm9uZSA9IEhlYWRlcihkZWZhdWx0PU5vbmUpKSAtPiBOb25lOgogIGlmIG5vdCBSRVFVSVJFX0FQSV9LRVk6CiAgICByZXR1cm4KICBpZiBub3QgQVBQX0FQSV9LRVk6CiAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMCwgZGV0YWlsPSJBUFBfQVBJX0tFWSBpcyByZXF1aXJlZCB3aGVuIFJFUVVJUkVfQVBJX0tFWT10cnVlIikKICBpZiBhdXRob3JpemF0aW9uICE9IGYiQmVhcmVyIHtBUFBfQVBJX0tFWX0iOgogICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT00MDEsIGRldGFpbD0iTWlzc2luZyBvciBpbnZhbGlkIGJlYXJlciB0b2tlbiIpCgoKZGVmIGVtYmVkZGluZ19mb3IodGV4dDogc3RyKSAtPiBsaXN0W2Zsb2F0XToKICB2ZWN0b3IgPSBbMC4wXSAqIEVNQkVERElOR19ESU1FTlNJT05TCiAgZm9yIHRva2VuIGluIHRleHQubG93ZXIoKS5zcGxpdCgpOgogICAgZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYodG9rZW4uZW5jb2RlKCJ1dGYtOCIpKS5kaWdlc3QoKQogICAgaW5kZXggPSBpbnQuZnJvbV9ieXRlcyhkaWdlc3RbOjRdLCAiYmlnIikgJSBFTUJFRERJTkdfRElNRU5TSU9OUwogICAgc2lnbiA9IDEuMCBpZiBkaWdlc3RbNF0gJSAyID09IDAgZWxzZSAtMS4wCiAgICB2ZWN0b3JbaW5kZXhdICs9IHNpZ24KICBub3JtID0gbWF0aC5zcXJ0KHN1bSh2YWx1ZSAqIHZhbHVlIGZvciB2YWx1ZSBpbiB2ZWN0b3IpKSBvciAxLjAKICByZXR1cm4gW3JvdW5kKHZhbHVlIC8gbm9ybSwgNikgZm9yIHZhbHVlIGluIHZlY3Rvcl0KCgpkZWYgdmVjdG9yX2xpdGVyYWwodmFsdWVzOiBsaXN0W2Zsb2F0XSkgLT4gc3RyOgogIHJldHVybiAiWyIgKyAiLCIuam9pbihzdHIodmFsdWUpIGZvciB2YWx1ZSBpbiB2YWx1ZXMpICsgIl0iCgoKZGVmIGNvbm5lY3QoKSAtPiBwc3ljb3BnLkNvbm5lY3Rpb246CiAgcmV0dXJuIHBzeWNvcGcuY29ubmVjdChEQVRBQkFTRV9VUkwpCgoKZGVmIGVuc3VyZV9zY2hlbWEoKSAtPiBOb25lOgogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgiQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHZlY3RvciIpCiAgICAgIGN1ci5leGVjdXRlKAogICAgICAgIGYiIiIKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkb2N1bWVudHMgKAogICAgICAgICAgaWQgdXVpZCBQUklNQVJZIEtFWSwKICAgICAgICAgIGNvbGxlY3Rpb24gdGV4dCBOT1QgTlVMTCwKICAgICAgICAgIGNvbnRlbnQgdGV4dCBOT1QgTlVMTCwKICAgICAgICAgIG1ldGFkYXRhIGpzb25iIE5PVCBOVUxMIERFRkFVTFQgJ3t7fX0nOjpqc29uYiwKICAgICAgICAgIGVtYmVkZGluZyB2ZWN0b3Ioe0VNQkVERElOR19ESU1FTlNJT05TfSkgTk9UIE5VTEwsCiAgICAgICAgICBjcmVhdGVkX2F0IHRpbWVzdGFtcHR6IE5PVCBOVUxMIERFRkFVTFQgbm93KCkKICAgICAgICApCiAgICAgICAgIiIiCiAgICAgICkKICAgICAgY3VyLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGRvY3VtZW50c19jb2xsZWN0aW9uX2lkeCBPTiBkb2N1bWVudHMgKGNvbGxlY3Rpb24pIikKICAgIGNvbm4uY29tbWl0KCkKCgpkZWYgc2VhcmNoX2RvY3VtZW50cyhxdWVyeTogc3RyLCBrOiBpbnQpIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogIGVuc3VyZV9zY2hlbWEoKQogIHF1ZXJ5X3ZlY3RvciA9IHZlY3Rvcl9saXRlcmFsKGVtYmVkZGluZ19mb3IocXVlcnkpKQogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgaWQ6OnRleHQsIGNvbnRlbnQsIG1ldGFkYXRhLCAxIC0gKGVtYmVkZGluZyA8PT4gJXM6OnZlY3RvcikgQVMgc2NvcmUKICAgICAgICBGUk9NIGRvY3VtZW50cwogICAgICAgIFdIRVJFIGNvbGxlY3Rpb24gPSAlcwogICAgICAgIE9SREVSIEJZIGVtYmVkZGluZyA8PT4gJXM6OnZlY3RvcgogICAgICAgIExJTUlUICVzCiAgICAgICAgIiIiLAogICAgICAgIChxdWVyeV92ZWN0b3IsIENPTExFQ1RJT04sIHF1ZXJ5X3ZlY3RvciwgayksCiAgICAgICkKICAgICAgcmV0dXJuIFsKICAgICAgICB7ImlkIjogcm93WzBdLCAidGV4dCI6IHJvd1sxXSwgIm1ldGFkYXRhIjogcm93WzJdLCAic2NvcmUiOiBmbG9hdChyb3dbM10pfQogICAgICAgIGZvciByb3cgaW4gY3VyLmZldGNoYWxsKCkKICAgICAgXQoKCmRlZiBpbmdlc3RfZG9jdW1lbnQocGF5bG9hZDogSW5nZXN0UmVxdWVzdCkgLT4gZGljdFtzdHIsIHN0cl06CiAgZW5zdXJlX3NjaGVtYSgpCiAgZG9jdW1lbnRfaWQgPSB1dWlkLnV1aWQ0KCkKICB3aXRoIGNvbm5lY3QoKSBhcyBjb25uOgogICAgd2l0aCBjb25uLmN1cnNvcigpIGFzIGN1cjoKICAgICAgY3VyLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIElOVE8gZG9jdW1lbnRzIChpZCwgY29sbGVjdGlvbiwgY29udGVudCwgbWV0YWRhdGEsIGVtYmVkZGluZykKICAgICAgICBWQUxVRVMgKCVzLCAlcywgJXMsICVzLCAlczo6dmVjdG9yKQogICAgICAgICIiIiwKICAgICAgICAoCiAgICAgICAgICBkb2N1bWVudF9pZCwKICAgICAgICAgIENPTExFQ1RJT04sCiAgICAgICAgICBwYXlsb2FkLnRleHQsCiAgICAgICAgICBKc29uYihwYXlsb2FkLm1ldGFkYXRhKSwKICAgICAgICAgIHZlY3Rvcl9saXRlcmFsKGVtYmVkZGluZ19mb3IocGF5bG9hZC50ZXh0KSksCiAgICAgICAgKSwKICAgICAgKQogICAgY29ubi5jb21taXQoKQogIHJldHVybiB7ImlkIjogc3RyKGRvY3VtZW50X2lkKX0KCgpkZWYgYW5zd2VyX3F1ZXN0aW9uKHBheWxvYWQ6IFJhZ0lucHV0IHwgZGljdFtzdHIsIEFueV0pIC0+IFJhZ091dHB1dDoKICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGRpY3QpOgogICAgcGF5bG9hZCA9IFJhZ0lucHV0Lm1vZGVsX3ZhbGlkYXRlKHBheWxvYWQpCgogIGNvbnRleHRzID0gc2VhcmNoX2RvY3VtZW50cyhwYXlsb2FkLnF1ZXN0aW9uLCBwYXlsb2FkLmspCiAgY29udGV4dF90ZXh0ID0gIlxuXG4iLmpvaW4oZiItIHtpdGVtWyd0ZXh0J119IiBmb3IgaXRlbSBpbiBjb250ZXh0cykgb3IgIk5vIG1hdGNoaW5nIGNvbnRleHQgZm91bmQuIgogIHByb21wdCA9ICgKICAgICJBbnN3ZXIgdGhlIHF1ZXN0aW9uIHVzaW5nIG9ubHkgdGhlIHJldHJpZXZlZCBjb250ZXh0LiAiCiAgICAiSWYgdGhlIGNvbnRleHQgaXMgaW5zdWZmaWNpZW50LCBzYXkgd2hhdCBpcyBtaXNzaW5nLlxuXG4iCiAgICBmIlF1ZXN0aW9uOiB7cGF5bG9hZC5xdWVzdGlvbn1cblxuQ29udGV4dDpcbntjb250ZXh0X3RleHR9IgogICkKCiAgaWYgT1BFTkFJX0FQSV9LRVkgYW5kIG5vdCBPUEVOQUlfQVBJX0tFWS5zdGFydHN3aXRoKCJSRVBMQUNFXyIpOgogICAgZnJvbSBsYW5nY2hhaW5fb3BlbmFpIGltcG9ydCBDaGF0T3BlbkFJCgogICAgYW5zd2VyID0gQ2hhdE9wZW5BSShtb2RlbD1PUEVOQUlfTU9ERUwsIHRlbXBlcmF0dXJlPTApLmludm9rZShwcm9tcHQpLmNvbnRlbnQKICAgIHJldHVybiBSYWdPdXRwdXQoYW5zd2VyPWFuc3dlciwgdXNlZF9sbG09VHJ1ZSwgY29udGV4dHM9Y29udGV4dHMpCgogIGFuc3dlciA9ICgKICAgICJPUEVOQUlfQVBJX0tFWSBpcyBub3QgY29uZmlndXJlZCwgc28gdGhpcyBzdGFydGVyIHJldHVybmVkIHJldHJpZXZlZCBjb250ZXh0IG9ubHkuXG5cbiIKICAgIGYie2NvbnRleHRfdGV4dH0iCiAgKQogIHJldHVybiBSYWdPdXRwdXQoYW5zd2VyPWFuc3dlciwgdXNlZF9sbG09RmFsc2UsIGNvbnRleHRzPWNvbnRleHRzKQoKCmFwcCA9IEZhc3RBUEkoCiAgdGl0bGU9IkxhbmdTZXJ2ZSBwZ3ZlY3RvciBSQUcgc3RhcnRlciIsCiAgdmVyc2lvbj0iMS4wLjAiLAogIGRlc2NyaXB0aW9uPSJBIFJhaWx3YXktcmVhZHkgTGFuZ1NlcnZlIHN0YXJ0ZXIgd2l0aCBQb3N0Z3Jlcy9wZ3ZlY3RvciBpbmdlc3Rpb24gYW5kIHJldHJpZXZhbC4iLAopCgoKQGFwcC5vbl9ldmVudCgic3RhcnR1cCIpCmRlZiBzdGFydHVwKCkgLT4gTm9uZToKICBlbnN1cmVfc2NoZW1hKCkKCgpAYXBwLmdldCgiLyIpCmRlZiByb290KCkgLT4gZGljdFtzdHIsIHN0cl06CiAgcmV0dXJuIHsic2VydmljZSI6ICJsYW5nc2VydmUtcGd2ZWN0b3IiLCAiZG9jcyI6ICIvZG9jcyIsICJoZWFsdGgiOiAiL2hlYWx0aCIsICJyYWciOiAiL3JhZy9pbnZva2UifQoKCkBhcHAuZ2V0KCIvaGVhbHRoIikKZGVmIGhlYWx0aCgpIC0+IGRpY3Rbc3RyLCBBbnldOgogIGVuc3VyZV9zY2hlbWEoKQogIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICB3aXRoIGNvbm4uY3Vyc29yKCkgYXMgY3VyOgogICAgICBjdXIuZXhlY3V0ZSgiU0VMRUNUIGNvdW50KCopIEZST00gZG9jdW1lbnRzIFdIRVJFIGNvbGxlY3Rpb24gPSAlcyIsIChDT0xMRUNUSU9OLCkpCiAgICAgIGNvdW50ID0gY3VyLmZldGNob25lKClbMF0KICByZXR1cm4geyJvayI6IFRydWUsICJjb2xsZWN0aW9uIjogQ09MTEVDVElPTiwgImRvY3VtZW50cyI6IGNvdW50fQoKCkBhcHAucG9zdCgiL2luZ2VzdCIsIGRlcGVuZGVuY2llcz1bRGVwZW5kcyhyZXF1aXJlX2FwaV9rZXkpXSkKZGVmIGluZ2VzdChwYXlsb2FkOiBJbmdlc3RSZXF1ZXN0KSAtPiBkaWN0W3N0ciwgc3RyXToKICByZXR1cm4gaW5nZXN0X2RvY3VtZW50KHBheWxvYWQpCgoKQGFwcC5wb3N0KCIvc2VhcmNoIiwgZGVwZW5kZW5jaWVzPVtEZXBlbmRzKHJlcXVpcmVfYXBpX2tleSldKQpkZWYgc2VhcmNoKHBheWxvYWQ6IFNlYXJjaFJlcXVlc3QpIC0+IGRpY3Rbc3RyLCBBbnldOgogIHJldHVybiB7InJlc3VsdHMiOiBzZWFyY2hfZG9jdW1lbnRzKHBheWxvYWQucXVlcnksIHBheWxvYWQuayl9CgoKcmFnX3J1bm5hYmxlID0gUnVubmFibGVMYW1iZGEoYW5zd2VyX3F1ZXN0aW9uKS53aXRoX3R5cGVzKGlucHV0X3R5cGU9UmFnSW5wdXQsIG91dHB1dF90eXBlPVJhZ091dHB1dCkKYWRkX3JvdXRlcyhhcHAsIHJhZ19ydW5uYWJsZSwgcGF0aD0iL3JhZyIsIGRlcGVuZGVuY2llcz1bRGVwZW5kcyhyZXF1aXJlX2FwaV9rZXkpXSkK | base64 -d > /app/main.py; cd /app; python -m pip install --no-cache-dir fastapi==0.115.14 uvicorn[standard]==0.35.0 langserve==0.3.1 langchain-core==0.3.68 langchain-openai==0.3.27 psycopg[binary]==3.2.9 pgvector==0.4.1 pydantic==2.11.7 sse-starlette==2.4.1; exec python -m uvicorn main:app --host 0.0.0.0 --port "${PORT:-8000}"'`
- **Health check:** /health
- **Public domain:** Yes

### postgres

- **Image:** pgvector/pgvector:pg17

## Documentation

# Deploy and Host LangServe RAG API + pgvector on Railway

Run a production-shaped LangServe/FastAPI starter with Postgres, pgvector, health checks, ingest/search routes, and API-key protection.

## About Hosting LangServe RAG API + pgvector on Railway

- `langserve`: public FastAPI/LangServe service
- `postgres`: private Postgres database with pgvector
- `/health`, `/ingest`, `/search`, and `/rag/invoke` endpoints
- Generated API key for protected write/invoke routes
- No bundled model provider key

## Why Deploy LangServe RAG API + pgvector on Railway

The published template deploy test created `langserve` and `postgres`; both reached `SUCCESS`; `/health`, `/ingest`, and `/rag/invoke` returned HTTP `200`; and vector search still found the ingested document after restarting `langserve`.

This is a useful RAG API starter, not a novelty prompt demo.

## Common Use Cases

- RAG API prototypes
- Private document search starters
- LangServe evaluation environments
- pgvector integration tests
- AI backend starter services

## Dependencies for LangServe RAG API + pgvector Hosting

The app requires Postgres with pgvector for document storage and vector search. Model provider keys are intentionally not bundled, and should be supplied by the deployer when generated answers are needed.

### Deployment Dependencies

- `DATABASE_URL`: private Postgres connection string
- `APP_API_KEY`: generated bearer token for protected endpoints
- `OPENAI_API_KEY`: optional deployer-provided provider key
- `OPENAI_MODEL`: chat model to use when a provider key is supplied

## After Deploy

1. Set the model provider key your app needs.
2. Call `/health`.
3. Ingest a small test document.
4. Call `/search` or `/rag/invoke` with the generated API key.

## Support Checklist

If a deploy fails, include `langserve` and `postgres` deployment IDs, the `/health` response, and logs mentioning pgvector, database setup, or API key validation.


## Similar templates

- [Chat Chat](https://railway.com/deploy/-WWW5r) — Chat Chat, your own unified chat and search to AI platform.
- [stella](https://railway.com/deploy/stella) — Self-host stella with web, API, Postgres, Redis, and object storage.
- [Hermes Agent | OpenClaw Alternative with Dashboard](https://railway.com/deploy/hermes-agent-or-openclaw-alternative-wit) — Self-Hosted Hermes AI Agent for Telegram, Discord & Slack

Open this page in a browser: https://railway.com/deploy/langserve-pgvector-rag
