Il y a 2-3 ans l’envie m’a pris de me config un serveur perso, j’ai vu le prix des Syno et cinquante euros plus tard, j’avais récupéré une vieille tour type bureautique des années 2010 mais le temps, la motivation et les connaissances me manquant (j’en étais a la moitié de mes études) la tour a fini par prendre la poussière dans un coin de ma chambre… Jusqu’à ce que je trouve récemment un logement qui me plaise vraiment et qui me pousse à m’intéresser plus sérieusement à la domotique et donc a passer un coup de Swiffer sur la vieille tour ! N’ayant pas encore tous le matériel pour connecter ma maison, j’ai décidé de démarrer ce petit side-project, tant l’envie de faire joujou avec mon serveur me brulait les doigts. Et quel meilleur premier article que celui qui explique comment j’ai monté ce site ?

NB : Je travaille sous MacOS

Prérequis

  • Avoir une machine sous UnraidOS

  • Posséder un compte Dockerhub

  • Config du NAS :

    • Intel Core i3-6100 @3.70GHz
    • 16 GB de RAM DDR4
    • 1 clé USB de 16 Go (2 giga minimum recommandé par Unraid)
    • 1 disque dur de 500GO

On y va !

J’ai zappé l’installation d’Unraid, car elle est vraiment simple, c’est une clé USB à graver et à booter sur la machine, le reste se fait tout seul.

Setup Hugo

Hugo est un générateur de site statique, c’est à dire qu’il va générer des fichiers HTML, CSS, JS, etc. à partir de fichiers markdown, puis servir ces fichiers statiques sur un serveur web.

On commence par installer hugo :

brew install hugo

puis on initialise le site :

hugo new site mon_blog
cd quickstart
git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
echo "theme = 'ananke'" >> hugo.toml

⚠️ Attention, ici on ajoute le theme ananke, bien que le tuto officiel l’ajoute sous forme de submodule git, il est possible de passer par les modules hugo, mais comme je suis passé par la première solution je ne vais pas m’étendre sur le sujet. Retenez simplement qu’il y aura une subtilité plus tard. Si vous voulez tenter l’approche module hugo, vous pouvez vous référer au repo ananke

Dockerfile

Maintenant que le site est initialisé, le but va être de le faire tourner dans un container docker sur le NAS. Il va donc nous falloir un Dockerfile.

FROM caddy:latest

WORKDIR /srv

COPY ./public /srv/public

EXPOSE 80

COPY Caddyfile /etc/caddy/Caddyfile

CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]

Ainsi le container lancera un serveur Caddy et servira les fichiers statiques générés par hugo dans public/.

Pour tester le container en local, on peut lancer les commandes suivantes pour build et run l’image :

  hugo
  docker build -t <dockerhub_username>/<image_name> .
  docker run -p 1313:80 phransswa/hugo-server

et ainsi accéder au site sur localhost:1313. On notera que j’ai redirigé le port 80 du container vers le port 1313 de ma machine, c’est parce que le port 80 est déjà utilisé par unraid pour exposer son dashboard GUI.

Github action

Pour que le site se mette à jour on va creer une action github qui va build le site, puis build l’image docker et enfin la push sur dockerhub.

vous allez tous d’abord devoir créer un token dockerhub, pour cela rendez vous sur cette page et cliquez sur “New Access Token”, puis copiez le token et ajoutez le parmis les secrets de votre repo github en tant que DOCKERHUB_TOKEN, et rajoutez votre pseudo dockerhub en tant que DOCKERHUB_USERNAME.

name: Docker Build and Push

on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        submodules: 'true'
    - name: Login to DockerHub
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}
    - name: Setup Hugo
      uses: peaceiris/actions-hugo@v2
      with:
        hugo-version: 'latest'

    - name: Build Hugo
      run: hugo --minify

    - name: Build and push Docker image
      run: |
        docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/hugo-server .
        docker push ${{ secrets.DOCKERHUB_USERNAME }}/hugo-server        
      env:
        DOCKER_BUILDKIT: 1

Pull l’image Docker sur Unraid

Maintenant que l’image est build et push sur dockerhub, il faut la pull sur le NAS. Unraid intègre déjà un plugin pour pull des images docker, rendez vous dans l’onglet Docker puis Docker Containers et cliquez sur Add Container. Remplissez les champs comme ci-dessous :

puis appliquez les changements et lancez le container.

votre site est maintenant accessible sur http://<ip_du_nas>:1313 depuis votre réseau local.

Exposer le site sur internet

Pour exposer le site sur internet, je vais faire simple dans un premier temps et ouvrir le port 1313 au paquet à destination de l’ip du NAS.

J’adresserai la question du nom de domaine plus tard, peut-être en même temps que celle du design.

Conclusion

Et voilà ! Vous avez maintenant un site statique qui tourne sur votre NAS, et qui se met à jour automatiquement à chaque push sur le repo github. Vous pouvez maintenant vous amuser à le personnaliser, à ajouter des articles, des pages etc.