SSD Nodes Learn
Guides Matt ConnorPar Matt Connor · Mis à jour le 2026-07-19

Héberger un serveur Minecraft sur un VPS

Faites tourner un serveur Minecraft Paper sur un VPS Ubuntu 24.04 : taille RAM, Java 21, unité systemd, les deux pare-feu sur 25565 et sauvegardes sûres.

Ce que vous allez construire

Un serveur Minecraft Java Edition qui reste en ligne : Paper sur Ubuntu 24.04, exécuté sous un utilisateur minecraft dédié via systemd avec Restart=on-failure, la liste blanche activée, le port 25565 ouvert dans les deux pare-feu qui se dressent entre vos joueurs et la JVM, et des sauvegardes prises d'une manière qui ne corrompt pas le monde qu'elles sont censées protéger. Le serveur lui-même se résume à un jar et une commande java ; tout ce qui sépare un serveur sur lequel vos amis jouent pendant un an d'un serveur qui meurt le premier week-end se trouve autour de cette commande, et c'est ce que couvre ce guide.

Deux avertissements honnêtes avant de dépenser de l'argent. Premièrement, Minecraft est gourmand en mémoire et surtout mono-thread : un VPS de 1 Go ne fera pas tourner 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 (consoles, téléphones, l'application Bedrock de Windows) ne peuvent pas rejoindre un serveur Java ; Bedrock nécessite un autre logiciel serveur sur UDP 19132, ou le plugin Geyser, qui sort du cadre de ce guide.

Il vous faut un VPS KVM Ubuntu 24.04 tout neuf avec un accès root ou sudo, et environ trente minutes.

Dimensionnement : ce dont un serveur entre amis a réellement besoin

La RAM est le chiffre qui compte, et les valeurs honnêtes sont plus basses que ce que suggèrent les forums de modpacks :

  • 2 Go font tourner la version vanilla pour 2 à 5 joueurs avec une distance d'affichage modeste. Jouable, sans marge.
  • 4 Go correspond à la taille confortable d'un serveur entre amis : environ dix joueurs simultanés sur Paper avec une poignée de plugins, et assez de mémoire restante pour le système.
  • 8 Go et plus relèvent du modpack et des serveurs de plus de 20 joueurs, où vous devez aussi vous soucier de la vitesse mono-cœur du CPU, car la boucle de jeu principale tourne sur un seul thread.

Le monde grandit aussi sur le disque à mesure que les joueurs explorent (un monde de survie très parcouru atteint plusieurs gigaoctets), alors laissez de la marge pour le monde et ses sauvegardes.

Vanilla ou Paper ? Paper est un remplacement direct du jar officiel : mêmes mondes, mêmes clients, aucun mod côté client nécessaire. Il réécrit les chemins de code les plus lents du serveur (chargement des chunks, mise à jour des entités, entonnoirs) et ajoute une API de plugins. La seule raison de faire tourner la version vanilla est si vous avez besoin d'une mécanique vanilla exacte au bit près pour des fermes à redstone techniques que les optimisations de Paper peuvent altérer ; pour tous les autres, Paper offre plus de joueurs par gigaoctet. Tout ce qui suit fonctionne pour les deux.

Étape 1 : installer Java 21

Minecraft 1.20.5 et toutes les versions depuis (tout 1.21.x) nécessitent Java 21. Ubuntu 24.04 le fournit dans les dépôts par défaut, et la version headless évite les bibliothèques de bureau qu'un serveur n'utilisera jamais :

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 prend le dessus ; corrigez cela avec sudo update-alternatives --config java et choisissez l'entrée contenant java-21.

Sauter cette vérification produit plus tard l'erreur de serveur Minecraft la plus recherchée sur Google. Avec Java 17, le jar du serveur meurt instantanément 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 65.0),
	this version of the Java Runtime only recognizes class file versions up to 61.0

Les nombres décodent l'incompatibilité : la version de fichier de classe 65.0 correspond à Java 21, 61.0 à Java 17, 60.0 à Java 16. Quelle que soit la paire que vous voyez, la correction est la même : installez le JRE plus récent et relancez update-alternatives.

Étape 2 : un utilisateur dédié, jamais root

Le serveur exécute du code de plugin et analyse les données réseau de quiconque peut atteindre le port. Si cela tourne mal un jour, une compromission qui s'exécute en root possède votre VPS ; une qui s'exécute en tant que minecraft ne possède qu'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 via SSH, avec /opt/minecraft comme répertoire personnel et de travail. À partir de maintenant, chaque commande qui touche au serveur s'exécute sous cet utilisateur.

Étape 3 : télécharger le jar du serveur depuis la source officielle

Seuls deux endroits devraient vous fournir un jar de serveur : la page de téléchargement officielle du serveur sur minecraft.net pour la version vanilla, la page de téléchargements sur papermc.io pour Paper. Les "hubs de téléchargement" tiers qui reconditionnent les jars de serveur sont depuis longtemps un canal de diffusion de malware : un jar de serveur est du code arbitraire que vous vous apprêtez à exécuter 24 h/24 et 7 j/7 sur une machine exposée à Internet.

Copiez le lien de téléchargement de la version actuelle depuis la page officielle (l'URL change à chaque version et build, donc en coder une en dur ici deviendrait vite obsolète), puis :

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

Résultat attendu : un server.jar d'environ 50 Mo appartenant à minecraft, confirmé avec ls -lh /opt/minecraft/server.jar.

Étape 4 : premier lancement, l'EULA et se donner le statut op

Lancez le serveur une fois en mode interactif avant de toucher à systemd : le premier lancement a deux tâches que seule une console en direct accomplit bien.

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

Il se termine en quelques secondes (Paper passe d'abord quelques instants de plus à appliquer ses correctifs), et 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 ; c'est une barrière de licence. Le lancement a écrit eula.txt à côté du jar. Lisez l'EULA liée si ce n'est pas déjà fait, puis basculez le drapeau :

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

Relancez la même commande java. Cette fois, il génère le monde (une minute ou deux au premier démarrage) et se stabilise sur :

[Server thread/INFO]: Done (9.204s)! For help, type "help"

Vous avez maintenant une console en direct. Utilisez-la pour la deuxième tâche : tapez op YourMinecraftName (votre nom d'utilisateur exact en jeu) et le serveur vous inscrit dans ops.json, de sorte que plus tard, quand aucune console n'est attachée, vous pourrez exécuter chaque commande d'administration depuis l'intérieur du jeu. Tapez ensuite stop pour sauvegarder et quitter proprement.

Étape 5 : server.properties, et pourquoi online-mode reste à true

Le premier lancement a aussi écrit server.properties. La plupart des valeurs par défaut conviennent ; voici les lignes qui méritent une décision réfléchie :

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 fait que le serveur vérifie chaque nom d'utilisateur qui se connecte auprès des serveurs de session de Mojang, prouvant que le joueur possède le compte. Le mettre à false (l'option du "serveur crack") signifie que le serveur croit n'importe quel client sur parole quant à son identité : n'importe qui peut se connecter sous n'importe quel nom, y compris le vôtre, et comme les ops et les listes blanches sont indexés par nom, un usurpateur entre avec vos permissions d'opérateur. La seule raison légitime pour qu'il soit à false est derrière un proxy d'authentification comme Velocity, qui vérifie les joueurs lui-même. Sur un serveur normal, il reste à true, un point c'est tout.

view-distance est le plus grand levier de performance du fichier : le coût en CPU et en RAM évolue à peu près avec son carré. 8 est une valeur par défaut raisonnable pour un VPS ; 10 est la valeur par défaut de la version vanilla et nettement plus lourde.

white-list=true plus enforce-whitelist=true ferment le serveur aux inconnus, ce que la section sécurité ci-dessous présente comme non optionnel. Ajoutez des joueurs avec /whitelist add TheirName en jeu en tant qu'op.

Étape 6 : les options mémoire, pourquoi -Xms et -Xmx doivent correspondre

La JVM alloue son tas (heap) entre -Xms (taille de départ) et -Xmx (plafond). Sur un serveur de jeu dédié, réglez-les sur la même valeur : le tas atteindra le plafond de toute façon, et le faire grandir par paliers ne fait qu'ajouter de l'agitation du ramasse-miettes pendant le jeu. Sur un VPS de 4 Go, la bonne paire est :

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx n'est pas la mémoire totale utilisée par le processus. La JVM ajoute une surcharge hors-tas (piles de threads, caches JIT, tampons directs) d'environ un demi-gigaoctet ou plus, et Ubuntu lui-même a besoin de place. La règle pratique : -Xmx au maximum égal à la RAM du VPS moins 1 Go. Dépassez et vous obtenez l'une des deux défaillances. Si l'allocation échoue d'emblée, le serveur refuse de démarrer avec :

Error: Could not reserve enough space for object heap

Celle-ci est honnête et immédiate. La version plus vicieuse démarre bien et meurt des heures plus tard, quand le tas se remplit sous la charge et que le tueur OOM (out of memory) du noyau choisit le plus gros processus de la machine, la JVM. Rien n'apparaît dans le journal du serveur ; la preuve se trouve dans sudo dmesg | grep -i oom, une ligne du genre Out of memory: Killed process 1234 (java). Si votre service redémarre "au hasard", vérifiez là en premier, et baissez -Xmx.

Pour Paper, le projet documente les flags d'Aikar : un jeu G1GC réglé (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 et une douzaine d'autres) qui lisse les pauses du ramasse-miettes sur les grands tas. Générez la ligne complète depuis la documentation de Paper ; sur un tas de 2 à 4 Go, le gain est modeste mais les flags sont sans danger.

Étape 7 : une unité systemd avec Restart=on-failure

Un serveur lancé à la main meurt avec votre session SSH et reste hors service 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 transporte désormais la sortie de la console du serveur) se termine de nouveau à la ligne Done.

Deux choix délibérés dans cette unité. Restart=on-failure relance le serveur après un plantage mais pas après un stop propre, de sorte que la maintenance reste possible. Et TimeoutStopSec=120 compte plus qu'il n'y paraît : systemctl stop envoie SIGTERM, le serveur Minecraft l'intercepte et sauvegarde chaque monde avant de quitter, et sur un grand monde cette sauvegarde prend du temps. Le délai par défaut de systemd peut envoyer un SIGKILL à la JVM en pleine sauvegarde, ce qui est exactement la façon dont les fichiers de région se corrompent. Accordez-lui deux minutes.

Si le service tremblote 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 quelque chose occupe déjà 25565, presque toujours votre lancement au premier plan d'avant, encore actif dans une autre session SSH. Trouvez-le avec sudo ss -tlnp | grep 25565 et arrêtez cette copie ; ne faites jamais tourner deux serveurs sur un même port.

Étape 8 : ouvrir 25565 sur les deux pare-feu

Minecraft Java utilise uniquement le TCP 25565 (l'UDP n'est que le protocole de requête optionnel, désactivé par défaut). Sur le VPS :

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

Voilà le premier pare-feu. La plupart des fournisseurs de VPS font tourner un second pare-feu, au niveau réseau, dans le panneau de contrôle, et c'est celui que les gens oublient. Ouvrez aussi le TCP 25565 là-bas. Le symptôme quand on n'ouvre qu'un seul des deux est d'une imprécision exaspérante : le client reste bloqué sur "Connexion au serveur..." et échoue avec Connection timed out: no further information, sans refus, sans erreur serveur, rien dans le journal, parce que les paquets ne sont jamais arrivés. Vérifiez depuis une machine à l'extérieur du VPS avec nc -vz your.server.ip 25565 ; succeeded signifie que les deux pare-feu sont ouverts, un blocage signifie qu'au moins un ne l'est pas.

Pendant que vous êtes dans ufw, la même machine fait tourner SSH sur une IP publique, et le bruit des tentatives de force brute dans les journaux commence en quelques heures : configurez Fail2ban pour SSH sur Ubuntu 24.04 avant de l'oublier.

Connectez-vous maintenant : Multijoueur, Connexion directe, l'IP du serveur. Comme vous vous êtes donné le statut op à l'étape 4, les commandes en jeu fonctionnent immédiatement : /whitelist add FriendName pour chaque joueur, /gamemode creative si c'est le plan.

Étape 9 : la liste blanche, parce qu'Internet trouve le port 25565

Laisser un serveur Minecraft ouvert sur Internet n'est pas un risque théorique : des scanners de masse balaient en continu tout l'espace IPv4 à la recherche du port 25565 (des projets amateurs de griefing ont cartographié des centaines de milliers de serveurs ouverts de cette manière), et un serveur sans liste blanche reçoit des visiteurs non invités en quelques jours, parfois quelques heures. La liste blanche de l'étape 5 est la solution : online-mode=true prouve l'identité, la liste blanche restreint l'entrée aux identités que vous avez choisies. Cette paire constitue tout le modèle de sécurité, et elle suffit pour un serveur entre amis.

Pour un accès à la console sans le jeu (sauvegardes scriptées, une tâche cron), activez RCON dans server.properties (enable-rcon=true, un rcon.password solide, port 25575) et compilez le petit client mcrcon depuis sa source GitHub directement sur le VPS ; il n'est pas dans les dépôts d'Ubuntu. N'ouvrez pas le 25575 dans un pare-feu : RCON envoie le mot de passe en clair, il reste donc uniquement en loopback.

Étape 10 : des sauvegardes qui ne corrompent pas le monde

La règle unique : ne copiez jamais un répertoire de monde pendant que le serveur y écrit. Les fichiers de région sont réécrits en continu pendant le jeu ; un tar qui entre en concurrence avec une écriture produit une archive avec des chunks à moitié écrits, et quand vous finissez par la restaurer (le seul moment où une sauvegarde doit fonctionner), le journal se remplit d'erreurs de chargement de chunks et le terrain a des trous. Deux disciplines évitent cela.

Arrêter-copier-démarrer est la méthode simple, au prix d'une minute d'indisponibilité :

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 répartit les dimensions en world, world_nether et world_the_end ; un serveur vanilla garde tout dans world, alors supprimez les deux autres dans ce cas.)

Save-off sauvegarde à chaud : via RCON, lancez save-off (arrête la sauvegarde automatique), puis save-all flush (force tout sur le disque et attend), prenez le tar, puis save-on. C'est la version à placer dans cron à 5 h du matin.

Dans les deux cas, une sauvegarde posée sur le même VPS que le serveur n'est pas une sauvegarde : transférez les archives hors de la machine avec scp ou rclone, et gardez-en plus d'une. Et comme vous ne serez pas devant la console quand quelque chose casse, mettez une vérification externe sur le port : Uptime Kuma sur une autre machine effectuant une vérification TCP sur 25565 vous prévient que le serveur est tombé avant vos joueurs.

Plugins et mises à niveau

Sur Paper, un plugin est un jar déposé dans /opt/minecraft/plugins/ suivi d'un redémarrage : c'est toute l'installation. Ne récupérez les plugins que depuis leurs pages de projet officielles (Hangar, Modrinth, SpigotMC), pour la même raison que le jar du serveur : chacun est du code arbitraire s'exécutant sous l'utilisateur minecraft.

Mettre à niveau le serveur consiste à : arrêter, sauvegarder, remplacer server.jar par la version pour la nouvelle version de Minecraft, démarrer. Deux précautions. Les mises à niveau de monde sont à sens unique : un monde ouvert par une version plus récente ne s'ouvrira pas dans une plus ancienne, ce qui est une autre raison d'avoir les sauvegardes. Et les plugins accusent souvent un retard de plusieurs jours ou semaines sur une nouvelle version de Minecraft, alors vérifiez la compatibilité avant de courir après une version dès le premier jour.

Si vous préférez gérer tout cela sous forme de conteneur (épinglage de version, acceptation de l'EULA et options mémoire sous forme de variables d'environnement), l'image très répandue itzg/minecraft-server fait tourner le même serveur Paper sous Docker Compose sur votre VPS avec la même discipline de pare-feu et de sauvegarde.

FAQ

Combien de RAM faut-il pour un serveur Minecraft ?

2 Go font tourner la version vanilla pour 2 à 5 joueurs ; 4 Go sont confortables pour un serveur entre amis d'environ dix joueurs sur Paper avec quelques plugins ; les modpacks et plus de 20 joueurs demandent 8 Go ou plus. Quelle que soit la taille du VPS, réglez -Xmx au maximum sur la RAM totale moins 1 Go : la JVM utilise de la mémoire au-delà du tas, et un dépassement se termine par Error: Could not reserve enough space for object heap ou une mise à mort OOM silencieuse.

Pourquoi mes amis n'arrivent-ils pas à se connecter à mon serveur Minecraft ?

Un client qui se bloque et finit par Connection timed out: no further information signifie presque toujours un pare-feu, et il y en a deux : ufw sur le VPS et le pare-feu réseau de votre fournisseur dans le panneau de contrôle. Le TCP 25565 doit être ouvert dans les deux. Confirmez que le serveur écoute réellement avec sudo ss -tlnp | grep 25565 sur la machine, puis testez depuis l'extérieur avec nc -vz your.server.ip 25565.

Faut-il mettre online-mode=false dans server.properties ?

Non. Avec online-mode=false, le serveur saute entièrement l'authentification Mojang, donc n'importe qui peut se connecter sous n'importe quel nom d'utilisateur (y compris le nom d'un op, en héritant de ses permissions), et les skins et les UUID stables cassent. Le seul usage légitime est derrière un proxy d'authentification comme Velocity qui vérifie les joueurs lui-même. Pour un serveur normal, il reste à true.

Paper est-il meilleur que le serveur Minecraft vanilla ?

Pour presque tout le monde, oui : Paper est un jar de remplacement direct qui charge les mondes vanilla, accepte les clients non modifiés, met à jour les entités et charge les chunks bien plus efficacement, et ajoute l'écosystème de plugins. L'exception concerne les communautés de redstone technique qui ont besoin d'un comportement vanilla exact au bit près, que certaines optimisations de Paper altèrent. Sur un petit VPS, l'efficacité de Paper équivaut à de la RAM supplémentaire gratuite.

Comment sauvegarder un monde Minecraft sans le corrompre ?

N'archivez jamais le répertoire du monde pendant que le serveur y écrit : une copie qui entre en concurrence avec une écriture de fichier de région produit des chunks corrompus que vous ne découvrez qu'au moment de la restauration. Soit vous arrêtez le serveur, archivez les répertoires du monde avec tar, puis le redémarrez, soit vous le gardez actif avec save-off, save-all flush, tar, save-on via RCON. Déplacez ensuite l'archive hors du VPS.

#minecraft#game-server#java#ubuntu#auto-hébergement