Son projet Hugo dans Coolify
Démarche à suivre dans l'ordre, pour héberger un Portfolio créé avec Hugo dans Coolify.
Pour créer le Portfolio lui-même, voir le tutoriel Créer son Portfolio avec Hugo.
-
Étapes à suivre par l'étudiant :
- A) Adapter le projet Hugo
- B) Pousser les modifications sur GitHub
- MAJ du projet par l'étudiant
-
Étapes à suivre par l'enseignant :
- C) Créer la ressource dans Coolify
- D) Déployer
- MAJ du projet par l'enseignant
Un site Hugo est statique : une fois construit, il ne reste que des fichiers HTML, CSS et JavaScript. Il n'y a donc ni base de données, ni variable d'environnement secrète, ni migration à gérer. Le conteneur se compose de deux temps :
- Construire le site avec Hugo (commande
hugo, qui produit le dossierpublic/). - Servir ce dossier avec un serveur Web léger (Nginx).
A) Adapter le projet Hugo
1. Le thème doit faire partie du dépôt
Dans le tutoriel Hugo, le thème est récupéré avec git clone dans le dossier themes/. Or un dossier cloné contient son propre dossier .git : Git le traite alors comme un autre dépôt et n'envoie pas ses fichiers sur GitHub. Coolify construirait alors le site sans thème.
Supprimer le dossier .git du th ème (exemple avec le thème ananke) :
-
Sous macOS, Linux ou Git Bash :
rm -rf themes/ananke/.git -
Sous Windows (PowerShell) :
Remove-Item -Recurse -Force themes\ananke\.git
Explications :
-
Après cette suppression, les fichiers du thème sont de simples fichiers du projet : ils seront envoyés sur GitHub avec le reste.
-
Si un
git add .a déjà été exécuté avant cette suppression,git statusaffichethemes/anankecomme un élément particulier (embedded git repository). Dans ce cas, après avoir supprimé le dossier.git, exécuter :git rm --cached themes/ananke
2. hugo.toml
Vérifier que baseURL correspond à l'adresse finale du site dans Coolify (le sous-domaine donné par l'enseignant) :
baseURL = 'https://portfolio-hugo-demo.app.ndlpavranches.fr/'
languageCode = 'fr-fr'
title = "Portfolio de Camille DURAND"
theme = 'ananke'
Explications :
- Une
baseURLincorrecte (par exemple celle de GitLab Pages) produit des liens vers un autre site, ou des pages sans mise en forme. - Il faut conserver le
/final. - L'adresse exacte est communiquée par l'enseignant (voir la partie C, étape 3).
3. Dockerfile
Créer un fichier Dockerfile à la racine du projet (à côté de hugo.toml), avec ce contenu :
# Étape 1 : construire le site avec Hugo (version extended)
FROM hugomods/hugo:exts AS build
WORKDIR /src
COPY . .
RUN hugo --minify
# Étape 2 : servir les fichiers générés avec Nginx
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /src/public /usr/share/nginx/html
Explications :
- Le
Dockerfilecontient deux étapes (multi-stage build). Hugo n'est présent que dans la première : l'image finale ne contient que Nginx et les fichiers du site, ce qui la rend très légère. hugomods/hugo:extsest une image Docker contenant la version extended de Hugo, comme celle installée sur votre poste.hugo --minifyconstruit le site dans/src/publicen réduisant la taille des fichiers. Sans l'option-D, les pages endraft: truene sont pas publiées : vérifier que chaque page à publier est bien endraft: false.- Le tag
extssuit la dernière version de Hugo. Pour retrouver exactement la version de votre poste, lancerhugo versionpuis remplacerextsparexts-<version>(par exempleexts-0.140.0), après avoir vérifié que ce tag existe sur Docker Hub.
4. nginx.conf
Créer un fichier nginx.conf à la racine du projet, avec ce contenu :
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Le HTTPS est géré par Traefik (Coolify) : ne pas générer de redirections absolues en http
absolute_redirect off;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
}
Explications :
- Nginx écoute en HTTP sur le port 80 : le HTTPS est géré par Traefik, le proxy de Coolify.
try_files $uri $uri/ =404sert le fichier demandé, ou le fichierindex.htmldu dossier correspondant (Hugo génèreapropos/index.htmlpour la page/apropos/).absolute_redirect offévite que Nginx, qui ne voit que du HTTP, redirige/aproposvershttp://...au lieu dehttps://....error_page 404 /404.htmlaffiche la page d'erreur404.htmlgénérée par Hugo (si le thème en fournit une).
5. compose.yaml
Créer un fichier compose.yaml à la racine du projet, avec ce contenu :
services:
web:
build: .
restart: unless-stopped
Explications :
build: .: l'image du servicewebest construite à partir duDockerfilesitué à la racine du projet.- Aucun
ports:n'est publié : Coolify (via son proxy Traefik) route le trafic vers le port 80 du serviceweb. - Aucune variable
${VARIABLE}: il n'y a rien à configurer dans l'onglet Environment Variables de Coolify.
6. .dockerignore
Créer un fichier nommé exactement .dockerignore à la racine du projet (à côté du Dockerfile), avec ce contenu :
.git/
.idea/
.vscode/
public/
resources/_gen/
.hugo_build.lock
node_modules/
Explications :
- Ces fichiers ne sont pas copiés dans l'image par le
COPY . .duDockerfile: historique Git, réglages de l'éditeur, et résultats d'une construction locale (le dossierpublic/est reconstruit par Hugo dans le conteneur). - Ne pas ajouter
themes/: le thème est nécessaire à la construction.
7. .gitignore
Vérifier que le fichier .gitignore (à créer s'il n'existe pas) contient :
public/
resources/_gen/
.hugo_build.lock
Explications :
- Ces dossiers sont régénérés par Hugo : inutile de les envoyer sur GitHub.
B) Pousser les modifications sur GitHub
git status
git add .
git commit -m "Préparer le déploiement Coolify (Hugo, Nginx)"
git push origin main
Explications :
- Coolify déploie ce qui est sur GitHub : tous les fichiers créés ou modifiés en A doivent être poussés sur la branche
main. git statuspermet de vérifier la liste des fichiers modifiés avant legit add. Vérifier en particulier que les fichiers du thème (dossierthemes/ananke/) apparaissent bien comme nouveaux fichiers à ajouter.- Le dépôt doit être public, car la ressource Coolify est de type Public Repository.
- Le fichier
.gitlab-ci.ymléventuellement présent (publication sur GitLab Pages) n'a pas d'effet sur Coolify : il peut rester dans le projet.
MAJ du projet par l'étudiant
Après chaque modification du Portfolio, suivre ces étapes dans l'ordre.
5.1 Tester en local
hugo server -D
Ouvrir http://localhost:1313/ et vérifier que le site s'affiche comme prévu.
Puis vérifier que la construction finale (sans les brouillons) fonctionne :
hugo --minify
Aucune erreur ne doit s'afficher. Si une page est visible avec hugo server -D mais absente du site publié, elle est encore en draft: true.
5.2 Pousser les modifications sur GitHub
git status
git add .
git commit -m "Description de la modification"
git push origin main
Vérifier avec git status que seuls les fichiers attendus sont ajoutés.
Attendre la fin du git push avant de demander le déploiement dans Coolify : Coolify déploie le dernier commit présent sur GitHub, pas celui de votre poste. Pour vérifier que le push est bien terminé :
git status
Le message doit indiquer Your branch is up to date with 'origin/main'.
Puis prévenir l'enseignant, qui lance le déploiement (voir « MAJ du projet par l'enseignant »).
C) Créer la ressource dans Coolify
1. Créer la ressource
-
Projet → choisir l'environnement (ex. 2026-sio2-portfolio) → + New Resource.
-
Choisir Public Repository.
-
Saisir l'URL du dépôt dans l'unique champ Repository URL (https://) :
https://github.com/votre-compte/mon-portfolio, puis valider (Check repository). -
Sur l'écran suivant, renseigner la configuration de la ressource :
- Branch :
main - Build Pack : Docker Compose
- Base Directory :
/ - Docker Compose Location :
/compose.yaml
- Branch :
-
Cliquer sur Continue : la ressource est créée et ouverte sur sa page Configuration.
2. Variables d'environnement
Rien à renseigner : le compose.yaml d'un projet Hugo ne contient aucune variable ${VARIABLE}.
3. Définir le sous-domaine
-
Dans l'onglet General, le champ Domains apparaît pour le service du compose. Pour le service
web, saisir par exemple :https://portfolio-hugo-demo.app.ndlpavranches.frCette adresse doit être identique à la
baseURLdu fichierhugo.tomlde l'étudiant (partie A, étape 2). Nginx écoute sur le port 80 : il n'y a pas de port à ajouter. -
Cliquer sur Save. Coolify génère le routage Traefik et le certificat Let's Encrypt.
-
Chez le gestionnaire DNS du domaine, créer un enregistrement de type A pour ce sous-domaine, pointant vers l'adresse IP du serveur Coolify.
D) Déployer
Cliquer sur Deploy (en haut de la ressource), puis suivre les logs du déploiement. Une fois terminé, le site est accessible à l'adresse du sous-domaine.
Dépannage : le site s'affiche sans mise en forme, ou les liens pointent vers un autre site
La baseURL du fichier hugo.toml ne correspond pas à l'adresse du site dans Coolify. Corriger baseURL dans le projet, pousser la modification sur GitHub, puis relancer Deploy.
Dépannage : le site affiche une page vide, ou le build échoue avec module "ananke" not found
Le thème n'est pas dans le dépôt GitHub (voir A, étape 1). Sur GitHub, ouvrir le dossier themes/ du dépôt : le dossier ananke doit contenir des fichiers. S'il apparaît comme un élément grisé ou vide :
- Dans le projet, supprimer
themes/ananke/.git. - Exécuter
git rm --cached themes/ananke, puisgit add .. - Faire un
git commitet ungit push origin main, puis relancer Deploy.
Dépannage : une page est introuvable (erreur 404)
Si la page existe en local avec hugo server -D mais pas en ligne, elle est encore en draft: true. La passer en draft: false, pousser sur GitHub, puis relancer Deploy.
MAJ du projet par l'enseignant
Après chaque modification du Portfolio poussée par l'étudiant, suivre ces étapes dans l'ordre.
5.3 Redéployer dans Coolify
Dans la ressource Coolify :
-
dans l'onglet General, cliquer sur le bouton Reload Compose file
-
cliquer sur le bouton Deploy (en haut à droite), puis suivre les logs du déploiement.
-
Coolify récupère le dernier commit de la branche
main, reconstruit l'image (Hugo reconstruit le site, puis Nginx le sert) et redémarre le conteneur. -
Le déploiement n'est pas lancé automatiquement par un
git push: il faut cliquer sur Deploy. -
Au début du log de déploiement, la ligne
Importing votre-compte/mon-portfolio:main (commit sha …)indique le commit réellement déployé. Il doit correspondre au dernier commit poussé par l'étudiant (git log -1 --format=%H). Sinon, le déploiement a été lancé trop tôt : relancer Deploy.
5.4 Vérifier
- Ouvrir le site à l'adresse du sous-domaine et tester la modification.
- En cas d'erreur, consulter les logs du déploiement (une erreur Hugo y apparaît à l'étape
RUN hugo --minify), puis les logs du conteneurwebdans Coolify.