Héberger un serveur Minecraft sur un VPS
Installez Paper sur Ubuntu 24.04 avec Java 25 : dimensionnement RAM, systemd, port 25565, pare-feu, whitelist et sauvegardes sûres du monde.
Ce que vous allez construire
Un serveur Minecraft Java Edition qui reste disponible : Paper sur Ubuntu 24.04, exécuté par un utilisateur dédié minecraft sous systemd avec Restart=on-failure, avec la whitelist activée, le port 25565 ouvert dans ufw et dans le pare-feu réseau de votre fournisseur s’il est activé, et des sauvegardes effectuées sans corrompre le monde qu’elles doivent protéger. Le serveur lui-même tient dans un fichier jar et une commande java ; tout ce qui distingue un serveur sur lequel vos amis jouent pendant un an d’un serveur qui tombe en panne le premier week-end concerne cette commande. C’est ce que couvre ce guide.
Deux avertissements importants avant de dépenser de l’argent. Premièrement, Minecraft consomme beaucoup de mémoire et utilise principalement un seul thread : un VPS de 1 GB ne fera pas fonctionner un serveur jouable, et un cœur rapide vaut mieux que quatre cœurs lents. Deuxièmement, il s’agit de Java Edition. Les joueurs Bedrock, les consoles, les téléphones et l’application Windows Bedrock ne peuvent pas rejoindre un serveur Java. Bedrock nécessite un autre logiciel serveur sur UDP 19132, ou le plugin Geyser, qui n’est pas traité ici.
Vous avez besoin d’un VPS KVM Ubuntu 24.04 vierge avec un accès root ou sudo, et d’environ trente minutes.
Dimensionnement : les besoins réels d’un serveur entre amis
La RAM est le facteur déterminant, et les chiffres réels sont inférieurs à ceux souvent annoncés sur les forums de modpacks :
- 2 GB permettent d’exécuter le jeu vanilla pour 2–5 joueurs avec une distance d’affichage modeste. Le jeu reste jouable, mais sans marge.
- 4 GB constituent la capacité confortable pour un serveur entre amis : environ dix joueurs simultanés sur Paper avec quelques plugins, tout en laissant suffisamment de mémoire pour l’OS.
- 8 GB et plus correspondent aux modpacks et aux groupes de plus de 20 joueurs. Vous devez alors aussi tenir compte de la fréquence du CPU sur un seul cœur, car la boucle principale du jeu s’exécute sur un seul thread.
Le monde occupe également de plus en plus d’espace disque à mesure que les joueurs l’explorent. Un monde de survie très parcouru atteint plusieurs gigaoctets. Prévoyez donc de la marge pour le monde et ses sauvegardes.
Vanilla ou Paper ? Paper est un remplacement direct du fichier jar officiel : mêmes mondes, mêmes clients, aucun mod côté client nécessaire. Il réécrit les chemins d’exécution les plus lents du serveur, notamment le chargement des chunks, la mise à jour des entités et le traitement des hoppers, et ajoute une API de plugins. La seule raison d’utiliser vanilla est de devoir conserver des mécanismes vanilla strictement identiques pour des fermes techniques en redstone que les optimisations de Paper peuvent modifier. Pour tous les autres usages, Paper permet d’accueillir davantage de joueurs avec la même quantité de mémoire. Tout ce qui suit fonctionne avec les deux.
Étape 1 : installer Java 25
Minecraft 26.1 et toutes les versions suivantes nécessitent Java 25 ; Java 21 ne couvre que la branche plus ancienne, de 1.20 à 1.21.11. Ubuntu 24.04 fournit Java 25 via ses dépôts de mises à jour et de sécurité. Installez le JRE complet, pas la variante -headless : le guide d’installation Java de Paper déconseille les variantes headless, car certaines dépendances nécessaires à Paper leur manquent.
sudo apt update && sudo apt install -y openjdk-25-jre
java -versionRésultat attendu : la première ligne affiche openjdk version "25.0.x". Si elle affiche 21, 17 ou 11, un autre JRE est installé et prioritaire ; corrigez cela avec sudo update-alternatives --config java, puis sélectionnez l’entrée qui contient java-25.
Si vous ignorez cette vérification, vous obtiendrez plus tard l’erreur Minecraft la plus recherchée sur Google. Avec Java 21, le fichier jar du serveur s’arrête immédiatement avec :
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
compiled by a more recent version of the Java Runtime (class file version 69.0),
this version of the Java Runtime only recognizes class file versions up to 65.0Les nombres indiquent l’incompatibilité : la version de fichier de classe 69.0 correspond à Java 25, 65.0 à Java 21 et 61.0 à Java 17. Quelle que soit la paire affichée, la correction est la même : installez le JRE le plus récent, puis relancez update-alternatives.
Étape 2 : un utilisateur dédié, jamais root
Le serveur exécute du code de plugin et analyse des données réseau provenant de toute personne pouvant atteindre le port. En cas de problème, une compromission avec les privilèges root donne le contrôle de votre VPS ; avec les privilèges de minecraft, elle se limite à un monde de jeu.
sudo adduser --system --group --home /opt/minecraft minecraft--system crée un compte sans mot de passe, qui ne peut pas se connecter en SSH, avec /opt/minecraft comme répertoire personnel et répertoire de travail. À partir de maintenant, chaque commande qui modifie le serveur est exécutée avec cet utilisateur.
Étape 3 : télécharger le fichier JAR du serveur depuis la source officielle
Deux sites seulement doivent vous fournir un fichier JAR de serveur : la page officielle de téléchargement des serveurs sur minecraft.net pour Vanilla, et la page de téléchargement sur papermc.io pour Paper. Les « hubs de téléchargement » tiers qui reconditionnent des fichiers JAR de serveur constituent depuis longtemps un vecteur de logiciels malveillants. Un fichier JAR de serveur contient du code arbitraire que vous allez exécuter 24 h/24 sur une machine exposée à Internet.
Copiez le lien de téléchargement de la build actuelle depuis la page officielle, puis exécutez :
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Résultat attendu : un server.jar d’environ 60 MB appartenant à minecraft, vérifié avec ls -lh /opt/minecraft/server.jar.
Étape 4 : premier démarrage, l’EULA et l’ajout de votre compte aux opérateurs
Lancez le serveur en mode interactif une fois avant de configurer systemd. Le premier démarrage permet de réaliser deux opérations que seule une console interactive gère correctement.
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiLe processus s’arrête en quelques secondes. Paper prend d’abord quelques instants supplémentaires pour appliquer ses correctifs. Le journal se termine par la ligne que tout le monde rencontre :
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.Ce n’est pas une erreur, mais un contrôle de licence. Le démarrage a créé eula.txt à côté du fichier JAR. Lisez l’EULA indiquée par le lien si ce n’est pas déjà fait, puis activez l’option :
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtRelancez la même commande java. Cette fois, le serveur génère le monde, ce qui prend une à deux minutes lors du premier démarrage, puis se stabilise sur :
[Server thread/INFO]: Done (9.204s)! For help, type "help"Vous disposez maintenant d’une console interactive. Utilisez-la pour la deuxième opération : saisissez op YourMinecraftName (votre nom d’utilisateur exact dans le jeu). Le serveur vous ajoute à ops.json. Vous pourrez ainsi exécuter toutes les commandes d’administration depuis le jeu, même lorsqu’aucune console n’est attachée. Saisissez ensuite stop pour enregistrer et quitter proprement.
Étape 5 : server.properties et pourquoi online-mode reste à true
Le premier démarrage a également créé server.properties. La plupart des valeurs par défaut conviennent. Voici les lignes qu’il faut définir délibérément :
online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually knowonline-mode=true oblige le serveur à vérifier chaque nom d’utilisateur qui se connecte auprès des serveurs de session Mojang. Cela confirme que le joueur possède bien le compte. En le réglant sur false, l’option « serveur cracked », le serveur accepte l’identité déclarée par n’importe quel client : n’importe qui peut se connecter sous n’importe quel nom, y compris le vôtre. Comme les opérateurs et les listes blanches utilisent le nom du joueur, un imposteur obtient alors vos permissions d’opérateur. La seule raison légitime de le désactiver est d’utiliser un proxy d’authentification comme Velocity, qui vérifie lui-même l’identité des joueurs. Sur un serveur normal, cette option reste à true, sans exception.
view-distance est le principal levier de performances du fichier. Le coût en CPU et en RAM évolue approximativement avec son carré. 8 est une valeur par défaut adaptée à un VPS ; 10 est la valeur par défaut de vanilla et consomme sensiblement plus de ressources.
white-list=true et enforce-whitelist=true ferment le serveur aux inconnus, ce que la section consacrée à la sécurité ci-dessous présente comme indispensable. Ajoutez des joueurs avec /whitelist add TheirName en jeu en tant qu’opérateur.
Étape 6 : paramètres mémoire, pourquoi -Xms et -Xmx doivent être identiques
La JVM alloue son heap entre -Xms (taille initiale) et -Xmx (plafond). Sur un serveur de jeu dédié, définissez-les à la même valeur : le heap atteindra de toute façon le plafond, et l’agrandir par étapes ne fait qu’ajouter de l’activité au garbage collector pendant les parties. Sur un VPS de 4 GB, la bonne paire est :
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx ne correspond pas à la mémoire totale utilisée par le processus. La JVM ajoute une surcharge hors heap, les piles des threads, les caches JIT et les buffers directs, pour environ un demi-gigaoctet ou davantage. Ubuntu a également besoin de mémoire. Règle pratique : -Xmx au maximum, soit la RAM du VPS moins 1 GB. Si vous dépassez cette limite, vous rencontrerez l’un des deux échecs suivants. Si l’allocation échoue immédiatement, le serveur refuse de démarrer avec :
Error: Could not reserve enough space for object heapCe message est explicite et immédiat. Le cas le plus problématique démarre correctement, puis s’arrête plusieurs heures plus tard, lorsque le heap se remplit sous la charge et que l’OOM killer du kernel sélectionne le plus gros processus de la machine : la JVM. Rien n’apparaît dans le journal du serveur ; l’indice se trouve dans sudo dmesg | grep -i oom, avec une ligne comme Out of memory: Killed process 1234 (java). Si votre service redémarre « aléatoirement », vérifiez d’abord cet emplacement et réduisez -Xmx.
Pour Paper, le projet documente les flags d’Aikar, un ensemble de paramètres G1GC optimisés (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 et une douzaine d’autres) qui lissent les pauses du garbage collector avec les heaps plus importants. Générez la ligne complète à partir de la documentation de Paper ; avec un heap de 2–4 GB, le gain est modeste, mais ces paramètres sont sans risque.
Étape 7 : une unité systemd avec Restart=on-failure
Un serveur lancé manuellement s’arrête avec votre session SSH et reste arrêté après un redémarrage. Écrivez /etc/systemd/system/minecraft.service :
[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fRésultat attendu : status affiche active (running), et le journal, qui contient maintenant la sortie console du serveur, se termine de nouveau à la ligne Done.
Deux choix sont délibérés dans cette unité. Restart=on-failure redémarre le serveur après un crash, mais pas après un arrêt propre avec stop, ce qui permet d’effectuer la maintenance. Et TimeoutStopSec=120 est plus important qu’il n’y paraît : systemctl stop envoie SIGTERM, le serveur Minecraft l’intercepte et enregistre chaque monde avant de s’arrêter, et cette sauvegarde peut prendre du temps sur un monde volumineux. Le délai par défaut de systemd peut envoyer SIGKILL à la JVM pendant la sauvegarde. C’est précisément ainsi que les fichiers de région sont corrompus. Accordez-lui deux minutes.
Si le service redémarre en boucle et que le journal affiche :
[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?alors un autre processus utilise déjà 25565. Il s’agit presque toujours de votre précédente exécution au premier plan, encore active dans une autre session SSH. Trouvez-la avec sudo ss -tlnp | grep 25565 et arrêtez cette instance ; ne lancez jamais deux serveurs sur le même port.
Étape 8 : ouvrir le port 25565 sur les deux firewalls
Minecraft Java utilise uniquement TCP 25565 (UDP sert seulement au protocole de requête facultatif, désactivé par défaut). Sur le VPS :
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableC’est le premier firewall. De nombreux fournisseurs de VPS proposent également un second firewall au niveau du réseau dans le panneau de contrôle. Lorsqu’il est actif, c’est souvent celui que l’on oublie. Chez SSD Nodes, il s’agit de l’extension Advanced Firewall Groups, un service payant que vous pouvez attribuer lors de la commande ou depuis le tableau de bord. Si votre serveur en utilise un, ouvrez également TCP 25565 à cet endroit. L’absence d’une règle dans l’un ou l’autre firewall produit un symptôme particulièrement peu explicite : le client reste bloqué sur « Connecting to the server... » et échoue avec Connection timed out: no further information, sans refus de connexion, sans erreur du serveur et sans message dans le journal, car les paquets n’arrivent jamais au serveur. Vérifiez depuis une machine extérieure au VPS avec nc -vz your.server.ip 25565. succeeded signifie que tous les firewalls sur le chemin autorisent la connexion. Un blocage indique généralement qu’un firewall abandonne encore les paquets, mais un hôte trop chargé pour accepter les connexions peut également provoquer un délai d’attente. Vérifiez donc que le serveur est bien en écoute avec ss directement sur la machine.
Puisque vous êtes déjà dans ufw, cette même machine exécute SSH sur une adresse IP publique. Les messages liés aux tentatives de brute force commencent en général à apparaître en quelques heures. Configurez Fail2ban pour SSH sur Ubuntu 24.04 avant de l’oublier.
Connectez-vous maintenant : Multiplayer, Direct Connection, puis l’adresse IP du serveur. Comme vous vous êtes donné les droits d’opérateur à l’étape 4, les commandes en jeu fonctionnent immédiatement : /whitelist add FriendName pour chaque joueur, /gamemode creative si c’est ce que vous avez prévu.
Étape 9 : utiliser une whitelist, car Internet trouve le port 25565
Laisser un serveur Minecraft ouvert sur Internet n’est pas un risque théorique : des scanners parcourent en continu tout l’espace IPv4 à la recherche du port 25565, des projets de griefing amateur ont ainsi recensé des centaines de milliers de serveurs ouverts, et un serveur sans whitelist reçoit des visiteurs indésirables en quelques jours, parfois en quelques heures. La whitelist de l’étape 5 règle le problème : online-mode=true vérifie l’identité, tandis que la whitelist limite l’accès aux identités que vous avez choisies. Ces deux éléments constituent tout le modèle de sécurité et suffisent pour un serveur réservé à des amis.
Pour accéder à la console sans lancer le jeu, automatiser les sauvegardes avec un script ou exécuter une tâche cron, activez RCON dans server.properties (enable-rcon=true, un rcon.password robuste, port 25575), puis compilez le petit client mcrcon à partir de son code source GitHub directement sur le VPS ; il ne se trouve pas dans les dépôts Ubuntu. N’ouvrez pas le port 25575 dans un firewall : RCON envoie le mot de passe en clair, il doit donc rester accessible uniquement via loopback.
Étape 10 : sauvegarder sans corrompre le monde
La règle principale : ne copiez jamais le répertoire d’un monde pendant que le serveur y écrit. Les fichiers de région sont réécrits en continu pendant le jeu. Un tar lancé pendant une écriture produit une archive contenant des chunks partiellement écrits. Lorsque vous la restaurez, au moment où la sauvegarde doit fonctionner, les erreurs de chargement des chunks remplissent les journaux et le terrain comporte des trous. Deux méthodes permettent d’éviter ce problème.
La méthode arrêt-copie-redémarrage est la plus simple, au prix d’une minute d’interruption :
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world
sudo systemctl start minecraft(Depuis la version 26.1, Paper conserve les trois dimensions dans world/dimensions/, comme vanilla. world contient donc l’intégralité du monde. Un serveur Paper qui utilise encore la version 1.21.11 ou une version antérieure les répartit dans world, world_nether et world_the_end. Ajoutez ces deux répertoires à l’archive tar dans ce cas.)
La méthode Save-off permet de sauvegarder un serveur en fonctionnement : via RCON, exécutez save-off (arrêtez la sauvegarde automatique), puis save-all flush (forcez l’écriture complète sur disque et attendez), créez l’archive tar, puis exécutez save-on. C’est la méthode à placer dans cron à 5 heures du matin.
Dans les deux cas, une sauvegarde stockée sur le même VPS que le serveur n’est pas une sauvegarde. Utilisez scp ou rclone pour transférer les archives hors du serveur, et conservez-en plusieurs. Comme vous ne surveillerez pas la console lorsqu’un problème surviendra, ajoutez un contrôle externe du port : Uptime Kuma sur une autre machine qui effectue un contrôle TCP sur 25565 vous indiquera que le serveur est hors service avant vos joueurs.
Plugins et mises à niveau
Sur Paper, un plugin est simplement un fichier jar placé dans /opt/minecraft/plugins/, puis suivi d’un redémarrage. C’est toute la procédure d’installation. Téléchargez les plugins uniquement depuis les pages officielles de leurs projets (Hangar, Modrinth, SpigotMC), pour la même raison que le fichier jar du serveur : chacun est du code arbitraire exécuté avec l’utilisateur minecraft.
La mise à niveau du serveur consiste à l’arrêter, à effectuer une sauvegarde, à remplacer server.jar par le build correspondant à la nouvelle version de Minecraft, puis à le démarrer. Deux précautions sont nécessaires. Les mises à niveau des mondes sont irréversibles : un monde ouvert avec une version plus récente ne s’ouvrira pas avec une version plus ancienne. Les sauvegardes sont donc indispensables. Les plugins prennent aussi souvent plusieurs jours ou semaines pour prendre en charge une nouvelle release de Minecraft. Vérifiez donc leur compatibilité avant d’installer une release dès le premier jour. Le passage de 1.21.11 à 26.1 ou une version ultérieure nécessite également Java 25 (étape 1) et déplace les dossiers Nether et End de Paper dans world/dimensions/.
Si vous préférez gérer tout cela dans un conteneur, avec le version pinning, l’acceptation de l’EULA et les options de mémoire définis comme variables d’environnement, l’image itzg/minecraft-server, très utilisée, exécute le même serveur Paper avec Docker Compose sur votre VPS, en appliquant les mêmes règles pour le pare-feu et les sauvegardes.
FAQ
De quelle quantité de RAM un serveur Minecraft a-t-il besoin ?
2 GB suffisent pour Minecraft vanilla avec 2–5 joueurs ; 4 GB offrent un fonctionnement confortable pour un serveur entre amis d’environ dix joueurs sous Paper avec quelques plugins ; les modpacks et plus de 20 joueurs nécessitent 8 GB ou davantage. Quelle que soit la taille du VPS, définissez -Xmx à au plus la RAM totale moins 1 GB : la JVM utilise de la mémoire en dehors du heap, et une valeur trop élevée finit par provoquer Error: Could not reserve enough space for object heap ou un arrêt OOM silencieux.
Pourquoi mes amis ne peuvent-ils pas se connecter à mon serveur Minecraft ?
Un client qui reste bloqué avant d’aboutir à Connection timed out: no further information indique généralement un problème de firewall : ufw sur le VPS et le firewall réseau de votre fournisseur s’il est activé dans le control panel. Le port TCP 25565 doit être ouvert dans chaque firewall sur le chemin. Vérifiez que le serveur est bien en écoute avec sudo ss -tlnp | grep 25565 sur la machine, puis testez depuis l’extérieur avec nc -vz your.server.ip 25565.
Dois-je définir online-mode=false dans server.properties ?
Non. Avec online-mode=false, le serveur ignore entièrement l’authentification Mojang. N’importe qui peut donc rejoindre le serveur avec n’importe quel nom d’utilisateur, y compris celui d’un op, et récupérer ses permissions. Les skins et les UUID stables cessent également de fonctionner correctement. Le seul usage légitime est derrière un proxy d’authentification comme Velocity, qui vérifie lui-même l’identité des joueurs. Pour un serveur normal, cette option reste true.
Paper est-il meilleur que le serveur Minecraft vanilla ?
Pour presque tout le monde, oui. Paper est un fichier jar drop-in qui charge les mondes vanilla et accepte les clients non modifiés. Il traite les entités et charge les chunks beaucoup plus efficacement, tout en ajoutant l’écosystème des plugins. L’exception concerne les communautés spécialisées dans la redstone technique qui ont besoin d’un comportement vanilla strictement identique bit à bit, car certaines optimisations de Paper le modifient. Sur un petit VPS, l’efficacité de Paper revient à disposer de RAM supplémentaire gratuitement.
Comment sauvegarder un monde Minecraft sans le corrompre ?
N’archivez jamais le répertoire du monde pendant que le serveur y écrit. Une copie effectuée pendant l’écriture d’un fichier de région peut produire des chunks corrompus, que vous ne découvrirez qu’au moment de la restauration. Arrêtez le serveur, archivez les répertoires du monde avec tar, puis redémarrez-le. Vous pouvez aussi le laisser fonctionner avec save-off, save-all flush, tar et save-on via RCON. Déplacez ensuite l’archive hors du VPS.