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.
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-base642. 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.
docker compose --env-file .env --profile ocr up --build -d
docker compose ps
docker compose logs --tail=100 migrate app workerWithout 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.