SSD Nodes Learn Hosting plans →
Guides Matt ConnorPar Matt Connor · Mis à jour le 2026-08-07

Héberger un serveur Minecraft sur un VPS

Installez Paper sur Ubuntu 24.04 avec Java 21 : RAM, systemd, port 25565 dans les deux pare-feu et sauvegardes sûres du monde, sans erreurs de corruption.

Ce que vous allez mettre en place

Un serveur Minecraft Java Edition stable : Paper sur Ubuntu 24.04, exécuté comme utilisateur dédié minecraft sous systemd avec Restart=on-failure, liste blanche activée, port 25565 ouvert dans les deux pare-feu situés entre vos joueurs et la JVM, et sauvegardes effectuées sans corrompre le monde qu’elles doivent protéger. Le serveur lui-même tient dans un 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 dès le premier week-end se trouve autour de 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 21

Minecraft 1.20.5 et toutes les versions sorties depuis, notamment toute la branche 1.21.x, nécessitent Java 21. Ubuntu 24.04 le fournit dans les dépôts par défaut. La version headless n’installe pas les bibliothèques graphiques dont un serveur n’a jamais besoin :

sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version

Résultat attendu : la première ligne affiche openjdk version "21.0.x". Si elle affiche 17 ou 11, un autre JRE est installé et prioritaire. Corrigez cela avec sudo update-alternatives --config java, puis sélectionnez l’entrée contenant java-21.

Si vous ignorez cette vérification, vous rencontrerez ensuite l’erreur Minecraft la plus recherchée. Avec Java 17, le fichier JAR du serveur s’arrête immédiatement et affiche :

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 65.0),
	this version of the Java Runtime only recognizes class file versions up to 61.0

Les nombres indiquent l’incompatibilité : la version de fichier de classe 65.0 correspond à Java 21, 61.0 à Java 17 et 60.0 à Java 16. Quelle que soit la paire affichée, la correction est la même : installez le JRE le plus récent, puis réexécutez 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 sources seulement doivent vous fournir un fichier JAR de serveur : la page officielle de téléchargement du serveur sur minecraft.net pour Vanilla, et la page de téléchargement sur papermc.io pour Paper. Les « download hubs » tiers qui reconditionnent des fichiers JAR de serveur constituent depuis longtemps un vecteur de malware. 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 du build actuel depuis la page officielle, puis exécutez la commande suivante. L’URL change avec chaque version et chaque build ; la coder en dur ici deviendrait rapidement obsolète :

cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'

Résultat attendu : un server.jar d’environ 50 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 nogui

Le 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.txt

Relancez 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 know

online-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 heap

Ce 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.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

Ré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 pare-feu

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 enable

C’est le premier pare-feu. La plupart des fournisseurs de VPS exécutent un second pare-feu au niveau du réseau dans le panneau de contrôle. C’est celui que l’on oublie souvent. Ouvrez également TCP 25565 à cet endroit. Lorsque l’un des deux pare-feu n’est pas ouvert, le symptôme est 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 ni erreur du serveur, et sans message dans le journal, car les paquets ne sont jamais arrivés. Vérifiez depuis une machine extérieure au VPS avec nc -vz your.server.ip 25565 ; succeeded signifie que les deux pare-feu sont ouverts. Un blocage signifie qu’au moins l’un d’eux ne l’est pas.

Pendant que vous êtes dans ufw, le même serveur exécute SSH sur une IP publique, et les messages liés aux tentatives de brute force commencent à s’accumuler en quelques heures. Configurez Fail2ban pour SSH sur Ubuntu 24.04 avant de l’oublier.

Connectez-vous maintenant : Multiplayer, Direct Connection, puis l’IP du serveur. Comme vous vous êtes donné les privilèges op à l’étape 4, les commandes en jeu fonctionnent immédiatement : /whitelist add FriendName pour chaque joueur, /gamemode creative si c’est 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 : sauvegardes sans corrompre le monde

La règle est simple : ne copiez jamais le répertoire d’un monde pendant que le serveur l’écrit. Les fichiers de région sont réécrits en continu pendant le jeu. Un tar qui intervient pendant une écriture produit une archive contenant des chunks partiellement écrits. Lorsque vous la restaurez, au moment précis où une sauvegarde doit fonctionner, le journal se remplit d’erreurs de chargement de chunks et le terrain comporte des trous. Deux méthodes permettent d’éviter ce problème.

Arrêter-copier-redémarrer est la méthode 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 world_nether world_the_end
sudo systemctl start minecraft

(Paper sépare les dimensions en world, world_nether et world_the_end. Un serveur vanilla conserve tout dans world. Supprimez donc les deux autres répertoires dans ce cas.)

Save-off permet de sauvegarder le serveur en fonctionnement : via RCON, exécutez save-off (arrêter la sauvegarde automatique), puis save-all flush (forcer l’écriture de toutes les données sur le disque et attendre), créez l’archive tar, puis exécutez save-on. C’est la version à placer dans cron à 5 h du matin.

Dans tous les cas, une sauvegarde stockée sur le même VPS que le serveur n’est pas une sauvegarde. scp ou rclone les archives vers une autre machine et conservez-en plusieurs. Comme vous ne surveillerez pas la console au moment d’une panne, ajoutez un contrôle externe du port : Uptime Kuma sur une autre machine effectue un contrôle TCP sur 25565 et vous indique que le serveur est indisponible avant vos joueurs.

Plugins et mises à niveau

Sur Paper, un plugin est simplement un fichier jar placé dans /opt/minecraft/plugins/, suivi d’un redémarrage. L’installation s’arrête là. 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 contient du code arbitraire exécuté par 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 points appellent votre attention. La mise à niveau d’un monde est irréversible : un monde ouvert avec une version plus récente ne s’ouvrira pas avec une version plus ancienne. Les sauvegardes sont donc indispensables. De plus, les plugins sont souvent compatibles avec une nouvelle version de Minecraft seulement après plusieurs jours ou semaines. Vérifiez leur compatibilité avant d’installer une nouvelle version dès sa sortie.

Si vous préférez gérer tout cela dans un conteneur, avec le pinning des versions, l’acceptation de l’EULA et les options de mémoire définis comme variables d’environnement, l’image itzg/minecraft-server, largement utilisée, exécute le même serveur Paper via Docker Compose sur votre VPS, avec 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 le serveur vanilla avec 2–5 joueurs ; 4 GB offrent un fonctionnement confortable pour un serveur privé 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 à une valeur inférieure ou égale à la RAM totale moins 1 GB : la JVM utilise de la mémoire en dehors du heap, et une valeur trop élevée provoque Error: Could not reserve enough space for object heap ou un kill OOM silencieux.

Pourquoi mes amis ne peuvent-ils pas se connecter à mon serveur Minecraft ?

Un blocage du client qui se termine par Connection timed out: no further information indique presque toujours un problème de firewall. Il y en a deux : ufw sur le VPS et le firewall réseau de votre fournisseur, dans le control panel. Le port TCP 25565 doit être ouvert dans les deux. 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 se connecter 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 ne fonctionnent alors plus correctement. Le seul usage légitime consiste à placer le serveur derrière un proxy d’authentification comme Velocity, qui vérifie lui-même les joueurs. Pour un serveur normal, la valeur 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 donnant accès à 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 identique au bit près, car certaines optimisations de Paper le modifient. Sur un petit VPS, l’efficacité de Paper équivaut pratiquement à 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 en parallèle de 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 soit le serveur, archivez les répertoires des mondes avec tar, puis redémarrez-le, soit laissez-le fonctionner avec save-off, save-all flush, tar et save-on via RCON. Déplacez ensuite l’archive hors du VPS.