Files
orchestrator/docs/architecture/adr/adr-0005-container-runs-as-host-uid.md
claude-bot fe5eb38af2
All checks were successful
CI / test (push) Successful in 14s
architect(ET): auto-commit from architect run_id=176
2026-06-06 14:59:07 +00:00

3.3 KiB
Raw Blame History

adr-0005: Контейнеры оркестратора бегут под uid:gid хоста (1000:1000)

  • Статус: accepted
  • Дата: 2026-06-06
  • Задача: ORCH-040

Контекст

Оба контейнера (orchestrator, orchestrator-staging) запускались под uid=0 (root) и монтировали хостовый /home/slin/repos/repos (rw). Claude-CLI агенты исполняются subprocess.Popen внутри контейнера под тем же root, поэтому все артефакты конвейера (git worktree, коммиты в docs/) появлялись на хосте как root:root. Деплой прода под slin (uid 1000) ломался на правах git до ручного chown. Это сквозное свойство рантайма: касается агентов всех проектов, а не отдельной фичи.

Решение

Оба сервиса в docker-compose.yml запускаются под user: "1000:1000" (uid:gid хоста slin).

  • group_add: ["999"] сохраняется — доступ к docker.sock идёт через gid 999, не через root.
  • target SSH-маунта приведён к /home/slin/.ssh (был /root/.ssh), синхронно с HOME=/home/slin, который форсит launcher → единый HOME по осям uid/claude/ssh.
  • Образ и launcher не меняются: numeric uid не требует записи в /etc/passwd, git config --system safe.directory '*' уже есть.

Обязательные host-prerequisites (Owner, вне кода): доступ uid 1000 к /home/slin/.claude/.credentials.json (блокер), ssh-ключи в новом HOME, рестарт prod только в окно тишины. Детали и команды — work-item ADR-001 и docs/operations/INFRA.md.

Альтернативы

  • drop-privileges только для subprocess агента (gosu/setuid) — контейнер остаётся root; новый код в горячем пути launcher, два uid в одном контейнере; отклонён.
  • chown-хук после каждой стадии — лечит симптом, требует root внутри контейнера (несовместимо), хрупкий пост-шаг; отклонён (fallback на крайний случай).

Последствия

  • Артефакты создаются под slin:slin; деплой прода не требует ручного chown.
  • HOME консистентен (uid = claude = ssh = /home/slin); устранён рассинхрон SSH-маунта.
  • Появляется явная привязка рантайма к uid 1000 хоста (задокументирована в INFRA.md).
  • Прод-рестарт self = групповой риск (общий инстанс с enduro-trails) → строго окно тишины; страховка — staging-гейт (adr-0003).

Связи

adr-0003 (staging-гейт — обязательная проверка перед прод-рестартом self), adr-0001 (is_self_hosting_repo), work-item docs/work-items/ORCH-040/06-adr/ADR-001-run-agents-as-host-uid.md.