# Deployment layouts

One image, three roles (`JARVIS_ROLE`), selected in `.env`. GPU is added per OS
via a compose override picked with `COMPOSE_FILE`.

## A. All-in-one (single machine)

Everything (desktop + Chrome + bridge + bot + TTS) in one container.

```
# .env
JARVIS_ROLE=full
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml      # Ubuntu
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-windows.yml  # Windows 11
DISCORD_SELFBOT_TOKEN=...
DISCORD_GUILD_ID=...

docker compose up -d            # Ollama + javis (COMPOSE_FILE adds GPU)
```

## B. Split: browser host (LAN) + bot on your PC

The on-screen Chrome, real mouse/keyboard (xdotool) and screen live on the
**browser host**. Your PC runs the **bot** and drives that browser over the
internal network — no auth (internal only).

### Browser host (the LAN machine that shows Chrome, e.g. 192.168.10.9)

```
# .env
JARVIS_ROLE=browser
CDP_BIND=0.0.0.0
BROWSER_CONTROL_BIND=0.0.0.0
CDP_PUBLISH_BIND=0.0.0.0
# no GPU needed → leave COMPOSE_FILE unset (base compose only)

docker compose up -d javis      # desktop + Chrome + control-server (port 8777)
```

Watch it on this machine’s VNC (`localhost:5901`) / noVNC (`localhost:6080`).

### Bot host (your PC — Ubuntu or Windows 11)

```
# .env
JARVIS_ROLE=bot
BROWSER_CONTROL_URL=http://192.168.10.9:8777      # the browser host's LAN IP
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml      # Ubuntu
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-windows.yml  # Windows 11
DISCORD_SELFBOT_TOKEN=...
DISCORD_GUILD_ID=...

docker compose up -d            # bot + bridge + TTS + Ollama (GPU per OS)
```

The bot’s `controlBrowser` tool posts commands to `BROWSER_CONTROL_URL`, so
"네이버에서 X 검색", "구글로 돌아가" etc. drive the **browser host’s** Chrome with real
human-style input (visible on its VNC).

## Windows 11 notes

- Install the NVIDIA driver on Windows and enable GPU in Docker Desktop
  (Settings → Resources → WSL Integration). Use the `gpu-windows.yml` override.
- Paths: named volumes are cross-platform. The Gemini OAuth bind mount defaults
  to `${HOME}/.config/javis/gemini` (works under WSL); override `GEMINI_OAUTH_DIR`
  if needed.

## Known limitation

Discord Go-Live broadcast of the **browser host's** screen from a **remote** bot
is not supported (the bot's WebRTC screen capture is local to the bot machine).
Use the browser host's VNC to view it. A full remote-broadcast path is separate,
larger work.
