feat: cross-platform compose (Ubuntu CDI + Windows Docker Desktop GPU)
Base compose is GPU-agnostic; GPU is added by a per-OS override selected via COMPOSE_FILE in .env (docker-compose.gpu-linux.yml for Ubuntu/CDI, docker-compose.gpu-windows.yml for Windows 11 Docker Desktop). Adds .env.example split-deployment section + docs/DEPLOY.md covering all-in-one and browser+bot layouts on both OSes.
This commit is contained in:
35
.env.example
35
.env.example
@@ -152,3 +152,38 @@ SCREENSHOT_INTERVAL_SEC=5
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Silence (ms) that marks the end of an utterance before sending to the brain.
|
# Silence (ms) that marks the end of an utterance before sending to the brain.
|
||||||
VOICE_SILENCE_MS=800
|
VOICE_SILENCE_MS=800
|
||||||
|
|
||||||
|
# ===========================================================================
|
||||||
|
# Split deployment & cross-platform (Ubuntu + Windows 11)
|
||||||
|
# ===========================================================================
|
||||||
|
# JARVIS_ROLE selects what this machine runs (see docker/run-if-role.sh):
|
||||||
|
# full (default) everything in one container
|
||||||
|
# browser ONLY the desktop + Chrome + control-server (driven over the LAN)
|
||||||
|
# bot ONLY the bot + bridge + TTS (drives a REMOTE browser)
|
||||||
|
JARVIS_ROLE=full
|
||||||
|
|
||||||
|
# --- GPU per OS: pick the matching compose override via COMPOSE_FILE ---
|
||||||
|
# Ubuntu (nvidia-container-toolkit / CDI):
|
||||||
|
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml
|
||||||
|
# Windows 11 (Docker Desktop + WSL2 + NVIDIA):
|
||||||
|
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-windows.yml
|
||||||
|
# Browser-only host (no GPU needed): leave COMPOSE_FILE unset (base only).
|
||||||
|
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml
|
||||||
|
|
||||||
|
# --- Browser HOST (JARVIS_ROLE=browser) — e.g. this LAN machine ---
|
||||||
|
# Expose Chrome control to the internal network (no auth, internal only):
|
||||||
|
# CDP_BIND=0.0.0.0
|
||||||
|
# BROWSER_CONTROL_BIND=0.0.0.0
|
||||||
|
# CDP_PUBLISH_BIND=0.0.0.0
|
||||||
|
# Defaults are loopback-only.
|
||||||
|
|
||||||
|
# --- BOT host (JARVIS_ROLE=bot) — e.g. your PC driving the remote browser ---
|
||||||
|
# Point the controlBrowser tool at the browser host's control-server:
|
||||||
|
# BROWSER_CONTROL_URL=http://192.168.10.9:8777
|
||||||
|
# (Leave BROWSER_CONTROL_URL empty on full/browser layouts.)
|
||||||
|
|
||||||
|
# --- Models (tune per machine) ---
|
||||||
|
# OLLAMA_CHAT_MODEL=qwen2.5:7b # quality (needs ~5GB VRAM + whisper small)
|
||||||
|
# OLLAMA_CHAT_MODEL=qwen2.5:3b # speed (fits easily, faster on 8GB GPUs)
|
||||||
|
# WHISPER_MODEL=small # small frees VRAM for a bigger LLM; medium=more accurate
|
||||||
|
# MELO_DEVICE=cuda # cpu if no GPU on the bot host
|
||||||
|
|||||||
14
docker-compose.gpu-linux.yml
Normal file
14
docker-compose.gpu-linux.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# GPU override for LINUX hosts using nvidia-container-toolkit with CDI
|
||||||
|
# (Ubuntu local Docker). Verified on the RTX 5050 (Blackwell sm_120).
|
||||||
|
#
|
||||||
|
# docker compose -f docker-compose.yml -f docker-compose.gpu-linux.yml up -d
|
||||||
|
#
|
||||||
|
# Or set COMPOSE_FILE in .env (recommended):
|
||||||
|
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml
|
||||||
|
services:
|
||||||
|
ollama:
|
||||||
|
devices:
|
||||||
|
- "nvidia.com/gpu=all"
|
||||||
|
javis:
|
||||||
|
devices:
|
||||||
|
- "nvidia.com/gpu=all"
|
||||||
26
docker-compose.gpu-windows.yml
Normal file
26
docker-compose.gpu-windows.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# GPU override for WINDOWS 11 (Docker Desktop + WSL2 + NVIDIA) and any host
|
||||||
|
# that exposes the GPU through Docker's portable device-reservation API rather
|
||||||
|
# than CDI. Requires the NVIDIA GPU driver on Windows and GPU support enabled in
|
||||||
|
# Docker Desktop (Settings → Resources → WSL Integration / GPU).
|
||||||
|
#
|
||||||
|
# docker compose -f docker-compose.yml -f docker-compose.gpu-windows.yml up -d
|
||||||
|
#
|
||||||
|
# Or set COMPOSE_FILE in .env (recommended):
|
||||||
|
# COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-windows.yml
|
||||||
|
services:
|
||||||
|
ollama:
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: all
|
||||||
|
capabilities: [gpu]
|
||||||
|
javis:
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: all
|
||||||
|
capabilities: [gpu]
|
||||||
@@ -27,10 +27,9 @@ services:
|
|||||||
# model resident forever, wasting VRAM next to the chat model.
|
# model resident forever, wasting VRAM next to the chat model.
|
||||||
volumes:
|
volumes:
|
||||||
- ollama_models:/root/.ollama
|
- ollama_models:/root/.ollama
|
||||||
# GPU: needs nvidia-container-toolkit on the host (CDI). Verified on the
|
# GPU is added by a platform override (see docker-compose.gpu-linux.yml /
|
||||||
# RTX 5050 (Blackwell sm_120) — Ollama offloads 100% to GPU.
|
# docker-compose.gpu-windows.yml + COMPOSE_FILE in .env). Base stays
|
||||||
devices:
|
# GPU-agnostic so the same files run on Ubuntu (CDI) and Windows (Desktop).
|
||||||
- "nvidia.com/gpu=all"
|
|
||||||
|
|
||||||
# Auto-pull the models the brain needs, then exit. Idempotent (re-runnable).
|
# Auto-pull the models the brain needs, then exit. Idempotent (re-runnable).
|
||||||
ollama-init:
|
ollama-init:
|
||||||
@@ -102,10 +101,8 @@ services:
|
|||||||
# must NOT pull in Ollama. Full/bot layouts start it with a plain
|
# must NOT pull in Ollama. Full/bot layouts start it with a plain
|
||||||
# `docker compose up -d` (all services); the bridge tolerates Ollama warming
|
# `docker compose up -d` (all services); the bridge tolerates Ollama warming
|
||||||
# up lazily, so start order doesn't matter.
|
# up lazily, so start order doesn't matter.
|
||||||
# GPU: accelerates Whisper STT (and anything else CUDA) in this container.
|
# GPU is added by a platform override (docker-compose.gpu-linux.yml /
|
||||||
# Verified: faster-whisper float16 works on the RTX 5050 (sm_120).
|
# docker-compose.gpu-windows.yml). The browser-only host needs no GPU.
|
||||||
devices:
|
|
||||||
- "nvidia.com/gpu=all"
|
|
||||||
shm_size: "1gb" # Chrome needs a larger /dev/shm
|
shm_size: "1gb" # Chrome needs a larger /dev/shm
|
||||||
ports:
|
ports:
|
||||||
# All published to loopback only by default — VNC/noVNC use a weak default
|
# All published to loopback only by default — VNC/noVNC use a weak default
|
||||||
|
|||||||
73
docs/DEPLOY.md
Normal file
73
docs/DEPLOY.md
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# 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.
|
||||||
Reference in New Issue
Block a user