Перейти к содержимому
Версия 1.0 ещё не выпущена; проект находится на стадии pre-MVP. См. возможности и ограничения версии 1.0.

Подключение GitHub

Выбирайте учётные данные по выполняемой операции. Механизмы аутентификации этих сценариев не взаимозаменяемы. Для передачи исходников можно подключить собственное приложение GitHub App или отдельный сервис общего приложения. Оба варианта не связаны со входом в CMS.

Сценарий Аутентификация и условия Что сохраняется
Вход в админку и активация первого администратора Приложение GitHub OAuth App, настроенное оператором. Бэкенду нужны GITHUB_CLIENT_ID и секрет GITHUB_CLIENT_SECRET. Callback: BACKEND_URL + /api/auth/callback/github. GitHub должен вернуть основной подтверждённый email, точно совпадающий с адресом существующего аккаунта или с адресом, привязанным к первому администратору. Идентификатор аккаунта GitHub привязывается к единственному аккаунту CMS с тем же нормализованным email. Access token, refresh token и ID token провайдера не сохраняются.
Админка Настройки → Код и публикация Приложение GitHub App оператора или отдельный сервис общего приложения. Для приложения оператора бэкенду нужны GITHUB_APP_ID, GITHUB_APP_SLUG, GITHUB_APP_CLIENT_ID, GITHUB_APP_CLIENT_SECRET, GITHUB_APP_PRIVATE_KEY, а также допустимые BACKEND_URL и FRONTEND_URL. Callback приложения: BACKEND_URL + /api/source/github/callback. Пользователю нужны site:infra и чтение моделей. Сохраняется привязка установки и репозитория. Токены установки действуют недолго, ограничены выбранным репозиторием и отзываются после использования. Личный токен не заменяет этот сценарий.
npm run wire:github OAuth device flow GitHub с DEEWAN_GITHUB_CLIENT_ID. Для настройки Cloudflare нужны CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID и DEE_WAN_URL. --project обязателен. Секреты шифруются только после чтения точного коммита с сервера. Авторизованный CLI записывает секреты и переменные репозитория. Учётные данные device flow остаются в памяти процесса. Конфигурация вебхука выводится, но не сохраняется в CMS автоматически.
npm run backend:deliver Device flow с DEEWAN_GITHUB_CLIENT_ID, а не App админки. Также нужны целевой репозиторий, исходная БД и пути для сохранения результата, аккаунт и токен Cloudflare, API_BEARER_TOKEN и PUBLIC_HOSTNAME. Выбранный перенос медиа требует собственных учётных данных источника и назначения. Остаются сгенерированный репозиторий и развёртывание. Учётные данные device flow не записываются в конфигурацию git или журнал CMS. После успешной проверки предлагается план отделения. Автоматического отделения нет.
Необязательное подключение GitHub в установщике DEEWAN_GITHUB_APP_SLUG только включает ссылку на установку App. Это не конфигурация App бэкенда из пяти переменных и не замена device flow обоих CLI.

После авторизации репозитория в GitHub может оказаться, что в админке выбран другой сайт. Нажмите Перейти на {site}: рабочая область перезагрузится для указанного сайта и продолжит проверку репозитория. Перед переходом обычное подтверждение смены сайта защитит несохранённую работу.

GitHub OAuth App для входа в CMS отличается от GitHub App для передачи исходников и от приложения CLI device flow. Его идентификатор клиента и секрет не дают прав на отправку исходников в репозиторий.

Токенам источника в админке нужны права репозитория contents:write, workflows:write, metadata:read. Для развёртывания также нужны actions:write, secrets:write, variables:write. Система проверяет, что выбран именно тот репозиторий, к которому подключено приложение. Если приложение GitHub App не настроено на бэкенде, операция отклоняется с github_app_not_configured. Автоматического перехода на device flow в этом интерфейсе нет.

Отдельные учётные данные вебхука сборки, которые выводит wire:github, — это fine-grained токен для этого репозитория с Contents: read и Actions: write. Не используйте device-токен как сохраняемый секрет вебхука. Проверьте и сохраните выведенную конфигурацию в разделе Код и публикация → Параметры разработчика через авторизованную сессию CMS.

Управляемая публикация локального коммита

Заголовок раздела «Управляемая публикация локального коммита»

Сначала локально сгенерируйте сайт Astro и бэкенд. Попытка генерации на стороне размещённой CMS по-прежнему завершается отказом source_build_runtime_unavailable. Подключите GitHub App для исходников к нужному приватному репозиторию владельца, затем выполните:

Окно терминала
npm run wire:github -- --repo owner/site-source --project ./generated/site --managed --operation delivery-20260920-1

Для новой операции публикации используйте новый постоянный идентификатор операции. Пользователю нужны site:infra, site:deploy и чтение всех генерируемых моделей. Передайте DEE_WAN_SESSION_COOKIE через окружение CLI, а в DEE_WAN_SESSION_ORIGIN укажите origin интерфейса CMS. DEE_WAN_URL — origin бэкенда. CLI передаёт сессию только на этот адрес CMS. Эти значения не попадают в сгенерированный проект.

До изменений репозитория подготовьте CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN, API_BEARER_TOKEN, DEE_WAN_HOSTNAME (имя хоста развёрнутого бэкенда), ASTRO_ORIGIN (ожидаемый публичный HTTPS origin Astro) и учётные данные выбранных способов входа артефакта, описанные ниже. Авторизация GitHub не даёт доступа к Cloudflare. До коммита настройте мост предпросмотра сайта для нужного публичного API CMS.

CLI создаёт коммит и отправляет его через Git, считывает полный удалённый коммит и проверяет манифест. Только после этого он шифрует секреты для репозитория владельца. CMS сохраняет сайт, операцию, попытку, версию исходников и точный коммит. От build token сохраняются только идентификатор и HMAC. Учётные данные Cloudflare не попадают в запросы CMS, журнал, манифест или сгенерированные файлы. Запуск передаёт точный коммит. Workflow извлекает и проверяет его перед выполнением скрипта развёртывания.

После прерывания сохраните идентификатор операции. Добавляйте --resume только после остановки предыдущего процесса CLI, пока операция готовит секреты: старый build token заменяется и отзывается. После начала dispatch используйте --reconcile с тем же идентификатором. Сверка читает соответствующий запуск GitHub и ничего не запускает повторно. Отсутствующий, неоднозначный или недоступный запуск оставляет операцию заблокированной с неизвестным исходом. Не обходите блокировку новой операцией. Успех CLI означает подтверждение запуска GitHub, а не завершённое развёртывание или активацию предпросмотра.

Только управляемый workflow сообщает о завершении через существующий build token с привязанными операцией, попыткой, коммитом и развёрнутым origin Astro. Для автоматического включения нужны использованный build token, привязанный к попытке, соответствующая запись об успешном развёртывании и ответ /.well-known/dee-wan-deployment.json с точными сайтом, версией исходников, коммитом и операцией. Затем Dee Wan проверяет сообщённый адрес тем же подписанным подтверждением сохранённой записи, что и при ручном включении предпросмотра. Перед автоматическим включением система заново проверяет право site:deploy у пользователя, запустившего операцию. Если нет подходящей сохранённой записи, проверка не прошла или право отозвано, прежний обработчик остаётся активным. Ручная проверка по-прежнему доступна. Конфликтующий повтор сообщения отклоняется. Включить можно только адрес, указанный в этой операции.

Реальная авторизация установки и callback GitHub, подключение приватного репозитория владельца, шифрование секретов и отзыв токенов, сверка Actions, развёртывание Cloudflare, DNS, callback развёрнутой системы и проверка предпросмотра остаются внешними этапами приёмки.

Поведение определяют исходники: backend/src/api/source-delivery.ts, backend/src/lib/github/credentials.ts, scripts/github-start.ts, scripts/github.ts, scripts/exit-start.ts и scripts/install-web.ts. Перед запуском CLI прочитайте его фактическую справку. Эта страница не выдаёт и не создаёт учётные данные. Далее — установка или отделение.

Выберите Безопасность аккаунта в меню учётной записи, чтобы проверить и отвязать собственное подключение входа через GitHub. В подтверждении назван GitHub и есть предупреждение, что завершатся все сессии CMS, включая текущую. Операция выполняется атомарно и отклоняет удаление, если ни у одного активного суперадмина не останется включённого, настроенного и пригодного способа входа. Она не меняет отдельную установку GitHub App для передачи исходников или учётные данные CLI.

См. безопасность учётной записи и процедуру приёмки с реальными провайдерами, которую проводит ведущий. Локальные фикстуры не подтверждают успешный callback GitHub.

Необязательный Better Auth в сгенерированном бэкенде — отдельная система идентификации. GitHub OAuth-приложение артефакта использует <ARTIFACT_ORIGIN>/api/auth/callback/github и отделено от OAuth CMS, GitHub App для передачи исходников и device-авторизации CLI. Выберите методы в разделе Код и публикация. Учётные данные нужны только для выбранных провайдеров; их следует явно указать для целевого бэкенда. Имена Actions secrets имеют префикс ARTIFACT_, включая ARTIFACT_GITHUB_CLIENT_ID и ARTIFACT_GITHUB_CLIENT_SECRET. При публикации система создаёт новый секрет аутентификации артефакта, шифрует значения целевым публичным ключом и сохраняет существующие секреты без ротации. Учётные записи CMS, их пароли и ключи провайдеров не копируются.

Переключатель Код и публикация → Обновлять при публикации изначально выключен. Сначала настройте вебхук сборки. Для включения нужны site:infra, site:deploy и чтение всех моделей, попадающих в сборку. CMS сохраняет пользователя, разрешившего автоматическое обновление; подставить другого пользователя в запросе нельзя.

Запрос на обновление сохраняется вместе с публикацией, в одной транзакции. Запросы, поступившие до захвата сборки, объединяются в одну сборку текущего состояния. Публикации во время сборки остаются в очереди для следующей. Фоновый обработчик проверяет, что аккаунт и права разрешившего пользователя всё ещё действуют, затем запускает обычную цепочку: генерация, проверка миграций, сборка, развёртывание и откат. Запрос переживает сбой доставки. Уже запущенная попытка проверяется, а не запускается повторно. Если отправка могла состояться, но результат неизвестен, автообновление останавливается для проверки. Перед новой сборкой проверьте запуск у провайдера и состояние развёртывания. Выключение настройки или отзыв прав останавливает ожидающие запросы. Публикация сразу обновляет API самой CMS. CMS не пишет напрямую в базу отдельного бэкенда.

Закрытый ключ приложения и OAuth client secret хранятся в отдельном сервисе. В CMS задаются только адрес и ключ доступа к сервису, а также открытые идентификаторы приложения. Короткоживущие токены GitHub отзываются после использования. Учётные данные Cloudflare через это подключение не передаются.

Запуск исходного сервиса с Node 24:

Окно терминала
GITHUB_APP_ID=... GITHUB_APP_CLIENT_ID=... \
GITHUB_APP_CLIENT_SECRET=... GITHUB_APP_PRIVATE_KEY=... \
GITHUB_SHARED_APP_CONSUMERS_FILE=/absolute/path/consumers.json \
npx tsx scripts/shared-github-app-service.ts

Файл потребителей храните вне репозитория. Это JSON-массив: для каждой установки CMS укажите отдельный key длиной от 32 символов, точный URL callback и массив разрешённых идентификаторов GitHub installations. Callback — origin бэкенда CMS плюс /api/source/github/callback. Другие callback, установки и виды разрешений сервис отклоняет. Адрес по умолчанию — 127.0.0.1:8794; его меняют GITHUB_SHARED_APP_HOST и GITHUB_SHARED_APP_PORT. Для размещённого сервиса оператор настраивает HTTPS.

В CMS задайте GITHUB_SHARED_APP_URL, GITHUB_SHARED_APP_KEY, GITHUB_APP_ID, GITHUB_APP_SLUG и GITHUB_APP_CLIENT_ID. В этом режиме ей не нужны GITHUB_APP_PRIVATE_KEY и GITHUB_APP_CLIENT_SECRET. Без переменных общего сервиса продолжает работать собственное приложение оператора с прежними ключом и секретом. Неполная или неверная настройка общего сервиса отклоняется: система не переходит молча на приложение оператора. Размещение сервиса, выдача учётных данных и проверка реального подключения выполняются оператором; изменения исходников сами их не создают.


Стабильная версия ещё не выпущена (pre-MVP)
Коммит исходного кода: e207e63239a627fbd2ae9c414ef7c6eb19fcfe5a (с локальными изменениями)
Дата сборки (UTC): 2026-10-21T09:28:24.214Z
Коммит для обновления: не определён: в рабочей копии есть изменения. Примечания к выпуску