Введение
Службе поддержки нужно безопасное место для предварительной проверки изменений конфигурации. Вы запустите один и тот же код в средах preview и live, разделите их общедоступные метки и секреты, а также защитите синтетическую конечную точку обслуживания, оставив проверки работоспособности общедоступными.
Используйте собственную учебную учётную запись Cloudflare и знания об авторизации устройства, развёртывании и журналировании, полученные в предыдущих лабораторных работах. Эта лабораторная работа запускается независимо в /home/labex/project/worker-config. В среде уже установлены Node.js 22.22.0, локальный для проекта Wrangler 4.131.1 и небольшой тестовый обработчик маршрута проверки работоспособности. Предыдущие ресурсы виртуальной машины или облака не используются повторно. Оба развёртывания можно удалить, а операция обслуживания выполняется в режиме пробного запуска. Используйте только сгенерированные синтетические токены. Workers Free и workers.dev подходят для этого небольшого упражнения; запросы учитываются в использовании вашей учётной записи. Покупать домен, базу данных или платный тариф не требуется.
Перед завершением работы с виртуальной машиной вы удалите оба облачных развёртывания и локальные файлы токенов, а затем выйдете из учётной записи. На протяжении всей работы используйте один и тот же открытый терминал.
Разделение конфигурации для Preview и Live
На этом этапе вы будете использовать один предоставленный обработчик проверки работоспособности в двух именованных средах. Здесь live по-прежнему является временным учебным развёртыванием; ни одна из сред не обрабатывает реальные производственные данные. Имя preview обозначает среду Wrangler, а не URL предварительного просмотра версии.
Перейдите в подготовленный проект и изучите тестовый обработчик маршрута проверки работоспособности. Node и локальный для проекта Wrangler уже установлены.
cd /home/labex/project/worker-config
node --version
npx wrangler --version
cat src/index.js
Ожидаемые версии — Node v22.22.0 и Wrangler 4.131.1. Обработчик получает несекретные отображаемые значения из env. На собственном компьютере установите Node и добавьте wrangler@4.131.1 как зависимость проекта для разработки; восстановите существующие зависимости с помощью npm ci.
Сгенерируйте временное базовое имя. Подстановка команды вставит случайное шестнадцатеричное значение в переменную оболочки. Не закрывайте этот терминал: он понадобится для следующих команд.
WORKER_NAME="labex-config-$(openssl rand -hex 6)"
Создайте конфигурацию с помощью heredoc. Кавычки вокруг закрывающего маркера отсутствуют, поэтому $WORKER_NAME будет подставлен. Параметр main выбирает общий код, а compatibility_date — поведение среды выполнения. Объекты env переопределяют конфигурацию для --env preview и --env live. Укажите все значения vars в каждой среде отдельно, поскольку эти привязки не наследуются. Ресурса базы данных или очереди нет: QUEUE_LABEL — только общедоступная отображаемая метка.
cat > wrangler.jsonc <<CONFIG
{
"name": "$WORKER_NAME",
"main": "src/index.js",
"compatibility_date": "2026-09-14",
"workers_dev": true,
"preview_urls": false,
"env": {
"preview": {"vars": {"ENVIRONMENT": "preview", "QUEUE_LABEL": "sandbox"}},
"live": {"vars": {"ENVIRONMENT": "live", "QUEUE_LABEL": "primary"}}
}
}
CONFIG
Запустите обе локальные среды выполнения. > перенаправляет вывод, 2>&1 добавляет сообщения об ошибках, а & запускает процесс в фоновом режиме. Разные порты HTTP и инспектора предотвращают конфликты.
npx wrangler dev --env preview --port 8080 > preview.log 2>&1 &
npx wrangler dev --env live --port 8081 --inspector-port 9230 > live.log 2>&1 &
cat preview.log
cat live.log
Дождитесь, пока оба журнала сообщат о готовности. При необходимости повторно выполните соответствующую команду cat. Затем сравните ответы:
curl -i http://127.0.0.1:8080/health
curl -i http://127.0.0.1:8081/health
Оба запроса должны вернуть код 200. Preview возвращает {"status":"ok","environment":"preview","queue":"sandbox"}, а live — {"status":"ok","environment":"live","queue":"primary"}. Ключ -i у curl добавляет к ответу статус и заголовки. Пока оба сервера работают, нажмите кнопку проверки.
В документации по средам описаны наследование конфигурации и имена развёрнутых Workers по умолчанию в формате <name>-<environment>.
Защита маршрута обслуживания с помощью локальных секретов
На этом этапе вы защитите синтетическую операцию обслуживания отдельным токеном в каждой среде. Секрет — это закрытая конфигурация, доступная через env; он не должен находиться в общедоступных vars, возвращаемом JSON или журналах приложения. Этот небольшой пример токена типа bearer показывает границу серверной части, а не полноценную систему аутентификации пользователей.
Перед добавлением файлов секретов остановите два локальных процесса. Сначала проверьте фактические номера заданий; в примерах предполагается, что preview имеет номер 1, а live — номер 2.
jobs
kill %1 %2
Сгенерируйте два случайных токена только для тестирования, не выводя их на экран. umask 077 делает новые файлы доступными для чтения только пользователю вашей виртуальной машины. printf записывает по одному присваиванию dotenv в файл каждой среды. Никогда не используйте здесь настоящий токен API учётной записи.
umask 077
PREVIEW_TOKEN=$(openssl rand -hex 24)
LIVE_TOKEN=$(openssl rand -hex 24)
printf 'MAINTENANCE_TOKEN=%s\n' "$PREVIEW_TOKEN" > .dev.vars.preview
printf 'MAINTENANCE_TOKEN=%s\n' "$LIVE_TOKEN" > .dev.vars.live
cat .gitignore
Убедитесь, что .dev.vars* и .env* исключены. Не выводите содержимое файлов секретов на экран и не добавляйте их в систему контроля версий. Wrangler загружает .dev.vars.preview при использовании --env preview, а для --env live использует отдельный файл live; файл .dev.vars для конкретной среды заменяет общий файл. Эти файлы не загружают секреты в Cloudflare автоматически. См. раздел локальные и развёрнутые секреты.
Замените обработчик. Кавычки вокруг heredoc сохраняют код JavaScript без изменений. Если настроенный секрет отсутствует, возвращается 503; если учётные данные запроса отсутствуют или неверны, возвращается 401. Перед успешным ответом сервер сравнивает заголовок Authorization. В журнал записываются только фиксированное имя события, общедоступная среда и числовой статус. Разрешённая операция является пробным запуском и не изменяет сохранённые данные.
cat > src/index.js <<'JS'
export default {
async fetch(request, env) {
const path = new URL(request.url).pathname;
if (path === '/health' && request.method === 'GET') {
return Response.json({status: 'ok', environment: env.ENVIRONMENT, queue: env.QUEUE_LABEL});
}
if (path !== '/maintenance') return Response.json({error: 'not_found'}, {status: 404});
if (request.method !== 'POST') {
return Response.json({error: 'method_not_allowed'}, {status: 405, headers: {Allow: 'POST'}});
}
// Fail closed if this environment has no configured secret.
if (!env.MAINTENANCE_TOKEN) {
return Response.json({error: 'maintenance_unconfigured'}, {status: 503});
}
const authorized = request.headers.get('Authorization') === `Bearer ${env.MAINTENANCE_TOKEN}`;
const status = authorized ? 200 : 401;
console.log(JSON.stringify({event: 'maintenance', environment: env.ENVIRONMENT, status}));
if (!authorized) return Response.json({error: 'unauthorized'}, {status});
return Response.json({operation: 'dry-run', environment: env.ENVIRONMENT});
}
};
JS
npx wrangler dev --env preview --port 8080 > preview.log 2>&1 &
npx wrangler dev --env live --port 8081 --inspector-port 9230 > live.log 2>&1 &
cat preview.log
cat live.log
После того как оба сервера сообщат о готовности, проверьте границу авторизации. -X POST задаёт метод, а -H передаёт заголовок bearer. Не используйте подробный вывод curl с настоящими учётными данными.
curl -i -X POST http://127.0.0.1:8080/maintenance
curl -i -X POST http://127.0.0.1:8080/maintenance -H "Authorization: Bearer incorrect-token"
curl -i -X POST http://127.0.0.1:8080/maintenance -H "Authorization: Bearer $LIVE_TOKEN"
curl -i -X POST http://127.0.0.1:8080/maintenance -H "Authorization: Bearer $PREVIEW_TOKEN"
curl -i -X POST http://127.0.0.1:8081/maintenance -H "Authorization: Bearer $LIVE_TOKEN"
curl -i http://127.0.0.1:8080/health
curl -i http://127.0.0.1:8081/health
Первые три запроса должны вернуть 401 unauthorized, включая валидный токен другой среды. Следующие два должны вернуть 200 с operation: dry-run и соответствующей средой. Проверка работоспособности остаётся общедоступной. Используйте проверку, чтобы убедиться в изоляции токенов в обоих направлениях, корректной обработке методов, общедоступной конфигурации и отсутствии значений токенов в локальных журналах.
Развёртывание каждой среды и загрузка её секрета
На этом этапе вы авторизуете новую виртуальную машину, развернёте каждую именованную среду и явно загрузите её секрет. Сначала остановите локальные процессы; используйте их фактические номера из вывода jobs.
jobs
kill %1 %2
npx wrangler login --device --browser=false --scopes account:read user:read workers_scripts:write workers_tail:read
Откройте показанную ссылку и введите текущий код в браузере, где выполнен вход. Проверьте разрешения Wrangler и требуемый Background Access, выберите только свою учебную учётную запись и авторизуйте доступ так, как показано в лабораторной работе по подключению. Дождитесь завершения команды в терминале.
npx wrangler whoami --json
Убедитесь, что loggedIn: true, а также отображаются имя и идентификатор учётной записи. Замените YOUR_ACCOUNT_ID ниже фактическим идентификатором; исходное имя ресурса оставьте без изменений.
cat > wrangler.jsonc <<CONFIG
{
"name": "$WORKER_NAME",
"main": "src/index.js",
"compatibility_date": "2026-09-14",
"account_id": "YOUR_ACCOUNT_ID",
"workers_dev": true,
"preview_urls": false,
"env": {
"preview": {"vars": {"ENVIRONMENT": "preview", "QUEUE_LABEL": "sandbox"}},
"live": {"vars": {"ENVIRONMENT": "live", "QUEUE_LABEL": "primary"}}
}
}
CONFIG
Всегда указывайте --env в этом проекте. Иначе Wrangler обратится к безымянной среде верхнего уровня, которая не входит в план развёртывания этой лабораторной работы.
npx wrangler deploy --env preview
npx wrangler deploy --env live
Скопируйте точный адрес workers.dev из вывода каждого развёртывания. Используйте существующий поддомен учебной учётной записи. Пользователи, которые выполняют это впервые, должны следовать предложению Wrangler выбрать доступный поддомен и не изменять существующий поддомен.
PREVIEW_URL="https://YOUR_BASE-preview.YOUR_SUBDOMAIN.workers.dev"
LIVE_URL="https://YOUR_BASE-live.YOUR_SUBDOMAIN.workers.dev"
curl -i -X POST "$PREVIEW_URL/maintenance"
curl -i -X POST "$LIVE_URL/maintenance"
Оба запроса должны вернуть 503 maintenance_unconfigured: локальные файлы секретов не загружаются обычной командой развёртывания. Проверка работоспособности не зависит от авторизации обслуживания.
Используйте стандартную групповую команду, чтобы загрузить dotenv-файл в соответствующую среду. Даже для одного секрета можно использовать этот файловый способ; в его выводе указывается имя секрета, но не его значение. Обновление секрета немедленно создаёт и развёртывает новую версию.
npx wrangler secret bulk .dev.vars.preview --env preview
npx wrangler secret bulk .dev.vars.live --env live
npx wrangler secret list --env preview
npx wrangler secret list --env live
В каждом списке должна присутствовать запись MAINTENANCE_TOKEN с типом secret_text. Сравните общедоступные значения и поведение авторизации:
curl -i "$PREVIEW_URL/health"
curl -i "$LIVE_URL/health"
curl -i -X POST "$PREVIEW_URL/maintenance"
curl -i -X POST "$PREVIEW_URL/maintenance" -H "Authorization: Bearer $LIVE_TOKEN"
curl -i -X POST "$PREVIEW_URL/maintenance" -H "Authorization: Bearer $PREVIEW_TOKEN"
curl -i -X POST "$LIVE_URL/maintenance" -H "Authorization: Bearer $LIVE_TOKEN"
Проверка работоспособности должна по-прежнему показывать preview/sandbox и live/primary. Отсутствующие и принадлежащие другой среде учётные данные должны возвращать 401, а соответствующие токены — 200. Перед повторной попыткой при ошибках подключения дождитесь первоначального распространения имени узла. В той же учётной записи Dashboard откройте Compute → Workers & Pages. Найдите два Worker, имена которых заканчиваются на -preview и -live, и сравните их полные имена и URL с выводом команд развёртывания. В этом примере каждая именованная среда Wrangler имеет собственный развёрнутый Worker; не создавайте другое приложение в Dashboard.

Откройте Worker с суффиксом -preview и выберите Settings. В разделе Runtime variables and secrets (раздел Variables and secrets) сравните столбцы Type, Name и Value. Для ENVIRONMENT должно быть указано preview, а для QUEUE_LABEL — sandbox. Для MAINTENANCE_TOKEN тип должен быть Secret, а вместо читаемого значения должно отображаться Value encrypted.

Вернитесь в Workers & Pages, откройте Worker с суффиксом -live и проверьте тот же раздел. Его общедоступными значениями должны быть live и primary, а независимо загруженный секрет должен использовать то же имя привязки. Перед сравнением таблицы проверьте имя Worker в верхней цепочке навигации.

Случайный суффикс имени и поддомен на этих изображениях являются примерами. Зашифрованное отображение подтверждает наличие и тип привязки секрета, но не то, что в двух средах используются разные значения секрета; это поведение подтверждается приведёнными выше HTTP-проверками соответствующего и чужого токена. На этом этапе только просматривайте данные: не редактируйте переменные и не раскрывайте, не заменяйте и не копируйте учётные данные в Dashboard. Используйте проверку: она проверяет фактического владельца, типы развёрнутых привязок и общедоступное поведение обеих сред.
Просмотр журналов приложения без раскрытия секретов
На этом этапе вы проверите один отклонённый и один принятый запрос в развёрнутой среде preview. Журналы приложения должны объяснять результат, не копируя учётные данные и заголовки запросов.
Запустите поток журналов с помощью ранее изученной команды tail. Форматированный вывод показывает сообщения приложения; сохраните его в файл, чтобы после остановки потока проверить ограниченный набор тестовых запросов.
npx wrangler tail --env preview --format pretty > preview-tail.log 2>&1 &
cat preview-tail.log
Дождитесь сообщения о подключении потока; пока подключение устанавливается, повторяйте cat. Затем отправьте новые синтетические запросы:
curl -i -X POST "$PREVIEW_URL/maintenance" -H "Authorization: Bearer incorrect-token"
curl -i -X POST "$PREVIEW_URL/maintenance" -H "Authorization: Bearer $PREVIEW_TOKEN"
С помощью grep выведите только строки, содержащие фиксированное имя события приложения:
grep 'maintenance' preview-tail.log
Дождитесь событий со статусами 401 и 200. В обоих сообщениях общедоступной средой должна быть preview. Значение токена не должно присутствовать ни в одном сообщении. Доставка событий может задерживаться относительно HTTP-ответа; повторяйте grep не более одной минуты. Если событие отсутствует, проверьте соответствующий console.log в исходном коде.
jobs
kill %1
Остановите фактическое задание потока после появления обоих событий; в примере предполагается, что это задание 1. Используйте проверку, чтобы проверить сохранённый журнал и отдельно повторно проверить удалённые правила авторизации. Это упражнение использует только синтетические запросы и не гарантирует безопасность любых будущих изменений журналирования.
Удаление развёртываний обеих сред
На этом этапе вы удалите оба временных Worker для сред, пока авторизация ещё действует. Проверьте базовое имя и учебную учётную запись в конфигурации:
cat wrangler.jsonc
Удаляйте только развёртывания preview и live из этой лабораторной работы. В каждом запросе подтверждения проверьте точное имя <base>-preview или <base>-live и нажмите единственную клавишу y.
npx wrangler delete --env preview
npx wrangler delete --env live
Удаление этих Worker также удаляет связанные с ними привязки секретов. После этого Wrangler 4.131.1 может показать ранее описанную ошибку аутентификации устаревшего Workers Sites KV. Не расширяйте разрешения и не воспринимайте эту ошибку как доказательство удаления. Обновите раздел Workers & Pages и используйте проверку: успешная авторизованная инвентаризация должна показать отсутствие обоих имён. Ошибка аутентификации или сети не даёт окончательного результата. Не изменяйте другие Worker, учебную учётную запись и её существующий поддомен.
Удаление локальных секретов и отключение
На этом этапе после проверки очистки в облаке вы удалите локальные копии секретов этой лабораторной работы, а затем отключите виртуальную машину. rm удаляет только два указанных ниже файла, а unset удаляет две временные переменные оболочки.
rm .dev.vars.preview .dev.vars.live
unset PREVIEW_TOKEN LIVE_TOKEN
npx wrangler logout
npx wrangler whoami --json
Ожидайте явное значение "loggedIn": false; ненулевой код выхода неаутентифицированной команды ожидаем, если в структурированном результате присутствует это значение. Используйте проверку, затем завершите работу виртуальной машины. Вход в браузере выполняется отдельно и может оставаться доступным для следующей лабораторной работы. Ни выход из учётной записи, ни завершение работы виртуальной машины не заменяют предварительное удаление облачных ресурсов.
Итоги
Вы разделили общедоступную конфигурацию между средами Wrangler, загрузили локальные секреты для каждой среды, добавили зашифрованные привязки секретов и проверили соответствующие, отсутствующие и принадлежащие другой среде учётные данные. Общедоступный маршрут проверки работоспособности сохранял идентификатор своей среды, а сервер защищал маршрут обслуживания в режиме пробного запуска. Вы просмотрели ограниченные журналы приложения без вывода токенов, затем проверили удаление ресурсов, удалили локальные учётные данные и вышли из учётной записи.
Такая же дисциплина работы с конфигурацией поможет вам позднее в этом курсе диагностировать расхождения конфигурации preview.

