Skip to content

Images & networking

ServiceImageNotes
botghcr.io/batazor/autopilot/bot:latestHeadless worker + scheduler + local Tesseract OCR. Multi-arch (amd64+arm64).
apisame bot image, command: apiFastAPI for the Web UI (:8765).
webghcr.io/batazor/autopilot/web:latestNext.js operator dashboard (:3000). Multi-arch.
redisredis:alpineQueue + state.
inferenceroboflow/roboflow-inference-server-cpuOptional — only with the full profile. Fishing Tournament fish detector (Fish detection).

The inference image is not pulled by default — it sits behind a Compose profile, so a plain up runs only the core services:

Terminal window
docker compose -f docker-compose.prod.yml up -d --pull always # default: redis, bot, api, web
docker compose -f docker-compose.prod.yml --profile full up -d --pull always # + inference (needs ROBOFLOW_API_KEY)

Public images are published as latest only — keep your install on latest. Updating is more than --pull always (you also refresh the compose file, and a stuck container needs a down first) — see Updating.

How the container reaches the host’s ADB

Section titled “How the container reaches the host’s ADB”

bot, api, and web run in network_mode: host so the app shares the host’s loopbackadb start-server stays bound to 127.0.0.1:5037 (safe, no LAN exposure) and both workers and the dashboard ADB scan talk to it as 127.0.0.1:5037 from inside their containers.

No adb -a, no socat sidecar, no host.docker.internal indirection.

Side effect: app containers do not use Compose-internal DNS for redis. Instead, bot and api connect to Redis over a shared Unix socket volume (redis_socket/var/run/redis/redis.sock), and web proxies /api to 127.0.0.1:8765.

The compose file also shares wos_temporal between bot and api; that is where the worker writes rolling screenshots used by the dashboard preview and Click approvals page.

  • Linux — fully supported out of the box.
  • Docker Desktop (macOS / Windows) — works only with the Host networking beta enabled (Settings → Resources → Network → Enable host networking). Without it, the app containers can mount the Redis socket but not reliably reach the host’s adb server.