Installer Minecraft 1.9, 1.10 sur serveur dédié Debian 8 Jessie

Minecraft on Linux Dans ce mini tutoriel nous allons voir comment installer un serveur Minecraft sur un serveur dédié et faire en sorte que nous n'ayons pas de maintenance ou du moins le minimum, je veux dire par là que le serveur Minecraft devra démarrer automatiquement à chaque démarrage ou redémarrage du serveur Linux. De plus nous mettrons en place un système de reboot automatique 3 fois par jours du serveur Minecraft avec un message dans le chat pour avertir les joueurs en ligne.

Préparation du serveur

Vous venez d'installer un serveur Debian 8 Jessie depuis l'interface d'administration de votre hébergeur, connectons nous à celui-ci en console et procédons à quelques vérifications

$ ssh root@***.***.***.***
root@***.***.***.***'s password:
root@monserveur:~#

Si on ne le sait pas encore identifions le type de processeur

# uname -m 
x86_64

Ceci nous permettra d'installer la version de java la mieux appropriée (version 64 bit dans mon cas)
Tiens à ce propos y-a-t il une version de java déjà installée?

# java -version
-bash: java : commande introuvable

Le message est limpide, aucune version de java n'est installé mais avant d'y remédier installons un outil qui nous sera utile par la suite:

# apt-get update
...
# apt-get upgrade
...
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.

Normal la machine vient d'être installée. Installons le programme screen qui nous permettra de fermer la console sans interférer avec le serveur Minecraft.

# apt-get install screen
screen est déjà la plus récente version disponible.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.

Bon hé bien on en apprends tous les jours.

Installer java

Il est souvent proposé d'installer java en ajoutant à la liste des dépôts le serveur webupd8team comme expliqué ici mais je n'aime pas beaucoup cette méthode alors faisons autrement.

Commençons par créer un répertoire là ou l'on souhaite installer java

root@monserveur:~# cd /usr
root@monserveur:/usr# mkdir java
root@monserveur:/usr# cd java

Télécharger l'archive java qui correspond à notre système, dans mon cas la version Linux-x64

root@monserveur:/usr/java# wget --output-document=jre-8u77-linux-x64.tar.gz http://javadl.oracle.com/webapps/download/AutoDL?BundleId=207221
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 71796315 (68M) [application/x-gzip]
Sauvegarde en : « jre-8u77-linux-x64.tar.gz »

jre-8u77-linux-x64.tar.gz         100%[===================================================>]  68,47M  11,2MB/s   ds 6,6s   

2016-04-03 18:44:02 (10,3 MB/s) — « jre-8u77-linux-x64.tar.gz » sauvegardé [71796315/71796315]

Et on extrait le contenu de cette archive ici même

root@monserveur:/usr/java# tar zxvf jre-8u77-linux-x64.tar.gz
...
root@monserveur:/usr/java# ls -l
drwxr-xr-x 6 uucp  143     4096 mars  21 06:09 jre1.8.0_77
-rw-r--r-- 1 root root 71796315 mars  21 16:11 jre-8u77-linux-x64.tar.gz

Il ne nous reste plus qu'à demander à Linux d'utiliser cette version quand on appèle la commande java

# update-alternatives --install /usr/bin/java java /usr/java/jre1.8.0_77/bin/java 100
update-alternatives: utilisation de « /usr/java/jre1.8.0_77/bin/java » pour fournir « /usr/bin/java » (java) en mode automatique

Et par mesure de sécurité on s'assure que le lien soit bien fait

# java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

EDIT: Si le retour de la commande ne vous dit rien et que vous êtes toujours en java 1.7 utilisez la commande # update-alternatives --config java qui vous permettra de switcher entre les versions.

Cool on continue ...

Installer le serveur Minecraft

Avant d'installer le serveur Minecraft il serait prudent de créer un nouvel utilisateur dont le rôle sera de l'administrer.

# adduser craftadmin
...
Entrez le nouveau mot de passe UNIX :
...
Cette information est-elle correcte ? [O/n]o

Puis on se connecte en tant qu'utilisateur craftadmin et on entre dans son répertoire personnel

# su craftadmin
$ cd /home/craftadmin

Créons un répertoire serveur où nous allons télécharger et installer le serveur Minecraft

$ mkdir serveur
$ cd serveur/
$ wget --no-check-certificate https://s3.amazonaws.com/Minecraft.Download/versions/1.9.2/minecraft_server.1.9.2.jar

Ici je récupère un serveur Minecraft vanilla 1.9.2, remplacez bien sûr par la version du serveur Minecraft que vous allez télécharger.

Procédons à un premier lancement du serveur

$ java -Xms1024M -Xmx1024M -jar minecraft_server.1.9.2.jar nogui
[20:10:25] [Server thread/INFO]: Starting minecraft server version 1.9.2
[20:10:25] [Server thread/INFO]: Loading properties
[20:10:25] [Server thread/WARN]: server.properties does not exist
[20:10:25] [Server thread/INFO]: Generating new properties file
[20:10:25] [Server thread/WARN]: Failed to load eula.txt
[20:10:25] [Server thread/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[20:10:25] [Server thread/INFO]: Stopping server
[20:10:25] [Server Shutdown Thread/INFO]: Stopping server

On constate que le serveur est presque immédiatement stoppé, la encore le message est claire, il faut accepter le contrat de licence pour pouvoir continuer.
Si vous faites un ls dans le répertoire serveur/ vous verrez un fichier eula.txt, il à été créé durant ce premier lancement.
Ouvrez le et remplacer la ligne eula=false par eula=true

Ceci fait on relance le serveur à nouveau

$ java -Xms1024M -Xmx1024M -jar minecraft_server.1.9.2.jar nogui
...
[20:40:06] [Server thread/INFO]: Preparing level "world"
[20:40:07] [Server thread/INFO]: Preparing start region for level 0
[20:40:08] [Server thread/INFO]: Preparing spawn area: 6%
[20:40:09] [Server thread/INFO]: Preparing spawn area: 13%
[20:40:10] [Server thread/INFO]: Preparing spawn area: 21%
[20:40:11] [Server thread/INFO]: Preparing spawn area: 28%
[20:40:12] [Server thread/INFO]: Preparing spawn area: 37%
[20:40:13] [Server thread/INFO]: Preparing spawn area: 46%
[20:40:14] [Server thread/INFO]: Preparing spawn area: 54%
[20:40:15] [Server thread/INFO]: Preparing spawn area: 60%
[20:40:16] [Server thread/INFO]: Preparing spawn area: 67%
[20:40:17] [Server thread/INFO]: Preparing spawn area: 73%
[20:40:18] [Server thread/INFO]: Preparing spawn area: 78%
[20:40:19] [Server thread/INFO]: Preparing spawn area: 84%
[20:40:20] [Server thread/INFO]: Preparing spawn area: 89%
[20:40:21] [Server thread/INFO]: Preparing spawn area: 95%
[20:40:22] [Server thread/INFO]: Done (16,100s)! For help, type "help" or "?"
|

Cette fois ci tout c'est bien passé, le serveur est démarré et n'attend plus que des joueurs s'y connectent.
On est désormais devant un prompt du serveur Minecraft d'où l'on peut lancer des commandes ou écrire des messages comme depuis un chat Minecraft.

Pour arrêter le serveur on tapera simplement stop.

Les valeurs -Xms1024M et -Xmx1024M de la commande de démarrage peuvent être modifiées en fonction de la mémoire RAM de votre serveur, par exemple si votre machine dispose de 16GO de ram alors vous pouvez aisément utiliser -Xms12G et -Xmx12G.

Pour information j'ai longtemps utilisé un petit serveur vps avec 2GO de ram qui suffisait amplement pour 3 ou 4 joueurs sur Minecraft vanilla 1.8.

Utiliser screen et aller dormir

Notre serveur Minecraft est donc fonctionnel mais il est nécessaire de se connecter et de le démarrer avec la longue commande ci-dessus chaque fois que l'on souhaite jouer, de plus la console doit rester ouverte tant qu'on l'utilise, pas très pratique.

Voyons donc comment utiliser le serveur avec screen (le serveur Minecraft doit être stoppé)

craftadmin@monserveur:~/serveur$ screen
Screen version 4.02.01 (GNU) 28-Apr-14
... bla bla ...
[Press Space for next page; Return to end.]
craftadmin@monserveur:~/serveur$

Jusque là il semble n'y avoir aucune différence et pourtant; relancez la commande de démarrage

$ java -Xms1024M -Xmx1024M -jar minecraft_server.1.9.2.jar nogui
... bla bla ...
[20:42:33] [Server thread/INFO]: Done (2,433s)! For help, type "help" or "?"
|

Maintenant pressez les touches [CTRL+a] puis [d] (d comme détacher)

Ne confondez pas [CTRL+a] puis [d] avec [CTRL+d] qui ferme screen et/ou la console

[detached from 25882.pts-0.monserveur]
craftadmin@monserveur:~/serveur$

Même si ça ne se voit pas screen fonctionne toujours et le serveur Minecraft aussi. On pourrait fermer la console, éteindre son pc local et aller se coucher.

Pour reprendre la main sur le serveur on procède ainsi:

$ screen -r

-r comme récupération

Une fois encore on pourrait en rester là mais il sera toujours nécessaire de se connecter pour redémarrer de temps à autre le serveur Minecraft.
Nous allons donc écrire un petit script bash qui permettra de démarrer, stopper ou redémarrer proprement et automatiser trois redémarrages par jour grâce à une tache cron.

Script d'arrêt/démarrage et tache cron

Minecraft Warning Copiez collez la totalité du script ci-dessous dans un fichier que nous allons nommer boot.sh
Au besoin modifiez les variables SCREEN_NAME URL_SERVER et JAR_SERVER selon votre convenance et votre configuration.

Vous pouvez placer ce fichier où vous voulez, dans mon cas il est à la racine du répertoire personnel de l'utilisateur craftadmin /home/craftadmin/boot.sh

Enfin n'oubliez pas de le rendre exécutable

$ chmod +x boot.sh

Le script boot.sh

#!/bin/bash

SCREEN_NAME="minecraft"
URL_SERVER="/home/craftadmin/serveur/"
JAR_SERVER="minecraft_server.1.9.2.jar"

cd $URL_SERVER

case $1 in
    "start")
        screen -dmS $SCREEN_NAME java -Xmx12G -Xms12G -jar $JAR_SERVER nogui
    ;;
    "stop")
        screen -S $SCREEN_NAME -p 0 -X stuff "title @a times 20 100 20 \r";
        screen -S $SCREEN_NAME -p 0 -X stuff 'title @a subtitle {"text":"perte du signal dans 1mn","color":"gold"} \r';
        screen -S $SCREEN_NAME -p 0 -X stuff 'title @a title {"text":"WARNING","bold":"true","color":"red"} \r';
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 60 secondes","color":"green","bold":"true"} \r'; sleep 30
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 30 secondes","color":"green","bold":"true"} \r'; sleep 10
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 20 secondes","color":"green","bold":"true"} \r'; sleep 10
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 10 secondes","color":"green","bold":"true"} \r'; sleep 5
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 5 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 4 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 3 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 2 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 1 seconde","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Signal perdu !!!","color":"yellow","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"; sleep 10
    ;;
    "reboot")
        screen -S $SCREEN_NAME -p 0 -X stuff "title @a times 20 100 20 \r";
        screen -S $SCREEN_NAME -p 0 -X stuff 'title @a subtitle {"text":"perte du signal dans 1mn","color":"gold"} \r';
        screen -S $SCREEN_NAME -p 0 -X stuff 'title @a title {"text":"WARNING","bold":"true","color":"red"} \r';
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 60 secondes","color":"green","bold":"true"} \r'; sleep 30
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 30 secondes","color":"green","bold":"true"} \r'; sleep 10
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 20 secondes","color":"green","bold":"true"} \r'; sleep 10
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 10 secondes","color":"green","bold":"true"} \r'; sleep 5
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 5 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 4 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 3 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 2 secondes","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Perte du signal dans 1 seconde","color":"red","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff 'tellraw @a {"text":"Signal perdu !!!","color":"yellow","bold":"true"} \r'; sleep 1
        screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"; sleep 10

        screen -dmS $SCREEN_NAME java -Xmx12G -Xms12G -jar $JAR_SERVER nogui
    ;;
    *)
        echo -e "Le script demande au moins un des parametres:\033[32m | start | stop | reboot |\033[0m"
    ;;
esac

Je ne vais pas détailler chaque ligne, sachez simplement que:

On appèlera le script avec un des trois arguments start | stop | reboot. Si aucun argument n'est indiqué il vous les rappèlera

$ ./boot.sh
Le script demande au moins un des parametres: | start | stop | reboot |

Donc pour démarrer

$ ./boot.sh start

pour redémarrer

$ ./boot.sh reboot

et pour arrêter

$ ./boot.sh stop

Enfin il ne reste plus qu'à éditer la contab ...

$ crontab -e

... et lui ajouter cette ligne

0 4,12,20 * * * bash /home/craftadmin/boot.sh reboot >> /home/craftadmin/cron.log 2>&1

Ce qui signifie que le script sera exécuté tous les jours à 4h00, 12h00 et 20h00, si une erreur survient elle sera notifiée dans le fichier cron.log.

l'édition de la crontab se fait en tant qu'utilisateur craftadmin

Démarrage auto et script chapeau

Il ne nous reste plus qu'un cas de figure que nous n'avons pas traité, l'arrêt/redémarrage volontaire ou non du serveur Linux.
En effet si on désire redémarrer le serveur Linux nous aurons trois étapes à réaliser à la main:

Heureusement avec Linux il est tout à fait possible d'exécuter un script bash au démarrage, redémarrage ou arrêt de la machine, c'est ce que nous allons faire par l'intermédiaire d'un script chapeau.

Copiez / collez le code ci-dessous dans un fichier que l'on va appeler chapeau.sh est placez le dans le répertoire /etc/init.d en ayant pris soins de lui donner les droits d'exécution chmod +x.

Cette opération ne peut être faite que par root.

#!/bin/bash
LOG_FILE="/home/craftadmin/chapeau.log"
ERR_FILE="/home/craftadmin/chapeau.err"
USER=craftadmin

exec 1>$LOG_FILE
exec 2>$ERR_FILE

case "$1" in
    'start')
       su - $USER -c "/home/craftadmin/boot.sh start"
    ;;
    'stop')
       su - $USER -c "/home/craftadmin/boot.sh stop"
    ;;
esac

Il faut ensuite créer les liens dans les répertoires /etc/rcX.d, rassurez vous dans notre cas une configuration par défaut est suffisante et cette commande vas tout faire à notre place.

# update-rc.d chapeau.sh defaults

Malgré le message insserv: warning: script 'chapeau.sh' missing LSB tags and overrides les liens sont bien créés dans les répertoires rc0.d à rc6.d

Pour en savoir plus à propos des runlevels voir ici

Voila, redémarrez votre serveur Linux pour vérifier que tout fonctionne et consultez les fichiers de logs en cas d'erreur.

Bonus serveur

Adresse serveur Minecraft 1.10 Vanilla sans white liste : SERVEUR DOWN ... reviendra plus tard

ATTENTION le serveur peut être reset à tout moment sans préavis.

^