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

Отключение от Dee Wan и проверка автономного сайта

Отключение прекращает обновления, которыми управляет CMS. Это не удаление CMS или её данных. Сохраняйте исходную установку до приёмки автономного результата владельцем. Условия отключения определяют состав экспорта, а справочник API автономного бэкенда содержит единственное актуальное описание его API.

Используйте проверенный снимок исходников и определите нужный сайт, репозиторий, опубликованный снимок и целевую БД. Прочитайте матрицу аутентификации GitHub. Для управляемой публикации локально сгенерированного коммита используется настроенное приложение GitHub App, npm run backend:deliver — device flow, а админка не генерирует исходники (source_build_runtime_unavailable). Команде npm run backend:generate не нужны учётные данные GitHub, и она ничего не развёртывает.

До любого развёртывания учтите известные ограничения автономного бэкенда. Каждое развёртывание, управляемое или только из репозитория, записывает ACCESS_CONFIG как объединение дайджестов токенов чтения, выданных CMS и закоммиченных в access/read-tokens.json, и vars.ACCESS_CONFIG в вашем wrangler.jsonc. Если токенов нет, оно записывает корректный пустой список ({ version: 1, siteId, tokens: [] }). Маршруты, которым нужен токен чтения, отклоняют запросы, пока конфигурация с его дайджестом не развёрнута. Само развёртывание останавливается, если Worker не сможет запуститься с таким значением. Отозванный токен CMS продолжает приниматься, пока вы не перегенерируете и не развернёте сайт. Отключение не удаляет закоммиченные дайджесты: см. Отключение связи с CMS. Сгенерированный README может описывать устаревший контракт: одну модель с доступом только для чтения. Совместимость с edge не гарантируется для всех добавляемых расширений Prisma или сгенерированных маршрутов. Следуйте текущему справочнику API, а не устаревшему README, и сохраните проверенную резервную копию.

Форма вызова интегрированного CLI в исходном репозитории:

Окно терминала
npm run backend:deliver -- --site <site-id> --repo <owner/name> --source <cms.db> --dest <output-directory> --db <target.db>

Эта команда изменяет данные и запускает развёртывание, поэтому требует разрешения оператора. Она не ограничивается проверкой. Перед запуском задайте нужное окружение и подтвердите владение репозиторием. Проверьте файлы в зонах generated, owned и shared, охват моделей, переводы, связи и опубликованный снимок. Сохраните src/owned/ и общую конфигурацию зависимостей. Перенос медиа — отдельная, явно выбираемая операция, которой нужен доступ к источнику и назначению. Сайту, который ссылается на приватные файлы, нужны ещё приватная группа источника и собственный приватный бакет назначения (имена EXIT_MEDIA_SOURCE_PRIVATE_ и EXIT_MEDIA_DESTINATION_PRIVATE_ из exit --help); без них запуск отклоняется до копирования, а приватный файл никогда не пишется в публичный бакет. Привяжите этот бакет к Worker как PRIVATE_FILES. Чтобы вместо этого работать через npm run serve:local, задайте EXIT_MEDIA_DESTINATION_PRIVATE_DIRECTORY (существующий абсолютный каталог, вместо бакета) и запускайте сервер с PRIVATE_FILES_DIRECTORY, указывающим на него; пока он не задан, сервер отвечает 503 private_files_unavailable. Одна генерация не передаёт медиа под ваше управление.

Проверка точного сгенерированного коммита

Заголовок раздела «Проверка точного сгенерированного коммита»

В сгенерированном репозитории используйте его проверенный установщик зависимостей и имеющиеся проверки. После разрешённого развёртывания держите API_BEARER_TOKEN в окружении и выполните:

Окно терминала
node scripts/install-dependencies.mjs
npm run typecheck
npm run build
npm run verify:media
npm run verify:deployment -- --origin 'https://site.example.com' --expect-commit <full-commit-sha>

verify:media проверяет сохранённые в коммите проекции снимка и страниц на ссылки на медиа CMS. Она не проверяет, доступны ли сами файлы в удалённом хранилище. verify:deployment использует bearer-токен и сравнивает развёрнутый контент со снимком из коммита во всех таблицах, доступных через маршруты, включая ожидаемый коммит. Эта проверка должна пройти для ревизии репозитория, которую вы собираетесь использовать, а не просто подтвердить доступность сервиса.

Для созданного генератором apps/site также выполните node scripts/install-dependencies.mjs apps/site, npm run --prefix apps/site check и npm run --prefix apps/site build. Откройте характерные развёрнутые страницы во всех нужных локалях и отдельно проверьте доступность медиа. Успешная проверка бэкенда не проверяет сайт визуально.

Маршруты блога, страницы поиска и страницы с секцией «Последние записи», секцией «Поиск по сайту» или комментариями посетителей читают опубликованный контент из /v1 на собственном хосте сайта во время запроса. Cloudflare отправляет такой запрос к тому же хосту в публичный Worker Dee Wan, только если Worker сайта включает global_fetch_strictly_public. Новые проекты получают его в apps/site/wrangler.jsonc. Этот файл ваш: Dee Wan записывает его, только когда его нет, и никогда не переписывает. Списки «Последние записи» в общей секции, показанной в области страницы, закрепляются при генерации и ничего не читают во время запроса. Они читают только публичные модели: приватная модель показывает collection_model_missing. В кратких описаниях встраиваемый контент отображается во фреймах. Допускаются только источники (origin), разрешённые на момент генерации. Смена видимости модели или источника embed требует новой генерации.

Если сгенерированный сайт выполняет такие чтения (это записано в сгенерированном apps/site/public-reads.json), генерация и развёртывание проверяют ваш существующий apps/site/wrangler.jsonc. Если в compatibility_flags нет этого флага или это не список строк, обе операции завершаются отказом с public_fetch_compatibility_flag_required, называют файл и флаг и ничего не меняют. Добавьте "global_fetch_strictly_public" в compatibility_flags сами и запустите снова. Генерация в CMS и развёртывание читают этот файл как JSONC, поэтому комментарии и запятые после последнего элемента допускаются. Файл, который не является корректным JSONC, отклоняется так же. У сайта без блога, с выключенным поиском по сайту и без страниц, которые отдаются во время запроса, такого требования нет.

Только после приёмки удалите build-вебхук CMS и перестаньте запрашивать управляемые ею развёртывания. Проверьте или отключите workflow репозитория, который получает определения CMS, чтобы он не запускал неожиданную регенерацию. Задайте previewApiOrigin генерируемого сайта равным null, когда предпросмотр черновиков CMS больше не нужен. Автономный API и статически собранные страницы должны продолжать работать при недоступной CMS. Маршруты из раздела Что по-прежнему зависит от Dee Wan — нет. Без публичного Worker Dee Wan маршруты блога и страницы поиска отвечают 503, а секция «Последние записи» показывает свою ошибку. Без intake Worker комментарии и формы нельзя отправить.

Токены чтения, выданные CMS, остаются действительными после отключения. Их дайджесты остаются в закоммиченном access/read-tokens.json, и каждое развёртывание только из репозитория по-прежнему добавляет их в ACCESS_CONFIG. Отзыв токена в CMS больше не доходит до этого репозитория. Проверьте файл после отключения. Чтобы перестать принимать токен, удалите его запись или весь файл, затем закоммитьте и разверните. Без файла развёртывание использует только vars.ACCESS_CONFIG или пустой список. Файл находится в зоне generated, поэтому, пока связь ещё есть, отзывайте токен в CMS и перегенерируйте.

npm run backend:deliver предлагает план отключения после проверки. Окончательное отключение команда не выполняет автоматически. Не удаляйте исходные данные, бакеты или учётные данные в рамках этого руководства. Для отката сохраните предыдущий принятый коммит и соответствующее состояние БД и медиа. Один старый коммит кода не восстанавливает последующие изменения данных.

Источники: scripts/exit-start.ts, backend/src/lib/graduate/regenerate-template.ts, backend/src/lib/graduate/deployment-files.ts и backend/src/lib/graduate/media-custody.ts. Реальное развёртывание и визуальная приёмка остаются обязанностью оператора.

Отделение оставляет установку Dee Wan работающей. Вывод её из эксплуатации — отдельный шаг. Сначала проверьте каждый пункт:

  • Сгенерированный API. npm run verify:deployment проходит для коммита, который вы оставляете. API читает только собственную базу D1.
  • Статические страницы. Они собраны из закоммиченного pages.json и ничего не читают во время запроса.
  • Блог, поиск по сайту, «Последние записи» и комментарии. Если на сайте есть что-то из этого, apps/site/public-reads.json содержит "requestTimePublicReads": true. Они читают /v1 из публичного Worker Dee Wan при каждом запросе и перестают работать без него.
  • Формы и отправка комментариев. Они отправляются на /v1/interactions/* на вашем хосте, где отвечает intake Worker Dee Wan. Отправки форм доставляет admin Worker Dee Wan.
  • Предпросмотр. previewApiOrigin равен null, или вы согласны, что /preview перестанет работать.
  • Управляемый рендерер. Если вы развернули managed-renderer/, он читает /v1 при каждом запросе.
  • Публичный и intake Worker. Знайте, какие маршруты на вашем хосте ведут к Worker Dee Wan: /v1/* и /v1/interactions/*.
  • Владение медиа. npm run verify:media проходит, то есть ни одна закоммиченная проекция не указывает на медиа Dee Wan. Без переноса --media медиа по-прежнему отдаёт Dee Wan.
  • Плагины. У сгенерированного бэкенда нет хоста плагинов. Блоки плагинов в rich text на маршрутах, которые отдаются во время запроса, читают свои определения из /v1/_rich-blocks.
  • Read-токены. Вы проверили access/read-tokens.json, как описано выше.
  • Определения. Чтобы перегенерировать позже, получите и сохраните definitions.json, пока CMS ещё работает. См. Локальная перегенерация.

Перед публикацией проверьте общие для бэкенда методы Better Auth и точные политики доступа. Модель без политики использует service. Передайте данные выбранных провайдеров через целевое хранилище секретов или локальные переменные окружения ARTIFACT_*. При публикации система создаёт новый BETTER_AUTH_SECRET артефакта и шифрует значения репозитория под именами с префиксом ARTIFACT_. Существующие целевые секреты сохраняются. Невыбранные провайдеры учётных данных не требуют. Проверенный целевой hostname определяет OAuth и magic-link callbacks. Никогда не копируйте учётные данные и аккаунты CMS.

Храните auth-таблицы артефакта и историю их миграций вместе с резервной копией его БД. У них нет сгенерированного CRUD API. Выключение auth требует нового целевого каталога. Для изменения зависимостей или bindings методов нужна повторная генерация. Публичные запросы чтения проверяются анонимно. Запросы чтения только для пользователей с сессией требуют действительную сессию целевого бэкенда в ARTIFACT_VERIFY_SESSION_COOKIE. Без сессии ответ — verify_session_required, а не успешная проверка. При первом развёртывании инициализируйте целевой бэкенд, зарегистрируйтесь через его auth-маршруты и повторите проверку с этой сессией. Не сохраняйте значения сессии в исходниках, отчётах или журналах. Проверка callback провайдеров, почты и рабочего развёртывания требует отдельной среды владельца с разрешённым доступом.

Спланируйте восстановление базы данных и медиа по руководству восстановление автономного сайта.


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