<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Руководство on Михаил Мальчиков</title>
        <link>https://malchikovma.ru/tags/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE/</link>
        <description>Recent content in Руководство on Михаил Мальчиков</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ru-ru</language>
        <lastBuildDate>Wed, 02 Sep 2026 09:52:43 +0300</lastBuildDate><atom:link href="https://malchikovma.ru/tags/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Как получить OV-сертификат Минцифры для HTTPS в 2026 году</title>
        <link>https://malchikovma.ru/post/2026-09-02-mincifri/</link>
        <pubDate>Wed, 02 Sep 2026 09:52:43 +0300</pubDate>
        
        <guid>https://malchikovma.ru/post/2026-09-02-mincifri/</guid>
        <description>&lt;img src="https://malchikovma.ru/post/2026-09-02-mincifri/mincifry-https.webp" alt="Featured image of post Как получить OV-сертификат Минцифры для HTTPS в 2026 году" /&gt;&lt;h2 id=&#34;введение&#34;&gt;Введение
&lt;/h2&gt;&lt;p&gt;Однажды вечером я размышлял о цифровых угрозах в условиях текущей экономической блокады. Закрывают доступ ко всему подряд, и я задумался: а могут ли заблокировать Let&amp;rsquo;s Encrypt? У нас в компании на нём тысяча доменов. Даже vk.ru сейчас на Let&amp;rsquo;s Encrypt. Последние новости только подкрепили мои опасения: &lt;a class=&#34;link&#34; href=&#34;https://habr.com/ru/news/1047084/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GlobalSign отозвал часть сертификатов&lt;/a&gt;. И какие альтернативы предоставляет нам вселенная? У нас же есть система сертификатов Минцифры.&lt;/p&gt;
&lt;p&gt;Вечер был томным, всё нужное было под рукой, и я решил получить российские сертификаты для своего сайта. Сначала написал инструкцию для себя, а потом решил поделиться со всеми.&lt;/p&gt;
&lt;p&gt;Получать сертификаты будем через Госуслуги — других вариантов я не нашёл. Я делал конфиг для своего сайта, вам, конечно же, нужно подставить свои данные. Часть команд я выполнял в Windows 11 PowerShell, часть — в WSL (Ubuntu) bash.&lt;/p&gt;
&lt;h2 id=&#34;госуслуги&#34;&gt;Госуслуги
&lt;/h2&gt;&lt;p&gt;Идем на Госуслуги, вбиваем в поиске &amp;ldquo;SSL-сертификат&amp;rdquo;, получаем тако диалог с Роботом Максом:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Я: SSL-сертификат&lt;/p&gt;
&lt;p&gt;Робот Макс: Уточните свою роль при использовании сертификата безопасности&lt;/p&gt;
&lt;p&gt;Я: Владелец сайта&lt;/p&gt;
&lt;p&gt;Робот Макс: Вот что я могу предложить по сертификату безопасности для владельца сайта&amp;hellip;&lt;/p&gt;
&lt;p&gt;Я: Получение и виды сертификатов&lt;/p&gt;
&lt;p&gt;Робот Макс: На Госуслугах можно получить сертификаты безопасности OV и DV с алгоритмом шифрования RSA или ГОСТ. Понадобится подтверждённая учётная запись&lt;/p&gt;
&lt;p&gt;Различия сертификатов OV и DV (открывается модальное окно)&lt;/p&gt;
&lt;p&gt;Как получить на Госуслугах&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подайте заявление на получение OV-сертификата. Сертификат в форматах cer и crt придёт в течение 3 рабочих дней в личный кабинет&lt;/li&gt;
&lt;li&gt;Подайте заявление на получение DV-сертификата. Сертификат в форматах cer и crt придёт в течение 1 рабочего дня в личный кабинет&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Услуга бесплатная&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Госуслуги выдают два вида сертификатов: OV (Organization Validation) и DV (Domain Validation).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Характеристики OV-сертификата:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подтверждает, что вы владеете и управляете указанным в сертификате доменом, а передача данных пользователей защищена&lt;/li&gt;
&lt;li&gt;Защищает несколько доменов&lt;/li&gt;
&lt;li&gt;Действует 365 дней с даты выдачи&lt;/li&gt;
&lt;li&gt;Доступен гражданам РФ, организациям и ИП&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Характеристики DV-сертификата:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подтверждает, что вы управляете указанным в сертификате доменом, а передача данных пользователей защищена&lt;/li&gt;
&lt;li&gt;Защищает один домен&lt;/li&gt;
&lt;li&gt;Действует 90 дней с даты выдачи&lt;/li&gt;
&lt;li&gt;Доступен гражданам РФ, иностранцам, организациям и ИП&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;В природе существует ещё и EV (Extended Validation), но это уже другая история.&lt;/p&gt;
&lt;p&gt;Я выбираю OV. Далее на выбор дают два варианта: RSA и ГОСТ. Я посчитал, что использование сертификатов Минцифры уже достаточно патриотично, поэтому выбрал RSA.&lt;/p&gt;
&lt;p&gt;Ссылка на официальную инструкцию: &lt;a class=&#34;link&#34; href=&#34;https://gu-st.ru/content/PDF/Instrukciya_RSA_OV_FL.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Создание гражданином запроса на выпуск OV-сертификата с алгоритмом шифрования RSA&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;csr-certificate-signing-request&#34;&gt;CSR (Certificate Signing Request)
&lt;/h2&gt;&lt;p&gt;Создаём файл &lt;code&gt;malchikovma.ru.conf&lt;/code&gt;, заполняем по образцу секции &lt;code&gt;req_distinguished_name&lt;/code&gt; и &lt;code&gt;subjectAltName&lt;/code&gt;. Я заказывал сертификат сразу для основного домена и его поддоменов, поэтому в &lt;code&gt;subjectAltName&lt;/code&gt; указал сразу две записи.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;openssl_conf&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;openssl_init&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[ openssl_init ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;stbl_section&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;stable_section&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[ req ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;distinguished_name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;req_distinguished_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;req_extensions&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;v3_req&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;x509_extensions&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;v3_req&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;prompt&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string_mask&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;utf8only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;utf8&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[ req_distinguished_name ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;malchikovma.ru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;SN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Мальчиков&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;GN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Михаил Александрович&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;RU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;SNILS&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;12345678901&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;INN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;123456789012&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[ v3_req ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;keyUsage&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;digitalSignature, keyEncipherment, keyAgreement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;extendedKeyUsage&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;serverAuth, clientAuth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;subjectAltName&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;DNS:malchikovma.ru, DNS:*.malchikovma.ru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[ stable_section ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;SNILS&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;min:11,max:11,mask:NUMERICSTRING,flags:nomask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;INN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;min:12,max:12,mask:NUMERICSTRING,flags:nomask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Что интересно, в зарубежных примерах обычно указывают параметры &amp;ldquo;ST = California, L = San Francisco, O = My Company Inc&amp;rdquo;, а у нас, по классике, нужно указать СНИЛС и ИНН.&lt;/p&gt;
&lt;p&gt;Сгенерируем CSR (Certificate Signing Request) на основе конфига:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -out malchikovma.ru.csr -new -newkey rsa:2048 -nodes -keyout privkey.pem -config malchikovma.ru.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На выходе получим файлы &lt;code&gt;malchikovma.ru.csr&lt;/code&gt; и &lt;code&gt;privkey.pem&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Опционально, проверим валидность:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -in malchikovma.ru.csr -noout -text -nameopt utf8 -config malchikovma.ru.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;регистратор-доменных-имен&#34;&gt;Регистратор доменных имен
&lt;/h2&gt;&lt;p&gt;Далее, нужно подтвердить, что мы владеем доменом. Подтверждение через DNS или файл на сервере? Это все - прошлый век. Идем к своему регистратору имен (у меня это - рег.ру.), покупаем свидетельство о регистрации домена. На момент написания стоимость - 203 рубля.&lt;/p&gt;
&lt;p&gt;Далее нам понадобится &lt;abbr title=&#34;усиленная квалифицированная электронная подпись&#34;&gt;УКЭП&lt;/abbr&gt;, мы же делаем OV-сертификат. Как у организации, у нас конечно же, должна быть УКЭП. Если у нас ее нет, то ищем удостоверяющий центр поблизости, бронируем время и идем покупать токен примерно за 3 т.р. Я покупал у Тензора, просто потому, что он ближе.&lt;/p&gt;
&lt;p&gt;Теперь нужно подписать файл &lt;code&gt;malchikovma.ru.conf&lt;/code&gt; и свидетельство о регистрации домена, т.е. создать файлы &lt;code&gt;.sig&lt;/code&gt; с помощью УКЭП из любой сторонней программы. Если у вас оплачен КриптоПРО, то можно им, лично я использовал КриптоАРМ.&lt;/p&gt;
&lt;h2 id=&#34;снова-госуслуги-dns&#34;&gt;Снова Госуслуги, DNS
&lt;/h2&gt;&lt;p&gt;Отправляем все это на госуслуги. Нас просят подтвердить владение доменом еще через DNS (официального документа с подписью недостаточно). Добавляем требуемую TXT запись. Госуслуги требуют по 1 TXT записи на каждый домен, но меня пропустил с 1 записью. Идем спать. На следующий день получаем сертификаты.&lt;/p&gt;
&lt;p&gt;Что имеем в архиве?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;certificate.cer&lt;/li&gt;
&lt;li&gt;certificate.cer.sig&lt;/li&gt;
&lt;li&gt;certificate.crt&lt;/li&gt;
&lt;li&gt;certificate.crt.sig&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Файлы &lt;code&gt;.sig&lt;/code&gt; - это подписи, нас сейчас не интересуют. Мы имеем два сертификата, &lt;code&gt;certificate.cer&lt;/code&gt; и &lt;code&gt;certificate.crt&lt;/code&gt;. Сравнение показывает, что это одинаковые файлы. Зачем? Непонятно.&lt;/p&gt;
&lt;h2 id=&#34;подготовка-сертификатов&#34;&gt;Подготовка сертификатов
&lt;/h2&gt;&lt;p&gt;Сертификаты нам предоставляют в бинарном виде (&lt;abbr title=&#34;Distinguished Encoding Rules&#34;&gt;DER&lt;/abbr&gt;), а веб-серверу нужны в текстовом (&lt;abbr title=&#34;Privacy-Enhanced Mail&#34;&gt;PEM&lt;/abbr&gt;). Преобразуем DER в PEM:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl x509 -inform der -in certificate.crt -out malchikovma.ru.crt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На выходе получаем файл &lt;code&gt;malchikovma.ru.crt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Но это конечные сертификаты, а для HTTPS нам нужна полная цепочка. &lt;a class=&#34;link&#34; href=&#34;https://www.gosuslugi.ru/crt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Скачиваем корневой и промежуточный (выпускающий) сертификат Минцифры.&lt;/a&gt;. Находим среди них те, что в текстовом формате:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;для корневого сертификата - &lt;code&gt;russian_trusted_root_ca_pem.crt&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;для промежуточного - &lt;code&gt;russian_trusted_sub_ca_pem.crt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Объединяем сертификаты в цепочку:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat gosuslugi-malchikovma.ru/malchikovma.ru.crt &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;russian_trusted_sub_ca_pem/russian_trusted_sub_ca_pem.crt &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linux_russian_trusted_root_ca_pem/russian_trusted_root_ca_pem.crt &amp;gt; fullchain.crt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Загружаем цепочку сертификатов и приватный ключ, созданный на первом шаге, на сервер. Еще я переименовал crt в pem, чтобы сразу понимать формат.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/ssl/mincifry/malchikovma.ru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# drwxr-xr-x 2 root root 4096 Jul 31 12:17 .&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# drwxr-xr-x 3 root root 4096 Jul 31 12:15 ..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -rw-r--r-- 1 root root 7592 Jul 31 12:17 fullchain.pem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -rw------- 1 root root 1704 Jul 31 12:17 privkey.pem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;веб-сервер&#34;&gt;Веб-сервер
&lt;/h2&gt;&lt;p&gt;Указываем на веб-сервере, какие нужно использовать сертификаты. У меня это Nginx:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;443&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;[::]:443&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;ssl&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;malchikovma.ru&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;www.malchikovma.ru&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ssl_certificate&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/etc/ssl/mincifry/malchikovma.ru/fullchain.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ssl_certificate_key&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/etc/ssl/mincifry/malchikovma.ru/privkey.pem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Рекомендуемые базовые настройки безопасности SSL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ssl_protocols&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;TLSv1.2&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;TLSv1.3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ssl_ciphers&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;HIGH:!aNULL:!MD5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Перезагружаем его. Сайт теперь открывается по HTTPS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://malchikovma.ru/post/2026-09-02-mincifri/cert.jpg&#34;
	width=&#34;679&#34;
	height=&#34;785&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Сертификат минцифры для сайта malchikovma.ru&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;86&#34;
		data-flex-basis=&#34;207px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;Поздравляю! У вас все получилось.&lt;/p&gt;
&lt;h2 id=&#34;заключение&#34;&gt;Заключение
&lt;/h2&gt;&lt;p&gt;После этой незамысловатой процедуры, следующие 365 дней наш сайт будет доступен по HTTPS. А сертификаты подтверждены самим Министерством цифрового развития, связи и массовых коммуникаций Россиийской Федерфции. Но это при условии, что у вас на компьютере установлены их корневые сертификаты. Не будем здесь рассуждать, их наличие - это хорошо или плохо. На хабре в последнее время и так полно постов на эту тему. Мне же, как ИП с УКЭП, они необходимы. А еще, на днях без них перестал открываться Сбербанк. Мы же с вами прошли путем исследователя, которому интересно, как устроен процесс получения.&lt;/p&gt;
&lt;p&gt;А теперь серьезно. Этот процесс ужасно медленный и трудоемкий. Сертификат Let&amp;rsquo;s Encrypt можно получить за пару минут и несколько команд в терминале. Да, я получал OV сертификат, это чуть более ответственная вещь, чем DV. Но для DV сертификата похожая история. Если кто-то из Минцифры читает это, пожалуйста, сделайте инструменты для автоматизации. ACME протокол это позволяет.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Как хостить сайт на GitHub с Hugo</title>
        <link>https://malchikovma.ru/post/2024-10-19-hugo-github/</link>
        <pubDate>Thu, 17 Oct 2024 16:33:17 +0300</pubDate>
        
        <guid>https://malchikovma.ru/post/2024-10-19-hugo-github/</guid>
        <description>&lt;img src="https://malchikovma.ru/post/2024-10-19-hugo-github/hugo-logo.webp" alt="Featured image of post Как хостить сайт на GitHub с Hugo" /&gt;&lt;h2 id=&#34;введение&#34;&gt;Введение
&lt;/h2&gt;&lt;p&gt;GitHub позволяет использовать репозиторий как статический веб-сайт. Существует генератор статических сайтов Hugo. Так почему бы не подружить эти инструменты?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub из коробки работает с Jekyll, но я уже потратил вечер на изучение Hugo, и он мне понравился.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Для этого нам понадобится знание Git, Markdown и YAML. А при работе с репозиторием по ssh, еще и умение работать с ключами шифрования на базовом уровне.&lt;/p&gt;
&lt;p&gt;Описываю свой опыт, так что все упоминания malchikovma осознанно заменяем на свои собственные. Все происходит на Ubuntu Linux, но на Mac и Windows процесс должен быть примерно таким же.&lt;/p&gt;
&lt;h2 id=&#34;создаем-сайт-на-githubio&#34;&gt;Создаем сайт на github.io
&lt;/h2&gt;&lt;p&gt;Для начала создадим простой сайт из репозитория. GitHub выпустил красивую инструкцию на эту тему (&lt;a class=&#34;link&#34; href=&#34;https://pages.github.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pages.github.com&lt;/a&gt;). Я следовал ей, но встретил несколько проблем. Как их решить, описываю далее.&lt;/p&gt;
&lt;p&gt;Создаем репозиторий в GitHub с именем &lt;code&gt;malchikovma.github.io&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Копируем его локально:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@github.com:malchikovma/malchikovma.github.io.git malchikovma.ru
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Название директории я выбрал &amp;ldquo;malchikovma.ru&amp;rdquo; по названию своего домена. Можно указать любое другое: site, blog, etc.&lt;/p&gt;
&lt;p&gt;Если возникла проблема с доступом, можно настроить ssh-ключ и указать его в настройках GitHub. Есть официальная инструкция, но на данный момент она не переведена на русский язык: &lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/ru/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&amp;ldquo;Создание нового ключа SSH и его добавление в ssh-agent&amp;rdquo;&lt;/a&gt;. Кратко опишу процесс:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Выполняем команду &lt;code&gt;ssh-keygen -t ed25519 -C &amp;quot;malchikovma@gmail.com&amp;quot;&lt;/code&gt;. В процессе указываем название файла: &lt;code&gt;github_personal_ed25519&lt;/code&gt;. Пароль можно не указывать.
В результате в директории &lt;code&gt;~/.ssh&lt;/code&gt; получим два файла: &lt;code&gt;github_personal_ed25519&lt;/code&gt; и &lt;code&gt;github_personal_ed25519.pub&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Выполняем команду &lt;code&gt;ssh-add ~/.ssh/github_personal_ed25519&lt;/code&gt;. В дальнейшем это позволит не указывать файл ключа вручную.&lt;/li&gt;
&lt;li&gt;Добавляем содержимое файла &lt;code&gt;github_personal_ed25519.pub&lt;/code&gt; в настройки профиля GitHub: Settings, SSH and GPG keys, New SSH key.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;После этого проблема с доступами должна исчезнуть. Альтернативно, можно использовать протокол https, но тогда GitHub будет спрашивать каждый раз логин и пароль. Подробнее: &lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/ru/get-started/getting-started-with-git/about-remote-repositories&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Сведения об удаленных репозиториях&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/malchikovma/malchikovma.github.io.git malchikovma.ru
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Переходим в свежесозданную директорию, открываем &lt;del&gt;Vim&lt;/del&gt; свой любимый редактор и создаем файл &lt;code&gt;index.html&lt;/code&gt; с содержимым &amp;ldquo;Hello GitHub Pages!&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Публикуем изменения, и в течение минуты наше приветствие будет доступно по адресу &lt;a class=&#34;link&#34; href=&#34;https://malchikovma.github.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;malchikovma.github.io&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Initial commit&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;При коммите Git может запросить ваши данные. Указываем их:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config user.email &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;malchikovma@gmail.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config user.name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Mikhail Malchikov&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Если все получилось, идем дальше.&lt;/p&gt;
&lt;h2 id=&#34;настройка-hugo&#34;&gt;Настройка Hugo
&lt;/h2&gt;&lt;h3 id=&#34;установка&#34;&gt;Установка
&lt;/h3&gt;&lt;p&gt;Устанавливаем Hugo. На Ubuntu Linux это делается командой &lt;code&gt;sudo apt install hugo&lt;/code&gt;. Для других систем смотрим официальное руководство: &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/installation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo - Installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hugo не может создать новый сайт в уже существующей директории, поэтому создаем его рядом, затем перемещаем в созданный ранее репозиторий.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site malchikovma.ru.bak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp malchikovma.ru.bak/* malchikovma.ru/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Официальное руководство &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/getting-started/quick-start/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo - Quick Start&lt;/a&gt; несколько отличается от нашего процесса. В частности тем, что там не учитывается интеграция с GitHub.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hugo использует &lt;a class=&#34;link&#34; href=&#34;https://git-scm.com/book/ru/v2/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%BE%D0%B4%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;систему модулей git&lt;/a&gt;. Устанавливаем &lt;del&gt;первую приглянувшуюся&lt;/del&gt; тему &lt;a class=&#34;link&#34; href=&#34;https://themes.gohugo.io/themes/hugo-theme-stack/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Stack&lt;/a&gt; и указываем в конфиге, что используем ее:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git themes/stack
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;theme = &amp;#39;stack&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Запускаем локальный сервер: &lt;code&gt;hugo server --buildDrafts&lt;/code&gt;. Сайт будет доступен по адресу &lt;a class=&#34;link&#34; href=&#34;http://localhost:1313/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://localhost:1313/&lt;/a&gt;. Он нужен для локальной разработки: посмотреть, как выглядит страница перед публикацией. Hugo использует hot reload, при изменении файлов они автоматически перезагружаются в браузере. Иногда это не помогает и нужно &lt;del&gt;пнуть&lt;/del&gt; перезапустить сервер Hugo.&lt;/p&gt;
&lt;p&gt;На данном этапе мы должны получить рабочий сайт без контента.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://malchikovma.ru/post/2024-10-19-hugo-github/hugo-fresh.webp&#34;
	width=&#34;1208&#34;
	height=&#34;269&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Hugo с темой Stack без контента&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;449&#34;
		data-flex-basis=&#34;1077px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;пишем-первый-пост&#34;&gt;Пишем первый пост
&lt;/h3&gt;&lt;p&gt;Чтобы создать первый пост, используем команду &lt;code&gt;hugo new content content/post/my-first-post.md&lt;/code&gt;. Она создаст файл по указанному пути. Можно создать его и вручную, но команда имеет преимущество: она создаст так называемый &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/content-management/front-matter/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;front matter&lt;/a&gt;: метаданные о публикации в формате TOML. Front matter этой статьи:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title = &amp;#39;Как хостить сайт на GitHub с Hugo&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;date = 2024-10-18T16:33:17+03:00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;draft = false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;image = &amp;#39;hugo-logo.webp&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Текст статьи...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Открываем файл в &lt;del&gt;Vim&lt;/del&gt; &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; своем любимом редакторе. Пишем текст в формате Markdown. При сохранении, изменения должны отразиться на сайте.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://malchikovma.ru/post/2024-10-19-hugo-github/hugo-first-post.webp&#34;
	width=&#34;1284&#34;
	height=&#34;214&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Первый пост в Hugo&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;600&#34;
		data-flex-basis=&#34;1440px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;На этом знакомство с Hugo окончено. Как дальше можно изменить внешний вид сайта пишет автор нашей темы: &lt;a class=&#34;link&#34; href=&#34;https://stack.jimmycai.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;stack.jimmycai.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Одно последнее напутствие: &lt;a class=&#34;link&#34; href=&#34;https://transform.tools/toml-to-yaml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;конвертируем формат конфигурации из TOML в YAML&lt;/a&gt;. TOML - прекрасный формат, но плохо подходит для вложенных структур, таких как меню и виджеты. Соответственно, меняем расширение файла с &lt;code&gt;.toml&lt;/code&gt; на &lt;code&gt;.yaml&lt;/code&gt;. Hugo сам поймет, что формат изменился.&lt;/p&gt;
&lt;h3 id=&#34;публикация-на-github&#34;&gt;Публикация на GitHub
&lt;/h3&gt;&lt;p&gt;Теперь, при отправке изменений в GitHub, мы не увидим наш прекрасный новый сайт. Дело в том, что GitHub по умолчанию берет содержимое корневой директории, а Hugo публикует результат в директорию public.&lt;/p&gt;
&lt;p&gt;Как вариант, в &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/getting-started/configuration/#publishdir&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;конфигурации Hugo&lt;/a&gt; можно указать, чтоб сайт создавался в директории docs: &lt;code&gt;publishdir: docs&lt;/code&gt;. В настройках репозитория GitHub также указываем, публиковать директорию docs.&lt;/p&gt;
&lt;p&gt;Можно использовать репозиторий в таком виде, а можно генерировать сайт на стороне GitHub через Actions.&lt;/p&gt;
&lt;h2 id=&#34;github-actions&#34;&gt;GitHub Actions
&lt;/h2&gt;&lt;p&gt;При детальном рассмотрении, видим, что GitHub использует пайплайн сборки Jekyll для нашего сайта. Даже если мы этого не хотим. Зачем разворачивать образ операционной системы и устанавливать кучу программ, просто чтоб загрузить куда-то HTML файлы? Звучит как полный оверинжиниринг. Но что поделать: используем или дефолтный, или свой.&lt;/p&gt;
&lt;p&gt;Сообщество Hugo предоставляет нам &lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/hosting-and-deployment/hosting-on-github/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;готовый скрипт по сборке сайта в GitHub Pages&lt;/a&gt;. Директории &lt;code&gt;public&lt;/code&gt; и &lt;code&gt;resources/_gen&lt;/code&gt; теперь можно не отслеживать и добавить в .gitignore, они нам не понадобятся для публикации.&lt;/p&gt;
&lt;p&gt;Создаем файл &lt;code&gt;.github/workflows/hugo.yaml&lt;/code&gt; и копируем в него содержимое:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Sample workflow for building and deploying a Hugo site to GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Deploy Hugo site to Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Runs on pushes targeting the default branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Allows you to run this workflow manually from the Actions tab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;workflow_dispatch&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;permissions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;contents&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;pages&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;write&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;id-token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;write&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;concurrency&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;group&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cancel-in-progress&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Default to bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;defaults&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;shell&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Build job&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;HUGO_VERSION&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.134.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Install Hugo CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          &amp;amp;&amp;amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Install Dart Sass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;sudo snap install dart-sass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Checkout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/checkout@v4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;submodules&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;recursive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;fetch-depth&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Setup Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/configure-pages@v5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Install Node.js dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[[ -f package-lock.json || -f npm-shrinkwrap.json ]] &amp;amp;&amp;amp; npm ci || true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Build with Hugo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;HUGO_CACHEDIR&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ runner.temp }}/hugo_cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;HUGO_ENVIRONMENT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;production&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;TZ&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;America/Los_Angeles&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          hugo \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            --gc \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            --minify \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;            --baseURL &amp;#34;${{ steps.pages.outputs.base_url }}/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Upload artifact&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/upload-pages-artifact@v3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;path&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;./public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Deployment job&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;github-pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;url&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ steps.deployment.outputs.page_url }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;needs&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Deploy to GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/deploy-pages@v4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Зачем тратить минуту на установку зависимостей при каждой публикации? Можно загрузить уже готовые файлы за секунду. Я попытался удалить шаги сборки из пайплайна и генерировать сайт локально, но тщетно.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В настройках репозитория Pages указываем: использовать для сборки не бранч, а Action. Теперь при пуше в Github, он сам будет создавать директорию public и отправлять ее в сервис Pages.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://malchikovma.ru/post/2024-10-19-hugo-github/github-actions.gif&#34;
	width=&#34;720&#34;
	height=&#34;177&#34;
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Успешный пайплайн в GitHub&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;406&#34;
		data-flex-basis=&#34;976px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;свой-домен&#34;&gt;Свой домен
&lt;/h2&gt;&lt;p&gt;GitHub бесплатно предоставляет нам свой субдомен с именем пользователя: &lt;a class=&#34;link&#34; href=&#34;malchikovma.github.io&#34; &gt;malchikovma.github.io&lt;/a&gt;. Но что, если мы хотим иметь свой, да еще и с сертификатом? У нас есть такая возможность. Для этого нужно приобрести желаемый домен (я это сделал на рег.ру). В панели управления, в разделе &amp;ldquo;DNS-серверы и управление зоной&amp;rdquo; указываем следующие значения:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Тип записи&lt;/th&gt;
					&lt;th&gt;Префикс&lt;/th&gt;
					&lt;th&gt;Значение&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;A&lt;/td&gt;
					&lt;td&gt;@&lt;/td&gt;
					&lt;td&gt;185.199.108.153&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A&lt;/td&gt;
					&lt;td&gt;@&lt;/td&gt;
					&lt;td&gt;185.199.109.153&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A&lt;/td&gt;
					&lt;td&gt;@&lt;/td&gt;
					&lt;td&gt;185.199.110.153&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A&lt;/td&gt;
					&lt;td&gt;@&lt;/td&gt;
					&lt;td&gt;185.199.111.153&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CNAME&lt;/td&gt;
					&lt;td&gt;www&lt;/td&gt;
					&lt;td&gt;malchikovma.github.io&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Это - &lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#dns-records-for-your-custom-domain&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;IP-адресы GitHub Pages&lt;/a&gt;. Предполагаю, что 4 адреса требуются для распределения нагрузки по 4 серверам, а www-запись нужна для получения сертификата Let&amp;rsquo;s Encrypt &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. &amp;ldquo;@&amp;rdquo; означает сам наш домен (malchikovma.ru), а www - его субдомен (&lt;a class=&#34;link&#34; href=&#34;https://www.malchikovma.ru&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;www.malchikovma.ru&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;После этого, на странице настроек Pages, в разделе &amp;ldquo;Custom domain&amp;rdquo; указываем наш домен. После проверки DNS, можно указать &amp;ldquo;Enforce HTTPS&amp;rdquo;. Теперь наш сайт доступен по адресу &lt;a class=&#34;link&#34; href=&#34;https://malchikovma.ru&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;malchikovma.ru&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;заключение&#34;&gt;Заключение
&lt;/h2&gt;&lt;p&gt;У меня давно было желание создать свой сайт, но всегда отталкивали цены на хостинг, постоянные проблемы с CMS &lt;del&gt;и отсутствие идей&lt;/del&gt;. С SSG и GitHub Pages звезды сошлись.&lt;/p&gt;
&lt;p&gt;В статическом контенте масса преимуществ. HTML-страницы открываются мгновенно, практически не требуют серверных мощностей. Появляется возможность кэшировть ответы без лишних усилий. Нет необходимости настраивать и поддерживать CSM, базу данных, PHP, веб-сервер. Файлы занимают минимум места на диске: только сами статьи и материалы к ним. Можно использовать бесплатные хостинги, такие как GitHub Pages. Использование своего домена позволяет &amp;ldquo;переехать&amp;rdquo; на другой хостинг в любой момент.&lt;/p&gt;
&lt;p&gt;Но негативные моменты тоже есть: мы лишаемся динамического контента, а порог входа слишком велик. Для человека, не занимающегося разработкой ПО, генератор статических сайтов вряд ли подойдет. Слишком многое нужно изучить: Bash, Git, YAML, Markdown. Гораздо проще взять пресловутый WordPress и работать через графический интерфейс. Но если так получилось, что у вас уже есть такой &amp;ldquo;багаж&amp;rdquo; знаний, то почему бы не воспользоваться им.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Это скорее шутка, так как Vim известен своей недружелюбностью. Этот пост я пишу в &lt;a class=&#34;link&#34; href=&#34;https://apps.gnome.org/ru/TextEditor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Gnome Text Editor&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Подобную систему мы использовали в для пользовательских доменов в собственном конструкторе сайтов.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
