Cloud Repo Model — Гайд
Phase 69. Каждый проект Arc OS живёт в приватном GitHub-репозитории, которым управляет Arc OS от твоего имени. Тебе не нужен GitHub-аккаунт, ты никогда не увидишь github.com — но если захочешь подключить свои репозитории, тоже сможешь.
TL;DR
- Каждый проект Arc OS = один приватный репозиторий. Создаётся автоматически в момент создания проекта.
- Каждый пользователь также получает один «системный» репозиторий для кросс-проектных заметок и личного
CLAUDE.md. - Cloud Workspace клонирует каждый репозиторий в
/workspace/<project>при provision. Работай там напрямую, пуш — когда готов. - Три команды покрывают весь жизненный цикл:
arc pull,arc push,arc cloud sync. - Внешние репозитории приветствуются. Вставь любой SSH URL или (скоро) выбери из своего GitHub через OAuth.
Почему управляемая GitHub bot org?
Arc OS владеет GitHub-организацией (arc-os-platform), в которой хранятся все автоматически управляемые репозитории всех пользователей. Ты её не видишь, ты в неё не логинишься, и твой аккаунт никогда не появится в её списке участников. Роботизированное GitHub App с жёстко ограниченными правами создаёт репозитории, регистрирует credentials и никогда не держит токен дольше одного часа.
Два практических следствия:
- Ты можешь зарегистрироваться в Arc OS без GitHub-аккаунта. Первая регистрация, первый проект, первый Cloud Workspace — всё работает без захода на
github.com. - Ты можешь уйти когда захочешь. Каждый репозиторий — это стандартный 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-сервер:
- Поднимает свежий контейнер, монтирует
/workspace. - Пишет одночасовой installation token GitHub App в
~/.git-credentialsвнутри контейнера (никогда в argv, никогда вdocker inspect). - Выставляет
credential.helper=storeплюс безобидныеuser.email/user.name, чтобы коммиты не падали с "tell me who you are". - Клонирует твой системный репозиторий в
/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>:
1775855296184--_system— твой системный репозиторий1775855296184--myapp— твой проектmyapp
В UI Arc OS ты видишь только slug (_system, myapp). Префикс user-id — это то, что не даёт двум пользователям столкнуться на одном имени проекта внутри одной GitHub-организации.
Добавление внешних репозиториев
Два пути, один результат (строка в секции External):
Вставить SSH URL
- Открой Настройки → Cloud Workspace → Repositories.
- Кликни + Add external.
- Вставь любой
[email protected]:owner/repo.gitилиhttps://...URL. - Кликни Clone.
Это единственный путь, который работает сегодня. Если репозиторий приватный, тебе нужно настроить свой GitHub SSH key внутри контейнера (описано в standard-cloud.md § "GitHub SSH Setup"). Публичные репозитории клонируются сразу.
Подключить GitHub (появится в Phase 69.5a — #347)
- Кликни + Add external → вкладка Connect GitHub.
- Авторизуй Arc OS GitHub OAuth app (scope
public_repoпо умолчанию; переключатель Include private для scoperepo). - Выбери репозитории из списка чекбоксов.
- Кликни 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.
Две меры митигации, которые мы катим с первого дня:
- Часовой manifest mirror. Cron-job делает snapshot полного списка репозиториев нашей bot org в S3 каждый час, так что у нас всегда актуальный inventory.
- 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-контейнеру.
См. также
standard-cloud.md— provisioning контейнеров, web-терминал, жизненный циклarc-cli-reference.md— полный CLI surfacegithub-integration.md— интеграция с твоим собственным GitHub-аккаунтом (другая тема: webhooks, OAuth sign-in)docs/architecture/PHASE_69_CLOUD_REPO_MODEL.md— полная архитектурная спецификация