Привет, хабр! Сегодня я расскажу вам, как создать свой блог на Github Pages, используя hugo!

Хотите создать свой собственный блог, но не хотите привязываться к каким‑либо крупным хостинговым решениям или издательским сайтам по подписке?

Эта статья представляет собой довольно подробное руководство о том, как создать полнофункциональный веб‑сайт/блог с использованием Hugo и GitHub Pages. Если вам просто нужен краткий обзор того, как использовать Hugo, я рекомендую перейти на страницу быстрого запуска Hugo . Если вам нужен быстрый старт по настройке сайта Hugo/GitHub Pages, я рекомендую перейти на страницу быстрого запуска Hugo GitHub Pages.

По своей сути GitHub Pages представляет собой комбинацию репозитория GitHub и опубликованного веб‑сайта. Одним из последствий этого является то, что любая фиксация в основной ветке репозитория немедленно публикуется. Одним из способов создания веб‑сайта GitHub Pages является создание связанного с ним репозитория GitHub для «разработки». Вот что описано здесь.

Hugo — генератор статических веб‑сайтов с открытым исходным кодом. Он довольно мощный, и веб‑сайты, которые можно создать с помощью Hugo, могут быть весьма сложными. Hugo — это базовый движок, используемый для интерпретации создания веб‑сайта на основе предопределенного шаблона. Хьюго называет эти шаблоны темами. «Кожа» — другое слово для обозначения темы. Тема представляет собой комбинацию HTML и CSS. HTML используется для макета сайта. CSS используется для определения цветов, шрифтов, размера шрифта и других атрибутов, не связанных с макетом, которые определяют, как выглядит веб‑сайт. Эта комбинация является довольно мощной. Сами определения страниц веб‑сайта, то есть содержимое веб‑сайта, определяются с использованием стандартного синтаксиса Markdown.

Hugo также поставляется с HTML‑сервером, который можно использовать во время разработки для немедленного предоставления информации о любых изменениях, вносимых в веб‑страницы. Хьюго можно использовать двумя способами:

  1. Режим разработки. В этом режиме Hugo использует свой HTML‑сервер для рендеринга страниц по мере их изменения во время разработки. Запуск сервера во время разработки обеспечивает немедленную обратную связь при внесении изменений в контент.

  2. Режим сборки. Hugo также создаст полный статический веб‑сайт на основе макета темы, CSS и файлов уценки, определяющих содержимое. Результаты этого режима будут опубликованы.

Темы Hugo, а также определения страниц веб‑сайта хранятся в том, что я выше назвал репозиторием «разработки». Это основное пространство для разработки. Веб‑сервер Hugo работает с этим репозиторием. Благодаря магии подмодулей Git окончательный набор зафиксированных изменений в основной ветке репозитория разработки немедленно становится доступным в репозитории GitHub Pages.

Краткий переход к подмодулям Git :

Подмодули Git — это способ включения одного размещенного репозитория GitHub в другой хостинговый репозиторий. Все содержимое размещенного репозитория доступно в хост‑репозитории, как если бы это был обычный подкаталог в хост‑репозитории. Изменения в размещенном репозитории можно вносить в контексте хост‑репозитория. Любые такие изменения сразу же доступны в размещенном репозитории.

В контексте подмодулей репозиторий GitHub Pages является размещенным репозиторием. Он содержит опубликованный контент веб‑сайта. Напротив, репозиторий, содержащий темы Hugo и разрабатываемые версии контента, является хостинговым репозиторием . Когда контент веб‑сайта готов к публикации, Hugo используется для создания статического веб‑сайта. Хьюго генерирует контент в подмодуле, связанном с размещенным репозиторием GitHub Pages. Когда все будет готово, изменения фиксируются в репозитории хостинга и сразу же становятся доступными и, таким образом, публикуются в репозитории GitHub Pages.

Создаем GitHub репозиторий

Необходимо создать два репозитория: репозиторий GitHub Pages и репозиторий разработки хостинга. Есть 2 варианта репозитория GitHub Pages:

  1. Личное или организационное

  2. Проект

Дополнительные сведения о различиях см. в справочной документации GitHub Pages. В этой статье описывается, как создать личный репозиторий GitHub.

Создать репозиторий GitHub Pages довольно просто, но есть одно очень важное ограничение на его имя. Имя репозитория должно иметь вид <github_username>.github.io. Например, habruser.github.ioгде habruserнаходится имя учетной записи связанного пользователя. Это будет URL‑адрес веб‑сайта. Таким образом, репозиторий страниц GitHub — это обычный репозиторий GitHub, только с очень специфическим именем. Мы будем использовать это имя репозитория habruser.github.ioв оставшейся части статьи при упоминании репозитория GitHub Pages. Если вам нужна дополнительная информация о том, как создать репозиторий, обратитесь к краткому руководству по GitHub Pages.

Второй шаг — создать репозиторий, в котором будет происходить разработка/авторство веб‑сайта. Это обычный репозиторий GitHub. Для целей этой статьи мы будем использовать blog.dev.repo (имя репозитория разработки). Если вам нужна дополнительная информация о том, как создать репозиторий, обратитесь к документации GitHub.

Я думаю, что вы знаете как создать репозиторий и у вас уже есть аккаунт.

Клонирование репозитория и установка

git clone git@github.com:<пользователь>/<репозиторий> # не <пользователь>.github.io, а репозиторий для разработки
cd <репозиторий>

# Установка hugo
# Debian
sudo apt install hugo
# Arch
sudo pacman -Sy hugo

Создание сайта

# Инициализация
hugo new site . --force

Мы создали новый сайт с hugo.

У Hugo есть темы. Я буду использовать тему Monochrome в этой статье.

Для того, чтобы применить тему, следуйте следующим инструкциям:

git submodule add https://github.com/kaiiiz/hugo-theme-monochrome.git themes/monochrome
# Подключаем подмодуль в git

И добавляем ее в конфиг Hugo:

# пример: echo 'theme = "<theme-name>"' >> hugo.toml
echo 'theme = "monochrome"' >> hugo.toml

Тестируем сайт

Давайте создадим пост. Для этого запустим следующую команду:

# создаем пост greeting.md
hugo new post/greeting.md

После открываем файл content/post/greeting.md и видим следующее:

+++
title = 'Greeting'
date = 2023-12-06T22:43:16+07:00
draft = true
+++

Давайте его чуть-чуть изменим:

+++
title = 'Привет, хабр!'
date = 2023-12-06T22:43:16+07:00
draft = true
tags = ['хабр', 'блог']
categories = ['приветствие', 'блог']
+++

# Привет, хабр!

Как дела, хабр?

# Пока, хабр?

Разделителями +++ мы добавляем секцию информации о посте. title — название, заголовок, date — дата, draft — черновик, tags — теги, categories — категории. Дальше идет пост в формате Markdown.

Тестируем...

hugo server -D

Мы должны где-то увидеть строку Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)

Мы открываем браузер, переходим по этой ссылке, и все отлично! Мы можем перейти на наш пост.

Конфигурация

Теперь нам надо изменить конфиг. Вот что получилось у меня:

baseURL = 'https://okulusdev.github.io'
languageCode = 'ru'
title = 'Okulus Dev'
languageName = 'ru'
defaultContentLanguage = "ru"
paginate = 100 #frontpage pagination
theme = 'monochrome'
enableGitInfo = true

[[navbar]]
  identifier = "categories"
  name = "Категории"
  url = "/categories/"
  weight = 1
[[navbar]]
  identifier = "tags"
  name = "Теги"
  url = "/tags/"
  weight = 2
[[navbar]]
  identifier = "posts"
  name = "Статьи"
  url = "/post/"
  weight = 3

[taxonomies]
	category = "categories"
	tag = "tags"
	series = "series"

[markup]
  [markup.highlight] # подсветка кода
    anchorLineNos = false
    codeFences = true
    guessSyntax = false
    hl_Lines = ''
    hl_inline = false
    lineAnchors = ''
    lineNoStart = 1
    lineNos = false
    lineNumbersInTable = true
    noClasses = true
    noHl = false
    style = 'gruvbox' # темы можно посмотреть на https://xyproto.github.io/splash/docs/all.html
    tabWidth = 4

[params]
	navbar_title = "Okulus Dev" # default: site's `title`
	footer = "Copyright © 2023 by OkulusDev" # default: None
	enable_toc = true # default: true
	enable_collapsible_toc = true # default: false
	enable_collapsible_changelogs = false # default: false
	enable_math = true
	enable_site_search = true # default: false
	author = "Okulus Dev" # default: no author `meta` tag
	color_scheme = "dark" # "light" or "dark"

  	[params.list_layout]
		enable_group_by_year = false # default: true
		enable_show_date = true # default: true
		enable_pagination = true # default: false

[menu]
[[menu.main]]
    name = 'Статьи'
    pageRef = '/'
    weight = 10
[[menu.main]]
    name = 'Теги'
    pageRef = '/tags'
    weight = 20
[[menu.main]]
    name = 'Категории'
    pageRef = '/categories'
    weight = 30

[[menu.navbar]]
identifier = "tags"
name = "Теги"
title = "Теги"
url = "/tags/"
weight = 100

[[menu.navbar]]
identifier = "categories"
name = "Категории"
title = "Категории"
url = "/categories/"
weight = -100

[[menu.navbar]]
identifier = "posts"
name = "Статьи"
title = "Статьи"
url = "/post/"
weight = 80

Здесь нет ничего сложного, простая конфигурация. Учтите, что этот конфиг — мой, и под тему, которую я использую. Если вы используете другую тему, вам может надо будет изменить конфиг, и написать по другому.

Публикация и деплой

Время публикации и деплоя нашего сайта на Github Pages!

git submodule add git@<имя пользователя>.github.io.git public # добавляем наш сайт в директорию public

И создаем скрипт для деплоя:

#!/bin/sh

set -e

printf "\033[0;32mДеплой на Github!..\033[0m\n"

msg="rebuilding site $(date)"
if [ -n "$*" ]; then
	msg="$*"
fi

echo ""
echo ""
echo "Коммитим изменения в $(pwd)"
hugo -D

cd public

echo ""
echo ""
echo "Коммитим изменения в $(pwd)"
git add .
git commit -m "$msg"
git push origin

cd ..
echo ""
echo ""
echo "Коммитим изменения в pwd $(pwd)"
git add .
git commit -m "$msg"
git push origin

После:

chmod +x <название скрипта для деплоя>.sh
./<скрипт для деплоя>.sh

Все готово! После этого немного ожидаем, пока изменения придут на Github - и получаем такую красоту (что получилось у меня):

Заключение

Мой сайт

Github репозиторий разработки сайта

Мой GitHub

Спасибо за прочтение статьи, с вами был доктор Аргентум!

Комментарии (20)


  1. Sazonov
    06.12.2023 16:09
    +1

    Штука удобная. Но увы, найти нормальную тему - большой квест. Надо либо самому страдать с вёрсткой, либо покупать. Так же как и нет нормальных онлайн редакторов. (Был раньше Forestry, но не умел нормально с LFS работать).

    Для хостинга могу посоветовать Netlify. Бонусом идёт много всяких плагинов, типа авто построения карты сайта, регистрация в поисковиках и тп.


    1. rsashka
      06.12.2023 16:09
      +1

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

      И если не секрет, то нафига онлайн редактор для статического сайта?


      1. Sazonov
        06.12.2023 16:09

        Вы рассматриваете только сценарии для программистов (или схожих по квалификации людей). В целом статические сайты не только для этого. Те же блоги / лендинги / сайты мелких организаций где нужны новости и пр.

        Я ковырял 2 проекта: forestry и netlify cms, увы оба слишком примитивные и глючные.


        1. rsashka
          06.12.2023 16:09

          Настраивать по любому будет "программист", а вот дальше может пользоваться кто угодно.


          1. Sazonov
            06.12.2023 16:09

            Без онлайн редактора пользовать сможет только человек, знающий гит или умеющий деплоить другим способом (запуск hugo через консоль и копирование файлов на хостинг). Я про это и говорил в исходном сообщении.


        1. muzaboz
          06.12.2023 16:09
          +1

          Вариантов на самом деле много, вот самые популярные системы управления статическими сайтами Contentful, Tina CMS, Prismic


    1. schebotar
      06.12.2023 16:09
      +7

      Буквально на этой неделе с темами этими упражнялся. У меня правда цель была сделать не блог, а лендинг в стиле известного шаблона резюме. В целом все не сложно, информации полно. Не хватило немного полноценного форматтера для VSCode под синтаксис который использует Hugo. Расширение есть, но не форматирует, приходится отступы самому выставлять, чтобы опрятно смотрелось в итоге.

      github.com/schebotar/hugos-resume - получившаяся тема, если вдруг кому будет интересно.


  1. schebotar
    06.12.2023 16:09
    +5

    Деплоить лучше через GitHub Actions. Тогда и скрипты никакие не нужны.


  1. Sild
    06.12.2023 16:09
    +3

    Спасибо, инструкция рабочая =)

    Давно задумывался о хостинге через gitlab-pages, но меня хватило только на index.html с hello world.
    Может этот инструмент сподвигнет к чему-то большему

    Жалко что конфиг не универсальный и придется затачивать под тему. Это геморрой. Но по сравнению честной версткой - земля и небо

    Необходимость двух репозиториев выглядит костылем.


  1. NeoCode
    06.12.2023 16:09

    Все-же не очень понимаю как это работает. В свое время пытался разобраться с Jekyll, который тоже используется на Github Pages. С одной стороны все это не серверные скрипты, с другой - вроде и не статические сайты. Но отложил по причине неготовности самого контента для публикации.
    У меня уже есть набор html страниц. Не markdown, а именно html (потому что это формат в котором я храню "заметки", они же "статьи", в собственном аутлайнере). Я хочу их опубликовать на Github Pages и связать с помощью древовидного оглавления. Оглавление я буду генерить своим софтом на основе своей базы. А вот сами страницы... делать все это на фреймах - несовременно, да и неудобно с получением адреса страницы в адресной строке. Идеальным вариантом был бы какой-то примитивный скрипт, который бы соединял страницу контента из репозитория (точнее содержимое ее тега body) с фиксированной обвязкой - хидером, футером, древовидным оглавлением сбоку. С помощью JS можно при переходе на другой URL поддерживать оглавление в том состоянии, в котором его оставил пользователь (открытые и закрытые узлы, позиция прокрутки).
    Но вот можно ли это сделать теми средствами, что предоставляет Github Pages?


    1. IvaYan
      06.12.2023 16:09

      Нельзя. GitHub Pages это, в первую очередь, хостинг статических страниц. Есть Jekyll, но он встроен и потому работает. Генерировать по произвольным правилам и произвольным образом не получится.


      1. NeoCode
        06.12.2023 16:09

        Я и пытался подстроиться под Jekyll. Даже более-менее удалось, но интересно, есть ли решения лучше.


      1. osmanpasha
        06.12.2023 16:09
        +1

        Почему нельзя, как раз GitHub Actions для этого. Нужно настроить конфигурацию для Actions, чтобы она выполняла вашу логику, и при каждом пуше она выполнится в облаке и создаст статичный контент, который публикуется в GitHub Pages. Так можно в Jekyll, например, использовать любые плагины, а не только те, которые дозволены гитхабом.


    1. Sazonov
      06.12.2023 16:09

      В hugo можно кидать произвольный контент в папку ./static/ , в том числе голый html со скриптами. GitHub Pages это просто хостинг для файлов :) так что думаю что можно.

      А вообще тут уже упоминали, самая мудрёная тема - google docsy. Там поиск, версионность и локализация поддерживается.


  1. mikegordan
    06.12.2023 16:09

    тоесть база (сообщения) = коммиты в репозиторий?

    тогда как они модерируются?


    1. Sazonov
      06.12.2023 16:09

      Можно через пуллреквесты модерировать.


  1. flyer2001
    06.12.2023 16:09
    +1

    Поднял что-то похожее на Swift а деплой через Netlify https://s.popyvanov.ru/posts/swift-publish-with-netlify/ - удобно, что можно из Obsidian md файлы в статью превращать.


  1. muzaboz
    06.12.2023 16:09
    +1

    Мне так за блог на github pages аккаунт заблокировали. Спасибо больше не надо. Выбрал хост pages.dev и развернул на Gatsby.


    1. DrArgentum Автор
      06.12.2023 16:09

      странно, я видел очень много блогов


      1. muzaboz
        06.12.2023 16:09

        Я тоже был в шоке. 3 года жил ни кого не трогал, а этим летом заблокировали акк GitHub. Ответ был что из за репозитория с сайтом от поддержки. Но этот хостинг на много круче. Есть даже возможность использовать базу данных