diff --git a/Dockerfile b/Dockerfile index 79a7752..949d195 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,13 @@ RUN curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/c ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true -RUN npm install -g opencode-ai repomix --unsafe-perm +RUN npm install -g opencode-ai repomix @vscode/ripgrep --unsafe-perm + +COPY pyproject.toml uv.lock /opt/memory/ +COPY src/ /opt/memory/src/ +RUN cd /opt/memory && uv sync --no-dev --frozen +ENV PYTHONPATH=/opt/memory/src +ENV PATH=/opt/memory/.venv/bin:$PATH WORKDIR /root/workspace diff --git a/docs/decisions/048-pr-107-dockerfile-memory-deps.md b/docs/decisions/048-pr-107-dockerfile-memory-deps.md new file mode 100644 index 0000000..d1fbcb6 --- /dev/null +++ b/docs/decisions/048-pr-107-dockerfile-memory-deps.md @@ -0,0 +1,25 @@ +# ADR-048: Dockerfile — install ripgrep and python deps for memory tools + +## Статус +Accepted (2026-07-26) + +## Контекст + +После удаления плагина `@mathew-cf/opencode-memory` (PR #103, ADR-045) его зависимости больше не ставятся в Docker-контейнер. Memory-инструменты (`memory-search.ts`, `python -m src.memory`) теперь живут в самом репо (`.opencode/tools/` + `src/memory/`), но их runtime-deps (`@vscode/ripgrep`, `httpx`, `numpy`, `tenacity`) не попадали в образ. Результат: `memory-search` падал на отсутствии binary `rg`, `python -m src.memory` — на `import httpx`. Память в контейнере не работала вообще. + +## Решение + +Добавить в `Dockerfile` два слоя установки deps после `npm install -g opencode-ai repomix`: + +1. **Node runtime deps** — `npm install -g @vscode/ripgrep` (глобально, в `/usr/local/lib/node_modules/`). Глобальная установка обходит bind-mount `./.opencode:/root/.config/opencode` который shadow'ит локальные node_modules в runtime. + +2. **Python runtime deps** — `COPY pyproject.toml uv.lock /opt/memory/` + `COPY src/ /opt/memory/src/` + `uv sync --no-dev --frozen` в `/opt/memory/` (вне shadow-пути `/root/workspace/`). `ENV PYTHONPATH=/opt/memory/src` + `ENV PATH=/opt/memory/.venv/bin:$PATH` делают `python3 -m src.memory` рабочим из любого cwd. Volume `./app_data/workspaces:/root/workspace` не shadow'ит `/opt/memory/`. + +Контейнер становится самодостаточным: память работает из коробки после `docker compose up -d --build`. + +## Альтернативы + +- **Вернуть плагин `@mathew-cf/opencode-memory`** — отвергнуто в PR #103 (плагин удалён, инструменты мигрированы в репо). +- **Ставить deps через `apt-get`** — `@vscode/ripgrep` и Python-пакеты не в Debian repos нужных версий; `uv`/`npm` дают детерминизм через lock-файлы. +- **Копировать весь `.opencode/` и `src/`** — раздувает образ; достаточно только manifest + lock для установки deps на этапе build. +- **Deps в `/root/.opencode/` + `/root/workspace/`** (первая попытка) — отвергнуто: bind-mount `./.opencode:/root/.config/opencode` и volume `./app_data/workspaces:/root/workspace` shadow'ят node_modules и `.venv/` в runtime. Deps установлены но не доступны. Исправлено: `/opt/memory/` (не shadow) + глобальный npm. \ No newline at end of file diff --git a/docs/handoff/pr-107-dockerfile-memory-deps.md b/docs/handoff/pr-107-dockerfile-memory-deps.md new file mode 100644 index 0000000..3eab74a --- /dev/null +++ b/docs/handoff/pr-107-dockerfile-memory-deps.md @@ -0,0 +1,36 @@ +--- +pr: 107 +title: fix(docker): install ripgrep and python deps for memory tools +--- + +## Что сделано + +Добавлены 2 шага в `Dockerfile` после `npm install -g opencode-ai repomix`: + +1. **`@vscode/ripgrep`** — `npm install -g @vscode/ripgrep` (глобально, в `/usr/local/lib/node_modules/`). Нужен для keyword search в `memory-search.ts`. Глобальная установка обходит bind-mount `./.opencode:/root/.config/opencode` который shadow'ит локальные node_modules. + +2. **Python deps (`httpx`, `numpy`, `tenacity`)** — `COPY pyproject.toml uv.lock /opt/memory/` + `COPY src/ /opt/memory/src/` + `uv sync --no-dev --frozen` в `/opt/memory/` (вне shadow-пути `/root/workspace/`). `ENV PYTHONPATH=/opt/memory/src` + `ENV PATH=/opt/memory/.venv/bin:$PATH` делают `python3 -m src.memory` рабочим из любого cwd. + +## Почему + +После удаления плагина `@mathew-cf/opencode-memory` (PR #103) его deps больше не ставятся в контейнер. Без этого PR: +- `memory-search` падает — `@vscode/ripgrep` не установлен, binary `rg` отсутствует +- `python -m src.memory` падает — `import httpx` ModuleNotFoundError +- Память не работает в контейнере вообще + +Первая попытка (коммит до `46eb81a`) ставила deps в `/root/.opencode/` и `/root/workspace/` — но volume `./app_data/workspaces:/root/workspace` shadow'ит `.venv/` и `src/`, а bind-mount `./.opencode:/root/.config/opencode` shadow'ит node_modules. Исправлено: deps в `/opt/memory/` (не shadow) + глобальный npm. + +Этот PR закрывает дыру — контейнер теперь самодостаточный, память работает из коробки после `docker compose up -d --build`. + +## Pending + +— + +## Watch out + +- `npm install -g @vscode/ripgrep` — глобальная установка, обходит bind-mount shadow. Binary в `/usr/local/lib/node_modules/@vscode/ripgrep-linux-x64/bin/rg`. +- `/opt/memory/` — вне volume shadow, переживает пересборку. `.venv` в `/opt/memory/.venv/`. +- `PYTHONPATH=/opt/memory/src` — `import src.memory` работает из любого cwd (TS tools запускают `python3 -m src.memory` с `cwd: context.worktree`). +- `PATH=/opt/memory/.venv/bin:$PATH` — `python3` резолвится в `.venv/bin/python3` который видит httpx/numpy/tenacity. +- `uv sync --no-dev --frozen` строго по `uv.lock` — только runtime deps, детерминизм. +- Closes #108. \ No newline at end of file diff --git a/docs/project-map/README.md b/docs/project-map/README.md index 416502a..bdbdcba 100644 --- a/docs/project-map/README.md +++ b/docs/project-map/README.md @@ -121,6 +121,7 @@ opencode-config/ ├── .pre-commit-config.yaml # ruff + UV hooks ├── docker-compose.yml # 2 services (dind + opencode), opencode_network, 4 bind mounts, port 4096 on 0.0.0.0 — PR#24, PR#51 ├── Dockerfile # node:22-trixie-slim (Debian 13 trixie, glibc 2.41) + uv + gh + chromium + docker.io + opencode-ai + repomix + cloudflared (@mathew-cf/opencode-memory REMOVED PR#103) — PR#24, PR#34, PR#57, PR#71, PR#103 +│ # Memory deps install layers (PR#107): COPY .opencode/package.json → npm install --omit=dev (runtime: @vscode/ripgrep for memory-search.ts); COPY pyproject.toml uv.lock → uv sync --no-dev --frozen (runtime: httpx, numpy, tenacity for python -m src.memory) ├── .env.example # Placeholder-only env template (user copies to .env) — PR#24, PR#34 (TUNNEL_DOMAIN), PR#36 (OPENCODE_MEMORY_REMOTE/DIR), PR#106 (AI_PROVIDER_* removed, OPENCODE_MEMORY_REMOTE now optional) ├── app_data/ │ ├── opencode-memory/ # Persistent memory (separate git repo, gitignored) — PR#36