diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000000000000000000000000000000000000..6ff4b7b260dfa2e6a3fcff2f44c0ddc2f9335061
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,4 @@
+
+PROJECT_NAME=quiz
+PROJECT_HOSTNAME=quiz.grandlyon.localhost
+CERT_SIZE=1
diff --git a/.gitignore b/.gitignore
index c507d542c73733a3bf69b462180eb8ce74d0545a..4cdcba404c0e0924b8cf17331b804debdf9246b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,7 @@ yarn-error.log
 
 # Miscellaneous
 /.angular/cache
+/.env
 .sass-cache/
 /connect.lock
 /coverage
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..37d2336d0e4a4904bd8eb52d11bcc292e9ea0cb9
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,46 @@
+
+ifneq (,$(wildcard ./.env))
+	include .env
+endif
+
+.PHONY: config
+config:
+	cp .env.example .env
+
+
+# Docker
+up:
+	docker-compose up -d
+
+down:
+	docker-compose down
+
+ps:
+	docker-compose ps
+
+rebuild:
+	docker-compose down --remove-orphans
+	docker-compose build --no-cache
+	docker-compose up -d
+
+
+# Mkcert
+
+define config_toml
+[[tls.certificates]]
+certFile = "/certs/${PROJECT_HOSTNAME}+${CERT_SIZE}.pem"
+keyFile = "/certs/${PROJECT_HOSTNAME}+${CERT_SIZE}-key.pem"
+endef
+
+export config_toml
+
+npm-install: docker compose run --rm node npm install
+
+certs:
+	mkdir -p ${HOME}/.dockerdev/traefik/certs ${HOME}/.dockerdev/traefik/conf
+	mkcert ${PROJECT_HOSTNAME} *.${PROJECT_HOSTNAME} ${CERT_ALIASES}
+	mv *.pem ~/.dockerdev/traefik/certs
+	@echo "$$config_toml" > ~/.dockerdev/traefik/conf/${PROJECT_NAME}-certs.toml
+
+install: config certs up
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5f952ef1babde84c88ff3d15611651450e707ad0
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,22 @@
+services:
+  node:
+    image: trion/ng-cli:17.2.1
+    restart: unless-stopped
+    volumes:
+      - ./:/app
+    working_dir: /app
+    command: ng serve --host 0.0.0.0 --port 4200
+    networks:
+      - webgateway
+    labels:
+      - "traefik.enable=true"
+      - "traefik.http.routers.${PROJECT_NAME}-front.rule=Host(`${PROJECT_HOSTNAME}`)"
+      - "traefik.http.routers.${PROJECT_NAME}-front.tls=true"
+      - "traefik.http.routers.${PROJECT_NAME}-front.entrypoints=websecure"
+      - "traefik.http.services.${PROJECT_NAME}-front.loadbalancer.server.port=4200"
+      - "traefik.http.services.${PROJECT_NAME}-nginx.loadbalancer.server.port=8080"
+
+networks:
+  webgateway:
+    external: true
+