Deskbell

Deploy Deskbell

The three ways to run Deskbell, what each needs, and the pages in this section that take you from a first boot to an instance that faces the internet.

Deskbell runs as two processes, web and worker, against one Postgres database with the pgvector extension. Nothing else is required: no queue broker, no cache, no separate vector database. Jobs queue in Postgres through pg-boss and vectors live in Postgres through pgvector.

Three ways to run it

WayWhat you needWhen
docker compose upDocker with Compose, a model provider keyThe supported install. Starts Postgres, migrates, seeds a development project, runs both processes
The images on your own orchestratorThe same two images (--target web, --target worker), a Postgres 17 with pgvector you provideWhen Compose is not how you run things. The Dockerfile builds both targets from one context
From sourceNode 22, pnpm 10, Postgres 17 with pgvectorDevelopment, or a host without Docker. pnpm dx does the bootstrap

Whichever way, the processes read the same environment variables and the migrate step is the same Drizzle migration run.

What the processes do

ProcessDoesListens
webThe dashboard, the widget endpoints under /api/v1, /deskbell.js, and /api/health3000
workerCrawling, chunking, embedding, re-indexing, gap clustering, notification delivery, retention purge, hourly maintenanceNothing

Only web is reachable from outside. Postgres binds to 127.0.0.1 in the Compose file and the worker has no port at all.

Read in this order

  1. Requirements, then Docker Compose for the file itself.
  2. Environment variables for every setting, and Models and providers for the one you will change first.
  3. Production checklist before the instance faces the internet.
  4. Upgrading and backups once it is running.

Vector store is for the case where you already run a Weaviate cluster and want the index there; the default needs no decision. Commands lists what an operator runs from the command line, and Troubleshooting is where to look when a source stays pending or the widget refuses to answer.

On this page