3 Commits

Author SHA1 Message Date
javis-bot
1efabe03b1 fix: strip CR from container shell scripts in Dockerfile build
Some checks failed
Release / semantic-release (push) Successful in 26s
tests / Unit tests (Linux, Python 3.11) (push) Failing after 5m12s
Release / build-linux (push) Failing after 7m8s
Release / build-windows (push) Has been cancelled
Release / build-macos (arm64, macos-latest) (push) Has been cancelled
Release / build-macos (x64, macos-15-intel) (push) Has been cancelled
Release / release-main (push) Has been cancelled
Release / release-develop (push) Has been cancelled
.gitattributes pins *.sh to LF, but that only helps after a full working-tree
renormalise, which a Windows build box may not have done. The image build kept
failing at `RUN bash setup-melo.sh` because the checked-out file still had CRLF,
so bash read line 18 as `set -euxo pipefail\r` and aborted with
"set: pipefail: invalid option name".

Strip CR from setup-melo.sh before running it, and normalise all docker/scripts
shell scripts to LF after the app COPY so their shebangs (entrypoint, run-*.sh)
also survive a CRLF checkout. Makes the build EOL-agnostic regardless of host
autocrlf settings.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 23:35:12 +09:00
javis-bot
09cd4c5e31 fix: pin docker shell scripts to LF to stop CRLF breaking the image build
Some checks failed
Release / semantic-release (push) Successful in 24s
tests / Unit tests (Linux, Python 3.11) (push) Failing after 5m18s
Release / build-windows (push) Has been cancelled
Release / build-macos (arm64, macos-latest) (push) Has been cancelled
Release / build-macos (x64, macos-15-intel) (push) Has been cancelled
Release / release-main (push) Has been cancelled
Release / release-develop (push) Has been cancelled
Release / build-linux (push) Has been cancelled
Windows checkouts with autocrlf=true inject CR into docker/*.sh, so inside
the Linux container `set -euxo pipefail` is read as `pipefail\r` and bash
aborts with "set: pipefail: invalid option name", failing setup-melo.sh and
the whole image build. .gitattributes already pinned .bat/.cmd/.ps1 to CRLF
but never pinned .sh, leaving all nine container scripts exposed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 23:27:46 +09:00
javis-bot
00ce813845 docs: warn that COMPOSE_FILE uses ';' on Windows, ':' on Linux/macOS
Some checks failed
Release / semantic-release (push) Successful in 26s
tests / Unit tests (Linux, Python 3.11) (push) Failing after 5m21s
Release / build-linux (push) Failing after 7m6s
Release / build-windows (push) Has been cancelled
Release / build-macos (arm64, macos-latest) (push) Has been cancelled
Release / build-macos (x64, macos-15-intel) (push) Has been cancelled
Release / release-main (push) Has been cancelled
Release / release-develop (push) Has been cancelled
Windows users following the docs hit "The system cannot find the file
specified" because COMPOSE_FILE's separator is OS-specific (':' collides
with the C: drive letter). Fix every Windows example to use ';', add an
explicit OS-separator warning in .env.example, README, DEPLOY.md and the
gpu-windows compose comment, and point users at the explicit `-f` form as
a separator-agnostic alternative.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 23:13:33 +09:00
6 changed files with 44 additions and 13 deletions

View File

@@ -190,11 +190,18 @@ VOICE_SILENCE_MS=800
JARVIS_ROLE=full
# --- GPU per OS: pick the matching compose override via COMPOSE_FILE ---
# Ubuntu (nvidia-container-toolkit / CDI):
# IMPORTANT: the file separator is OS-specific. Linux/macOS use ":" (colon);
# Windows uses ";" (semicolon), because ":" is taken by the drive letter (C:).
# Using the wrong one makes Docker treat the whole string as a single missing
# filename ("...gpu-windows.yml: The system cannot find the file specified").
# Ubuntu / macOS (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
# Windows 11 (Docker Desktop + WSL2 + NVIDIA) — note the ";" separator:
# COMPOSE_FILE=docker-compose.yml;docker-compose.gpu-windows.yml
# Browser-only host (no GPU needed): leave COMPOSE_FILE unset (base only).
# Default below is the Linux form; Windows users must change ":" to ";" AND
# swap gpu-linux for gpu-windows. If unsure, comment this out and pass the
# files explicitly: docker compose -f docker-compose.yml -f <gpu-override> ...
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml
# --- Browser HOST (JARVIS_ROLE=browser) — e.g. this LAN machine ---

6
.gitattributes vendored
View File

@@ -7,3 +7,9 @@
# PowerShell is more forgiving but the same logic applies.
*.ps1 text eol=crlf
# Shell scripts run inside the Linux container; they MUST stay LF even when
# checked out on Windows. autocrlf=true would otherwise inject CR and break
# `set -o pipefail`, shebangs, and heredocs (e.g. docker/setup-melo.sh failing
# the image build with "set: pipefail: invalid option name").
*.sh text eol=lf

View File

@@ -63,7 +63,11 @@ RUN ls -d /opt/venv/lib/python*/site-packages/nvidia/cublas/lib \
# Heavy layer (torch CPU + transformers + MeCab); placed before the app
# COPY so it stays cached across source-only changes. ---
COPY docker/setup-melo.sh /app/docker/setup-melo.sh
RUN bash /app/docker/setup-melo.sh
# Strip CR before running: a Windows checkout (autocrlf) yields CRLF, which makes
# bash read line 18 as `set -euxo pipefail\r` and abort with
# "set: pipefail: invalid option name". .gitattributes pins *.sh to LF, but this
# keeps the build working even on a not-yet-renormalised working tree.
RUN sed -i 's/\r$//' /app/docker/setup-melo.sh && bash /app/docker/setup-melo.sh
# --- Human input + window management for the on-screen Chrome control tool.
# Placed AFTER the heavy melo layer so it doesn't bust that cache. xdotool
@@ -81,6 +85,11 @@ RUN cd /app/bot && bun install --frozen-lockfile || bun install
COPY . /app
WORKDIR /app
# Normalise all container shell scripts to LF. On a Windows checkout (autocrlf)
# these arrive as CRLF, which would break their shebangs at runtime (entrypoint,
# run-*.sh) the same way it broke setup-melo.sh at build time.
RUN find /app/docker /app/scripts -name '*.sh' -exec sed -i 's/\r$//' {} +
# --- Default Piper voice (best-effort at build; entrypoint retries if absent) ---
RUN bash docker/download-piper.sh || true

View File

@@ -76,12 +76,14 @@ docker compose up -d --build
매번 `-f`를 치기 싫으면 `.env`에 한 줄 넣어두면 그냥 `docker compose up -d`로 됩니다(override가 자동 적용):
```bash
# Linux
# Linux / macOS (구분자 = 콜론 ":")
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml
# Windows 11
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-windows.yml
# Windows 11 (구분자 = 세미콜론 ";" — 콜론은 드라이브 문자 C: 와 충돌)
COMPOSE_FILE=docker-compose.yml;docker-compose.gpu-windows.yml
```
> ⚠️ `COMPOSE_FILE`의 파일 구분자는 OS마다 다릅니다: Linux/macOS는 `:`, Windows는 `;`. Windows에서 `:`를 쓰면 Docker가 전체를 파일 하나 이름으로 읽어 `... The system cannot find the file specified` 에러가 납니다. 헷갈리면 `COMPOSE_FILE`을 비워두고 실행 시 직접 지정하세요: `docker compose -f docker-compose.yml -f docker-compose.gpu-windows.yml up -d --build`.
> Linux와 Windows는 GPU를 컨테이너에 넣는 방식이 달라서 override 파일이 갈립니다. Linux는 CDI(`devices: nvidia.com/gpu=all`), Windows(Docker Desktop)는 Compose의 `deploy.resources.reservations.devices`(`driver: nvidia`)를 씁니다. 호스트 사전 준비는 아래 "GPU 가속" 절 참고.
`docker compose up` 한 번이면 자동으로:

View File

@@ -5,8 +5,9 @@
#
# 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
# Or set COMPOSE_FILE in .env (note the ";" separator on Windows — ":" collides
# with the C: drive letter and breaks file resolution):
# COMPOSE_FILE=docker-compose.yml;docker-compose.gpu-windows.yml
services:
ollama:
deploy:

View File

@@ -3,6 +3,12 @@
One image, three roles (`JARVIS_ROLE`), selected in `.env`. GPU is added per OS
via a compose override picked with `COMPOSE_FILE`.
> `COMPOSE_FILE`'s file separator is OS-specific: Linux/macOS use `:`, Windows
> uses `;` (a colon collides with the `C:` drive letter). Using `:` on Windows
> yields `... The system cannot find the file specified`. If in doubt, leave
> `COMPOSE_FILE` unset and pass the files explicitly:
> `docker compose -f docker-compose.yml -f docker-compose.gpu-windows.yml up -d`.
## A. All-in-one (single machine)
Everything (desktop + Chrome + bridge + bot + TTS) in one container.
@@ -10,8 +16,8 @@ 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
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml # Ubuntu/macOS (":" )
# COMPOSE_FILE=docker-compose.yml;docker-compose.gpu-windows.yml # Windows 11 (";" )
DISCORD_SELFBOT_TOKEN=...
DISCORD_GUILD_ID=...
@@ -45,8 +51,8 @@ Watch it on this machines VNC (`localhost:5901`) / noVNC (`localhost:6080`).
# .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
COMPOSE_FILE=docker-compose.yml:docker-compose.gpu-linux.yml # Ubuntu/macOS (":" )
# COMPOSE_FILE=docker-compose.yml;docker-compose.gpu-windows.yml # Windows 11 (";" )
DISCORD_SELFBOT_TOKEN=...
DISCORD_GUILD_ID=...