* feat(docker): add docker-compose + Dockerfile + .env.example * docs(handoff): add pr-8 handoff + ADR-004 * docs(handoff): fix PR number * docs: update project map + handoff + ADR --------- Co-authored-by: opencode-agent <agent@slaid098.dev>
3.7 KiB
3.7 KiB
ADR-004: Docker setup (public, cleaned)
Статус
Accepted
Контекст
Docker-based AI coding assistant с persistent memory. Старый репо /root/workspace/opencode/ содержал cloudflared (Cloudflare Tunnel client), external network digital_factory_app_network (shared с monorepo digital_factory), приватные IPs (80.85.139.21), приватный домен ai.slaid098.dev в AI_PROVIDER_BASE_URL, tunnel UUID f97e66a5-... в комментариях .env.example. Публичный релиз slaid098/opencode-config требует очистки от приватной инфраструктуры.
Архитектура нового репо: 4 bind mount'а (.opencode/app_data/app_data/workspaces/app_data/ssh:ro) вместо старого config/+sandbox_workspace.
Решение
- 2 services в
docker-compose.yml:dind(docker:dind, privileged, 2 CPU / 4G) +opencode(build from Dockerfile, 3 CPU / 6G) - Network
opencode_network(self-contained, НЕ external) - 4 bind mounts:
./.opencode→/root/.config/opencode,./app_data→/root/.local/share/opencode,./app_data/workspaces→/root/workspace,./app_data/ssh→/root/.ssh:ro docker-compose.yml:env_file: .env(gitignored, user copies from.env.example)Dockerfile: node:20-slim + apt (ca-certificates, curl, git, openssh-client, autossh, python3, make, g++, chromium, gnupg, docker.io, ffmpeg) + uv + gh (via apt keyring) +npm install -g opencode-ai repomix --unsafe-perm+ Puppeteer ENV (system chromium).env.example: placeholder only (your-api-key-here,https://your-ai-provider.example.com/v1/)- Убрано:
cloudflaredinstall (Dockerfile строки 33-34 оригинала),digital_factory_app_networkexternal network, IP80.85.139.21, доменai.slaid098.dev, tunnel UUIDf97e66a5-... GIT_AUTHOR/COMMITTER_EMAILизменён сagent@slaid098.devнаagent@opencode.local
Альтернативы
- Сохранить cloudflared — отклонено. Публичный репо, tunnel = приватная инфраструктура (named tunnel
slaid098-devпривязан к конкретному Cloudflare account). Tunnel вынесен в отдельный приватный репо. - Docker compose без dind — отклонено. opencode-ai использует Docker для sandboxed execution (субагенты запускают
docker run), без dind теряется ключевая возможность. - Сохранить external network
digital_factory_app_network— отклонено. External network shared с monorepodigital_factoryна конкретной машине, не self-contained. Заменён на локальнуюopencode_network. - Hardcode приватных IPs/domains в
.env.example— отклонено. Публичный репо, секреты в.env(gitignored),.env.example— документация с placeholder'ами.
Последствия
docker compose configбез.envпадает сenv file .env not found— expected, пользователь обязанcp .env.example .envпередdocker compose up.OPENCODE_MEMORY_DIR=/root/workspace/app_data/opencode-memory— путь внутри контейнера маппится через bind mount в./app_data/workspaces/app_data/opencode-memoryна хосте. Layout может потребовать корректировки после runtime-тестирования.- AGENTS.md bind-mount volume не включён в этот PR — добавляется в #10.