diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7b4f93f570edcf0b17df1a307a01baad180d9361..f005a67d71a93345792cc9e484aae0d77ed0cfa4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,6 +19,38 @@ build:
     - main
     - tags
 
+.mirror_template: &mirror # https://mdleom.com/blog/2020/04/21/gitlab-github-mirror/
+  allow_failure: true
+  variables:
+    GIT_MIRROR_HOST: dum.my
+    GIT_MIRROR_TARGET: git@dum.my:grp/repos.git
+    GIT_STRATEGY: clone
+  stage: build
+  image: node:alpine
+  script:
+    - 'which ssh-agent || (apk update && apk add openssh-client git)'
+    - eval $(ssh-agent -s)
+    - echo "$GIT_MIRROR_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - ssh-keyscan $GIT_MIRROR_HOST 2>&1 | grep -vE '^#' > ~/.ssh/known_hosts
+    - chmod 644 ~/.ssh/known_hosts
+    - git remote add mirrorTarget $GIT_MIRROR_TARGET
+    - git push mirrorTarget --all
+    - git push mirrorTarget --tags
+
+mirror-framagit:
+  <<: *mirror
+  variables:
+    GIT_MIRROR_HOST: framagit.org
+    GIT_MIRROR_TARGET: git@framagit.org:g1/g1lib.js.git
+
+mirror-git.duniter.org:
+  <<: *mirror
+  variables:
+    GIT_MIRROR_HOST: git.duniter.org
+    GIT_MIRROR_TARGET: git@git.duniter.org:libs/g1lib.js.git
+
 pages:
   stage: test
   image: node:latest