87 lines
6.2 KiB
Markdown
87 lines
6.2 KiB
Markdown
# 02 — ТЗ: agent-файлы под uid хоста (не root)
|
||
|
||
Work Item: **ORCH-040**
|
||
|
||
## 1. Суть требования
|
||
Артефакты конвейера (worktree + docs) должны создаваться на хосте под
|
||
`uid:gid = 1000:1000` (slin), а не `root:root`. При этом сохраняется работа
|
||
claude-auth, git, ssh-деплоя и docker.sock.
|
||
|
||
## 2. Задействованные модули и файлы
|
||
|
||
| Файл | Роль в задаче |
|
||
|------|----------------|
|
||
| `docker-compose.yml` | runtime-режим контейнера (prod `orchestrator` + `orchestrator-staging`). Основная точка изменения. |
|
||
| `Dockerfile` | возможные правки под непривилегированный запуск (safe.directory уже есть; при необходимости — создание пользователя/прав). |
|
||
| `src/agents/launcher.py` | `HOME=/home/slin` хардкод (env Popen ~стр.326 и git_env ~стр.513); путь `CLAUDE_BIN` (стр.187). Проверить совместимость при смене uid; править ТОЛЬКО при необходимости. |
|
||
| `docs/operations/INFRA.md` | блок «Тома (volumes)» (SSH-маунт `/root/.ssh`), карта рантайма — обновить. |
|
||
| `CHANGELOG.md` | запись об изменении. |
|
||
| `docs/work-items/ORCH-040/06-adr/` | ADR с выбором варианта + обоснованием (создаёт архитектор). |
|
||
|
||
## 3. Варианты решения (вход для ADR — выбор и обоснование за архитектором)
|
||
|
||
> Анализ фиксирует варианты как требование «выбрать и обосновать в ADR».
|
||
> Рекомендация разведки — Вариант 1.
|
||
|
||
1. **Вариант 1 (рекомендован): `user: "1000:1000"` в docker-compose.**
|
||
Все файлы сразу `slin:slin`, git на хосте без chown. Обязательные довески:
|
||
- сохранить/проверить `group_add: ["999"]` (docker.sock) — **уже присутствует**;
|
||
- обеспечить доступ uid 1000 к claude creds (`/home/slin/.claude/.credentials.json`):
|
||
`chown 1000:1000` на хосте ИЛИ права на чтение для 1000 (задокументировать);
|
||
- поправить SSH-маунт: `/home/slin/.orchestrator-ssh` → домашний каталог uid 1000
|
||
(`/home/slin/.ssh`), а не `/root/.ssh`; согласовать с `HOME` в launcher;
|
||
- проверить запуск `claude.exe` + `git` + `ssh` под uid 1000.
|
||
|
||
2. **Вариант 2: subprocess агента под непривилегированным uid внутри контейнера**
|
||
(`Popen preexec_fn setuid` / `gosu`). Точечно, но сложнее; контейнер остаётся root.
|
||
|
||
3. **Вариант 3 (fallback, костыль): chown-хук нормализации прав после стадии**
|
||
(`chown -R 1000:1000` worktree/доки). Лечит симптом, не корень. Применять, только
|
||
если В1 неустранимо рвёт creds/sock.
|
||
|
||
## 4. Требуемые изменения (при выбранном Варианте 1)
|
||
|
||
### 4.1 docker-compose.yml (оба сервиса: `orchestrator`, `orchestrator-staging`)
|
||
- Добавить `user: "1000:1000"`.
|
||
- Сохранить `group_add: ["999"]` (НЕ удалять).
|
||
- Изменить SSH-маунт: target `/root/.ssh` → каталог `.ssh` пользователя 1000,
|
||
синхронно с `HOME`, который форсит launcher (`/home/slin`). То есть привести к
|
||
единому HOME: маунт `/home/slin/.orchestrator-ssh` → `/home/slin/.ssh:ro`.
|
||
- Маунт `/home/slin/.claude` и `.claude.json` — оставить; проверить доступ uid 1000.
|
||
|
||
### 4.2 Доступ к claude creds
|
||
- Обеспечить, что `/home/slin/.claude/.credentials.json` читается uid 1000
|
||
(на хосте — операция Owner; в ТЗ зафиксировать команду и проверку).
|
||
|
||
### 4.3 src/agents/launcher.py
|
||
- Проверить, что `HOME=/home/slin` остаётся валиден под uid 1000 (домашний каталог
|
||
существует и доступен). Менять ТОЛЬКО при доказанной необходимости.
|
||
- Не менять CLAUDE_BIN, если запуск под 1000 подтверждён.
|
||
|
||
### 4.4 Dockerfile
|
||
- Менять при необходимости (например, гарантировать существование `/home/slin` и
|
||
права). `git config --system --add safe.directory '*'` уже есть — оставить.
|
||
|
||
## 5. Изменения API
|
||
Нет.
|
||
|
||
## 6. Изменения схемы БД
|
||
Нет.
|
||
|
||
## 7. Новые QG checks
|
||
Нет. Существующий staging-гейт (`check_staging_status`, ORCH-35) — обязательная
|
||
страховка перед прод-деплоем self (без изменений).
|
||
|
||
## 8. Артефакты pipeline, которые должны быть созданы/обновлены
|
||
- `06-adr/ADR-NNN-<slug>.md` — выбор варианта + обоснование (мины 1–3, SSH, HOME).
|
||
- `docs/operations/INFRA.md` — обновить блок volumes (SSH target) и, при изменении
|
||
режима, упоминание uid рантайма.
|
||
- `CHANGELOG.md` — запись `fix:`/`refactor:` по Conventional Commits.
|
||
- `12-review.md`, `13-test-report.md`, `15-staging-log.md` — по ходу конвейера.
|
||
|
||
## 9. Порядок безопасного внедрения (требование)
|
||
1. Живая разведка прав creds/sock/ssh ДО кода.
|
||
2. Применить и проверить на **staging (8501)** end-to-end.
|
||
3. Прод-рестарт контейнера под новым uid — только в окно тишины (нет активных задач).
|
||
4. Регресс на хосте: новые tracked-артефакты `1000:1000`, `git pull` под slin без ошибок.
|