Hugo — это генератор статических сайтов с открытым исходным кодом, написанный на Go, который позволяет быстро создавать, собирать и публиковать сайты и блоги из текстовых файлов (например, Markdown) с помощью шаблонов и тем, генерируя статичную HTML-структуру для публикации на любом хостинге. Но в современном мире, когда все больше и больше сайтов и приложений разрабатываются с использованием контейнеризации и облачных сервисов, использование Docker образов для публикации статических сайтов становится все более популярным и удобным способом.

Предварительная настройка#

  1. Сгенерируйте Access Token на GitHub с правами repo и write:packages.
  2. Создайте Secret с именем TOKEN в настройках вашего репозитория. Перейдите в Settings, слева в меню выберите Secrets and variables > Actions. Затем нажмите New repository secret и введите имя TOKEN и значение вашего Access Token.
  3. Добавьте в .gitignore папку /public/, для того чтобы не было конфликтов при генерации страниц.

Пример .gitignore файла

# Директория с сгенерированным сайтом
/public/

# Кэшированные и сгенерированные ресурсы Hugo
/resources/_gen/

# Лог файлы и статистика
hugo_stats.json

# Выполнимые файлы Hugo (если используются локально)
/hugo
/hugo.exe
/hugo.darwin
/hugo.linux

# Разные лишние файлы
.DS_Store
Thumbs.db

Dockerfile#

# Стадия сборки
FROM alpine:latest AS build
# Установка HUGO
RUN apk add --update hugo
WORKDIR /opt/HugoApp
# Копирование файлов
COPY . .
# Генерация сайта
RUN hugo --minify

# Стадия упаковки
FROM nginx:1.25-alpine
WORKDIR /usr/share/nginx/html
# Копирование сгенерированного сайта
COPY --from=build /opt/HugoApp/public .
# Открытие порта
EXPOSE 80/tcp

GitHub Actions#

Создайте файл .github/workflows/deploy.yml в корне вашего репозитория. Данный Github Action будет запускаться при каждом пуше в ветку main. Подробнее о триггерах можете прочитать в документации.

❗ Внимание

Замените REPLACE_REPO_NAME на имя вашего репозитория.

 1name: Build and Push Docker Image
 2
 3# Триггер при пуше в ветку main
 4on:
 5  push:
 6    branches:
 7      - main
 8
 9jobs:
10  build-and-push:
11    runs-on: ubuntu-latest
12
13    steps:
14      - name: Checkout repository with submodules
15        uses: actions/checkout@v3
16        with: # Если не используете Git Submodules можете удалить этот параметр
17          submodules: recursive
18
19      - name: Set up Docker Buildx
20        uses: docker/setup-buildx-action@v3
21
22      - name: Log in to GitHub Container Registry
23        uses: docker/login-action@v2
24        with:
25          registry: ghcr.io
26          username: ${{ github.actor }}
27          password: ${{ secrets.TOKEN }}
28
29      - name: Build and push Docker image
30        uses: docker/build-push-action@v4
31        with:
32          context: .
33          push: true
34          tags: ghcr.io/${{ github.repository_owner }}/[REPLACE_REPO_NAME]:latest
35          platforms: linux/amd64

Запушьте изменения и дождитесь завершения процесса (Вкладка Actions в вашем репозитории).

Запуск#

Если у вас приватный репозиторий, то вам нужно залогиниться в GitHub Docker Registry с использованием Access Token - Аутентификация ghcr.io в Docker.

Запуск через Docker#

docker run -d -p 8080:80 --restart unless-stopped ghcr.io/[REPLACE_USERNAME]/[REPLACE_REPO_NAME]:latest

Запуск через Docker Compose#

Создайте файл docker-compose.yml.

services:
  app:
    image: ghcr.io/[REPLACE_USERNAME]/[REPLACE_REPO_NAME]:latest
    ports:
      - "8080:80"
    restart: unless-stopped

И выполните команду:

docker compose up -d

После запуска сайт должен быть доступен по адресу http://localhost:8080.