Jeu d action spatial jouable dans le navigateur. Le front est un fichier statique et le backend Python (stdlib) expose une API JSON pour les sessions live et le leaderboard.
- Canvas HTML5, zero dependance front.
- Backend Python stdlib, sert les fichiers et l API.
- Leaderboard 100% serveur (pas de stockage local cote client).
- Sessions live: presence des joueurs, nettoyage a l expiration.
index.html: jeu + interface.server.py: serveur HTTP + API JSON.Dockerfile/docker-compose.yml: containerisation simple.scripts/: utilitaires (lint scores).tests/: tests unitaires backend.scores.json: genere au runtime, ignore par git.
cd /opt/neon
python3 server.py
# http://localhost:8000Si le front est ouvert en file://, il tentera http://localhost:8000 par defaut.
PORT(defaut8000)IDLE_TIMEOUT(defaut15)ADMIN_TOKEN: activePOST /api/reset(aliasRESET_TOKENaccepte)DRY_RUN(1/true) : analyse sans ecriture disqueTRUST_PROXY(1/true) : utiliseX-Forwarded-For/X-Real-IPMAX_SESSIONS_PER_IP(defaut6)RATE_LIMIT_RPS(defaut20)RATE_LIMIT_BURST(defaut40, calcule si absent)CACHE_MAX_AGE(defaut300)
Base: http://<host>:<port>/api. Le client peut forcer l API avec ?api=https://....
Si le front est heberge sous /space-cleaner, ce prefixe est ajoute automatiquement.
POST /api/state- body:
sessionId(obligatoire),clientId,instanceId,x,y,color,name,score,time,best,bestTime,since - reply:
{ ok, players, board, serverTime }
- body:
POST /api/score- body:
name,score,time,color,sessionId(optionnel) - reply:
{ ok, board, serverTime }
- body:
POST /api/leave- body:
sessionIdouclientId(+instanceIdoptionnel) - reply:
{ ok, removed, removedIds, serverTime }
- body:
POST /api/reset- body:
token(ou headerX-Admin-Token), requiertADMIN_TOKEN - reply:
{ ok, cleared, serverTime }
- body:
GET /api/stateouGET /api/board- reply:
{ ok, board, serverTime }
- reply:
scores.jsonest cree et mis a jour par le serveur (non versionne).- Le leaderboard expose le top 10 (
MAX_BOARD) et conserve jusqu a 100 scores (MAX_STORE). - Tri:
scoredesc, puistimedesc, puiscreated. - Purge automatique des scores vieux de 30 jours (
BOARD_TTL).
docker compose up --buildLe volume ./scores.json est monte dans le conteneur pour persister les scores.
python3 scripts/lint_scores_json.py
python3 -m unittest tests/test_server.py- Un reverse proxy (nginx/caddy) peut servir les assets statiques et proxyfier
/api. - Propager
X-Forwarded-Foret activerTRUST_PROXY=1si besoin.