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({