deploy-docker-composelisted
Install: claude install-skill sarptandoven/doppl-multiplayer
# Run Doppl as a Docker compose stack
The `Dockerfile` here is the single image used by every non-Databricks
deploy path. It bundles the FastAPI server + a pre-built web SPA
into a slim Python runtime. The compose file pairs it with Postgres
and exposes the server on port 8000.
The image is "external runner only" — it does NOT include `tmux`,
the harness SDKs, or anything that would let it execute agent code
in-process. Runners live on user machines and dial in via the
WebSocket tunnel. This keeps the image small (~250 MB), the security
boundary clean (server doesn't execute user code), and the deploy
shape consistent across hosts.
The same Dockerfile also has a `host` target — the prebaked Doppl
HOST image that remote sandboxes boot from
(`doppl sandbox create --provider modal --server https://your-host`,
server-launched managed
hosts). It is the inverse profile: full omnigent install plus git +
tmux, no SPA, no psycopg, no server entrypoint. Neither image is
published anywhere: build and push both yourself (see the "Host image"
section in `README.md` here, and `../README.md` § Container images).
## TL;DR — bring it up
```bash
cd deploy/docker
cp .env.example .env # edit POSTGRES_PASSWORD at minimum
docker compose up -d --build
docker compose logs -f omnigent # Ctrl-C when you see "Uvicorn running"
```
Server is on http://localhost:8000.
## Files
| | |
|---|---|
| `Dockerfile` | Multi-stage build with two final targets. `web-builder` (node:22) runs `npm