<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web Hosting on kenji.blog</title><link>http://kenji.blog/ru/categories/web-hosting/</link><description>Recent content in Web Hosting on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/categories/web-hosting/index.xml" rel="self" type="application/rss+xml"/><item><title>Как бесплатно и сверхбыстро опубликовать блог Hugo с помощью Cloudflare Pages и GitHub Pages</title><link>http://kenji.blog/ru/p/hugo-hosting-cloudflare-vs-github-pages/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/hugo-hosting-cloudflare-vs-github-pages/</guid><description>&lt;img src="http://kenji.blog/p/hugo-hosting-cloudflare-vs-github-pages/img/eyecatch.jpg" alt="Featured image of post Как бесплатно и сверхбыстро опубликовать блог Hugo с помощью Cloudflare Pages и GitHub Pages" />&lt;p>Скорость загрузки (производительность), эксплуатационные расходы и безопасность являются критически важными факторами при управлении веб-сайтом или блогом. Раньше доминировала комбинация динамической CMS (системы управления контентом), такой как WordPress, и арендованного сервера, но сегодня огромное внимание привлекает архитектура, называемая «Jamstack». В частности, объединив «Hugo», сверхбыстрый генератор статических сайтов (SSG), написанный на языке Go, с современными сервисами хостинга, такими как Cloudflare Pages или GitHub Pages, можно создать &lt;strong>совершенно бесплатную и невероятно быструю&lt;/strong> среду для блога.&lt;/p>
&lt;p>В этой статье мы глубоко погрузимся в технические аспекты и пошагово объясним, как опубликовать статический сайт на Hugo в Cloudflare Pages и GitHub Pages. Мы рассмотрим различия в архитектуре каждой платформы, настройку CI/CD (непрерывная интеграция/непрерывное развертывание) с использованием GitHub Actions, оптимизацию DNS, стратегии кэширования, а также внедрение аналитики, уважающей конфиденциальность пользователей.&lt;/p>
&lt;hr>
&lt;h2 id="1-основы-генераторов-статических-сайтов-ssg-и-jamstack">1. Основы генераторов статических сайтов (SSG) и Jamstack
&lt;/h2>&lt;h3 id="11-почему-статические-сайты">1.1 Почему статические сайты?
&lt;/h3>&lt;p>Традиционные динамические CMS (например, WordPress) при каждом запросе пользователя отправляют запрос к базе данных (например, MySQL) и динамически генерируют HTML на стороне сервера (например, с помощью PHP) перед его возвратом. Хотя этот метод обеспечивает высокую гибкость, он имеет низкую устойчивость к резким всплескам трафика (вирусный эффект или DDoS-атаки) и часто приводит к усложнению инфраструктуры, например, из-за необходимости установки кэширующего сервера (Redis или Varnish) на переднем крае.&lt;/p>
&lt;p>С другой стороны, генераторы статических сайтов (SSG), использующие архитектуру Jamstack (JavaScript, APIs, and Markup), генерируют все HTML-файлы, CSS и JavaScript заранее (на этапе сборки). При поступлении запроса от пользователя веб-сервер (или CDN) просто возвращает уже сгенерированный статический файл, что обеспечивает невероятную скорость и надежную безопасность.&lt;/p>
&lt;h3 id="12-преимущества-hugo">1.2 Преимущества Hugo
&lt;/h3>&lt;p>Среди множества SSG, таких как Next.js, Gatsby, Jekyll и Astro, главной отличительной чертой Hugo является &lt;strong>скорость сборки&lt;/strong>. Благодаря параллельной обработке на языке Go даже сайты с тысячами или десятками тысяч страниц собираются всего за несколько секунд. Это значительно сокращает время ожидания в пайплайне CI/CD и напрямую улучшает опыт разработчика (DX: Developer Experience).&lt;/p>
&lt;hr>
&lt;h2 id="2-сравнение-архитектуры-хостинговых-сервисов">2. Сравнение архитектуры хостинговых сервисов
&lt;/h2>&lt;p>Следующая задача — решить, где хостить статические файлы, сгенерированные Hugo. Основные варианты включают Cloudflare Pages, GitHub Pages и Netlify, но они различаются по своей сетевой архитектуре.&lt;/p>
&lt;h3 id="21-cdn-и-периферийные-вычисления-edge-computing">2.1 CDN и периферийные вычисления (Edge Computing)
&lt;/h3>&lt;p>Все эти платформы используют глобально распределенные CDN (сети доставки контента) для доставки контента. Однако ключевым фактором дифференциации является не только кэширование статических файлов, но и возможность выполнения маршрутизации запросов и перезаписи заголовков в ближайшем к пользователю PoP (Point of Presence) с помощью «периферийных вычислений».&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Пользователь (Токио)&amp;#34;] --&amp;gt;|Низкая задержка| B[&amp;#34;Периферийный узел (NRT)&amp;#34;]
C[&amp;#34;Пользователь (Нью-Йорк)&amp;#34;] --&amp;gt;|Низкая задержка| D[&amp;#34;Периферийный узел (EWR)&amp;#34;]
E[&amp;#34;Пользователь (Лондон)&amp;#34;] --&amp;gt;|Низкая задержка| F[&amp;#34;Периферийный узел (LHR)&amp;#34;]
B --&amp;gt; G[&amp;#34;Оригинальное хранилище / Хранилище объектов&amp;#34;]
D --&amp;gt; G
F --&amp;gt; G
&lt;/pre>
&lt;h3 id="22-github-pages">2.2 GitHub Pages
&lt;/h3>&lt;p>GitHub Pages — это сервис, который позволяет публиковать файлы HTML, CSS и JavaScript непосредственно из репозитория GitHub. В основе лежит CDN, такой как Fastly, что обеспечивает достаточную производительность. Тем не менее, как чистая инфраструктура он имеет некоторые ограничения: настройка заголовков (например, &lt;code>Cache-Control&lt;/code> или заголовки безопасности) ограничена, а настройка перенаправлений зависит от meta refresh в HTML или плагинов Jekyll.&lt;/p>
&lt;h3 id="23-cloudflare-pages">2.3 Cloudflare Pages
&lt;/h3>&lt;p>Cloudflare Pages — это сервис хостинга статических сайтов, построенный на базе крупнейшей в мире Anycast-сети Cloudflare (охватывающей более 275 городов).
Он обеспечивает выдающиеся возможности настройки производительности, включая стандартную поддержку HTTP/3 (QUIC), оптимизацию изображений и интеграцию с периферийными функциями (Cloudflare Workers). Большим преимуществом является отсутствие платы за пропускную способность, что позволяет бесплатно работать с сайтом даже при резких всплесках трафика.&lt;/p>
&lt;h3 id="24-netlify">2.4 Netlify
&lt;/h3>&lt;p>Netlify является пионером Jamstack и предлагает решение «все в одном» для DX, объединяя функции форм, аутентификации (Identity) и бессерверных функций. Однако следует быть осторожным с контролем затрат, особенно для блогов с большим количеством изображений и видео, так как при превышении бесплатного лимита пропускной способности (100 ГБ в месяц) применяются высокие тарифы за использование.&lt;/p>
&lt;hr>
&lt;h2 id="3-теоретический-расчет-производительности-и-задержки-математическая-модель-в-latex">3. Теоретический расчет производительности и задержки (математическая модель в LaTeX)
&lt;/h2>&lt;p>При оценке производительности веб-сайта сокращение задержки (Latency) является важнейшим показателем. Давайте смоделируем, насколько использование CDN (Edge) сокращает задержку по сравнению с прямым доступом к исходному серверу.&lt;/p>
&lt;p>Пусть $C$ — вероятность того, что запрос пользователя попадет в кэш («коэффициент попадания в кэш» или Cache Hit Ratio), где $0 \le C \le 1$.
Пусть $L_{origin}$ — задержка до исходного сервера, а $L_{edge}$ — задержка до ближайшего периферийного узла.&lt;/p>
&lt;p>Новая средняя задержка $L_{new}$ рассчитывается как следующее математическое ожидание:&lt;/p>
$$ L_{new} = C \times L_{edge} + (1 - C) \times (L_{edge} + L_{origin}) $$&lt;p>Упростив это уравнение, получим:&lt;/p>
$$ L_{new} = L_{edge} + (1 - C) \times L_{origin} $$&lt;p>Например, если пользователь в Токио обращается к исходному серверу на восточном побережье США (Нью-Йорк), учитывая физическое расстояние по оптоволокну и задержку обработки маршрутизатором, $L_{origin}$ составит около 200 мс. С другой стороны, если используется CDN, например Cloudflare, пользователь может подключиться к периферийному узлу в Токио, и $L_{edge}$ сократится примерно до 10 мс.&lt;/p>
&lt;p>Предположим, что коэффициент попадания в кэш $C = 0.95$ (95%):&lt;/p>
$$ L_{new} = 10 + (1 - 0.95) \times 200 = 10 + 0.05 \times 200 = 10 + 10 = 20 \text{ мс} $$&lt;p>Таким образом, внедрение CDN может кардинально (примерно на 90%) сократить среднюю задержку с 210 мс до 20 мс.&lt;/p>
&lt;hr>
&lt;h2 id="4-построение-пайплайна-cicd-с-помощью-github-actions">4. Построение пайплайна CI/CD с помощью GitHub Actions
&lt;/h2>&lt;p>Для автоматизации процесса обновления блога Hugo мы настроим пайплайн CI/CD с использованием GitHub Actions. Благодаря этому вам достаточно написать статью в Markdown локально и выполнить &lt;code>git push&lt;/code>, после чего автоматически запустится сборка и сайт будет развернут на Cloudflare Pages или GitHub Pages.&lt;/p>
&lt;p>На следующей диаграмме последовательности показан весь процесс от отправки (push) статьи до её доставки пользователю:&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Пользователь (Автор)&amp;#34;
participant G as &amp;#34;Репозиторий GitHub&amp;#34;
participant A as &amp;#34;GitHub Actions&amp;#34;
participant C as &amp;#34;Cloudflare Pages&amp;#34;
participant V as &amp;#34;Посетитель&amp;#34;
U-&amp;gt;&amp;gt;G: &amp;#34;git push origin main&amp;#34;
G-&amp;gt;&amp;gt;A: &amp;#34;Запуск события Push&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;Checkout и настройка Hugo&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;hugo --minify (Сборка)&amp;#34;
A-&amp;gt;&amp;gt;C: &amp;#34;Развертывание в Cloudflare Pages (Direct Upload)&amp;#34;
C--&amp;gt;&amp;gt;A: &amp;#34;URL развертывания (Успех)&amp;#34;
V-&amp;gt;&amp;gt;C: &amp;#34;Запрос веб-страницы&amp;#34;
C--&amp;gt;&amp;gt;V: &amp;#34;Возврат кэшированного HTML (Edge)&amp;#34;
&lt;/pre>
&lt;h3 id="41-настройка-развертывания-для-cloudflare-pages-direct-upload">4.1 Настройка развертывания для Cloudflare Pages (Direct Upload)
&lt;/h3>&lt;p>В Cloudflare Pages есть два способа: подключить репозиторий GitHub для сборки в инфраструктуре Cloudflare или выполнить «Direct Upload» (прямую загрузку) статических файлов, собранных с помощью GitHub Actions. Если вы хотите более строго управлять версией Hugo и связывать его с другими задачами (такими как тестирование или оптимизация изображений), рекомендуется собирать проект в GitHub Actions и использовать Direct Upload.&lt;/p>
&lt;p>Ниже приведен практический пример файла &lt;code>.github/workflows/deploy.yml&lt;/code> для развертывания в Cloudflare Pages.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy Hugo site to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build-and-deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ubuntu-latest&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Checkout repository&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;actions/checkout@v4&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;recursive&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Setup Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;peaceiris/actions-hugo@v3&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.125.0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Build Hugo Site&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;hugo --minify --gc&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_ENVIRONMENT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;production&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;cloudflare/pages-action@v1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">apiToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_API_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">accountId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_ACCOUNT_ID }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">projectName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;your-project-name&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">directory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;public&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">gitHubToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.GITHUB_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>В этом пайплайне файлы HTML/CSS/JS минифицируются с помощью опции &lt;code>--minify&lt;/code>, а ненужные файлы удаляются с помощью &lt;code>--gc&lt;/code>. Это основы оптимизации производительности.&lt;/p>
&lt;hr>
&lt;h2 id="5-глубокое-погружение-в-настройки-dns-пользовательские-домены-и-записи-cname--alias">5. Глубокое погружение в настройки DNS: пользовательские домены и записи CNAME / ALIAS
&lt;/h2>&lt;p>При использовании собственного домена (например, &lt;code>kenji.blog&lt;/code>) правильная настройка DNS (Domain Name System) просто необходима.&lt;/p>
&lt;h3 id="51-ограничения-записей-cname-и-zone-apex">5.1 Ограничения записей CNAME и Zone Apex
&lt;/h3>&lt;p>Обычно при направлении поддомена (например, &lt;code>www.kenji.blog&lt;/code>) на внешний сервис используется запись &lt;code>CNAME&lt;/code>. Однако спецификации DNS (RFC 1034) не позволяют устанавливать запись &lt;code>CNAME&lt;/code> для корневого домена (Zone Apex, также называемого голым доменом, например, &lt;code>kenji.blog&lt;/code>). Это правило связано с тем, что в Zone Apex обязательно должны присутствовать записи SOA (Start of Authority), NS (Name Server) и MX (Mail Exchange), а CNAME не может сосуществовать с другими записями ресурсов.&lt;/p>
&lt;h3 id="52-решение-записи-alias--aname--cname-flattening">5.2 Решение: записи ALIAS / ANAME / CNAME Flattening
&lt;/h3>&lt;p>Для решения этой проблемы современные DNS-провайдеры предлагают собственные расширения:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Записи ALIAS / ANAME&lt;/strong>: Динамически разрешают имена на стороне DNS-сервера и возвращают клиенту конечную запись A (IP-адрес). Поддерживается такими сервисами, как Amazon Route 53.&lt;/li>
&lt;li>&lt;strong>CNAME Flattening&lt;/strong>: Функция, предоставляемая Cloudflare. Она действует так, как если бы CNAME был настроен для Zone Apex, но при этом авторитетный DNS-сервер Cloudflare прозрачно возвращает клиенту автоматически разрешенные IP-адреса (записи A и AAAA).&lt;/li>
&lt;/ul>
&lt;p>При использовании Cloudflare Pages наиболее бесшовной и высокопроизводительной конфигурацией является делегирование серверов имен вашего домена в Cloudflare и использование этой функции «CNAME Flattening».&lt;/p>
&lt;hr>
&lt;h2 id="6-стратегия-кэширования-и-управление-http-заголовками">6. Стратегия кэширования и управление HTTP-заголовками
&lt;/h2>&lt;p>Еще одним ключом к ускорению работы статических сайтов является «стратегия кэширования». В Cloudflare Pages вы можете использовать сгенерированный файл (&lt;code>_headers&lt;/code> файл) для точного управления HTTP-заголовками ответа.&lt;/p>
&lt;h3 id="61-edge-cache-против-browser-cache">6.1 Edge Cache против Browser Cache
&lt;/h3>&lt;p>Кэш можно разделить на две основные категории: «Edge Cache» (кэш на периферии), хранящийся на стороне CDN, и «Browser Cache» (кэш браузера), сохраняемый в браузере пользователя.&lt;/p>
&lt;p>В идеале статические файлы (изображения, CSS, JS и т.д., чьи имена файлов содержат хэш) должны кэшироваться браузером на длительное время. С другой стороны, чтобы обновления HTML-файлов отражались немедленно, обычно делают кэш браузера коротким (или отключают его) и обрабатывают их с помощью кэша на периферии (edge cache).&lt;/p>
&lt;p>Пример настройки &lt;code>_headers&lt;/code> в Cloudflare Pages:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># HTML-файлы не кэшируются браузером и проверяются каждый раз
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*.html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=0, must-revalidate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># Ресурсные файлы (CSS/JS/изображения) кэшируются в браузере на 1 год
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/assets/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/img/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-формула-расчета-снижения-затрат-на-пропускную-способность">6.2 Формула расчета снижения затрат на пропускную способность
&lt;/h3>&lt;p>Настраивая правильные заголовки кэширования, вы можете значительно сократить объем передаваемых данных с сервера (периферии). Ежемесячные затраты на пропускную способность $Cost$ могут быть выражены следующей моделью на основе объема передачи $B_i$ каждого ресурса, коэффициента попадания в кэш $C_i$ и цены за единицу пропускной способности $R$:&lt;/p>
$$ Cost = \sum_{i=1}^{n} \left( B_i \times (1 - C_i) \times R \right) $$&lt;p>Поскольку Cloudflare не взимает плату за исходящий трафик ($R = 0$), прямые финансовые затраты составляют $0$. Однако, если вы используете другие инфраструктуры, такие как GitHub Pages, или используете AWS S3 в качестве бэкенда, максимизация коэффициента попадания в кэш $C_i$ имеет решающее значение для снижения затрат на инфраструктуру.&lt;/p>
&lt;hr>
&lt;h2 id="7-веб-аналитика-сочетающая-конфиденциальность-и-производительность">7. Веб-аналитика, сочетающая конфиденциальность и производительность
&lt;/h2>&lt;p>При ведении блога веб-аналитика (Web Analytics) необходима для понимания того, сколько пользователей его посещают. Долгое время Google Analytics (GA4) был стандартом де-факто, но в связи с недавними тенденциями в области защиты конфиденциальности (GDPR, CCPA) и отказом от сторонних файлов cookie, ситуация меняется.&lt;/p>
&lt;h3 id="71-влияние-на-веб-производительность">7.1 Влияние на веб-производительность
&lt;/h3>&lt;p>Внедрение Google Analytics (в частности, &lt;code>gtag.js&lt;/code> или Google Tag Manager) приводит к загрузке и выполнению множества внешних скриптов, что негативно сказывается на производительности (особенно на TTFB и времени блокировки основного потока).&lt;/p>
&lt;p>Давайте разобьем время загрузки сайта на компоненты:&lt;/p>
&lt;pre class="mermaid">
pie title Типичное распределение времени загрузки сайта
&amp;#34;TTFB (Время до первого байта)&amp;#34; : 15
&amp;#34;Загрузка контента (HTML/CSS)&amp;#34; : 20
&amp;#34;Парсинг DOM и рендеринг&amp;#34; : 45
&amp;#34;Аналитика и сторонний JS&amp;#34; : 20
&lt;/pre>
&lt;p>Нередко на сторонние JS-инструменты аналитики уходит около 20–30% всего времени загрузки.&lt;/p>
&lt;h3 id="72-внедрение-cloudflare-web-analytics">7.2 Внедрение Cloudflare Web Analytics
&lt;/h3>&lt;p>В связи с этим привлекают внимание аналитические инструменты, ориентированные на конфиденциальность и не использующие файлы cookie (Cookieless), такие как Cloudflare Web Analytics и Plausible Analytics.&lt;/p>
&lt;p>Cloudflare Web Analytics работает просто путем встраивания очень легкого фрагмента JavaScript и не выдает файлы cookie, поэтому вам не нужно устанавливать раздражающий баннер согласия на использование файлов cookie (Cookie Consent Banner).&lt;/p>
&lt;p>Его внедрение в Hugo также очень просто. Просто добавьте предоставленный фрагмент в &lt;code>layouts/partials/head.html&lt;/code> или &lt;code>layouts/partials/analytics.html&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">{{ if eq hugo.Environment &amp;#34;production&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">defer&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;https://static.cloudflareinsights.com/beacon.min.js&amp;#39;&lt;/span> &lt;span class="na">data-cf-beacon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;{&amp;#34;token&amp;#34;: &amp;#34;YOUR_CLOUDFLARE_BEACON_TOKEN&amp;#34;}&amp;#39;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- End Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Добавив атрибут &lt;code>defer&lt;/code>, скрипт загружается асинхронно, не блокируя парсинг HTML, и выполняется после построения DOM. Это сводит к минимуму влияние на начальную скорость отображения (LCP: Largest Contentful Paint и FCP: First Contentful Paint).&lt;/p>
&lt;hr>
&lt;h2 id="8-заключение-и-лучшие-практики">8. Заключение и лучшие практики
&lt;/h2>&lt;p>При работе со статическими сайтами на Hugo использование современных хостинговых платформ, таких как Cloudflare Pages или GitHub Pages, дает огромные преимущества с точки зрения экономической эффективности, скорости загрузки и безопасности.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Сверхбыстрые сборки&lt;/strong>: Используйте скорость Hugo, чтобы минимизировать время выполнения пайплайна CI/CD (GitHub Actions).&lt;/li>
&lt;li>&lt;strong>Доставка на периферии&lt;/strong>: Используйте периферийную сеть Cloudflare для доставки контента пользователям по всему миру с задержками порядка миллисекунд.&lt;/li>
&lt;li>&lt;strong>Правильная настройка DNS&lt;/strong>: Используйте CNAME Flattening для безопасной и быстрой работы Zone Apex (пользовательский домен).&lt;/li>
&lt;li>&lt;strong>Оптимизация стратегии кэширования&lt;/strong>: Используйте &lt;code>_headers&lt;/code>, чтобы правильно разделить кэширование в браузере и кэширование на периферии для каждого типа ресурсов.&lt;/li>
&lt;li>&lt;strong>Легкая аналитика&lt;/strong>: Внедрите такие решения, как Cloudflare Web Analytics, которые уважают конфиденциальность без ущерба для производительности.&lt;/li>
&lt;/ol>
&lt;p>Объединив все это, вы сможете бесплатно создать масштабируемую и надежную систему блогов, способную выдерживать огромный трафик — миллионы просмотров страниц в месяц. Если вы планируете запустить технический блог, корпоративный сайт или сайт-портфолио, обязательно попробуйте эту комбинацию Jamstack + Hugo + Cloudflare Pages.&lt;/p></description></item></channel></rss>