Installation
Install Durabull locally with Docker, or build a self-hosted instance from source.
For a first run, use Docker. For desktop installation, see Desktop Apps. If you need to choose authentication or persistence first, read Self Hosting Setup.
Try it locally with Docker
This example starts an empty Redis instance and an ephemeral Durabull instance. Docker and OpenSSL must be installed.
docker network create durabull
docker run -d --name durabull-redis --network durabull redis:8-alpine
docker run --rm -p 127.0.0.1:3000:3000 --network durabull \
-e DURABULL_AUTHLESS=true \
-e MCP_AUTHLESS_BEARER_TOKEN="$(openssl rand -hex 32)" \
-e DURABULL_ENV_CONNECTIONS=true \
-e DURABULL_REDIS_URL_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
-e DURABULL_REDIS_URL_MAIN=redis://durabull-redis:6379 \
-e DURABULL_REDIS_URL_MAIN_ENVIRONMENT=development \
-e DURABULL_REDIS_URL_DEFAULT=MAIN \
-e APP_BASE_URL=http://localhost:3000 \
-e VITE_PUBLIC_APP_URL=http://localhost:3000 \
ghcr.io/durabullhq/durabull:latestOpen http://localhost:3000. Queues appear after your BullMQ application writes to this Redis
instance. To inspect existing queues, replace DURABULL_REDIS_URL_MAIN with a Redis URL reachable
from the container; localhost inside the container refers to the container itself.
This command binds Durabull to localhost. Authless mode grants owner access to the entire web UI
and HTTP API. MCP_AUTHLESS_BEARER_TOKEN protects only MCP, and is required by production images
when authless mode is enabled. If you want to use an MCP client, supply a token you have saved
securely instead of generating an unknown value inline.
The app container is removed when it exits, including its local database. For persistent data, authenticated Compose deployment, image version pinning, and production configuration, continue to Docker Image and Compose.
After stopping the app with Ctrl+C, remove this example's Redis container and network:
docker rm -f durabull-redis
docker network rm durabullThis also discards the example Redis data.
Run from source
For contributor development, follow Local Development.
For a production build, install Bun 1.3.5 and a compatible Node.js version (20.19+ or 22.12+), then:
git clone https://github.com/durabullhq/durabull.git
cd durabull
bun install --frozen-lockfile
cp .env.example .envEdit .env before starting. Replace all secret placeholders with generated values, set the public
app URLs, configure a reachable Redis instance, and choose PostgreSQL (DATABASE_URL) or PGlite
(clear DATABASE_URL). The example's database and Redis URLs target the development Docker stack;
replace them for your deployment.
For an authenticated deployment, keep DURABULL_AUTHLESS=false. Configure environment-managed
Redis connections or add connections through the UI. See
Environment Variables for a complete reference.
NODE_ENV=production bun run prodThe build creates the web assets and the API serves them on port 3000 by default. Use a process
supervisor and a reverse proxy with HTTPS for a lasting deployment. Database migrations run
when Durabull initializes its database.
Verify the installation
curl -fsS http://localhost:3000/api/health
curl -fsS http://localhost:3000/api/modeUse your public origin instead of localhost for a remote deployment. Confirm:
- Health returns
status: "ok"and/api/app/configreturns JSON. - Mode reports the authentication, connection, and persistence choices you configured.
- Login works when authentication is enabled.
- The selected Redis connection shows your expected queues and job details.