Перейти к содержимому
Pre-MVP. Кодовая база 1.0 не является выпущенным продуктом — см. границы продукта 1.0.

Установка Dee Wan

Это руководство устанавливает Dee Wan CMS в ваш собственный аккаунт Cloudflare. Инсталляция — это админский Worker, публичный Worker чтения, интерфейс управления на Cloudflare Pages, одна управляющая база данных D1, хранилище медиа и учётные данные, на которых всё это держится. Она создаётся один раз, имеет одну ссылку активации и обслуживает много сайтов (см. словарь продукта).

Есть один движок установщика с двумя интерфейсами:

  • веб-установщик — мастер из четырёх шагов, который запускается на вашей машине (npm run install:web);
  • CLI-установщик: npm run setup для интерактивного запуска и npm run install:cms <verb> для запланированных, возобновляемых и скриптуемых запусков.

Оба читают и пишут один и тот же файл конфигурации, backend/wrangler.jsonc, и один и тот же журнал шагов, и оба выполняют один и тот же список шагов, который выводит npm run plan.

Dee Wan 1.0 ещё не выпущен. Установка в реальный Cloudflare — один из критериев приёмки, которые остаются открытыми. Что входит и что не входит в продукт, описано в границе продукта 1.0.

  • Аккаунт Cloudflare с Workers, D1, Pages и R2 или Cloudflare Images.
  • Node.js 22.14 или новее в линейке 22 либо 24.10 или новее в линейке 24. В репозитории есть .nvmrc (24.18.1), поэтому nvm use выбирает нужную версию.
  • npm ровно той версии, которую объявляет package.json (11.16.0), — это npm, который поставляется с Node из .nvmrc.
  • Git, чтобы клонировать репозиторий вместе с сабмодулями.
  • По желанию — собственный домен. Чтобы его использовать, домен должен быть зоной в том же аккаунте Cloudflare. Без него инсталляция использует адреса, которые выдаёт Cloudflare (pages.dev и workers.dev).
  • По желанию — API-ключ DeepInfra, если вам нужны функции ИИ. Он добавляется после установки.

Cloudflare Access (Zero Trust) не обязателен. Оба установщика предлагают его как дополнительный периметр перед админкой, и он выключен, пока вы его не включите.

Окно терминала
git clone --recurse-submodules <repository-url> dee-wan-cms
cd dee-wan-cms
node scripts/install-dependencies.mjs

Всегда устанавливайте зависимости через node scripts/install-dependencies.mjs, никогда не через голый npm install или npm ci. Скрипт отказывается работать с любой другой версией npm, распаковывает зафиксированное дерево зависимостей с отключёнными install-скриптами, а затем пересобирает только те пакеты, чьи скрипты одобрены.

Свежему клону не нужен ручной шаг сборки: setup, deploy и migrate:d1 собирают пакеты и клиент Prisma, если их нет.

Это шаги, которые выполняет установщик, по порядку. npm run plan выводит тот же список для вашей конфигурации с состоянием каждого шага.

Шаг Что он создаёт или делает
Проверить Node и Wrangler Только проверяет.
Найти токен Cloudflare API Только проверяет.
Выбрать аккаунт Cloudflare Только проверяет.
Предварительная проверка — права токена, тарифный план, существующие ресурсы Только проверяет. Если проверка не пройдена, останавливает запуск до того, как что-либо создано.
Создать управляющую базу D1 Базу данных D1 (имя по умолчанию dee-wan-cms-db).
Применить миграции к D1 Схему, а также начальные роли и рабочий процесс.
Подготовить закрытый бакет для импорта Закрытый бакет R2 для архивов импорта. Только если вы это выберете.
Подключить первый сайт к домену Публичное имя хоста для первого сайта.
Собрать интерфейс управления Только собирает.
Развернуть интерфейс управления в Pages Проект Pages (имя по умолчанию dee-wan-cms).
Развернуть Worker панели управления Worker (имя по умолчанию dee-wan-cms-backend).
Создать и сохранить секрет подписи сеансов Секрет Worker.
Подготовить хранилище медиа Бакет R2 для медиа или привязку Cloudflare Images.
Развернуть публичный API Публичный Worker чтения (назван по имени админского Worker с добавлением -public) и его имя хоста.
Создать и сохранить ключ подписи токенов сайта Секрет Worker на админском и публичном Workers.
Подключить маршрут Worker Маршрут Worker в вашей зоне. Только с собственным доменом.
Направить DNS на развёртывание DNS-записи в вашем домене. Только с собственным доменом и включённой настройкой DNS.
Поставить Cloudflare Access перед панелью управления Приложение и политику Access. Только если вы включите Access.
Проверить, что развёртывание отвечает Только проверяет.
Выпустить ссылку доступа для первого администратора Одноразовую ссылку, которая показывается один раз.

Такие ресурсы, как Workers, проект Pages, база данных D1 и бакеты R2, — платные ресурсы Cloudflare в выбранном вами аккаунте.

С собственным доменом интерфейс управления по умолчанию доступен по адресу cms.<your-domain>, а публичный API — по адресу content.<your-domain>. Без домена интерфейс управления доступен по адресу <pages-project>.pages.dev, а публичный API — по адресу <admin-worker>-public.<your-workers.dev-subdomain>.workers.dev.

Веб-установщик CLI-установщик
Запуск npm run install:web npm run setup или npm run install:cms -- <verb>
Интерфейс Страница в браузере на 127.0.0.1, которую отдаёт ваша машина Вопросы в терминале или без вопросов с --yes
Учётные данные Cloudflare Вход через Cloudflare (OAuth), хранится в памяти на время сеанса API-токен, который вы создаёте, из окружения, .env или по запросу
Требуется Приложение Cloudflare OAuth, настроенное для этой сборки (см. ниже) API-токен Cloudflare с перечисленными правами
Планирование и скрипты Показывает, что будет создано, до установки plan, вывод --json и фиксированные коды выхода
Возобновление после остановки Кнопка Продолжить npm run install:cms -- resume или повторный запуск setup

Для входа через Cloudflare в веб-установщике нужно зарегистрированное приложение Cloudflare OAuth. Установщик читает его client id из DEEWAN_CF_OAUTH_CLIENT_ID. Dee Wan 1.0 не поставляется с зарегистрированным приложением, поэтому, если у вас его нет и эта переменная не задана, шаг Cloudflare показывает «Вход через Cloudflare нужно настроить.» и предлагает вместо этого запустить CLI-установщик. Пройти мастер всё равно можно с помощью npm run install:web:dry-run — он ничего не затрагивает.

Окно терминала
npm run install:web

Сервер слушает только 127.0.0.1, на порту 8976, если не задан DEEWAN_INSTALL_PORT. Он выводит одну ссылку:

Dee Wan installer
Open this link. It is bound to this session and is not written to disk:
http://127.0.0.1:8976/?t=<session-token>

Токен в ссылке генерируется для этого запуска. Каждый запрос должен его содержать, поэтому другая страница или программа на той же машине не может управлять установщиком. Запрос без токена получает «This installer is bound to one session. Open the link printed in the terminal.» Когда закончите, нажмите Ctrl-C в терминале.

После входа Cloudflare возвращает браузер на http://127.0.0.1:<port>/oauth/cloudflare, и этот адрес должен в точности совпадать с адресом, зарегистрированным в приложении OAuth. DEEWAN_CF_OAUTH_REDIRECT его переопределяет.

На странице есть селектор Язык с английским, тайским, русским, испанским, французским и немецким. Язык, на котором вы устанавливаете, также становится языком по умолчанию первого сайта.

В мастере четыре шага: Сайт, Cloudflare, Администратор и Установка. Продолжить сохраняет текущий шаг перед переходом дальше, а Назад возвращает к предыдущему.

Веб-установщик, шаг «Сайт»: инсталляция будет работать на собственном домене

У вопроса Где это будет жить? два ответа:

  • На моём собственном домене: введите его в поле Ваш домен, например example.com.
  • На адресах, которые выдаёт Cloudflare: оставьте домен пустым.

Больше здесь ничего не спрашивается. У имён инфраструктуры и необязательных функций есть рабочие значения по умолчанию, и они находятся на шаге «Установка».

Веб-установщик, шаг «Cloudflare»: подключено на этот сеанс, тариф D1 выбран

  1. В разделе Подключить Cloudflare выберите Авторизовать Cloudflare. Cloudflare откроется в новой вкладке. Пока у вас есть несохранённые изменения, ссылка отключена («Сохраните настройки перед подключением.»).
  2. Подтвердите запрос. Вкладка покажет Connected и сообщит, что установщик хранит учётные данные Cloudflare только на этот сеанс. Закройте её и вернитесь в установщик, где карточка показывает Подключено только для этого сеанса.
  3. Выберите аккаунт в разделе Какой аккаунт Cloudflare и нажмите Использовать этот аккаунт. Если ваш вход даёт доступ только к одному аккаунту, он выбирается за вас. Всё, что создаёт инсталляция, оплачивается с этого аккаунта.
  4. Выберите Тариф базы данных D1: Бесплатный или Платный. Cloudflare не даёт способа узнать, какой тариф у аккаунта, а два тарифа допускают разный объём хранимого контента, поэтому установщик спрашивает, а не угадывает.

Какие права запрашиваются? перечисляет точные области доступа Cloudflare, которые запрашивает вход. Они зависят от ваших ответов:

Когда Области доступа
Всегда account-settings.read, d1.write, workers-scripts.write, page.write, workers-r2.write
С собственным доменом zone.read, workers-routes.write
С собственным доменом и включённой настройкой DNS dns.write
С включённым Cloudflare Access access.write, access-acct.read, access-service-token.write

Если позже вы измените настройку, которая меняет нужный доступ, установщик сбросит старую авторизацию и сообщит «Сохранено. Это меняет требуемый доступ, поэтому подключите Cloudflare заново.»

«Продолжить» не срабатывает, пока Cloudflare не подключён и аккаунт не выбран.

Учётные данные хранятся в памяти установщика и не записываются на диск. Если срок их действия истечёт, страница сообщит «Подключение истекло. Подключитесь снова.» Повторная авторизация не затрагивает ничего из уже созданного.

Введите одну Электронную почту администратора. Первая ссылка для входа (ссылка активации) привязывается к этому адресу, и только этот адрес может активировать инсталляцию.

Веб-установщик, шаг «Установка»: проверка запланированных адресов и всего, что будет создано

Проверка перечисляет принятые вами решения: адрес, Планируемый адрес входа, Планируемый адрес сайта, аккаунт Cloudflare, тариф базы данных D1 и администратора. Будет создано перечисляет каждый шаг, который что-то создаст и ещё не выполнен.

Настроить инфраструктуру открывает остальные настройки:

Настройка По умолчанию
Где вы входите (поддомен админки) cms
Откуда читает ваш сайт (поддомен публичного API) content
Направить ваш домен на эту установку Включено. Нужен собственный домен.
Спрашивать вход Cloudflare перед панелью управления (Cloudflare Access) Выключено. Нужен собственный домен.
Ограничить, как часто один посетитель читает ваш контент Выключено. Нужен собственный домен.
Имя службы (админский Worker) dee-wan-cms-backend
Имя проекта (проект Pages) dee-wan-cms
Ваш поддомен workers.dev Пусто. Используется для адреса публичного API, если у вас нет домена.
Сколько секунд хранить ответы сайта 0 — каждый читатель видит самый свежий контент
Также подготовить хранилище для переноса содержимого из другой системы Выключено

Админке и сайту нужны разные поддомены. Если вы включаете Access, обратите внимание на два предупреждения на странице: каждому, кого вы приглашаете, также нужна запись в политике Cloudflare Access, а если приложение Access удалено или настроено неправильно, доступ теряют все. Ограничение для посетителей действует и на приватные чтения, включая сборку сайта, которая читает с одного IP-адреса.

В проверке также сказано, что отчёты об ошибках отправляются в проект Sentry команды Dee Wan (тип ошибки, очищенное сообщение, стек вызовов и маршрут; никогда — контент, значения форм, адреса электронной почты или учётные данные). Позже это можно выключить в Settings → Integrations → Error reports или задав переменной Worker DEEWAN_ERROR_REPORTING значение off.

Если вы меняете настройку на этом шаге, основная кнопка становится Сохранить изменения. Когда всё сохранено, выберите Установить.

Установщик отказывается начинать запуск с настройками, которые вы не проверили. Если файл конфигурации изменился, пока страница была открыта, он сообщает «Настройки изменились, пока страница была открыта. Ничего не запущено. Проверьте их и повторите.»

Каждое сохранение записывает ваши ответы в backend/wrangler.jsonc (или в файл, указанный через --config) и сохраняет комментарии в нём. Если файла нет, создаётся новый. Выбор аккаунта записывает account_id. Файл находится в gitignore, потому что содержит ваши реальные значения. Веб-установщик не умеет редактировать конфигурацию wrangler.toml; переведите её в wrangler.jsonc или используйте CLI-установщик.

Сам запуск установки — это движок командной строки: страница запускает install:cms apply (или resume) с --yes, передавая учётные данные Cloudflare из вашего входа. Он делает всё, что делает npm run setup, включая запись backend/wrangler.public.jsonc для публичного Worker чтения.

Наблюдение за запуском, повтор и возобновление

Заголовок раздела «Наблюдение за запуском, повтор и возобновление»

Панель рядом с мастером показывает Что будет сделано до запуска, Ход выполнения во время него и Что сделано по завершении. Технические подробности показывают журнал установщика с удалёнными учётными данными.

Пока идёт запуск, страница продолжает опрашивать установщик. Если перезагрузить её, она вернётся к запуску. Если она теряет связь с установщиком, то сообщает «Связь с установщиком потеряна. Он может продолжать работу — перезагрузите страницу.»

Если запуск остановился, панель сообщает, где («Остановлено на шаге: …»), и что делать дальше:

  • Если какие-то шаги были выполнены: «Прогресс сохранён. Продолжите, когда будете готовы.» Выберите Продолжить. Выполненные шаги не повторяются.
  • Если ничего не было создано: «Ничего не создано. Запустите установку снова, когда будете готовы.» Выберите Установить.

Запуск, который завершился с оставшейся работой (код выхода 4, incomplete), отображается как «Не завершено», а не как успех. Проверьте журнал, исправьте то, что в нём названо, и продолжите.

Веб-установщик, завершение: все шаги выполнены, кнопка «Создать администратора»

Панель перечисляет Worker, адрес админки и адрес публичного API, которые ответили, а страница показывает Создать администратора. Кнопка открывает ссылку активации в новой вкладке, где вы задаёте пароль. См. Активация инсталляции.

Ссылка активации никогда не показывается в журнале. Страница предлагает её через эту кнопку, только пока ссылка действительна, и только один раз.

Предпросмотр мастера без обращения к Cloudflare

Заголовок раздела «Предпросмотр мастера без обращения к Cloudflare»
Окно терминала
npm run install:web:dry-run

Эта команда отдаёт ту же страницу для ознакомления, заменяя каждое внешнее действие. Конфигурация и журнал шагов находятся во временной папке, которая удаляется по Ctrl-C, поиск аккаунтов и запуск установки разыграны по сценарию, и ничего не доходит до Cloudflare. Сервер слушает порт 8978, если не задан DEEWAN_INSTALL_PORT. Вход завершается, когда вы открываете ссылку для входа, выведенную при старте; не нажимайте Авторизовать Cloudflare — эта кнопка открывает Cloudflare с client id-заглушкой.

CLI-установщику нужен API-токен Cloudflare. npm run setup запрашивает его, если токен не задан, и выводит права доступа с причиной для каждого, а также ссылку на редактор токенов Cloudflare, в котором они уже выбраны. Он также просит включить все аккаунты и зоны.

Право доступа Зачем
Account · Account Settings · Read Найти аккаунт, которому принадлежат ресурсы.
Account · D1 · Edit Создать базу данных и применить миграции.
Account · Workers Scripts · Edit Развернуть Worker API.
Account · Cloudflare Pages · Edit Создать и развернуть проект интерфейса управления.
Account · Workers R2 Storage · Edit Создать бакет для медиа.
Account · Access: Service Tokens · Edit Выпустить сервисный токен, который используют Workers.
Account · Zero Trust · Edit Создать приложение Access, которое защищает админку.
Zone · Zone · Read Определить зону, к которой относится ваш домен.
Zone · DNS · Edit Направить имя хоста на Worker.
Zone · Workers Routes · Edit Направить маршрут имени хоста на Worker.
User · API Tokens · Edit Проверить сам токен.
Zone · WAF · Edit (optional) Установить правила ограничения частоты для аутентификации и, по желанию, для публичного API.

npm run doctor выводит тот же список, если токена нет или ему не хватает права доступа. Оба списка берутся из scripts/cloudflare-token-scopes.ts, поэтому токен, собранный по тому, что просит doctor, принимается setup. Если вы используете Cloudflare Images, setup рекомендует отдельный токен только с правом Cloudflare Images: Edit.

Чтобы пропустить вопросы, задайте токен и аккаунт в окружении:

Окно терминала
export CLOUDFLARE_API_TOKEN=# skips the token prompt
export CLOUDFLARE_ACCOUNT_ID=# skips the account picker

Учётные данные разрешаются в таком порядке: переменная, экспортированная в вашей оболочке, затем файл .env репозитория, затем значения в backend/wrangler.jsonc. Когда окружение переопределяет другое значение из конфигурации, установщик об этом сообщает.

Токен проверяется до того, как что-либо создаётся. Интерактивный запуск допускает три попытки; неинтерактивный останавливается на первой неудаче. В любом случае, если токен не удаётся проверить, ресурсы Cloudflare не создаются.

Секреты приложения никогда не хранятся в wrangler.jsonc. См. Секреты.

Окно терминала
npm run setup

setup проводит вас через установку и сохраняет каждый ответ в backend/wrangler.jsonc по ходу дела, поэтому второй запуск не спрашивает снова. По порядку он:

  1. Находит или создаёт backend/wrangler.jsonc и определяет токен и аккаунт. Если токен даёт доступ к нескольким аккаунтам, спрашивает, какой использовать.
  2. Спрашивает, на каком тарифе D1 аккаунт (Free — 500 MB на базу данных; Paid — 10 GB на базу данных).
  3. Выполняет предварительную проверку и выводит отчёт. Если проверка не пройдена, останавливается до создания чего-либо («Setup stopped before creating any Cloudflare resources. Fix the FAIL rows above.»). Если ресурсы будут созданы или изменены, просит подтверждения.
  4. Спрашивает, где будет работать инсталляция (на вашем собственном домене или на адресах, которые выдаёт Cloudflare), затем домен, поддомен админки (по умолчанию cms) и поддомен публичного API контента (по умолчанию content).
  5. Спрашивает, настраивать ли DNS, настраивать ли Cloudflare Access (по умолчанию нет) и устанавливать ли правило ограничения частоты запросов для публичного API (по умолчанию нет).
  6. Спрашивает имя проекта Pages и имя Worker.
  7. Спрашивает провайдера хранилища: Cloudflare R2 или Cloudflare Images. Для R2 создаёт бакет (по умолчанию dee-wan-cms-images), включает публичный доступ через управляемый адрес r2.dev или собственный домен для медиа и проверяет, что загруженные файлы действительно отдаются.
  8. Спрашивает, включить ли импорт данных, — это создаёт закрытый бакет R2 для загружаемых архивов (по умолчанию нет).
  9. Создаёт базу данных D1 и предлагает применить схему (по умолчанию да). Свежей установке не нужен отдельный шаг миграции.
  10. Собирает и разворачивает интерфейс управления, админский Worker и публичный Worker чтения, сохраняет секреты Worker и подключает выбранные вами маршрут, DNS-записи и приложение Access. Он записывает backend/wrangler.public.jsonc, когда аккаунт, зона и id базы данных определены, и никогда не перезаписывает существующий файл.
  11. Предлагает запустить проверки работоспособности.
  12. Спрашивает email первого администратора, если BOOTSTRAP_ADMIN_EMAIL ещё не задан, и выводит ссылку активации.

В конце он выводит «Setup complete!», сводку конфигурации и следующие шаги. Если не хватает обязательной части, он завершается сообщением «Setup did not complete» и вместо этого называет, чего не хватает.

setup также принимает --access / --no-access и --public-rate-limit / --no-public-rate-limit, чтобы ответить на эти вопросы в командной строке, например npm run setup -- --no-access.

Окно терминала
npm run plan
npm run plan -- --json

plan выводит каждый шаг, который выполнила бы инсталляция, и состояние, в котором он уже находится. Он работает только с конфигурацией и журналом шагов на диске: не обращается к сети, ничего не создаёт и ничего не стоит. --json выводит машиночитаемый план с planVersion.

У каждого шага одно из этих состояний:

Отметка Состояние Значение
done Записан как выполненный.
to do Будет выполнен.
not applicable Пропущен для этой конфигурации, с указанием причины.
blocked Пока не может быть выполнен, например потому что не найден API-токен Cloudflare.
? unresolved Предыдущий запуск запросил это и так и не записал ответ, или запрос завершился ошибкой. apply проверяет аккаунт перед повтором и скорее откажет, чем будет угадывать.
re-checked Проверка, которая выполняется при каждом apply.
Окно терминала
npm run install:cms -- <verb> [options]
Команда Что делает Меняет аккаунт
plan Сообщает, что сделала бы установка. То же, что npm run plan. Нет
apply Выполняет установку. Да, создаёт платные ресурсы
resume Продолжает установку, остановившуюся на полпути. Отказывает, если ни один шаг ещё не выполнен. Да, создаёт платные ресурсы
doctor Предварительные проверки. Ничего не меняет. Нет
verify Проверяет развёртывание от начала до конца. Никогда не направляйте её на production; там добавляйте --read-only. Создаёт сайт, модель и контент, если не указан --read-only
teardown Удаляет то, что создала установка. Пробный прогон, если не передан --apply. Только с --apply
manifest Выводит отредактированную запись об установке (аккаунт, имена ресурсов, история шагов) для передачи. Никогда не содержит учётных данных. Нет

apply и resume работают на том же движке, что и npm run setup. Именно журнал шагов заставляет второй запуск продолжать, а не повторять: каждый выполненный шаг записывается в файл журнала в корне репозитория, по одному файлу на аккаунт Cloudflare (.dee-wan-cms-install.<account>.json). Файл журнала, который не удаётся прочитать полностью, останавливает запуск, а не игнорируется.

Параметры:

Параметр Значение
--config <file> С какой инсталляцией работать. По умолчанию wrangler.jsonc; голое имя ищется в backend/.
--account <id> Явно указанный аккаунт Cloudflare. Каждый шаг, выполняемый командой, привязан к нему.
--json Машиночитаемый вывод. Подразумевает --yes.
--yes, -y Никогда не задавать вопросов; вместо вопроса — ошибка.

verify также передаёт дальше --read-only, --public, --admin, --email, --model и --disposable, а teardown передаёт --apply и --yes. Любой другой параметр, повторённый параметр или параметр с пустым значением (например, --account= из незаданной переменной оболочки) вызывает отказ, а не игнорируется.

apply, resume, teardown и verify (если не указан --read-only) требуют аккаунт. Они берут его из --account, затем из CLOUDFLARE_ACCOUNT_ID, затем из account_id в конфигурации и отказывают, если аккаунт не указан нигде.

install:cms завершается с фиксированным кодом, чтобы скрипт мог ветвиться по результату:

Код Имя Значение Что делать
0 ok Установка завершена. Ничего.
1 usage Неверная командная строка, или resume не нашёл, что продолжать. Исправьте команду.
2 blocked Не хватает того, что можете предоставить только вы, например токена или аккаунта. Предоставьте это и запустите снова.
3 failed Запуск сломался. Прочитайте вывод и устраните причину, прежде чем повторять.
4 incomplete Запуск не сломался, но работа осталась. Можно безопасно повторить как есть, обычно через resume.
5 unresolved Шаг был начат, и его результат неизвестен. Прежде чем что-либо повторять, посмотрите на аккаунт.

plan использует те же коды для описания текущего состояния: 2, если шаг заблокирован, 5, если шаг не определён, 4, если работа осталась, и 0, если всё выполнено.

С --yes, --json, DEEWAN_YES=1 или CI=true каждый вопрос получает ответ по умолчанию. Вопрос без безопасного значения по умолчанию превращается в ошибку, которая называет настройку, которую нужно добавить, вместо догадки:

  • Где будет работать инсталляция: задайте "DOMAIN_MODE": "custom" вместе с "DOMAIN" или "DOMAIN_MODE": "cloudflare" в vars в backend/wrangler.jsonc.
  • Тариф D1: задайте "D1_PLAN": "free" или "paid" в vars либо экспортируйте D1_PLAN.
  • Аккаунт, если токен даёт доступ к нескольким: задайте account_id в конфигурации или экспортируйте CLOUDFLARE_ACCOUNT_ID.
  • Первый администратор: задайте BOOTSTRAP_ADMIN_EMAIL в vars. Запуск без участия пользователя его не спрашивает, и без него ссылку активации выпустить нельзя.

Например:

Окно терминала
npm run install:cms -- apply --account <account-id> --json

Имена ресурсов по умолчанию (dee-wan-cms-backend, dee-wan-cms-db и так далее) фиксированы, поэтому две инсталляции в одном аккаунте Cloudflare конфликтуют. Задайте DEEWAN_RESOURCE_PREFIX, чтобы вынести в отдельное пространство имён каждый ресурс, который создаёт запуск:

Окно терминала
DEEWAN_RESOURCE_PREFIX=test-a1b2 npm run setup # creates test-a1b2-dee-wan-cms-db, …
DEEWAN_RESOURCE_PREFIX=test-a1b2 npm run teardown # dry run; only touches test-a1b2-*

Префикс должен состоять из строчных букв, цифр и дефисов, начинаться с буквы или цифры и быть не длиннее 24 символов. Когда он задан, teardown пропускает и перечисляет в отчёте любой ресурс, в имени которого его нет.

Задавайте его для новой инсталляции, а не для существующей. Wrangler находит базу данных D1 по имени в backend/wrangler.jsonc, поэтому префикс работает только после того, как setup записал имена с префиксом в этот файл. См. Запуск установщика на общем аккаунте.

Пока инсталляция не активирована, аккаунта нет ни у кого. Установщик выпускает одноразовую ссылку активации, привязанную к email администратора:

  • веб-установщик предлагает её через Создать администратора;
  • npm run setup выводит её один раз вместе с адресом, которому она принадлежит, и сроком действия.

Откройте её и задайте пароль длиной не менее 12 символов. Это создаст суперадминистратора, и вы войдёте в систему. Ссылка истекает через 15 минут и показывается ровно один раз; хранится только её хеш, поэтому вывести её снова нельзя.

Если ссылка истекла до того, как ею кто-то воспользовался, снова запустите установщик (Продолжить в веб-установщике, npm run install:cms -- resume или npm run setup). Истёкшая ссылка активации считается невыполненным шагом, поэтому запуск выпустит новую, пока инсталляция не активирована.

npm run claim:link -- --remote --email <address> — аварийный путь на будущее: он выпускает ссылку для задания пароля только для единственного активного суперадминистратора. Создать первого администратора он не может. См. Вход и восстановление доступа.

  • npm run health выполняет проверки после развёртывания по развёрнутым адресам. Если включён Access, он также проверяет периметр.
  • npm run verify -- --read-only --public <public-api-url> проверяет развёртывание, ничего не записывая. Добавьте --model <slug>, чтобы прочитать одну опубликованную модель.
  • npm run verify без --read-only создаёт сайт, модель и контент. Используйте его только на одноразовом развёртывании.
  • npm run doctor — предварительная проверка только для чтения, которая называет всё, чего не хватает, и как это исправить.
  • npm run plan должен сообщать, что делать больше нечего.

Добавьте секреты для необязательных функций

Заголовок раздела «Добавьте секреты для необязательных функций»

Секреты задаются через wrangler secret put из каталога backend/, никогда не в файле. Например, функциям ИИ нужен ключ DeepInfra:

Окно терминала
npx wrangler secret put DEEPINFRA_API_KEY

Полный список — в разделе Секреты.

Разворачивайте обновления и применяйте миграции

Заголовок раздела «Разворачивайте обновления и применяйте миграции»

Установщик разворачивает всё один раз. После изменения кода или конфигурации разверните снова:

Окно терминала
npm run deploy # admin Worker, admin UI and the public read Worker
npm run health

deploy отказывается работать без backend/wrangler.public.jsonc. Инсталляция, которая намеренно не отдаёт публичный контент, разворачивается командой npm run deploy -- --admin-only. См. Развёртывание.

Когда в более позднем релизе появятся миграции базы данных, примените их командой npm run migrate:d1. См. Миграции базы данных.

npm run teardown удаляет ресурсы, названные в конфигурации инсталляции: Workers, проект Pages, базы данных D1, бакеты R2, приложение Access и DNS-записи. Это пробный прогон, если вы не передадите --apply.

Окно терминала
npm run teardown -- --config backend/wrangler.jsonc # list what would be deleted
npm run teardown -- --config backend/wrangler.jsonc --apply # delete it
  • Без --config teardown отказывает, если не задан DEEWAN_RESOURCE_PREFIX, поэтому он никогда случайно не нацелится на инсталляцию по умолчанию.
  • Перед удалением чего-либо перечисляется каждый ресурс. Ресурсы, которые существуют, но не названы в конфигурации, попадают в отчёт и пропускаются.
  • Перед удалением баз данных D1 он предлагает экспортировать каждую в локальный файл .sql (по умолчанию да). Если запрошенный вами экспорт не удался, ничего не удаляется.
  • Для подтверждения вы вводите имя аккаунта Cloudflare.
  • Без участия пользователя (--yes или CI=true) нужно передать --export-dir <directory> или --skip-export, а также --confirm-account <name>.
  • После этого в backend/wrangler.jsonc остаются старые идентификаторы. Удалите файл перед повторной установкой.

npm run install:cms -- teardown запускает тот же скрипт для выбранной конфигурации и аккаунта и передаёт только --apply и --yes. Для параметров запуска без участия пользователя, описанных выше, запускайте npm run teardown напрямую.

Начните с npm run doctor и npm run plan. doctor называет, чего не хватает и как это исправить. plan показывает, какой шаг выполнен, остался, заблокирован или не определён, не обращаясь к сети.

Веб-установщик сообщает, что порт занят. Порт слушает другой процесс, часто второй установщик. Закройте его или задайте в DEEWAN_INSTALL_PORT свободный порт. Ни в одном аккаунте ничего не создано. Если вы используете приложение Cloudflare OAuth, его зарегистрированный адрес перенаправления должен соответствовать новому порту.

Страница сообщает «This installer is bound to one session.» Откройте ровно ту ссылку, которая выведена в терминале. Перезапущенный установщик выводит новую ссылку.

Шаг Cloudflare сообщает «Вход через Cloudflare нужно настроить.» В этой сборке нет приложения Cloudflare OAuth (DEEWAN_CF_OAUTH_CLIENT_ID не задан). Используйте CLI-установщик с API-токеном.

Веб-установщик не может прочитать или отредактировать конфигурацию. Он редактирует только wrangler.jsonc. Исправьте backend/wrangler.jsonc, если он повреждён, или переведите wrangler.toml в wrangler.jsonc, затем перезагрузите страницу.

Запуск остановился на полпути. Продолжите его: Продолжить в веб-установщике или npm run install:cms -- resume. Выполненные шаги не повторяются. resume отказывает, если ещё ничего не выполнено; в этом случае используйте apply.

Код выхода 4 (incomplete). Запуск не сломался, и его можно безопасно повторить как есть. Прочитайте в выводе, что осталось, — обычно что-то, что нужно исправить в Cloudflare, — и продолжите.

Код выхода 3 (failed). Прочитайте вывод, устраните причину и запустите снова.

Код выхода 5 или шаг с отметкой ? (unresolved). Предыдущий запуск что-то запросил у Cloudflare и так и не записал ответ, или запрос завершился ошибкой. Установщик проверяет аккаунт перед повтором шага и отказывает, если не может определить результат. Посмотрите на названный ресурс в своём аккаунте Cloudflare, разберитесь с ним и запустите снова.

Предварительная проверка не проходит. setup останавливается до того, как что-либо создано. Исправьте строки с отметкой FAIL в отчёте и запустите снова.

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

Запуск без участия пользователя останавливается из-за отсутствующего ответа. Сообщение называет настройку, которую нужно добавить в backend/wrangler.jsonc (или переменную окружения, которую нужно экспортировать). Добавьте её и запустите снова. См. Запуск без участия пользователя.

«Setup did not complete: this deployment has no way in.» Не удалось выпустить ссылку активации, или не установлен секрет подписи сеансов. Задайте BOOTSTRAP_ADMIN_EMAIL в vars в backend/wrangler.jsonc (ровно один адрес), устраните причину, названную в выводе, если она есть, и снова запустите setup.

Ссылка активации истекла. Снова запустите установщик, чтобы выпустить новую. См. Активация инсталляции.