Files
orchestrator/docs/work-items/ORCH-040/02-trz.md
claude-bot 5436c4110e
All checks were successful
CI / test (push) Successful in 13s
analyst(ET): auto-commit from analyst run_id=175
2026-06-06 14:55:35 +00:00

8.9 KiB
Raw Blame History

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 — выбор варианта + обоснование (мины 13, 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 без ошибок.

10. Зависимости и host-prerequisites (действия на хосте, вне кода)

Эти пункты — предусловия для Варианта 1; их выполняет Owner на хосте mva154 (в гит не коммитятся, но фиксируются в ADR/INFRA как обязательная процедура). Без них переход контейнера на uid 1000 ломает конвейер (МИНА 2 — блокер).

# Предусловие Команда / проверка Зачем
P-1 Доступ uid 1000 к claude creds chown -R 1000:1000 /home/slin/.claude (вкл. .credentials.json); проверка sudo -u '#1000' test -r /home/slin/.claude/.credentials.json МИНА 2: без доступа preflight ORCH-044 завернёт весь конвейер
P-2 SSH-ключи в HOME нового uid и читаемы ключи в /home/slin/.orchestrator-ssh читаемы uid 1000; маунт ведёт в /home/slin/.ssh (см. §4.1) деплой по ssh (DEPLOY_SSH_*)
P-3 Подтверждение uid:gid рантайма id slinuid=1000 gid=1000; /repos и /app/data уже 1000:1000 (подтверждено разведкой) целевые файлы создаются под slin
P-4 Окно тишины для рестарта self GET /status → нет активных задач перед рестартом прод-контейнера self-hosting: общий инстанс с enduro-trails

Открытый выбор для ADR (не решается анализом): способ обеспечения P-1 — chown creds (рекомендация разведки) vs. ослабление read-прав vs. отказ от Варианта 1 в пользу Варианта 3 (chown-хук). Анализ фиксирует P-1 как обязательное предусловие при любом из вариантов 1/2; для Варианта 3 — неактуально.

11. Подтверждённые факты текущего рантайма (anchor для Dev)

Сверено с веткой feature/ORCH-040-root-git на 06.06:

  • docker-compose.yml: оба сервиса имеют group_add: ["999"] (МИНА 1 — НЕ удалять); SSH-маунт обоих = /home/slin/.orchestrator-ssh:/root/.ssh:ro (требует правки target); claude-маунты = /home/slin/.claude и /home/slin/.claude.json:ro.
  • src/agents/launcher.py: HOME="/home/slin" форсится в env Popen (стр. 326) и в git_env (стр. 513); CLAUDE_BIN="/opt/claude-code/bin/claude.exe" (стр. 187).