# One-command self-hosted Executor.## docker compose up -d --build # build the image and start# open http://localhost:4788 # create the admin account (first-run)## Everything — SQLite (libSQL), QuickJS code execution, and the MCP server — runs# in this single container. The named volume persists the database and the# generated keys across restarts and upgrades. Nothing else to orchestrate.## No configuration is required: a bare `docker compose up` boots a working# instance and walks you through creating the admin account in the browser.# Optional settings live in .env (see .env.example) — most importantly# EXECUTOR_WEB_BASE_URL when serving behind a domain / TLS.services: executor: build: # Build context is the repo root: the Bun workspace install needs every member. context: ../.. dockerfile: apps/host-selfhost/Dockerfile image: executor-selfhost restart: unless-stopped ports: - "4788:4788" env_file: - path: .env required: false volumes: - executor-data:/data healthcheck: test: - CMD - bun - -e - "fetch('http://127.0.0.1:4788/api/health').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))" interval: 30s timeout: 5s retries: 5 start_period: 20svolumes: executor-data:
# One-command self-hosted Executor.
#
# docker compose up -d --build # build the image and start
# open http://localhost:4788 # create the admin account (first-run)
#
# Everything — SQLite (libSQL), QuickJS code execution, and the MCP server — runs
# in this single container. The named volume persists the database and the
# generated keys across restarts and upgrades. Nothing else to orchestrate.
#
# No configuration is required: a bare `docker compose up` boots a working
# instance and walks you through creating the admin account in the browser.
# Optional settings live in .env (see .env.example) — most importantly
# EXECUTOR_WEB_BASE_URL when serving behind a domain / TLS.
services:
executor:
build:
# Build context is the repo root: the Bun workspace install needs every member.
context: ../..
dockerfile: apps/host-selfhost/Dockerfile
image: executor-selfhost
restart: unless-stopped
ports:
- "4788:4788"
env_file:
- path: .env
required: false
volumes:
- executor-data:/data
healthcheck:
test:
- CMD
- bun
- -e
- "fetch('http://127.0.0.1:4788/api/health').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
volumes:
executor-data: