Skip to guide
Deployment/Get started
Self-hosting reference

Local Docker setup

Run the app, worker, database, object storage, and document services together.

1. Set the required configuration

Copy .env.example to .env, generate a BETTER_AUTH_SECRET, and choose chat and embedding providers. Compose constructs DATABASE_URL for its db service from POSTGRES_PASSWORD; it does not use your host database URL.

.env · add your AI settings too
DEPLOYMENT_MODE=self-hosted
POSTGRES_PASSWORD=replace-with-a-strong-password
BETTER_AUTH_SECRET=replace-with-an-independent-random-secret
BETTER_AUTH_URL=http://localhost:3000
EMBEDDING_SECRETS_KEY=replace-with-32-random-bytes-in-base64

2. Start the complete document stack

Enable the ocr profile for the default Docling parser. The migrate service applies both engine and product migrations before the app and worker start.

Terminal
docker compose --env-file .env --profile ocr up --build -d
docker compose ps
docker compose logs --tail=100 migrate app worker

Without the ocr profile, the default local parser is unavailable: PDF/Office conversion can return 503 even while text uploads work. A configured cloud OCR provider is the alternative.

3. Open the product and verify a document

Visit http://localhost:3000, create an account, and add a workspace. Upload a small document, wait for processing, then ask a question and open its citation.

http://localhost:3000
Product and account creation.
http://localhost:8020/healthz
Worker liveness. /readyz also checks database readiness.
http://localhost:8288
Local Inngest dashboard for optional background workflows.
localhost:5433
PostgreSQL for local tools; inside Compose use db:5432.

make up-prod runs the base Compose stack. Use the production overlay explicitly for the public deployment described in this guide.

Configuration sources

Checked against app revision 862963ca. Use the configuration shipped with your release when deploying a different version.

Deployment Guide — Self-Host Launchstack | Launchstack