{"id":22982303,"url":"https://github.com/raveriss/ft_transcendence","last_synced_at":"2026-04-05T23:02:53.580Z","repository":{"id":287085106,"uuid":"902809732","full_name":"raveriss/ft_transcendence","owner":"raveriss","description":"Une application web intégrant le jeu Pong multijoueur en temps réel avec une interface utilisateur moderne, des fonctionnalités avancées de gestion des utilisateurs et une architecture modulaire axée sur la sécurité et l'accessibilité.","archived":false,"fork":false,"pushed_at":"2025-04-09T22:37:08.000Z","size":158727,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-23T17:54:59.397Z","etag":null,"topics":["2fa","cyber-security","dev-ops","django","docker-compose","gdpr","javascipt","jwt","microservices","oauth2","pong","pong-python","postgresql","python","real-time","spa"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raveriss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-12-13T10:08:18.000Z","updated_at":"2025-04-09T22:37:12.000Z","dependencies_parsed_at":"2025-04-09T22:37:49.688Z","dependency_job_id":null,"html_url":"https://github.com/raveriss/ft_transcendence","commit_stats":null,"previous_names":["raveriss/ft_transcendence"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/raveriss/ft_transcendence","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_transcendence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_transcendence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_transcendence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_transcendence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raveriss","download_url":"https://codeload.github.com/raveriss/ft_transcendence/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_transcendence/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31452901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2fa","cyber-security","dev-ops","django","docker-compose","gdpr","javascipt","jwt","microservices","oauth2","pong","pong-python","postgresql","python","real-time","spa"],"created_at":"2024-12-15T02:17:28.417Z","updated_at":"2026-04-05T23:02:53.562Z","avatar_url":"https://github.com/raveriss.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ft_transcendence - École 42 | Paris\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/game-Pong-brightgreen\" alt=\"Pong\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/framework-Django-blue\" alt=\"Django\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/database-PostgreSQL-blue\" alt=\"PostgreSQL\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/devops-Docker-red\" alt=\"Docker\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/security-2FA-blue\" alt=\"2FA\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/application-SPA-brightgreen\" alt=\"SPA\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/frontend-JavaScript-yellow\" alt=\"JavaScript\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/multi--language-Yes-blue\" alt=\"Multi-language\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/compliance-GDPR-blue\" alt=\"GDPR\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/authentication-OAuth2.0/42-blueviolet\" alt=\"OAuth2.0/42\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/logging-ELK-orange\" alt=\"ELK\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/architecture-Microservices-ff69b4\" alt=\"Microservices\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/security-WAF%2FModSecurity-red\" alt=\"WAF/ModSecurity\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/secrets-HashiCorp%20Vault-blue\" alt=\"HashiCorp Vault\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/matchmaking-Automated-blue\" alt=\"Matchmaking\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/status-Friends%20Online-green\" alt=\"Friends Online\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/tournament-Automatic%20Organization-blue\" alt=\"Automatic Tournament\"\u003e\n\u003c/div\u003e\n\n\n###\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/ayogun/42-project-badges/refs/heads/main/badges/ft_transcendencee.png?raw=true\" alt=\"Badge du projet transcendence\"\u003e\n\u003c/div\u003e\n\n## Description\n\nLe projet **`ft_transcendence`** est une plateforme Web innovante centrée sur le jeu **`Pong`**. Bien plus qu'un simple jeu local, il s'agit d'une application web complète, évolutive, et riche en fonctionnalités, permettant des interactions temps réel entre utilisateurs. Ce projet est conçu comme un exercice d'excellence en développement web, **`DevOps`**, et **`cybersécurité`**.\n\n---\n\n## Fonctionnalités Principales\n\n### Partie Obligatoire\n- **Jeu Pong en ligne** :\n  - Mode **`1v1`** sur **`même machine`**\n  - **`Tournoi`** avec organisation **`automatique`** des **`matchs`**.\n- **Application Web Monopage (**`SPA`**)** :\n  - Développée en **`JavaScript`** : **`vanilla`**.\n  - Compatible avec la dernière version stable de **`Google Chrome`**.\n- **Sécurité Basique** :\n  - Connexion **`HTTPS`**.\n  - Protection contre les injections **`SQL`** et **`XSS`**.\n  - Stockage des mots de passe **`hashés`**.\n- **Conteneurisation avec `Docker`** :\n  - Déploiement via une commande simple (**`docker-compose up --build`**).\n\n### Modules Avancés\nLe projet peut être enrichi avec de nombreux modules pour atteindre **`100 %`** de complétion :\n\n#### Web\n- Backend avec **`Django`**.\n- Utilisation de **`PostgreSQL`** comme base de données.\n\n#### User Management\n- **Authentification `OAuth2.0/42`**.\n- Gestion des **`profils`** avec **`avatars`**, historique des **`matchs`**, et **`statistiques`**.\n- Système d'**`amis`** avec affichage du **`statut`** en ligne.\n\n#### Gameplay\n- **Matchmaking** **`automatisé`**.\n\n#### Cybersécurité\n- Mise en place de **`WAF/ModSecurity`**.\n- Gestion des **`secrets`** avec **`HashiCorp Vault`**.\n- Authentification **`2FA`** et **`JWT`**.\n- Conformité **`GDPR`**.\n\n#### DevOps\n- Gestion des **`logs via ELK` `(Elasticsearch, Logstash, Kibana)`**.\n- Architecture **`backend`** en **`microservices`**.\n\n#### Accessibilité\n- **Multi-langue**, compatibilité **`multi-navigateurs`**.\n\n## Structure du Projet\n\n```bash\nft_transcendence/\n.\n├── backend\n│   ├── conecte_me_backend\n│   │   ├── asgi.py\n│   │   ├── __init__.py\n│   │   ├── middleware.py\n│   │   ├── settings.py\n│   │   ├── urls.py\n│   │   ├── views.py\n│   │   └── wsgi.py\n│   ├── Dockerfile\n│   ├── entrypoint.sh\n│   ├── game\n│   │   ├── admin.py\n│   │   ├── apps.py\n│   │   ├── consumers.py\n│   │   ├── __init__.py\n│   │   ├── migrations\n│   │   │   ├── 0001_initial.py\n│   │   │   ├── 0002_gamesettings_paddle_size_matchhistory.py\n│   │   │   └── __init__.py\n│   │   ├── models.py\n│   │   ├── routing.py\n│   │   ├── tests.py\n│   │   ├── urls.py\n│   │   └── views.py\n│   ├── logs\n│   │   ├── django.log\n│   │   └── frontend.log\n│   ├── manage.py\n│   ├── media\n│   │   └── profile_pictures\n│   │       └── default_avatar.png\n│   ├── oauth_app\n│   │   ├── __init__.py\n│   │   ├── jwt_decorator.py\n│   │   ├── migrations\n│   │   │   ├── 0001_initial.py\n│   │   │   ├── 0002_user42_email_address_user42_first_name_and_more.py\n│   │   │   ├── 0003_user42_is_2fa_enabled_user42_totp_secret.py\n│   │   │   ├── 0004_alter_user42_totp_secret.py\n│   │   │   ├── 0005_user42_profile_image.py\n│   │   │   ├── 0006_alter_user42_profile_image_userloginhistory.py\n│   │   │   ├── 0007_userloginhistory_is_connected.py\n│   │   │   ├── 0008_alter_user42_username.py\n│   │   │   └── __init__.py\n│   │   ├── models.py\n│   │   ├── templates\n│   │   │   └── 2fa_setup.html\n│   │   ├── tests.py\n│   │   ├── twofa_views.py\n│   │   ├── urls.py\n│   │   ├── utils.py\n│   │   └── views.py\n│   ├── requirements.txt\n│   └── tournament\n│       ├── admin.py\n│       ├── apps.py\n│       ├── forms.py\n│       ├── __init__.py\n│       ├── migrations\n│       │   └── __init__.py\n│       ├── models.py\n│       ├── tests.py\n│       ├── urls.py\n│       └── views.py\n├── certs\n│   ├── localhost.crt\n│   └── localhost.key\n├── docker-compose.yml\n├── elk\n│   ├── elasticsearch\n│   │   └── elasticsearch.yml\n│   ├── elk_initializer.sh\n│   ├── filebeat.yml\n│   ├── kibana\n│   │   └── kibana.yml\n│   ├── logstash\n│   │   ├── logstash.conf\n│   │   └── logstash.yml\n│   └── saved_objects.ndjson\n├── frontend\n│   ├── Dockerfile\n│   ├── index.html\n│   └── static\n│       ├── css\n│       │   ├── board.css\n│       │   ├── game.css\n│       │   ├── game_tournament.css\n│       │   ├── login.css\n│       │   ├── main.css\n│       │   ├── privacy.css\n│       │   ├── setup.css\n│       │   ├── signup.css\n│       │   ├── social.css\n│       │   ├── stats.css\n│       │   ├── team.css\n│       │   ├── terms.css\n│       │   ├── tournament.css\n│       │   ├── tournament_details.css\n│       │   └── user.css\n│       ├── fonts\n│       │   ├── PongGame.woff\n│       │   └── PongGame.woff2\n│       ├── img\n│       │   ├── 42_logo.png\n│       │   ├── default_avatar.png\n│       │   ├── favicon.ico\n│       │   ├── field_basketball.png\n│       │   ├── field_hockey.png\n│       │   ├── field_NFL.png\n│       │   ├── Game_anime.png\n│       │   ├── jecointr.jpg\n│       │   ├── mmaric.jpg\n│       │   ├── ode-cleb.jpg\n│       │   ├── PONG_Accueil.png\n│       │   ├── PONG_seul.png\n│       │   ├── raveriss.jpg\n│       │   ├── return_arrow.png\n│       │   └── sycourbi.jpg\n│       ├── js\n│       │   ├── 2fa.js\n│       │   ├── board.js\n│       │   ├── game.js\n│       │   ├── game_tournament.js\n│       │   ├── i18n.js\n│       │   ├── login.js\n│       │   ├── main.js\n│       │   ├── router.js\n│       │   ├── setup.js\n│       │   ├── signin42.js\n│       │   ├── signup.js\n│       │   ├── social.js\n│       │   ├── stats.js\n│       │   ├── tournament_details.js\n│       │   ├── tournament.js\n│       │   ├── translations.json\n│       │   └── user.js\n│       ├── sounds\n│       │   └── hit.mp3\n│       └── templates\n│           ├── board.html\n│           ├── game.html\n│           ├── game_tournament.html\n│           ├── home.html\n│           ├── login.html\n│           ├── privacy.html\n│           ├── setup.html\n│           ├── signin42.html\n│           ├── signup.html\n│           ├── social.html\n│           ├── stats.html\n│           ├── team.html\n│           ├── terms.html\n│           ├── tournament_details.html\n│           ├── tournament.html\n│           └── user.html\n├── nginx.conf\n└── README.md\n```\n\n## Installation et Lancement\n### Prérequis\n  - **`Docker`** et **`Docker Compose`** installés.\n  - Navigateur moderne (**`Google Chrome`** recommandé).\n\n### Commandes\n  - **1.** Clonez le dépôt :\n    ```bash\n    git clone https://github.com/raveriss/ft_transcendence.git\n    cd ft_transcendence\n    ```\n  - **2.** Configurez les variables d'environnement :\n    - Créez un fichier **`.env`** à la racine et renseignez-y vos clés **`API`**, mots de passe et paramètres.\n\n  - **3.** Lancez l'application :\n    ```bash\n    docker-compose up --build\n    ```\n  - **4.** Accédez à l'application :\n    - Ouvrez votre navigateur et rendez-vous sur **`https://localhost:8443`**.\n\n## Modules et Extensions\n### Modules Principaux\n  - **`1`.** **`Backend Framework`** : Développement du backend avec **`Django`**.\n  - **`2`.** **`User Management`** : Authentification, gestion des profils et historique des matchs.\n  - **`3`.** **`Gameplay`** : Personnalisation des règles**.\n  - **`4`.** **`Cybersecurity`** : Mise en place de **`2FA`** et **`JWT`**.\n  - **`5`.** **`DevOps`** : Gestion des logs avec **`ELK`**.\n  \n### Modules Bonus\n  - **`Accessibilité`** : Compatibilité multi-langue\n\n## Aperçu\n\n  - ### Accueil\n  \t\u003cdiv align=\"center\"\u003e\n     \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/accueil.gif\" alt=\"Accueil_pong\"\u003e\n  \t\u003c/div\u003e\n\n  - ### Login Signup et 2fa\n    \u003cdiv align=\"center\"\u003e\n      \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/signup_login_2fa.gif\" alt=\"Inscription et authentification\"\u003e\n    \u003c/div\u003e \n    \n  - ### Authentification avec log in 42\n    \u003cdiv align=\"center\"\u003e\n      \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/login42.gif\" alt=\"Authentification avec log in\"\u003e\n    \u003c/div\u003e \n\n  - ### Interface du jeu\n    \u003cdiv align=\"center\"\u003e\n      \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/home.png\" alt=\"Interface du jeu\"\u003e\n    \u003c/div\u003e \n    \n  - ### Game\n    \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/2p.gif\" alt=\"Windows Game\"\u003e \u003c/div\u003e\n  \n  - ### Statistiques des utilisateurs\n    \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/stats.gif\" alt=\"Statistiques utilisateur\"\u003e \u003c/div\u003e\n    \n  - ### Interface utilisateurs et Sécurité\n    \u003cdiv align=\"center\"\u003e\n      \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/user.gif\" alt=\"Interface du jeu\"\u003e\n    \u003c/div\u003e \n\n  - ### Personnalisation et réglages\n    \u003cdiv align=\"center\"\u003e\n      \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/setup.gif\" alt=\"Personnalisation des avatars et réglages\"\u003e\n    \u003c/div\u003e\n    \n  - ### Tournoi game\n    \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/tournament.gif\" alt=\"Tournois game\"\u003e \u003c/div\u003e\n\n  - ### Réseau social\n    \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/social.gif\" alt=\"Réseau social\"\u003e \u003c/div\u003e\n\n  - ### Team\n    \u003cdiv align=\"center\"\u003e \u003cimg src=\"https://github.com/raveriss/ft_transcendence/blob/main/assets/team.gif\" alt=\"Credits\"\u003e \u003c/div\u003e\n  \n## Contributeurs\n- [jecointr](https://github.com/jecointr)\n- [mmaric](https://github.com/markomrc)\n- [ode-cleb](https://github.com/ode-cleb)\n- [raveriss](https://github.com/raveriss)\n- [sycourbi](https://github.com/Sycourbi)\n\n## Ressources Utilisées\n\n- [Request for Comments 4226 HOTP: An HMAC-Based One-Time Password Algorithm](https://datatracker.ietf.org/doc/html/rfc4226)\n\n- [Request for Comments 6238 TOTP: Time-Based One-Time Password Algorithm](https://datatracker.ietf.org/doc/html/rfc6238)\n\n- [RGPD](https://eur-lex.europa.eu/eli/reg/2016/679/oj?locale=fr)\n\n- [Documentation Django](https://docs.djangoproject.com/fr/5.1/)\n- [Openlassrooms debutez avec le framework django](https://openclassrooms.com/fr/courses/7172076-debutez-avec-le-framework-django)\n- [Openlassrooms allez plus loin avec le framework django](https://openclassrooms.com/fr/courses/7192426-allez-plus-loin-avec-le-framework-django)\n- [Openlassrooms mettez-en-place-une-api-avec-django-rest-framework/7424482-decouvrez-django-rest-framework](https://openclassrooms.com/fr/courses/7192416-mettez-en-place-une-api-avec-django-rest-framework/7424482-decouvrez-django-rest-framework)\n- [Openlassrooms deployez-une-application-django](https://openclassrooms.com/fr/courses/4425101-deployez-une-application-django)\n- [Django Rest Framework cours tutoriel exemples](https://python.doctor/page-django-rest-framework-drf-cours-tuto-tutoriel-exemples)\n\n- [Openlassrooms apprenez a programmer avec javascript](https://openclassrooms.com/fr/courses/7696886-apprenez-a-programmer-avec-javascript)\n- [Lesieur apprenez a programmer avec javascript](https://blog.lesieur.name/vanilla-js-france/#id)\n\n- [Ethereum guides](https://ethereum.org/fr/guides/)\n- [Soliditylang Documentation](https://docs.soliditylang.org/fr/latest/)\n\n- [Play list Video Tuto Docker #01](https://www.youtube.com/watch?v=GVogBCqrXck\u0026list=PLn6POgpklwWqVFAFrjnpXGhjveRUTHGa_\u0026ab_channel=xavki)\n- [Play list Video Tuto Docker-Compose #01](https://www.youtube.com/watch?v=pMAGe6nTkws\u0026list=PLn6POgpklwWqaC1pdx02SrrgOaL2ZL7G0\u0026ab_channel=xavki)\n\n- [Google Authenticator PAM module](https://github.com/google/google-authenticator-libpam)\n- [Introducing 2FA with Google Authenticator and Node.js](https://www.youtube.com/watch?v=6mxA9Zp8600\u0026ab_channel=Omnidev)\n- [Two-Factor Authentication in Django Using Google Authenticator](https://www.youtube.com/watch?v=u02U_ZNd0HU\u0026ab_channel=Neszen)\n\n- [Tuto docker comprendre docker partie #01](https://www.wanadevdigital.fr/23-tuto-docker-comprendre-docker-partie1/)\n- [Tuto docker comprendre docker partie #02](https://www.wanadevdigital.fr/24-tuto-docker-demarrer-docker-partie-2/)\n- [Tuto docker comprendre docker partie #03](https://www.wanadevdigital.fr/27-tuto-docker-les-commandes-et-docker-partie-3/)\n\n- [PostgreSQL](https://docs.postgresql.fr/)\n- [TUTORIALS POSTGRESQL](https://www.youtube.com/watch?v=_LmASWXwdoM\u0026list=PLn6POgpklwWonHjoGXXSIXJWYzPSy2FeJ\u0026ab_channel=xavki)\n\n- [TUTORIALS PROMETHEUS / GRAFANA](https://www.youtube.com/watch?v=wcTr8Hm7SCQ\u0026list=PLn6POgpklwWo3_2pj5Jflqwla62P5OI8n\u0026ab_channel=xavki)\n\n- [TUTORIALS Introduction : why ? what ? - #ELK 01](https://www.youtube.com/watch?v=QmSIml8lo-c\u0026list=PLn6POgpklwWqSvhjguOUJCH8ItydtIvKZ\u0026ab_channel=XavkiEn)\n\n\n- [ThreeJS](https://threejs.org/docs/index.html#manual/fr/introduction/Creating-a-scene)\n- [Tutoriel Pong](https://www.ponggame.org/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_transcendence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraveriss%2Fft_transcendence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_transcendence/lists"}