diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 49233ae8bb7ed17ba01df514b5371cc3ab66c37d..05c4bf524d28c13eacc0632e18773071bc2b2361 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,11 +1,29 @@
-image: registry.gitlab.com/pages/hugo/hugo_extended:0.111.3
+image: registry.forgemia.inra.fr/agroclim/agrometinfo/docker-documentation
 
-variables:
-  HUGO_ENV: ci
+workflow:
+  rules:
+    # All commits on `main` can be published to pre-production using GitLab GUI (Build > Pipelines)
+    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "web"
+      variables:
+        HUGO_ENV: preproduction
+        SSH_PRIVATE_KEY: $PREPRODUCTION_SSH_PRIVATE_KEY
+        USER: $PREPRODUCTION_USER
+        SERVER: $PREPRODUCTION_SERVER
+        DESTDIR: $PREPRODUCTION_DESTDIR
+    # All tags are published to production, from `main`
+    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_COMMIT_TAG != null
+      variables:
+        HUGO_ENV: production
+        SSH_PRIVATE_KEY: $PRODUCTION_SSH_PRIVATE_KEY
+        USER: $PRODUCTION_USER
+        SERVER: $PRODUCTION_SERVER
+        DESTDIR: $PRODUCTION_DESTDIR
+    - when: always
+      variables:
+        HUGO_ENV: ci
 
 default:
   before_script:
-    - apk add --no-cache curl bash
     - bin/tool-dependencies.sh
   # Share caches across jobs in different branches 
   # Cache modules in between jobs
@@ -13,12 +31,20 @@ default:
     key: bin
     paths:
      - bin/lychee
+  tags:
+    - agroclim
+
 test:
   script:
+    - echo $HUGO_ENV
+    - echo $CI_COMMIT_REF_NAME
+    - echo $CI_DEFAULT_BRANCH
+    - echo $CI_PIPELINE_SOURCE
     - hugo
     - bin/check.sh public/
 
 pages:
+  needs: ["test"]
   script:
     - hugo
   artifacts:
@@ -27,3 +53,17 @@ pages:
   rules:
     - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
 
+deploy:
+  needs: ["test"]
+  rules:
+    - if: $SSH_PRIVATE_KEY != null
+  before_script:
+    - eval $(ssh-agent -s)
+    - echo "$SSH_PRIVATE_KEY" | ssh-add -
+    - mkdir -p ~/.ssh
+    - touch ~/.ssh/known_hosts
+    - ssh-keygen -R $SERVER
+    - ssh-keyscan -H -t rsa $SERVER  >> ~/.ssh/known_hosts
+  script:
+    - hugo
+    - rsync -rvz --delete --copy-links public/ $USER@$SERVER:$DESTDIR
diff --git a/README.md b/README.md
index e4d4103d354fc71f3e1ce1b821e679f6f93eddff..6f7f51dccb30259341de278d508c348658364de9 100644
--- a/README.md
+++ b/README.md
@@ -40,3 +40,40 @@ Pour modifier ou ajouter une page :
 - Vérifiez la bonne exécution de l'intégration sur la page <https://forgemia.inra.fr/agroclim/agrometinfo/documentation/-/pipelines>.
 - Faites une demande de fusion en choisissant « Écraser les commits lorsque la demande de fusion est acceptée. ».
 - Faites relire.
+
+## Déploiements
+
+Les pages sont publiées après construction et tests des liens grâce à l'intégration et au déploiement continus GitLab-CI.
+
+### Sur la production
+
+Un déploiement depuis la branche `main` sur le serveur de production s'exécute lors de l'[ajout d'une étiquette](https://forgemia.inra.fr/agroclim/agrometinfo/documentation/-/tags/new).
+
+Suivez le numéro de version de l'application pour nommer l'étiquette.
+Si un déploiement intermédiaire doit être effectué, ajouter un numéro de sous version.
+Exemple : si la version `v2.0.0` est en ligne et qu'une mise à jour de la documentation doit être publiée, nommez l'étiquette `v2.0.0.1`. Si une autre doit être publiée : `v2.0.0.2`.
+
+Un déploiement manuel est possible en utilisant le script `bin/deploy.sh`.
+
+### Sur la pré-production
+
+Un déploiement sur le serveur de pré-production s'exécute lors du [lancement manuel](https://forgemia.inra.fr/agroclim/agrometinfo/documentation/-/pipelines/new) du pipeline.
+
+Un déploiement manuel est possible en utilisant le script `bin/deploy.sh`.
+
+### Sur GitLab Pages
+
+Un déploiement sur GitLab Pages <https://agroclim.pages.mia.inra.fr/agrometinfo/documentation/> s'exécute à chaque validation sur la branche `main`.
+
+### Détails techniques
+
+L'image [Docker spécifique](https://forgemia.inra.fr/agroclim/agrometinfo/docker-documentation) a été préparée pour l'intégration et le déploiement continus.
+
+La configuration des intégration et déploiement continus a été faite dans :
+
+- `.gitlab-ci.yml`
+- les [variables CI/CD](https://forgemia.inra.fr/agroclim/agrometinfo/documentation/-/settings/ci_cd) :
+  - création de clefs privées avec `ssh-keygen -t rsa` et `cat ~/.ssh/id_rsa`
+  - `PREPRODUCTION_DESTDIR`, `PREPRODUCTION_SERVER`, `PREPRODUCTION_USER` et `PREPRODUCTION_SSH_PRIVATE_KEY`
+- les serveurs de production et pré-production : création d'un utilisateur, ajout de clef SSH
+
diff --git a/bin/check.sh b/bin/check.sh
index 3d357594412fab1c5f6611639fb2042ee151979e..7bd3c34fc0fffee27323f4aa53dc8222804d1e0b 100755
--- a/bin/check.sh
+++ b/bin/check.sh
@@ -14,7 +14,12 @@ if [ "$INPUT_DIR" == "" ]; then
     exit 1;
 fi
 
-if [ ! -f $BIN_DIR/lychee ]; then
+LYCHEE=$(command -v lychee)
+if [ ! -x "$LYCHEE" ]; then
+	LYCHEE=$BIN_DIR/lychee
+fi
+
+if [ ! -f $LYCHEE ]; then
 	echo_bold_red "- lychee is not installed. Install..."
 	$BIN_DIR/tool-dependencies.sh
 fi
@@ -25,7 +30,7 @@ if [ ! -d $INPUT_DIR ]; then
 fi
 
 echo_bold_green "- Checking links in $INPUT_DIR..."
-$BIN_DIR/lychee --offline --exclude '.*/app$' $INPUT_DIR
+$LYCHEE --offline --exclude '.*/app$' $INPUT_DIR
 if [ $? -ne 0 ]; then
 	echo_bold_red "Errors were found"
 	exit 1
diff --git a/bin/tool-dependencies.sh b/bin/tool-dependencies.sh
index d4fb4ea400bf4189c148728e530cad7ac4ba5621..b4e8bddee368c4ccc3778271d55ba08c66527e2e 100755
--- a/bin/tool-dependencies.sh
+++ b/bin/tool-dependencies.sh
@@ -6,15 +6,23 @@ function echo_bold_red {
     echo -e "\033[31;1m"$1"\033[0m";
 }
 
+LYCHEE_VERSION="v0.13.0"
+LYCHEE_TGZ="lychee-${LYCHEE_VERSION}-x86_64-unknown-linux-musl.tar.gz"
+LYCHEE_URL="https://github.com/lycheeverse/lychee/releases/download/${LYCHEE_VERSION}/${LYCHEE_TGZ}"
+
+LYCHEE=$(command -v lychee)
+if [ -x "$LYCHEE" ]; then
+	echo_bold_green "Lychee is installed"
+	exit
+fi
+
 BIN_DIR=$(dirname $0)
 
 if [ ! -f $BIN_DIR/lychee ]; then
-	VERSION=v0.13.0    
-	LYCHEETGZ=lychee-${VERSION}-x86_64-unknown-linux-musl.tar.gz 
 	echo_bold_green "Getting Lychee to check pages"
 	mkdir -p $BIN_DIR
 	if [ ! -f $BIN_DIR/$LYCHEETGZ ]; then
-		wget "https://github.com/lycheeverse/lychee/releases/download/${VERSION}/$LYCHEETGZ" -O $BIN_DIR/$LYCHEETGZ
+		curl --location $LYCHEE_URL -o $LYCHEE_TGZ
 	fi
-	tar zxf $BIN_DIR/$LYCHEETGZ -C $BIN_DIR
+	tar zxf $LYCHEETGZ -C $BIN_DIR
 fi