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:
javis-bot
2026-06-15 13:00:04 +09:00
parent 8dd6386af8
commit 3bdc7d078a
5 changed files with 153 additions and 8 deletions

View File

@@ -152,3 +152,38 @@ SCREENSHOT_INTERVAL_SEC=5
# ---------------------------------------------------------------------------
# Silence (ms) that marks the end of an utterance before sending to the brain.
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

View 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"

View 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]

View File

@@ -27,10 +27,9 @@ services:
# model resident forever, wasting VRAM next to the chat model.
volumes:
- ollama_models:/root/.ollama
# GPU: needs nvidia-container-toolkit on the host (CDI). Verified on the
# RTX 5050 (Blackwell sm_120) — Ollama offloads 100% to GPU.
devices:
- "nvidia.com/gpu=all"
# GPU is added by a platform override (see docker-compose.gpu-linux.yml /
# docker-compose.gpu-windows.yml + COMPOSE_FILE in .env). Base stays
# GPU-agnostic so the same files run on Ubuntu (CDI) and Windows (Desktop).
# Auto-pull the models the brain needs, then exit. Idempotent (re-runnable).
ollama-init:
@@ -102,10 +101,8 @@ services:
# must NOT pull in Ollama. Full/bot layouts start it with a plain
# `docker compose up -d` (all services); the bridge tolerates Ollama warming
# up lazily, so start order doesn't matter.
# GPU: accelerates Whisper STT (and anything else CUDA) in this container.
# Verified: faster-whisper float16 works on the RTX 5050 (sm_120).
devices:
- "nvidia.com/gpu=all"
# GPU is added by a platform override (docker-compose.gpu-linux.yml /
# docker-compose.gpu-windows.yml). The browser-only host needs no GPU.
shm_size: "1gb" # Chrome needs a larger /dev/shm
ports:
# All published to loopback only by default — VNC/noVNC use a weak default

73
docs/DEPLOY.md Normal file
View 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 machines 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 bots `controlBrowser` tool posts commands to `BROWSER_CONTROL_URL`, so
"네이버에서 X 검색", "구글로 돌아가" etc. drive the **browser hosts** 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.