Папка с готовой страницей есть, ссылки нет. Выложим её на Cloudflare Workers, а процедуру поручим Claude Code: создадим скилл, с которым публикация и обновление сводятся к короткой просьбе.

1. Что такое Cloudflare Workers для статики

Слово Workers звучит как "программы, которые крутятся на сервере", и это правда. Но не вся: к воркеру можно приложить папку файлов, и тогда сервер просто отдаёт их, как обычный хостинг. Кода при этом не пишут ни строчки.

Для страницы из HTML, CSS и картинок такого режима достаточно. В документации эта папка называется static assets, статические ассеты, и в настройках проекта она занимает ровно одно поле с путём.

Cloudflare раздаёт файлы через свою сеть серверов и кеширует их ближе к посетителям.

Воркер без кода это нормально

Воркер, к которому приложена только папка, ничего не выполняет. Программу к нему можно добавить позже, и папка при этом останется на месте - но это уже другая история и другой счёт.

2. Сколько это стоит

Запросы к статическим файлам бесплатны и не ограничены по количеству. Это условие тарифа, а не обещание отсутствия статистики посещений.

Тогда откуда взялось известное число - 100 000 запросов в сутки? Это лимит на вызовы Worker-скрипта, той самой программы на сервере. У страницы, к которой приложена только папка, скрипта нет, и в этот счётчик она не попадает.

Запросы к файлам не тарифицируются, а запросы, которые будят Worker-скрипт, идут в суточный лимитПосетительЗапрос к файлуФайл отданЗапрос будит скриптСкрипт отработалне тарифицируетсяидёт в суточный лимит
Счётчик включает только тот запрос, который разбудил программу

Верхний путь на схеме подходит нашей странице: файл отдаётся без вызова серверной программы. Нижний понадобится, если позже добавить Worker-скрипт.

Лимиты у бесплатного тарифа всё-таки есть, но они про другое - про размер того, что вы выкладываете:

ОграничениеБесплатный тариф
Файлов в одном деплое20 000
Размер одного файла25 MB
Воркеров на аккаунт100

Для страницы с десятком картинок этих лимитов обычно достаточно. Перед большим проектом проверьте актуальные условия Cloudflare: ограничения могут измениться. 25 MB на файл, кстати, кажутся щедрыми ровно до первого видео.

3. Аккаунт

Регистрация на cloudflare.com обычная: email и пароль, следом письмо с подтверждением. Карта для бесплатного тарифа не нужна. Свой домен добавлять тоже не нужно - сервис это предложит, но предложение относится к другой половине продукта, к защите и ускорению существующих сайтов.

После входа нужный раздел называется "Workers & Pages", и лежит он не на виду: в левом меню сначала группа Build, в ней Compute, и уже внутри - "Workers & Pages". Панель со временем перестраивают, так что если по этому пути раздела нет, ищите по названию: поиск вверху слева открывается по Ctrl + K. Два слова в названии - это два продукта Cloudflare; вам нужна первая половина, Workers, и попадёте вы туда сами, ничего специально не выбирая.

Ещё одна вещь всплывёт при первом деплое: Cloudflare попросит выбрать имя поддомена для аккаунта. Все ваши проекты будут жить на нём, а адрес складывается из двух частей - имя проекта плюс ваш поддомен:

my-landing.example-account.workers.dev
|          |               |
|          |               общий домен Cloudflare
|          поддомен вашего аккаунта
имя проекта

меняется это имя потом плохо, так что первое пришедшее в голову лучше не вписывать.

4. Первый деплой

Сначала коротко посмотрим, как публикация выглядит в панели. Это необязательное знакомство с сервисом: если хотите сразу настроить деплой агентом и сохранить один адрес, переходите к подготовке ниже.

Это работает для обоих способов

Отдаёте вы всегда папку целиком, а главная страница внутри неё должна называться именно index.html и лежать в корне:

landing/          <- эту папку отдаём
  index.html      <- главная страница, имя обязательное
  wrangler.jsonc  <- агент создаст перед первым деплоем
  style.css
  img/
    hero.png

Это правило по умолчанию: на запрос без имени файла сервер отдаёт index.html из соответствующей папки. Вложенность работает так же - about/index.html откроется по адресу /about/.

Никакого списка файлов при этом не бывает: если index.html в корне нет (скажем, вы отдали папку уровнем выше и он оказался во вложенной), по ссылке будет просто ошибка 404.

Перед публикацией проверьте содержимое выбранной папки: файлы в ней станут публичными. Уберите из неё личные файлы и черновики, которые не собирались показывать.

Вручную через панель

В разделе с проектами есть кнопка, которая заводит новый проект. Дальше вам предложат отдать файлы: можно выбрать один файл, можно папку целиком. Загрузили, подтвердили - Cloudflare разложил их у себя и вернул ссылку. Названия кнопок и порядок экранов тут меняются чаще, чем выходят статьи, так что держитесь смысла, а не подписей: завести проект, отдать файлы, получить адрес.

Откройте полученный адрес https://…workers.dev и проверьте страницу и картинки. Это можно сделать с того же компьютера. Телефон пригодится для дополнительной проверки доступности и мобильного вида.

После публикации через панель локального конфига не появляется. Скилл из нашего примера сам не связывает папку с таким проектом: без конфига он создаст новое имя и второй адрес. Cloudflare позволяет обновлять существующий Worker через Wrangler, но для этого нужно отдельно настроить конфиг на его имя.

Что нужно, чтобы это делал агент

Для дальнейших публикаций настроим скилл. Подготовка нужна один раз на вашем компьютере.

Программ понадобится немного. Аккаунт у вас уже есть, нужен ещё Node.js - проверяется командой node -v, и если её не нашли, сначала придётся его поставить. Сам wrangler ставить не надо: npx скачает свежий сам, когда до него дойдёт дело.

  • Аккаунт
  • wrangler login
  • wrangler deploy
  • Ссылка

Второй шаг на схеме - вход, и его стоит закрыть прямо сейчас, до всего остального:

npx wrangler login    # откроется браузер, там кнопка подтверждения

Команду выполнить в терминале. Если этого шага нет, вся процедура упрётся в него на первом же прогоне, и выглядеть это будет как сломанный скилл, хотя дело совсем не в нём. Проверить, что всё получилось, можно командой npx wrangler whoami - она покажет, под кем вы вошли.

Для этого маршрута достаточно входа через браузер. API-токен разобран в необязательном продолжении в конце.

Третий шаг схемы, npx wrangler deploy, будет запускать агент из папки страницы. Сначала дадим ему правила подготовки конфига и публикации.

5. Свой скилл для деплоя

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

Что скилл должен уметь

Пять шагов, и каждый решает конкретную проблему, а не добавлен для полноты:

  1. Взять папку, которую назвали, и убедиться, что index.html лежит в её корне. Дешёвая проверка, которая ловит самую частую ошибку до деплоя, а не после.
  2. Определить имя проекта - вывести его из имени папки, а не спрашивать каждый раз.
  3. Посмотреть, лежит ли внутри папки, рядом с index.html, файл wrangler.jsonc. Нет - создать; есть - взять имя оттуда и ничего в нём не переписывать.
  4. Запустить деплой из этой папки и показать команду до запуска.
  5. Вернуть публичный адрес и напомнить проверить страницу и картинки по нему.

Имя проекта выводится из папки

Это главное решение всей процедуры, и именно его нельзя оставлять агенту на импровизацию. Если имя не задано правилом, агент придумает его сам - и в следующий раз придумает другое. Получится второй проект с другим адресом, а первый останется висеть.

Правило простое: имя папки и есть имя проекта. В имени воркера могут быть только строчные латинские буквы, цифры и дефис, поэтому всё остальное - точки, пробелы, подчёркивания - меняем на дефис и добавляем короткий суффикс, четыре случайных символа:

landing/                 ->  landing-42c2
my.first.page/           ->  my-first-page-8e10
portfolio-2026/          ->  portfolio-2026-b7a3

Суффикс нужен, чтобы две папки с одинаковым именем в разных проектах не заняли один адрес. Генерируется он один раз, при создании файла настроек, и обязательно командой, а не из головы агента: иначе он возьмёт суффикс из примера, и у всех, кто читал ту же статью, он окажется одинаковым. Дальше суффикс всегда читается из конфига. Это и есть причина, по которой скилл сначала смотрит на существующий конфиг и только потом что-то пишет.

Имя задеплоенного проекта не меняют

Правка поля name в готовом конфиге это не переименование. Cloudflare заведёт новый проект с новым адресом, а старый останется жить со старой ссылкой - той самой, которую вы уже кому-то отправили.

Поэтому в процедуре и стоит отдельным шагом: конфиг есть - имя оттуда, и не трогать.

Файл настроек пишет агент

В wrangler.jsonc агент записывает имя проекта и настройки публикации, чтобы запускать деплой без вопросов в терминале. Конфиг лежит рядом с index.html, поэтому путь к файлам в нём - точка, "эта же папка":

{
  "name": "landing-42c2",
  "compatibility_date": "2026-09-07",
  "assets": { "directory": "." }
}

Поле compatibility_date выбирает совместимое поведение платформы на указанную дату. Для нового конфига агент ставит текущую дату, как рекомендует документация Cloudflare; при повторной публикации сохраняет прежнюю.

Класть конфиг уровнем выше, рядом с папкой, не стоит: имя файла фиксированное, в одном каталоге такой файл может быть только один, и вторая папка либо перезапишет конфиг первой, либо выложится под её именем. Внутри папки каждый проект самодостаточен, и деплой запускается прямо из неё.

Побочный эффект такой раскладки: конфиг лежит в той же папке, что и страница, поэтому уедет на хостинг вместе с ней и будет открываться по ссылке. Секретов в нём нет - имя, дата и точка, - а кому мешает, тот кладёт рядом файл .assetsignore и перечисляет в нём, что не выкладывать.

Три правила, которые стоит проговорить в задании явно, иначе агент их не угадает:

  • файла нет - создать, показав, что записал;
  • файл есть - имя и дату оставить как есть, даже если сегодняшняя дата другая;
  • переписывать файл только тогда, когда содержимое действительно меняется.

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

Первая - собственно задание на скилл. Она длиннее остальных, потому что это единственный раз, когда вы описываете процедуру целиком:

Собери skill для деплоя статических страниц на Cloudflare Workers.
Положи его в .claude/skills/ этого проекта.
В конце покажи путь к созданному SKILL.md и способ явного вызова скилла.

Сначала прочитай актуальную документацию Cloudflare про Workers
и static assets: команды и поля конфига могли измениться.
Если что-то в описании ниже разойдётся с документацией - скажи мне,
молча не переписывай.

В описании скилла перечисли фразы, по которым он должен срабатывать,
как минимум: "выложи папку", "выложи заново", "задеплой на Cloudflare".

Процедура: беру папку, проверяю, что в корне есть index.html.
Имя проекта вывожу из имени этой папки: в нём остаются только
строчные латинские буквы, цифры и дефис, всё остальное (пробелы,
подчёркивания, заглавные, кириллица) меняю на дефис.
В конец добавляю через дефис суффикс из четырёх символов.
Суффикс не придумываю, а получаю командой:
node -e "console.log(crypto.randomUUID().slice(0,4))"
Конфиг wrangler.jsonc лежит внутри публикуемой папки, рядом
с index.html, и assets.directory в нём равен ".".
Если конфига нет - создаю его: name, compatibility_date,
assets.directory. Для нового compatibility_date беру текущую дату
в формате YYYY-MM-DD. Показываю, что записал.
Если конфиг есть - имя и дату беру оттуда и не переписываю.
Переписываю файл только тогда, когда содержимое действительно меняется.
Если конфиг есть, но assets.directory указывает не на эту папку
или в конфиге есть поле main - останавливаюсь и говорю, деплой не запускаю.
Если просят выложить заново, а конфига в папке нет - останавливаюсь
и спрашиваю, новый проект не создаю.
Деплой: npx wrangler deploy из папки проекта. Команду показываю до запуска.
В ответе возвращаю публичный адрес и напоминаю проверить по нему
страницу и картинки. При обновлении адрес должен остаться прежним.
Если нет Node.js или не пройдена авторизация - говорю об этом,
а не пытаюсь обойти.
Если у аккаунта ещё нет поддомена workers.dev - говорю об этом:
неинтерактивный деплой на этом падает.

После создания откройте показанный агентом файл .claude/skills/<имя>/SKILL.md: в нём должны быть правила выше. Перед второй просьбой явно вызовите созданный скилл способом, который показал агент. Если скилл не находится, попросите проверить путь и его доступность в текущем проекте.

Вторая - проверка перед делом. Полезна перед первым деплоем папки, когда хочется увидеть план до того, как что-то уедет наружу; если папок несколько, её задают для каждой:

Файлы не создавай и не меняй, wrangler не запускай. Только покажи,
что ты собираешься сделать с папкой landing: какое имя проекта,
какой конфиг запишешь, какую команду запустишь.

Одна оговорка: суффикс появляется в момент записи конфига, так что для папки, где конфига ещё нет, имя в плане и имя на реальном прогоне могут не совпасть. Совпадёт всё остальное.

Третья и четвёртая - рабочие, ради них всё и затевалось:

Выложи папку landing на Cloudflare Workers.
Я поправил index.html в landing. Выложи заново на Cloudflare Workers.

После первой публикации откройте полученную ссылку, проверьте текст и картинки. Затем измените одну заметную фразу в landing/index.html и отправьте четвёртую просьбу. Обновите страницу по прежнему адресу: должна появиться новая фраза. Если адрес сменился, попросите агента проверить имя в конфиге до следующего деплоя.

На этом основной маршрут завершён: скилл создан, страница опубликована, обновление проверено по той же ссылке. Перед каждой публикацией остаётся выбрать нужную папку и посмотреть команду агента.

6. Дополнительные сценарии

Дальше можно не читать, пока у вас нет задачи готовить много папок разом или запускать деплой без входа через браузер.

Когда процедуры становится мало

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

Тогда процедуру переписывают в скрипт: он обходит папки сам, пишет конфиги, пропускает те, где ничего не изменилось, и печатает сводку. Скилл при этом никуда не девается - он просто зовёт скрипт вместо того, чтобы писать конфиги самому, а деплой по-прежнему запускает сам.

Писать его тоже не вам. У агента уже есть подробное описание процедуры - ваш скилл, - так что просьба выходит короткой:

Напиши на Python скрипт, который делает то же, что описано в моём skill
для деплоя, только сразу по всем папкам проекта.

Берёт папки, где в корне есть index.html;
в node_modules, .git и dist не заглядывает.
Для каждой собирает имя по нашему правилу и пишет wrangler.jsonc
внутрь папки.
Если конфиг уже есть - имя и compatibility_date берёт оттуда,
а файл перезаписывает только тогда, когда содержимое реально изменилось.
Если конфиг не читается - не трогает его, говорит об этом
и пропускает папку.
По умолчанию только показывает план и ничего не пишет;
запись - по явному флагу.
Нужен фильтр, чтобы прогнать только выбранные папки.
Скрипт только готовит конфиги, деплой не запускает.
В конце печатает таблицу: папка, имя проекта, что сделано.
Если что-то в этом описании неоднозначно - спроси, молча не додумывай.

Показ плана позволяет проверить список папок до записи. Сохранение имени и даты защищает существующие конфиги от случайных изменений. Сам скрипт только готовит настройки; публикацию по-прежнему выполняет скилл.

Токен доступа

На своём компьютере вы уже вошли через npx wrangler login. Wrangler сохраняет авторизацию, которой пользуются и команды агента.

Если нужен автоматический запуск без входа через браузер или более узкие права, используют API-токен. Его можно создать в профиле: аватарка, профиль, раздел API-токенов. Прямой адрес - dash.cloudflare.com/profile/api-tokens.

Форма создания выглядит пугающе: группы прав, ресурсы, какие-то фильтры. На самом деле решений там четыре, и половину полей можно не трогать вовсе.

  1. Имя токена. Через полгода вы не вспомните, зачем он, поэтому пишите по делу: "деплой страниц с ноутбука", а не "token 2".
  2. Права. Собирать их по одному не нужно и не стоит. В списке готовых наборов есть Edit Cloudflare Workers - в нём уже собрано всё, что требуется для публикации.
  3. Ресурсы. Ограничьте токен одним аккаунтом, тем самым, куда выкладываете. Даже если аккаунт у вас единственный, выберите его явно: аккаунтов может стать больше, а токен останется прежним.
  4. Срок жизни и фильтр по IP. Поля необязательные. Срок имеет смысл поставить, когда токен нужен на один вечер или для чужой машины; в обычной работе их оставляют как есть.
Права можно не угадывать

Наборы прав со временем меняются, а к проекту однажды добавляется что-то ещё - хранилище, база, почта. Токен, который вчера работал, внезапно перестаёт подходить, и выглядит это как отказ на ровном месте.

Паниковать не нужно: wrangler в таких случаях говорит, какого именно доступа ему не хватило. Эту строчку можно целиком показать агенту и спросить, что добавить в права токена, - документацию сервиса он прочитает быстрее, чем вы вспомните её наизусть.

Дальше токен кладут в переменную окружения CLOUDFLARE_API_TOKEN, а аккаунт указывают в CLOUDFLARE_ACCOUNT_ID. Переменная окружения - это настройка вашей машины, которую программы читают сами; wrangler найдёт обе без вашего участия. Как переменные устроены и где их правильно держать - отдельный разговор, здесь достаточно того, что это место, а не строка в переписке.

Где запускается командаЧем авторизоваться
Свой компьютер, браузер под рукойwrangler login
Сервер без браузера, чужая машина, автоматический прогонAPI-токен в переменной окружения
Токен не вставляют в чат

Переписка с агентом сохраняется и уходит по сети, а токен с правами на воркеры позволяет выложить и удалить что угодно от вашего имени. Если агент спрашивает токен, правильный ответ - назвать место, откуда его можно прочитать, а не саму строку.

Токен, который однажды где-то мелькнул, отзывают в панели и создают заново. Это дешевле, чем гадать, видел его кто-нибудь или нет.