diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d362592b38f98a34671b8c6603561b5430b380f4
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,119 @@
+image: node:15
+
+stages:
+  - build
+  - deploy
+
+################################################################################
+#####                              BUILD STAGE                             #####
+################################################################################
+
+build-front:
+  stage: build
+  only:
+    - master
+    - staging
+  script:
+    - cd ./front
+    - npm install --only=prod
+    - CI=false npm run build
+  artifacts:
+    paths:
+      - front/node_modules/
+      - front/build/
+
+################################################################################
+#####                         PREPROD-DEPLOY STAGE                         #####
+################################################################################
+
+back-preprod-deploy:
+  stage: deploy
+  only:
+    - staging
+  script:
+    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
+    - eval $(ssh-agent -s)
+    - ssh-add <(echo "$SSH_PRIVATE_KEY")
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
+    - echo ${PREPROD_SECRETS} > secrets.js
+    - scp secrets.js root@humaviron.cs-campus.fr:~/leaderboard/back/src/secrets.js
+    - >
+      ssh root@humaviron.cs-campus.fr
+      "cd leaderboard/back &&
+      git stash &&
+      git checkout staging &&
+      git stash &&
+      git pull &&
+      npm install --only=prod &&
+      pm2 delete back-preprod &&
+      pm2 start src/index.js --name back-preprod &&
+      exit"
+
+front-preprod-deploy:
+  stage: deploy
+  only:
+    - staging
+  dependencies:
+    - build-front
+  script:
+    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
+    - eval $(ssh-agent -s)
+    - ssh-add <(echo "$SSH_PRIVATE_KEY")
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
+    - >
+      ssh root@humaviron.cs-campus.fr
+      "sudo rm -rf /var/www/preprod/* &&
+      exit"
+    - "scp -r ./front/build/* root@humaviron.cs-campus.fr:/var/www/preprod"
+
+################################################################################
+#####                          PROD-DEPLOY STAGE                           #####
+################################################################################
+
+back-prod-deploy:
+  stage: deploy
+  only:
+    - master
+  script:
+    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
+    - eval $(ssh-agent -s)
+    - ssh-add <(echo "$SSH_PRIVATE_KEY")
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
+    - echo ${PROD_SECRETS} > secrets.js
+    - scp secrets.js root@humaviron.cs-campus.fr:~/leaderboard/back/src/secrets.js
+    - >
+      ssh root@humaviron.cs-campus.fr
+      "cd leaderboard/back &&
+      git stash &&
+      git checkout master &&
+      git stash &&
+      git pull &&
+      npm install --only=prod &&
+      pm2 delete back-prod &&
+      PROD=true pm2 start src/index.js --name back-prod &&
+      exit"
+
+front-prod-deploy:
+  stage: deploy
+  only:
+    - master
+  dependencies:
+    - build-front
+  script:
+    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
+    - eval $(ssh-agent -s)
+    - ssh-add <(echo "$SSH_PRIVATE_KEY")
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
+    - >
+      ssh root@humaviron.cs-campus.fr
+      "sudo rm -rf /var/www/prod/* &&
+      exit"
+    - "scp -r ./front/build/* root@humaviron.cs-campus.fr:/var/www/prod"