Nakama : le serveur de jeu open source qui transforme votre homelab en cloud gaming
Vous voulez faire tourner un jeu multijoueur chez vous, avec du matchmaking, des leaderboards, du chat en temps réel, et même des PNJ pilotés par IA locale ? Sans passer par un SaaS qui coûte un rein par mois ? Nakama est là.
Nakama est un serveur de jeu backend open source développé par Heroic Labs. Écrit en Go (avec des parties en Lua pour les scripts custom), il fournit tout ce qu’un jeu multijoueur moderne peut demander : authentification, stockage persistants, messages en temps réel, groupes, clans, et même un système de règles métier scriptable.
Pourquoi Nakama plutôt qu’un autre ?
Il existe plusieurs solutions dans le domaine :
| Solution | Licence | Stack | Realtime | IA locale |
|---|---|---|---|---|
| Nakama | Apache 2.0 | Go + Lua | ✅ WebSocket | ✅ Custom |
| Photon | Propriétaire | C# | ✅ | ❌ |
| Colyseus | MIT | TS/Node | ✅ | Possible |
| Unity Netcode | Propriétaire | C# | ❌ | ❌ |
Nakama se distingue par son open source total (pas de fonctionnalités bloquées derrière une licence payante), sa légèreté (le binaire fait 30 Mo), et sa flexibilité : tout peut être scripté en Lua, du comportement du matchmaking à la logique économique du jeu.
L’installation : un docker-compose et on respire
version: '3'
services:
nakama:
image: heroiclabs/nakama
ports:
- 7350:7350 # API REST + gRPC
- 7351:7351 # WebSocket
environment:
DB_NAME: nakama
DB_USER: nakama
DB_PASSWORD: votre-mot-de-passe
command: --database.address nakama:votre-mot-de-passe@db:5432/nakama
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: nakama
POSTGRES_USER: nakama
POSTGRES_PASSWORD: votre-mot-de-passe
Un docker-compose up -d et Nakama tourne. L’interface d’admin est accessible sur le port 7350 — console web complète avec métriques, logs, et éditeur de comptes.
Ce qu’on peut faire avec
Matchmaking — créez des files d’attente avec des critères personnalisés (niveau, latence, région). Les joueurs sont automatiquement regroupés et une partie est créée.
Leaderboards — classements par score, par temps, par kills, avec réinitialisation quotidienne/hebdomadaire/saisonnière. Possibilité de n’afficher que les scores des amis.
Chat en temps réel — channels globaux, de groupe, ou privés. Messages persistants, modération, historique.
Stockage persistants — chaque joueur peut sauvegarder son inventaire, sa progression, ses préférences. Accessible via l’API REST.
IA locale — couplé à Ollama (cf. mon article sur le sujet), Nakama peut appeler un LLM local pour générer des dialogues de PNJ, des descriptions d’objets, ou même arbitrer des décisions complexes dans le jeu.
L’intégration avec le client
Nakama parle gRPC et WebSocket. Les SDK officiels couvrent Unity, Unreal, Godot, Defold, JavaScript, Python, Java, Swift, et C++. C’est aussi simple que :
const client = new NakamaClient('http', 'localhost', 7350);
const session = await client.authenticateCustom('mon-id-joueur');
const socket = client.createSocket();
socket.onmessage = (msg) => console.log('Realtime:', msg);
Le temps réel est géré via WebSocket avec des protocoles binaires — latence minimale, bande passante optimisée.
Ce que j’en fais dans mon homelab
Nakama tourne sereinement sur mon serveur, à côté d’Ollama et PostgreSQL. Il sert de backend pour un petit RPG expérimental — les PNJ sont pilotés par LLM local, le matchmaking est custom, et les scores persistent entre sessions.
Le tout sans dépendre d’aucun service cloud. Gratuit, ouvert, chez moi.
Les limites
Nakama n’est pas parfait. La documentation peut être lacunaire par endroits (les exemples Lua ne couvrent pas tous les cas). Le debogage des scripts Lua est rudimentaire. Et la scalabilité horizontale demande une configuration avancée avec CockroachDB.
Mais pour un homelab, un projet indie, ou une petite PME qui veut ajouter du social à son app, Nakama est un choix solide. Performant, léger, et complètement sous votre contrôle.