6.2 KiB
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 (рекомендован):
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: subprocess агента под непривилегированным uid внутри контейнера (
Popen preexec_fn setuid/gosu). Точечно, но сложнее; контейнер остаётся root. -
Вариант 3 (fallback, костыль): chown-хук нормализации прав после стадии (
chown -R 1000:1000worktree/доки). Лечит симптом, не корень. Применять, только если В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. Порядок безопасного внедрения (требование)
- Живая разведка прав creds/sock/ssh ДО кода.
- Применить и проверить на staging (8501) end-to-end.
- Прод-рестарт контейнера под новым uid — только в окно тишины (нет активных задач).
- Регресс на хосте: новые tracked-артефакты
1000:1000,git pullпод slin без ошибок.