[{"data":1,"prerenderedAt":683},["ShallowReactive",2],{"article-cloudflare-hermes-integration":3},{"id":4,"title":5,"body":6,"date":667,"description":668,"extension":669,"meta":670,"navigation":341,"path":671,"readingTime":672,"seo":673,"stem":674,"tags":675,"__hash__":682},"articles\u002Fcloudflare-hermes-integration.md","Hermes + Cloudflare: автоматизация DNS и деплоя из терминала",{"type":7,"value":8,"toc":651},"minimark",[9,13,17,20,25,28,47,50,54,64,90,93,127,130,134,139,142,190,193,231,238,242,284,288,312,316,319,387,390,457,467,471,478,484,487,491,494,499,502,516,519,523,526,549,552,556,562,568,617,623,637,641,644,647],[10,11,5],"h1",{"id":12},"hermes-cloudflare-автоматизация-dns-и-деплоя-из-терминала",[14,15,16],"p",{},"У меня десятки субдоменов: блог, лендинги, API, нотификационные сервисы. Управлять всем этим через Cloudflare Dashboard — больно. Каждый раз логиниться, искать нужную запись, кликать, ждать...",[14,18,19],{},"Решение — дать это дело AI-агенту. Hermes Agent умеет работать с Cloudflare через CLI и API. Вот как я настроил этот pipeline.",[21,22,24],"h2",{"id":23},"зачем-агенту-cloudflare","Зачем агенту Cloudflare?",[14,26,27],{},"Типичный сценарий: я ставлю новый сервис на VPS и хочу, чтобы он был доступен по HTTPS на своём субдомене. Раньше это было:",[29,30,31,35,38,41,44],"ol",{},[32,33,34],"li",{},"Зайти в Cloudflare Dashboard",[32,36,37],{},"Создать DNS-запись",[32,39,40],{},"Дождаться пропагации",[32,42,43],{},"Проверить SSL",[32,45,46],{},"Настроить Caddy\u002Fnginx",[14,48,49],{},"Теперь я говорю Hermes: «Подними ntfy на субдомене notify и проксируй через Cloudflare». Агент делает всё сам.",[21,51,53],{"id":52},"инструмент-flarectl","Инструмент: flarectl",[14,55,56,63],{},[57,58,62],"a",{"href":59,"rel":60},"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fcloudflare-go\u002Ftree\u002Fmain\u002Fcmd\u002Fflarectl",[61],"nofollow","flarectl"," — официальная CLI-утилита от Cloudflare. Установка:",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","go install github.com\u002Fcloudflare\u002Fcloudflare-go\u002Fcmd\u002Fflarectl@latest\n","bash","",[72,73,74],"code",{"__ignoreMap":70},[75,76,79,83,87],"span",{"class":77,"line":78},"line",1,[75,80,82],{"class":81},"svObZ","go",[75,84,86],{"class":85},"sU2Wk"," install",[75,88,89],{"class":85}," github.com\u002Fcloudflare\u002Fcloudflare-go\u002Fcmd\u002Fflarectl@latest\n",[14,91,92],{},"Авторизация через переменные окружения:",[65,94,96],{"className":67,"code":95,"language":69,"meta":70,"style":70},"export CF_API_TOKEN=your-api-token\nexport CF_ACCOUNT_ID=your-account-id\n",[72,97,98,114],{"__ignoreMap":70},[75,99,100,104,108,111],{"class":77,"line":78},[75,101,103],{"class":102},"snl16","export",[75,105,107],{"class":106},"s95oV"," CF_API_TOKEN",[75,109,110],{"class":102},"=",[75,112,113],{"class":106},"your-api-token\n",[75,115,117,119,122,124],{"class":77,"line":116},2,[75,118,103],{"class":102},[75,120,121],{"class":106}," CF_ACCOUNT_ID",[75,123,110],{"class":102},[75,125,126],{"class":106},"your-account-id\n",[14,128,129],{},"Токен создаётся в Dashboard → My Profile → API Tokens. Нужны permissions: Zone:DNS:Edit, Zone:Zone:Read.",[21,131,133],{"id":132},"базовые-операции","Базовые операции",[135,136,138],"h3",{"id":137},"создание-dns-записи","Создание DNS-записи",[14,140,141],{},"A-запись (субдомен → IP сервера):",[65,143,145],{"className":67,"code":144,"language":69,"meta":70,"style":70},"flarectl dns create --zone example.com \\\n  --type A --name myservice --content 203.0.113.1 --proxied\n",[72,146,147,167],{"__ignoreMap":70},[75,148,149,151,154,157,161,164],{"class":77,"line":78},[75,150,62],{"class":81},[75,152,153],{"class":85}," dns",[75,155,156],{"class":85}," create",[75,158,160],{"class":159},"sDLfK"," --zone",[75,162,163],{"class":85}," example.com",[75,165,166],{"class":159}," \\\n",[75,168,169,172,175,178,181,184,187],{"class":77,"line":116},[75,170,171],{"class":159},"  --type",[75,173,174],{"class":85}," A",[75,176,177],{"class":159}," --name",[75,179,180],{"class":85}," myservice",[75,182,183],{"class":159}," --content",[75,185,186],{"class":159}," 203.0.113.1",[75,188,189],{"class":159}," --proxied\n",[14,191,192],{},"CNAME (субдомен → Cloudflare Pages проект):",[65,194,196],{"className":67,"code":195,"language":69,"meta":70,"style":70},"flarectl dns create --zone example.com \\\n  --type CNAME --name blog --content my-project.pages.dev --proxied\n",[72,197,198,212],{"__ignoreMap":70},[75,199,200,202,204,206,208,210],{"class":77,"line":78},[75,201,62],{"class":81},[75,203,153],{"class":85},[75,205,156],{"class":85},[75,207,160],{"class":159},[75,209,163],{"class":85},[75,211,166],{"class":159},[75,213,214,216,219,221,224,226,229],{"class":77,"line":116},[75,215,171],{"class":159},[75,217,218],{"class":85}," CNAME",[75,220,177],{"class":159},[75,222,223],{"class":85}," blog",[75,225,183],{"class":159},[75,227,228],{"class":85}," my-project.pages.dev",[75,230,189],{"class":159},[14,232,233,234,237],{},"Флаг ",[72,235,236],{},"--proxied"," включает оранжевый облако — Cloudflare кеширует, защищает от DDoS, terminates SSL.",[135,239,241],{"id":240},"обновление-записей","Обновление записей",[65,243,245],{"className":67,"code":244,"language":69,"meta":70,"style":70},"flarectl dns update --zone example.com \\\n  --id RECORD_ID --type A --name myservice --content 203.0.113.2\n",[72,246,247,262],{"__ignoreMap":70},[75,248,249,251,253,256,258,260],{"class":77,"line":78},[75,250,62],{"class":81},[75,252,153],{"class":85},[75,254,255],{"class":85}," update",[75,257,160],{"class":159},[75,259,163],{"class":85},[75,261,166],{"class":159},[75,263,264,267,270,273,275,277,279,281],{"class":77,"line":116},[75,265,266],{"class":159},"  --id",[75,268,269],{"class":85}," RECORD_ID",[75,271,272],{"class":159}," --type",[75,274,174],{"class":85},[75,276,177],{"class":159},[75,278,180],{"class":85},[75,280,183],{"class":159},[75,282,283],{"class":159}," 203.0.113.2\n",[135,285,287],{"id":286},"удаление","Удаление",[65,289,291],{"className":67,"code":290,"language":69,"meta":70,"style":70},"flarectl dns delete --zone example.com --id RECORD_ID\n",[72,292,293],{"__ignoreMap":70},[75,294,295,297,299,302,304,306,309],{"class":77,"line":78},[75,296,62],{"class":81},[75,298,153],{"class":85},[75,300,301],{"class":85}," delete",[75,303,160],{"class":159},[75,305,163],{"class":85},[75,307,308],{"class":159}," --id",[75,310,311],{"class":85}," RECORD_ID\n",[21,313,315],{"id":314},"cloudflare-pages-деплой-статики","Cloudflare Pages: деплой статики",[14,317,318],{},"Для Nuxt, Astro, Next.js и других SSG\u002FSSR фреймворков Cloudflare Pages — бесплатный хостинг с CDN. Деплой через wrangler CLI:",[65,320,322],{"className":67,"code":321,"language":69,"meta":70,"style":70},"npm install -g wrangler\n\n# Авторизация\nwrangler login\n\n# Деплой из папки dist\u002F\nwrangler pages deploy dist --project-name=my-blog\n",[72,323,324,337,343,350,359,364,370],{"__ignoreMap":70},[75,325,326,329,331,334],{"class":77,"line":78},[75,327,328],{"class":81},"npm",[75,330,86],{"class":85},[75,332,333],{"class":159}," -g",[75,335,336],{"class":85}," wrangler\n",[75,338,339],{"class":77,"line":116},[75,340,342],{"emptyLinePlaceholder":341},true,"\n",[75,344,346],{"class":77,"line":345},3,[75,347,349],{"class":348},"sAwPA","# Авторизация\n",[75,351,353,356],{"class":77,"line":352},4,[75,354,355],{"class":81},"wrangler",[75,357,358],{"class":85}," login\n",[75,360,362],{"class":77,"line":361},5,[75,363,342],{"emptyLinePlaceholder":341},[75,365,367],{"class":77,"line":366},6,[75,368,369],{"class":348},"# Деплой из папки dist\u002F\n",[75,371,373,375,378,381,384],{"class":77,"line":372},7,[75,374,355],{"class":81},[75,376,377],{"class":85}," pages",[75,379,380],{"class":85}," deploy",[75,382,383],{"class":85}," dist",[75,385,386],{"class":159}," --project-name=my-blog\n",[14,388,389],{},"Кастомный домен привязывается через API:",[65,391,393],{"className":67,"code":392,"language":69,"meta":70,"style":70},"curl -s -X POST \\\n  \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Faccounts\u002F$CF_ACCOUNT_ID\u002Fpages\u002Fprojects\u002Fmy-blog\u002Fdomains\" \\\n  -H \"Authorization: Bearer $CF_API_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  --data '{\"name\": \"blog.example.com\"}'\n",[72,394,395,411,424,440,449],{"__ignoreMap":70},[75,396,397,400,403,406,409],{"class":77,"line":78},[75,398,399],{"class":81},"curl",[75,401,402],{"class":159}," -s",[75,404,405],{"class":159}," -X",[75,407,408],{"class":85}," POST",[75,410,166],{"class":159},[75,412,413,416,419,422],{"class":77,"line":116},[75,414,415],{"class":85},"  \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Faccounts\u002F",[75,417,418],{"class":106},"$CF_ACCOUNT_ID",[75,420,421],{"class":85},"\u002Fpages\u002Fprojects\u002Fmy-blog\u002Fdomains\"",[75,423,166],{"class":159},[75,425,426,429,432,435,438],{"class":77,"line":345},[75,427,428],{"class":159},"  -H",[75,430,431],{"class":85}," \"Authorization: Bearer ",[75,433,434],{"class":106},"$CF_API_TOKEN",[75,436,437],{"class":85},"\"",[75,439,166],{"class":159},[75,441,442,444,447],{"class":77,"line":352},[75,443,428],{"class":159},[75,445,446],{"class":85}," \"Content-Type: application\u002Fjson\"",[75,448,166],{"class":159},[75,450,451,454],{"class":77,"line":361},[75,452,453],{"class":159},"  --data",[75,455,456],{"class":85}," '{\"name\": \"blog.example.com\"}'\n",[458,459,460],"blockquote",{},[14,461,462,463,466],{},"Wrangler v4.94+ может не поддерживать ",[72,464,465],{},"wrangler pages domain add",". Используйте API напрямую.",[21,468,470],{"id":469},"ssl-flexible-vs-full","SSL: Flexible vs Full",[14,472,473,477],{},[474,475,476],"strong",{},"SSL:Flexible"," — Cloudflare terminates SSL на своём edge, до вашего origin идёт plain HTTP. Не нужен сертификат на сервере. Идеально для сервисов, которые не работают с HTTPS нативно.",[14,479,480,483],{},[474,481,482],{},"SSL:Full"," — Cloudflare terminates SSL на edge, но до origin тоже идёт SSL. Нужен сертификат на сервере (можно Cloudflare Origin CA — бесплатный).",[14,485,486],{},"Для self-hosted сервисов на одном VPS обычно хватает Flexible. Но если сервис передаёт чувствительные данные — ставьте Full.",[21,488,490],{"id":489},"автоматизация-через-hermes","Автоматизация через Hermes",[14,492,493],{},"Вот как это работает в реальной жизни. Hermes Agent имеет доступ к терминалу и может выполнять команды. Я говорю:",[458,495,496],{},[14,497,498],{},"«Поставь Grafana на монитор.example.com»",[14,500,501],{},"Агент:",[29,503,504,507,510,513],{},[32,505,506],{},"Проверяет, что Grafana установлена",[32,508,509],{},"Создаёт DNS A-запись через flarectl",[32,511,512],{},"Настраивает Caddy reverse proxy",[32,514,515],{},"Проверяет HTTPS",[14,517,518],{},"Всё в одном диалоге, без переключения в Dashboard.",[135,520,522],{"id":521},"cron-мониторинг","Cron-мониторинг",[14,524,525],{},"Hermes может проверять DNS-записи по расписанию:",[65,527,529],{"className":67,"code":528,"language":69,"meta":70,"style":70},"flarectl dns list --zone example.com --type A\n",[72,530,531],{"__ignoreMap":70},[75,532,533,535,537,540,542,544,546],{"class":77,"line":78},[75,534,62],{"class":81},[75,536,153],{"class":85},[75,538,539],{"class":85}," list",[75,541,160],{"class":159},[75,543,163],{"class":85},[75,545,272],{"class":159},[75,547,548],{"class":85}," A\n",[14,550,551],{},"Если запись изменилась или пропала — агент отправляет уведомление.",[21,553,555],{"id":554},"подводные-камни","Подводные камни",[14,557,558,561],{},[474,559,560],{},"Proxy status."," Если запись не proxied (серое облако), Cloudflare не terminates SSL и не кеширует. Для сервисов, которые должны быть за CDN — всегда proxied.",[14,563,564,567],{},[474,565,566],{},"Cache purge."," После деплоя нового билда Cloudflare может отдавать старый кеш. Очистка:",[65,569,571],{"className":67,"code":570,"language":69,"meta":70,"style":70},"curl -s -X POST \\\n  \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fzones\u002F$ZONE_ID\u002Fpurge_cache\" \\\n  -H \"Authorization: Bearer $CF_API_TOKEN\" \\\n  --data '{\"purge_everything\":true}'\n",[72,572,573,585,598,610],{"__ignoreMap":70},[75,574,575,577,579,581,583],{"class":77,"line":78},[75,576,399],{"class":81},[75,578,402],{"class":159},[75,580,405],{"class":159},[75,582,408],{"class":85},[75,584,166],{"class":159},[75,586,587,590,593,596],{"class":77,"line":116},[75,588,589],{"class":85},"  \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fzones\u002F",[75,591,592],{"class":106},"$ZONE_ID",[75,594,595],{"class":85},"\u002Fpurge_cache\"",[75,597,166],{"class":159},[75,599,600,602,604,606,608],{"class":77,"line":345},[75,601,428],{"class":159},[75,603,431],{"class":85},[75,605,434],{"class":106},[75,607,437],{"class":85},[75,609,166],{"class":159},[75,611,612,614],{"class":77,"line":352},[75,613,453],{"class":159},[75,615,616],{"class":85}," '{\"purge_everything\":true}'\n",[14,618,619,622],{},[474,620,621],{},"Rate limits."," Cloudflare Free план имеет лимиты на API-вызовы. Для автоматизации это редко проблема, но если агент делает десятки запросов в минуту — может словить 429.",[14,624,625,628,629,632,633,636],{},[474,626,627],{},"DNS пропагация."," После создания записи DNS пропагируется за 1-5 минут. Hermes проверяет через ",[72,630,631],{},"dig"," или ",[72,634,635],{},"flarectl dns list"," перед тем, как считать задачу выполненной.",[21,638,640],{"id":639},"итог","Итог",[14,642,643],{},"Cloudflare Free + Hermes Agent = полная автоматизация инфраструктуры из терминала. Никакого Dashboard, никаких ручных кликов. Агент управляет DNS, деплоит статику, настраивает SSL, мониторит записи.",[14,645,646],{},"Для self-hosted проектов это идеальный стек: бесплатно, надёжно, и всё через CLI.",[648,649,650],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":70,"searchDepth":116,"depth":116,"links":652},[653,654,655,660,661,662,665,666],{"id":23,"depth":116,"text":24},{"id":52,"depth":116,"text":53},{"id":132,"depth":116,"text":133,"children":656},[657,658,659],{"id":137,"depth":345,"text":138},{"id":240,"depth":345,"text":241},{"id":286,"depth":345,"text":287},{"id":314,"depth":116,"text":315},{"id":469,"depth":116,"text":470},{"id":489,"depth":116,"text":490,"children":663},[664],{"id":521,"depth":345,"text":522},{"id":554,"depth":116,"text":555},{"id":639,"depth":116,"text":640},"2026-05-24","Как AI-агент Hermes управляет DNS-записями, деплоит статику на Cloudflare Pages и настраивает SSL — всё через CLI, без Dashboard.","md",{},"\u002Fcloudflare-hermes-integration",null,{"title":5,"description":668},"cloudflare-hermes-integration",[676,677,678,679,680,681],"hermes","cloudflare","dns","devops","automation","cli","nbKjEdlyWOAi4H76Q371RdUB9XnUB-9T_HxrDpUkCIk",1779661627947]