Cloud Repo Model — Гайд

Phase 69. Каждый проект Arc OS живёт в приватном GitHub-репозитории, которым управляет Arc OS от твоего имени. Тебе не нужен GitHub-аккаунт, ты никогда не увидишь github.com — но если захочешь подключить свои репозитории, тоже сможешь.


TL;DR


Почему управляемая GitHub bot org?

Arc OS владеет GitHub-организацией (arc-os-platform), в которой хранятся все автоматически управляемые репозитории всех пользователей. Ты её не видишь, ты в неё не логинишься, и твой аккаунт никогда не появится в её списке участников. Роботизированное GitHub App с жёстко ограниченными правами создаёт репозитории, регистрирует credentials и никогда не держит токен дольше одного часа.

Два практических следствия:

  1. Ты можешь зарегистрироваться в Arc OS без GitHub-аккаунта. Первая регистрация, первый проект, первый Cloud Workspace — всё работает без захода на github.com.
  2. Ты можешь уйти когда захочешь. Каждый репозиторий — это стандартный git-репозиторий, полностью клонируемый; мы держим export-скрипт в нашем коде на маловероятный случай, если GitHub когда-нибудь отключит нашу bot org.

Архитектурный deep-dive — в docs/architecture/PHASE_69_CLOUD_REPO_MODEL.md.


Три типа репозиториев

Когда откроешь Настройки → Cloud Workspace → Repositories, увидишь три секции:

1. System

Поле Значение
Где /workspace/_system
Назначение Кросс-проектные заметки, личный CLAUDE.md, scratchpad
Видимость Только ты
Создан Автоматически при первом проекте
Удаляется Нет

Это твоя память «везде-всегда». Всё, что положишь в CLAUDE.md здесь, применяется к каждому воркеру Arc OS, независимо от проекта. CLAUDE.md уровня проекта переопределяет системный для этого проекта.

2. Project

Поле Значение
Где /workspace/<project>
Назначение Код, заметки и конфиг одного проекта Arc OS
Видимость Ты (совместная работа появится в Phase 68)
Создан Автоматически при создании проекта
Удаляется Архивируется при удалении проекта; восстанавливается 30 дней

По одной строке на проект. Бейдж показывает synced_at, чтобы было видно, когда был последний push. Клик по иконке GitHub открывает read-only вид репозитория на github.com — полезно для permalinks, blame или скачивания zip без arc pull.

3. External

Поле Значение
Где /workspace/<name> (имя директории выбираешь сам)
Назначение Клиентские репозитории, твои GitHub-репозитории, всё что не управляется Arc
Видимость Что разрешает upstream
Создан Добавляешь через вставку SSH URL или GitHub OAuth (появится в Phase 69.5a)
Удаляется Да — кнопка Trash на строке

Внешние репозитории полностью под твоим контролем. Arc OS клонирует их при provision, но не делает auto-commit и никуда не пушит. Используй для кодовых баз, которые принадлежат клиенту, основной работе или личному аккаунту, которым ты не хочешь, чтобы Arc OS управлял.


Команды на каждый день

Все три — часть arc (CLI-бинарь, инструкции по установке в arc-cli-reference.md). Они работают из любого git work tree на твоём ноутбуке и требуют arc login всего один раз.

arc pull [project]

Если текущая директория не git tree — клонирует репозиторий проекта в неё. Если да — делает fast-forward main к последнему состоянию из твоего bot-org репозитория.

mkdir my-feature && cd my-feature
arc pull myapp
# → Cloning [email protected]:arc-os-platform/<uid>--myapp.git into <cwd>
# → ✓ cloned

Отказывается перезаписывать незакоммиченные изменения — сначала commit или stash.

arc push [project]

Пушит то, что у тебя в локальном HEAD, в bot-org репозиторий. Отказывается на грязных деревьях, чтобы ты никогда не запушил недоредактированные файлы. Под капотом ненадолго подменяет remote URL на одночасовой токен, пушит, потом восстанавливает публичную SSH-форму — так что credentials не остаются на диске после выхода из команды.

git commit -am "fix: handle empty body"
arc push myapp
# → → [email protected]:arc-os-platform/<uid>--myapp.git
# → To https://github.com/arc-os-platform/<uid>--myapp.git
# →    ac30671..914cc84  HEAD -> main
# → ✓ pushed

arc cloud sync [project]

Печатает матрицу состояния, ничего не меняя (кроме git fetch).

arc cloud sync myapp
# project:        myapp
# bot repo:       [email protected]:arc-os-platform/<uid>--myapp.git
# last_synced:    2026-06-04T11:07:53.695Z
# local HEAD:     914cc84
# origin/main:    914cc84
# dirty:          no

Если твой локальный HEAD впереди origin/main, следующая строка будет ahead/behind: — сразу видно, насколько разошлись деревья.

[project] можно опускать в любой из трёх команд, если ты внутри сессии arc <project> dev (мы подхватываем ARC_PROJECT из окружения).


Как сюда встраивается Cloud Workspace

Когда ты делаешь provision Cloud Workspace, master-сервер:

  1. Поднимает свежий контейнер, монтирует /workspace.
  2. Пишет одночасовой installation token GitHub App в ~/.git-credentials внутри контейнера (никогда в argv, никогда в docker inspect).
  3. Выставляет credential.helper=store плюс безобидные user.email / user.name, чтобы коммиты не падали с "tell me who you are".
  4. Клонирует твой системный репозиторий в /workspace/_system и каждый проектный — в /workspace/<project>.

Когда контейнер становится idle (нет активности 30 минут), мы его паузим — но перед паузой автоматически коммитим любые грязные деревья как [auto] pre-pause snapshot и пушим их, так что твоя работа всегда в bot-org репозитории до того, как погаснет свет. На wake мы обновляем токен и делаем git fetch для каждого репозитория, чтобы следующая терминальная сессия попадала на свежие refs.

Токен живёт максимум один час; каждый wake или pause-push обновляет его. App ID + private key на bot-стороне никогда не попадают в контейнер.


Конвенция имён

Репозитории в bot org называются <arc-user-id>--<slug>:

В UI Arc OS ты видишь только slug (_system, myapp). Префикс user-id — это то, что не даёт двум пользователям столкнуться на одном имени проекта внутри одной GitHub-организации.


Добавление внешних репозиториев

Два пути, один результат (строка в секции External):

Вставить SSH URL

  1. Открой Настройки → Cloud Workspace → Repositories.
  2. Кликни + Add external.
  3. Вставь любой [email protected]:owner/repo.git или https://... URL.
  4. Кликни Clone.

Это единственный путь, который работает сегодня. Если репозиторий приватный, тебе нужно настроить свой GitHub SSH key внутри контейнера (описано в standard-cloud.md § "GitHub SSH Setup"). Публичные репозитории клонируются сразу.

Подключить GitHub (появится в Phase 69.5a — #347)

  1. Кликни + Add external → вкладка Connect GitHub.
  2. Авторизуй Arc OS GitHub OAuth app (scope public_repo по умолчанию; переключатель Include private для scope repo).
  3. Выбери репозитории из списка чекбоксов.
  4. Кликни Add selected.

Это приедет как часть #347 — отслеживай в roadmap.


Что будет, если я удалю проект?

Репозиторий проекта архивируется, а не удаляется. Архивированные репозитории остаются в bot org 30 дней, после чего ежедневный cleanup-job их удаляет. Если передумаешь в это окно, восстановление — однострочный restore через support-флоу Arc OS.

Твой системный репозиторий никогда не архивируется автоматически — он привязан к твоему аккаунту, а не к проектам.


Что будет, если я удалю аккаунт Arc OS?

GDPR Art. 17 erasure (Phase 64) каскадно удаляет репозитории в bot org: и твой _system репозиторий, и каждый репозиторий проектов архивируются при удалении аккаунта, потом окончательно удаляются по тому же 30-дневному таймеру. Часовой manifest-mirror в S3 (см. ban-day insurance ниже) гарантирует, что даже список архивированного аудируем для compliance.


Страховка на день бана

Мы выбрали единую bot org вместо self-hosted Gitea, потому что cost-анализ показал экономию ~€5k за 24 месяца. Trade-off в том, что мы зависим от terms of service GitHub.

Две меры митигации, которые мы катим с первого дня:

  1. Часовой manifest mirror. Cron-job делает snapshot полного списка репозиториев нашей bot org в S3 каждый час, так что у нас всегда актуальный inventory.
  2. Export runbook в репозитории. scripts/phase-69-export-to-gitea.ts документирует 6-шаговую миграцию из bot org на свежий Gitea instance, с rollback-гейтами между каждым шагом. Мы делаем quarterly dry-run, чтобы он не bit-rot'нул.

Оценка wall clock, если когда-нибудь придётся переключаться: ~2 дня end-to-end.


FAQ

Нужен ли мне GitHub-аккаунт? Нет. Зарегистрируйся по email, создай проект, сделай provision Cloud Workspace — всё работает без github.com.

Может ли мой коллега увидеть мой проектный репозиторий? Нет (пока не приедет совместная работа в Phase 68). Проектные репозитории приватны для владельца.

Почему HTTPS clone URLs? GitHub App installation tokens аутентифицируются по HTTPS, не по SSH. repo_url, который мы показываем в UI, — это SSH-форма (удобно для read-only открытий на github.com); clone_url, который мы передаём в git clone, — это HTTPS-форма с короткоживущим встроенным токеном.

Где разница со Standard Cloud? Standard Cloud — это контейнерный fleet (Hetzner, пауза после idle, доступ через web-терминал). Cloud Repo Model — это git-слой, который стоит за volume /workspace. Оба — часть плана Starter Cloud; отдельно не платишь.

Можно ли отключить auto-create для одного проекта? Сегодня нет. Если хочешь проект Arc OS без кода (только заметки), используй системный репозиторий для записей и относись к проекту как к knowledge-контейнеру.


См. также