Da qualche tempo cercavo un workflow semplice e leggero per pubblicare un sito statico generato con Hugo. Dopo varie prove ho deciso di utilizzare Codeberg Pages.

L’obiettivo era avere:

  • repository Git con tutti i sorgenti del sito;
  • deploy semplice;
  • nessuna dipendenza da servizi proprietari;
  • possibilità di usare un dominio personale;
  • workflow completamente locale.

Perché Codeberg

Codeberg offre hosting Git basato su Forgejo e permette di pubblicare siti statici tramite Codeberg Pages.

Per un sito Hugo è una soluzione molto comoda:

  • semplice;
  • leggera;
  • compatibile con Git;
  • orientata al software libero.

Struttura del repository

Utilizzo due branch:

main   -> sorgenti Hugo
pages  -> sito statico generato

Il branch main contiene:

content/
layouts/
themes/
static/
hugo.toml

Il branch pages contiene invece solo il sito statico già generato:

index.html
css/
posts/
images/
...

Codeberg Pages pubblica direttamente il contenuto del branch pages.

Configurazione di Hugo

Nel file hugo.toml imposto:

baseURL = "https://alanleoni.ch/"

Creazione del branch pages

Il branch pages va creato una sola volta.

Genero il sito:

hugo --minify

Creo il branch orfano:

git switch --orphan pages

Rimuovo tutto:

git rm -rf .

Copio il contenuto della directory public/ nella root del branch:

cp -r public/* .

Commit iniziale:

git add .
git commit -m "Initial Pages branch"
git push -u origin pages

A questo punto il branch pages contiene soltanto il sito statico.

Ignorare la directory public

Sul branch main conviene ignorare public/.

Nel file .gitignore:

public/

Poi:

git rm -r --cached public

e commit.

Script di deploy

Per automatizzare il deploy utilizzo questo semplice script Bash.

Creo deploy.sh nella root del repository:

#!/usr/bin/env bash
set -e

git switch main
hugo --minify

rm -rf /tmp/hugo-public
cp -r public /tmp/hugo-public

git switch pages
find . -maxdepth 1 ! -name "." ! -name ".git" -exec rm -rf {} \;
cp -r /tmp/hugo-public/* .

git add .
git commit -m "Update site" || true
git push

git switch main

Rendo lo script eseguibile:

chmod +x deploy.sh

Da questo momento il deploy si riduce a:

./deploy.sh

Lo script:

  1. genera il sito Hugo;
  2. aggiorna il branch pages;
  3. esegue automaticamente il push;
  4. torna al branch main.

Dominio personale

Per utilizzare un dominio personalizzato con Codeberg Pages conviene creare il file .domains all’interno della directory static/ del progetto Hugo.

Nel mio caso:

static/.domains```

Poi bisogna configurare i DNS.

Per `www`:

```text
CNAME  www  alanleoni.codeberg.page.

Per il dominio principale:

A      @    217.197.84.141
AAAA   @    2a0a:4580:103f:c0de::2

Considerazioni finali

Questo workflow è volutamente semplice.

Non utilizzo:

  • CI/CD;
  • GitHub Actions;
  • Forgejo Actions.

Tutto il deploy avviene localmente tramite un semplice script Bash.

Per un piccolo sito personale generato con Hugo trovo che sia una soluzione:

  • leggera;
  • trasparente;
  • affidabile;
  • molto in linea con la filosofia Unix.