diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..13566b81b
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 000000000..104c42f56
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 000000000..7e7ac73a0
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..35eb1ddfb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/browserquest-infra/docs/infra.md b/browserquest-infra/docs/infra.md
new file mode 100644
index 000000000..3c2ddfc1d
--- /dev/null
+++ b/browserquest-infra/docs/infra.md
@@ -0,0 +1,91 @@
+### Documentation Lancement de l'app via le dockerfile
+```shell
+docker build -t browserquest .
+docker run -p 8080:8080 -p 8000:8000 browserquest
+```
+Dans notre cas on utilisera notre image dockerhub:
+
+`jeck0v/browserquest:test`
+
+### Documentation lancement Minikube
+
+#### Installer Minikube et Kubectl sur windows:
+On utilise Chocolatery, donc si pas installer => dans powershell admin
+```powershell
+Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
+```
+Minikube:
+```bash
+choco install minikube
+```
+Kubectl:
+```bash
+choco install kubernetes-cli
+```
+#### Lancement Minikube:
+```bash
+minikube start --driver=docker --network-plugin=cni --cni=bridge
+```
+Si besoin de suppr le cluster:
+```bash
+minikube delete
+```
+Activer l'ingress de minikube
+```bash
+minikube addons enable ingress
+```
+Activer les metrics-server pour le scalling du cluster
+```bash
+minikube addons enable metrics-server
+```
+Pour être sûr que l'image est bien prise en compte par minikube:
+```bash
+docker build -t jeck0v/browserquest .
+minikube image load jeck0v/browserquest:test
+```
+Aller dans le dossier browserquest-infra:
+ça lancera tout
+```bash
+.\scripts\start-minikube.bat
+.\scripts\deploy.bat
+.\scripts\status.bat
+.\scripts\test-access.bat
+```
+
+
+### Tester l'app:
+Dans un autre terminal qu'il faudra laisser ouvert:
+
+```bash
+kubectl port-forward -n browserquest svc/browserquest 8080:80
+```
+## Config nginx, configmap et ingress
+
+- un reverse proxy avec **nginx** pour gérer les requêtes HTTP et WebSocket
+- un **configmap** pour gérer la config de Nginx
+- un **ingress** pour exposer l'app (+ ingress-controller)
+Cette partie n'est pas à 100% opérationel, je n'ai pas beaucoup d'xp en K8S donc je pense pas avoir fini ça d'ici le temps imparti
+
+## Infra Kubernetes
+
+- **deployement** : Pour déployer les pods de l'application et de Nginx
+- **services** : Pour exposer les pods et permettre la communication entre eux
+- **configmap** : Pour fournir des configurations personnalisées à Nginx
+- **ingress** : Pour gérer l'accès externe à l'app
+
+### Ce que j'aurais aimé faire de plus
+Je n’ai pas énormément d'expérience avec K8S, et c'étais assez complexe pour moi. Cela dit, je me suis beaucoup amusé à apprendre et à tester. Même si le résultat n'est pas incroyable, j'ai tenté de comprendre au mieux chaque éléments, et j’ai pas mal appris.
+
+J’aurais bien aimé :
+
+- Finaliser proprement la partie Ingress + Ingress Controller
+
+- Approfondir Kubernetes Security
+
+- Mettre en place AWS EKS, avec ELB, et potentiellement un déploiement complet en cloud
+
+ Mais avec le temps imparti, ce n'était pas réaliste ahahha :)
+
+
+
+
diff --git a/browserquest-infra/kustomization.yaml b/browserquest-infra/kustomization.yaml
new file mode 100644
index 000000000..0b4b67445
--- /dev/null
+++ b/browserquest-infra/kustomization.yaml
@@ -0,0 +1,4 @@
+resources:
+ - manifests/base
+ - manifests/ingress
+ - manifests/metrics
diff --git a/browserquest-infra/manifests/base/deployment.yaml b/browserquest-infra/manifests/base/deployment.yaml
new file mode 100644
index 000000000..768f4573c
--- /dev/null
+++ b/browserquest-infra/manifests/base/deployment.yaml
@@ -0,0 +1,28 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: browserquest
+ namespace: browserquest
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: browserquest
+ template:
+ metadata:
+ labels:
+ app: browserquest
+ spec:
+ containers:
+ - name: browserquest
+ image: maxbdk/browserquest:test
+ ports:
+ - containerPort: 8080
+ name: http
+ - containerPort: 8000
+ name: websocket
+ resources:
+ requests:
+ cpu: 500m
+ limits:
+ cpu: 1000m
diff --git a/browserquest-infra/manifests/base/hpa.yaml b/browserquest-infra/manifests/base/hpa.yaml
new file mode 100644
index 000000000..f2154925f
--- /dev/null
+++ b/browserquest-infra/manifests/base/hpa.yaml
@@ -0,0 +1,19 @@
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: browserquest-hpa
+ namespace: browserquest
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: browserquest
+ minReplicas: 3
+ maxReplicas: 8
+ metrics:
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: 50
diff --git a/browserquest-infra/manifests/base/kustomization.yaml b/browserquest-infra/manifests/base/kustomization.yaml
new file mode 100644
index 000000000..27cb562ce
--- /dev/null
+++ b/browserquest-infra/manifests/base/kustomization.yaml
@@ -0,0 +1,6 @@
+namespace: browserquest
+resources:
+ - namespace.yaml
+ - deployment.yaml
+ - service.yaml
+ - hpa.yaml
diff --git a/browserquest-infra/manifests/base/namespace.yaml b/browserquest-infra/manifests/base/namespace.yaml
new file mode 100644
index 000000000..8267280c7
--- /dev/null
+++ b/browserquest-infra/manifests/base/namespace.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: browserquest
diff --git a/browserquest-infra/manifests/base/service.yaml b/browserquest-infra/manifests/base/service.yaml
new file mode 100644
index 000000000..059d55df0
--- /dev/null
+++ b/browserquest-infra/manifests/base/service.yaml
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: browserquest
+ namespace: browserquest
+spec:
+ type: NodePort
+ selector:
+ app: browserquest
+ ports:
+ - name: http
+ port: 8080
+ targetPort: 8080
+ - name: websocket
+ port: 8000
+ targetPort: 8000
diff --git a/browserquest-infra/manifests/dualstack/enable-dualstack.md b/browserquest-infra/manifests/dualstack/enable-dualstack.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/browserquest-infra/manifests/ingress/controller.yaml b/browserquest-infra/manifests/ingress/controller.yaml
new file mode 100644
index 000000000..9c32b2cf8
--- /dev/null
+++ b/browserquest-infra/manifests/ingress/controller.yaml
@@ -0,0 +1,15 @@
+apiVersion: helm.cattle.io/v1
+kind: HelmChart
+metadata:
+ name: ingress-nginx
+ namespace: kube-system
+spec:
+ chart: ingress-nginx
+ repo: https://kubernetes.github.io/ingress-nginx
+ version: 4.10.0
+ valuesContent: |-
+ controller:
+ service:
+ type: NodePort
+ extraArgs:
+ enable-ssl-passthrough: ""
diff --git a/browserquest-infra/manifests/ingress/ingress.yaml b/browserquest-infra/manifests/ingress/ingress.yaml
new file mode 100644
index 000000000..a4a2ac549
--- /dev/null
+++ b/browserquest-infra/manifests/ingress/ingress.yaml
@@ -0,0 +1,30 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: browserquest-ingress
+ namespace: browserquest
+ annotations:
+ nginx.ingress.kubernetes.io/use-regex: "true"
+ nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
+ nginx.ingress.kubernetes.io/websocket-services: "browserquest"
+ nginx.ingress.kubernetes.io/ssl-redirect: "false"
+spec:
+ ingressClassName: nginx
+ rules:
+ - host: browserquest
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: browserquest
+ port:
+ number: 80
+ - path: /socket.io
+ pathType: ImplementationSpecific
+ backend:
+ service:
+ name: browserquest
+ port:
+ number: 8000
diff --git a/browserquest-infra/manifests/ingress/kustomization.yaml b/browserquest-infra/manifests/ingress/kustomization.yaml
new file mode 100644
index 000000000..caebd60d9
--- /dev/null
+++ b/browserquest-infra/manifests/ingress/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+ - ingress.yaml
\ No newline at end of file
diff --git a/browserquest-infra/manifests/kustomization.yaml b/browserquest-infra/manifests/kustomization.yaml
new file mode 100644
index 000000000..f43f78fcf
--- /dev/null
+++ b/browserquest-infra/manifests/kustomization.yaml
@@ -0,0 +1,4 @@
+resources:
+ - ./base
+ - ./ingress
+ - ./metrics
diff --git a/browserquest-infra/manifests/metrics/kustomization.yaml b/browserquest-infra/manifests/metrics/kustomization.yaml
new file mode 100644
index 000000000..37e6e9a80
--- /dev/null
+++ b/browserquest-infra/manifests/metrics/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+ - metrics-server.yaml
diff --git a/browserquest-infra/manifests/metrics/metrics-server.yaml b/browserquest-infra/manifests/metrics/metrics-server.yaml
new file mode 100644
index 000000000..e69de29bb
diff --git a/browserquest-infra/manifests/metrics/placeholder.yaml b/browserquest-infra/manifests/metrics/placeholder.yaml
new file mode 100644
index 000000000..72bc6193c
--- /dev/null
+++ b/browserquest-infra/manifests/metrics/placeholder.yaml
@@ -0,0 +1,8 @@
+# placeholder pour que kubectl ne plante pas
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: dummy-metrics
+ namespace: browserquest
+data:
+ dummy: "true"
diff --git a/browserquest-infra/scripts/deploy.bat b/browserquest-infra/scripts/deploy.bat
new file mode 100644
index 000000000..a942899f9
--- /dev/null
+++ b/browserquest-infra/scripts/deploy.bat
@@ -0,0 +1,14 @@
+@echo off
+kubectl apply -k manifests/base
+kubectl apply -k manifests/metrics
+
+echo Attente du controller NGINX...
+kubectl wait --namespace ingress-nginx --for=condition=Ready pod --selector=app.kubernetes.io/component=controller --timeout=120s
+
+:retry
+kubectl apply -k manifests/ingress
+IF %ERRORLEVEL% NEQ 0 (
+ echo Echec de l'application de l'ingress, nouvelle tentative dans 10s...
+ timeout /t 10
+ GOTO retry
+)
diff --git a/browserquest-infra/scripts/start-minikube.bat b/browserquest-infra/scripts/start-minikube.bat
new file mode 100644
index 000000000..3407dbd0e
--- /dev/null
+++ b/browserquest-infra/scripts/start-minikube.bat
@@ -0,0 +1,5 @@
+@echo off
+minikube delete
+minikube start --driver=docker --network-plugin=cni --cni=bridge
+minikube addons enable ingress
+minikube addons enable metrics-server
\ No newline at end of file
diff --git a/browserquest-infra/scripts/status.bat b/browserquest-infra/scripts/status.bat
new file mode 100644
index 000000000..3815bf9e5
--- /dev/null
+++ b/browserquest-infra/scripts/status.bat
@@ -0,0 +1,4 @@
+@echo off
+kubectl get all -n browserquest
+kubectl get hpa -n browserquest
+minikube service list
diff --git a/browserquest-infra/scripts/test-access.bat b/browserquest-infra/scripts/test-access.bat
new file mode 100644
index 000000000..ffc351028
--- /dev/null
+++ b/browserquest-infra/scripts/test-access.bat
@@ -0,0 +1,12 @@
+@echo off
+echo Test d'accessibilite de l'application sur http://localhost:8080...
+
+timeout /t 5 > nul
+
+curl -I http://localhost:8080
+
+IF %ERRORLEVEL% EQU 0 (
+ echo [OK] Application accessible sur http://localhost:8080
+) ELSE (
+ echo [ERREUR] L'application ne repond pas sur http://localhost:8080
+)
diff --git a/client/.dockerignore b/client/.dockerignore
new file mode 100644
index 000000000..e69de29bb
diff --git a/client/js/gameclient.js b/client/js/gameclient.js
index ac40dd025..8c420e652 100644
--- a/client/js/gameclient.js
+++ b/client/js/gameclient.js
@@ -41,15 +41,15 @@ define(["player", "entityfactory"], function (Player, EntityFactory) {
},
connect: function (dispatcherMode) {
- var url = "http://" + this.host + ":" + this.port,
+ var url = "ws://" + this.host + ":" + this.port,
self = this;
this.connection = io(url, {
- transports: ["websocket", "polling"],
+ transports: ["websocket"],
reconnection: true,
- reconnectionAttempts: 5,
- reconnectionDelay: 1000,
- timeout: 20000,
+ reconnectionAttempts: 3,
+ reconnectionDelay: 2000,
+ timeout: 5000,
forceNew: true,
});
diff --git a/package.json b/package.json
index bbdcc0594..ce2092e0e 100644
--- a/package.json
+++ b/package.json
@@ -4,11 +4,11 @@
"private": false,
"dependencies": {
"express": ">0",
+ "underscore": ">0",
"http-server": "^14.1.1",
"log": ">0",
"memcache": "0.3.0",
"sanitizer": "0.1.2",
- "socket.io": "^4.8.1",
- "underscore": ">0"
+ "socket.io": "^4.8.1"
}
}
diff --git a/server/config.json b/server/config.json
index be9b16666..1aed330ea 100644
--- a/server/config.json
+++ b/server/config.json
@@ -1,5 +1,5 @@
{
- "host": "127.0.0.1",
+ "host": "0.0.0.0",
"port": 8000,
"debug_level": "info",
"nb_players_per_world": 200,
diff --git a/server/js/area.js b/server/js/area.js
index 63c3742e8..3b7efc75a 100644
--- a/server/js/area.js
+++ b/server/js/area.js
@@ -1,6 +1,5 @@
var cls = require('./lib/class'),
- _ = require('underscore'),
Utils = require('./utils'),
Types = require("../../shared/js/gametypes");
diff --git a/server/js/checkpoint.js b/server/js/checkpoint.js
index 1d5a97df7..fb53d8264 100644
--- a/server/js/checkpoint.js
+++ b/server/js/checkpoint.js
@@ -1,5 +1,4 @@
var cls = require("./lib/class"),
- _ = require("underscore"),
Utils = require("./utils"),
Types = require("../../shared/js/gametypes");
diff --git a/server/js/chestarea.js b/server/js/chestarea.js
index a16925922..083bcccc2 100644
--- a/server/js/chestarea.js
+++ b/server/js/chestarea.js
@@ -1,6 +1,5 @@
var Area = require('./area'),
- _ = require('underscore'),
Types = require("../../shared/js/gametypes");
module.exports = ChestArea = Area.extend({