Arnaud/HTTPS sur Gitalb Pages et nom de domain personnalisé

Created Sat, 18 Sep 2021 12:38:25 +0200

Comment paramétrer un nom de domain personnalisé sur Gitlab Pages

… en incluant un certificat Let’s Encrypt pour l’exposer en HTTPS !

Le choix de l’hébergement

Quand j’ai décidé de construire mon propre blogue pour mes notes, mes considérations et mes investigations techniques, j’ai dû bien évidemment choisir mon principe d’hébergement.

Je voulais faire un site statique, facile à mettre à jour, à moindre coût et exposé en https. En plus de tout cela, je voulais pouvoir avoir une chaine de déployment continu CICD… le tout avec un nom de domaine personnalisé.

Voici donc le résultat d’évaluations faites de quelques solutions.

Solution Avantages Inconvénients
Hébergement web classique Service géré. Nom de domaine personnalisé. La chaine CICD doit scripter du ftp. Le process pour l’obtention d’un certificat peut être compliqué ou onéreux. Solution globalement chère.
Raspberry Pi Autonomie > 100%. Pas de coûts récurrents (excepté un peu d’électricité) De nombreuses tâches de maintenance (mise à jour OS). Une chaine de déploiment pas simple à construire. Onéreux en matériel (équivalent à plusieurs années de nom de domaine)
S3 avec l’option site web statique Très peu cher (quelques euros, voire moins, par an). Nom de domaine personnalisable Rien à déclarer 😄
Github Pages Solution que j’ai utilisé plus intensément ces deux dernières années (version Entreprise). Nom de domaine personnalisable (à confirmer) Pas d’outil de CICD, d’où la nécessité d’utiliser Jenkins ou Travis.
Gitlab Pages Déjà utilisé pour des sujets perso. Inclut l’outil de CICD Gitlab-CI (et quelques heures de build gratuitement). Nom de domaine personnalisable. Possibilité de paramétrer un certificat Let’s Encrypt Rien à déclarer

En partant de cette liste, mon choix s’est porté sur Gitlab Pages, et Gitlab CI comme l’outil d’intégration continue.

Gitlab Pages

Pour plus de détails sur l’utilisation de Gitlab Pages, vous devriez lire la documentation.

Avant d’entrer dans le paramétrage des pages et du nom de domaine personnalisé, j’ai dû préparer un site statique de base, de façon à ce que Gitlab CI ait quelque chose à se mettre sous la dent. 😇

J’ai utilisé une version vierge de site généré par l’outil HUGO.

Ensuite, j’ai ajouté le fichier de base de Gitlab-CI pour un site Hugo, nommé .gitlab-ci.yaml :

image: registry.gitlab.com/pages/hugo:latest

variables:
GIT_SUBMODULE_STRATEGY: recursive

test:
script:
    - hugo
except:
    variables:
    - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

pages:
script:
    - hugo
artifacts:
    paths:
    - public
only:
    variables:
    - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Rien de magique ici, ni même de spécial. En fait, il s’agit d’un simple copier/coller du fichier modèle proposé par Gitlab !

En tout cas, le résultat est plaisant : à chaque push sur ma branche main, cela “compile” mon site Hugo !

Si tout s’est bien passé, vous devriez maintenant avoir votre site Gitlab Pages disponible. Le mien se trouvait à l’adresse https://arnaduga.gitlab.io/arnaduga-website/, c’est pour ça que je voulais un nom de domaine personnalisé.

Maintenant que les bases sont posées, parlons du nom de domaine personnalisé et de son certificat.

Étape 1 : Enregistrer un nom de domaine

Pour ma part, j’utilise Gandi pour gérer mes noms de domaines.

J’ai sélectionné le nom arnaduga.dev, mais il y a une contrainte à son utilisation :

images

… c’est une des raisons qui m’ont poussé à vouloir un HTTPS 😄

Étape 2 : Créer un nouveau domaine dans les paramètres Gitlab Pages

Dans votre dépôt Gitlab, aller dans Settings > Pages > bouton New Domain.

Dans le formulaire proposé, renseignez le nom de domaine que vous venez d’acheter et assurez vous que l’option Automatic certificate management using Let’s Encrypt est bien sélectionnée.

image

Étape 3 : Mettre à jour les enregistrements DNS

Dans votre outil de gestion de DNS, éditez les enregistrements, en en ajoutant DEUX, tels que mentionnés sur la page de configuration Gitlab (après avoir cliqué sur le bouton Create New Domain) :

From DNS Record To
arnaduga.dev A 35.185.44.232
_gitlab-pages-verification-code.arnaduga.dev TXT gitlab-pages-verification-code=bda9f41fd4ff3bef595190d769025366

IMPORTANT

La façon dont ces enregistrements sont affichés dans la page ou la doc m’a menée à une mauvaise interprétation et donc, des erreurs.

Voici mes configurations en place :

image

Comme vous pouvez le constater, ces deux enregistrements sont nommés @ et le terme _gitlab-pages-verification-code.arnaduga.dev n’est même pas utilisé !

Une fois que c’est fait, vous devriez pouvoir faire vérifier que vous êtes bien le propriétaire du domaine :

image

Après quelques minutes, votre certificat Let’s Encrypt sera généré et paramétré !

🎉 Et voilà ! 🎉

Note

Il est fort possible que certains enregistrements DNS par défaut entrent en conflict avec cette configuration. Je me souviens en avoir supprimé quelques uns (un ou deux, peut-être), mais malheureusement, je ne sais plus lesquels. Désolé.

Si vous créer un nouveau nom de domaine che Gandi, pourriez-vous me lister les enregistrements par défaut ? Cela me permettrait de corriger cet article en le complétant. Merci ! 😉

Notes à propos des “secrets”

Comme vous avez vu dans cet article, je partage quelques informations DNS (comme mon code de vérification Gitlab par exemple).

Mais rassurez-vous, ces informations ne sont PAS des secrets, étant donné qu’elles sont partagées avec les DNS !

Pour vous en convaincre, sur Mac ou LInux, essayez ces commandes dig :

$ dig arnaduga.dev TXT

; <<>> DiG 9.10.6 <<>> arnaduga.dev TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17169
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;arnaduga.dev.			IN	TXT

;; ANSWER SECTION:
arnaduga.dev.		10800	IN	TXT	"v=spf1 include:_mailcust.gandi.net ?all"
arnaduga.dev.		10800	IN	TXT	"gitlab-pages-verification-code=bda9f41fd4ff3bef595190d769025366"

;; Query time: 64 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Sep 15 18:08:21 CEST 2021
;; MSG SIZE  rcvd: 169
$ dig arnaduga.dev A

; <<>> DiG 9.10.6 <<>> arnaduga.dev A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3607
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;arnaduga.dev.			IN	A

;; ANSWER SECTION:
arnaduga.dev.		10800	IN	A	35.185.44.232

;; Query time: 53 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Sep 15 18:08:25 CEST 2021
;; MSG SIZE  rcvd: 57

Alors, vous vouyez ? Ce ne sont pas des secrets ! 😄