Serveur minecraft

Déploiement d'un serveur Minecraft sur Azure avec Docker | Blog de Jonathan Peppers | Xamarin MVP | Développeur C # .Net | Bowling Green, KY – Un bon serveur Minecraft

Le 15 juin 2019 - 15 minutes de lecture

Cette semaine chez Microsoft, c’est "One Week" – un hackathon qui dure toute la semaine et qui nous permet de travailler sur des projets open source pour le plaisir. Cela me semble bien!

Pour une chose sur laquelle je voulais travailler, je voulais me concentrer sur un projet différent de celui que je réalisais avec l'équipe Xamarin.Android.
    Quelque chose utilisant Windows Azure, Docker et éventuellement une langue de programmation autre que C #.
    Je joue avec un serveur open source pour Minecraft: Pocket Edition nommé Nukkit, qui semblait être un projet amusant à "bidouiller".
    Il est écrit en Java par des passionnés de Minecraft (comme vous pouvez l’imaginer) et provient d’un serveur conçu pour la version PC de Minecraft, Bukkit.
    Nukkit est le meilleur logiciel que j'ai trouvé pour supporter Minecraft: PE, bien que ce soit dans un état expérimental.
    Soutenir l’éducation physique est une nécessité, car ma nièce, mon neveu et mon fils jouent tous à ce jeu. seulement appareils mobiles.

J'ai fait tout cela sous OS X, mais je suppose que cela fonctionnerait également sous Windows. Commencez par cloner (ou forger) leur rapport de Github.
    La prochaine chose dont vous aurez besoin est Maven, si vous ne l'avez pas déjà.
    Je l'ai installé avec Homebrew via un rapide brasser installer maven commander.

Ensuite, il ne reste plus que quelques commandes shell à compiler pour Nukkit:

Cela construira nukkit-1.0-SNAPSHOT.jar au cible annuaire.

Si vous n'avez jamais consulté Maven auparavant, il s'agit d'un autre format de construction pour Java.
    Un seul fichier pom.xml configure la construction, et est un format XML assez simple.
    Si vous souhaitez utiliser le projet dans un environnement de développement intégré, je vous recommanderais l'édition communautaire gratuite d'IntelliJ et il vous suffira d'ouvrir le répertoire racine cloné à partir de Github.
    Vous devriez voir un avertissement / une astuce indiquant que pom.xml n’est pas géré par IntelliJ, si vous cliquez dessus, c’était tout ce dont j’avais besoin pour travailler sur le projet et compiler dans IntelliJ.

NOTE: si vous ne voulez pas compiler à partir des sources, vous pouvez aussi récupérer une compilation de nukkit.jar de leur public Jenkins CI.

De là, je recommanderais de déménager nukkit-1.0-SNAPSHOT.jar à son propre répertoire quelque part, j'ai choisi ~ / minecraft.
    Pour exécuter Nukkit, il suffit de:

Une fois que Nukkit est opérationnel, il y a une invite de commande intéressante pour émettre des commandes dans le jeu.
    Type Aidez-moi voir une liste d'entre eux; Arrêtez arrête le serveur.
    Pour rejoindre le serveur, si vous avez un appareil sur le réseau local, vous devez voir le serveur répertorié exactement comme pour un jeu P2P. Magie complète!

D'après ce que j'ai vu, Nukkit stocke ses données dans quelques fichiers / répertoires comme suit:

  • nukkit.yml – l'un des principaux fichiers de configuration
  • server.properties – un autre fichier de configuration principal (je ne sais pas pourquoi il y en a deux)
  • des mondes directory – structure d'un ou plusieurs "mondes" enregistrés sur le serveur
  • joueurs répertoire – stocke les données sur chaque joueur rejoint dans un PLAYER_NAME.dat fichier
  • plugins répertoire – pour les plugins personnalisés à installer (plus de détails plus tard)
  • les journaux répertoire – rapports d'incident et sortie de la console

Il y a aussi quelques autres fichiers ici, mais ce sont ceux qui semblent importants.

Si vous avez déjà fréquenté des enfants qui jouent à Minecraft: PE, ils seulement jouer en mode créatif.
    Modifions notre server.properties fichier pour y arriver:

motd est le nom du serveur qui apparaît dans l'interface utilisateur de Minecraft, alors assurez-vous de mettre quelque chose de divertissant.
mode de jeu est 1 pour la création ou 2 pour la survie.

Il s'avère que la fonctionnalité de base de Nukkit manque de quelques éléments, mais ils ont heureusement inclus un modèle de plugin pour étendre Nukkit.
    J'ai utilisé deux plugins qui répondent principalement à ce que nous voulions:

  • EssentialsNK – ajoute façon plus de commandes à l'invite de commande
  • MobPlugin – fait bouger les animaux / ennemis

Vous pouvez trouver toutes sortes de plugins pour Nukkit ici, mais votre kilométrage peut varier.

Pour utiliser ces plugins, vous pouvez soit les faire compiler à partir de la source via paquet mvn, ou trouvez une version de téléchargement / Github contenant les fichiers jar résultants.
    Pour installer un plugin, il suffit de déposer le fichier jar dans le dossier plugins annuaire. Vous devriez voir un message tel que Activation de EssentialsNK v1.0.8 lors de l'exécution de Nukkit.

Une fois que votre serveur personnalisé fonctionne, la première chose dont vous avez besoin est d’atteindre les niveaux que votre public cible n’a jamais vus.
    Il existe de nombreux niveaux / cartes de Minecraft sur Internet, mais la recherche de Minecraft sur Google peut vous conduire à une contrée désastreuse regorgeant de logiciels malveillants – soyez prudent.
    Quelques sites que je recommanderais qui ont des cartes de travail sont sur Curse et Minecraft Maps.
    Les liens de téléchargement sur Minecraft Maps vous envoient des annonces terribles, mais les cartes elles-mêmes sont très bonnes.

Lorsque vous téléchargez une carte, ce sera un fichier zip énorme. J'ai trouvé seulement certains des fichiers comptent réellement.
    Je vais vous montrer comment configurer une carte que j'ai téléchargée depuis Curse ici, nommée Diversité 2.
    Faire un répertoire à NUKKIT_ROOT / mondes / diversité et copier level.dat et le Région répertoire du fichier zip dans celui-ci.

Ensuite, nous devrons apporter quelques modifications à notre nukkit.yml et server.properties des dossiers:

À partir de là, lancez votre serveur et connectez-vous à partir de votre appareil mobile. Vous devriez être plongé dans le monde que vous venez de télécharger sur Internet, pas trop mal!

Pour ajouter plusieurs mondes, répétez le processus ci-dessus et ajoutez des lignes supplémentaires à votre nukkit.yml fichier.
    Si vous voulez créer de nouveaux mondes à partir de rien, ajoutez simplement les noms au fichier yml et Nukkit créera les répertoires selon vos besoins.
    Pour parcourir les mondes lorsque votre serveur est en cours d’exécution, j’utilise quelques commandes fournies par EssentialsNK plugin nous avons installé plus tôt:

  • op PLAYER_NAME – parfois nécessaire, selon la commande. Cela fait du joueur un "admin".
  • sudo PLAYER_NAME monde WORLD_NAMEsudo permet au serveur d'exécuter une commande en tant que joueur, tandis que monde téléporte le joueur entre les mondes

C’est plutôt cool, car il n’existe vraiment aucun moyen d’avoir plusieurs «mondes» en même temps dans un même jeu P2P Minecraft connecté entre deux appareils mobiles.
    Plusieurs joueurs peuvent rejoindre le serveur et faire leur propre chose dans des mondes distincts.
    Il est également bon de savoir que ces commandes peuvent également être exécutées par les joueurs en chat en tapant / world WORLD_NAME, par exemple.
    Croyez-moi, tout ça va faire sauter les enfants. C'est un moyen incroyable de les faire entrer dans la pseudo-programmation (via une CLI), et ils peuvent commencer à voir à quel point la programmation peut être amusante!

Cartes héritées

Certaines cartes que vous trouverez sur Internet sont dans un format différent de celui mentionné ci-dessus.
    Si Nukkit trouve l'une de ces cartes, il effectuera un processus d'importation, imprimera probablement de nombreuses erreurs, puis fera migrer le monde vers le nouveau format.
    Ces anciennes cartes auront un db répertoire et un seul level.dat fichier. Installez-les dans le des mondes répertoire comme vous l'avez fait auparavant.
    Après la migration, Nukkit les déplacera vers LEVEL_NAME.old et garder le niveau migré dans un LEVEL_NAME dossier.
    Si vous avez besoin de migrer un niveau, je vous recommande de le faire localement et de placer les fichiers de niveau migrés dans votre image de menu fixe – passons maintenant à la discussion sur le menu fixe.

Jusqu'à présent, tout cela fonctionnait dans mon environnement de développement local. Ce n'est pas vraiment une étape de porter notre serveur sous Windows Azure et de le faire fonctionner sur Internet.
REMARQUE: si vous souhaitez exécuter Nukkit pendant une période prolongée sur un serveur public, certaines précautions de sécurité peuvent être nécessaires ici. Je pourrais écrire un prochain article à ce sujet si je découvre quelque chose.

Tout d’abord, créez une machine virtuelle Linux de votre choix, mais je viens de choisir la Ubuntu Server 16.04 LTS image.
    Assurez-vous que vous pouvez ssh dans la VM et que vous êtes à l'aise pour exécuter des commandes.
    Ensuite, installons Docker via sudo apt install docker.io.
    C’est vraiment tout ce que nous aurons besoin d’installer ici, si vous utilisez d’autres distributions, vous aurez peut-être besoin de Java, etc.

Azure devrait déjà avoir créé un groupe de sécurité réseau pour votre machine virtuelle. Nous devons ouvrir le port 19132 pour que Nukkit puisse fonctionner sous les règles de sécurité entrantes:

Règles de sécurité entrantes

NOTE: Je ne sais pas si cela est sécurisé ou la meilleure pratique. Je recommande de simplement arrêter la machine virtuelle lorsque vous ne l'utilisez pas.

Nukkit est un exemple parfait d'application pouvant être "dockerisée". Il n'a pas de dépendances et doit simplement utiliser le système de fichiers local.
    Dans l’ensemble, c’était un bon début pour moi d’apprendre à connaître Docker. Si vous n’avez pas utilisé ou entendu parler de docker, c’est un moyen de regrouper votre application et ses dépendances dans un conteneur isolé (ou un groupe de conteneurs).
    Cela configure notre application pour avoir son propre système de fichiers dans un bac à sable isolé des autres conteneurs de la même machine.

Si vous n'avez jamais utilisé Docker auparavant, installez l'environnement de bureau / dev sur docker.com.

Ensuite, créez un nouveau répertoire vide pour commencer à développer votre image Docker. J'ai utilisé un dépôt Github pour cela, ce qui était très logique pour moi.
    Laissez tomber nukkit-1.0-SNAPSHOT.jar, nukkit.yml, server.properties, et tous les fichiers de plugin souhaités dans le répertoire.

Ensuite écrivons notre premier Dockerfile, un fichier texte brut nommé en tant que tel pour configurer notre image:

Pour décomposer ce que nous avons fait ici:

  • DE anapsix / alpine-java – base notre image sur une image existante sur DockerHub
  • ENTRETIEN Jon – il suffit de mettre votre nom, je suppose
  • COPY src destination – construire la structure de fichier de notre image
  • WORKDIR / home / – définir le répertoire de travail
  • CMD java -jar /home/nukkit-1.0-SNAPSHOT.jar – lancer Nukkit

Je ne sais pas si cela correspond aux meilleures pratiques, mais j'ai organisé la structure de fichier suivante dans mon image comme suit:

  • /home/nukkit-1.0-SNAPSHOT.jar
  • /home/nukkit.yml
  • /home/server.properties
  • / home / mondes
  • /home/plugins/EssentialsNK-1.0.8.jar
  • /home/plugins/MobPlugin-1.1-DEV.jar

Pour construire l'image, accédez à ce répertoire et exécutez docker construire. -t nukkit. Cela construira une image nommée nukkit c'est une copie autonome de tous ces fichiers.

Pour exécuter un conteneur avec cette image, exécutez docker run -it -p 19132: 19132 / udp –nom-nukkit nukkit. Cela lancera un conteneur nommé nukkit de manière interactive, ouvrez le port UDP 19132 et utilisez le nukkit image.
    Cela ressemblera à ce que vous avez fait lorsque vous avez exécuté Nukkit normalement, à la différence qu’il s’exécute maintenant dans un bel environnement de docker en sandbox. Vous pouvez maintenant courir docker ps pour afficher les conteneurs en cours, et vous pouvez supprimer le conteneur via docker rm nukkit.
    Le seul inconvénient ici est que si nous détruisons le conteneur et le recréons, nous perdons tout état du système de fichiers.

Alors, comment conserver des fichiers dans Docker?

Docker a le concept de les volumes pour la persistance des données. Vous pouvez les mapper vers des répertoires personnalisés, mais j'ai préféré laisser simplement docker gérer les volumes comme suit:

  • docker volume crée des mondes –name
  • docker volume create logs –name
  • docker volume create –name players
  • docker volume create –name plugins

Ensuite, nous pouvons modifier un peu notre commande docker pour utiliser ces volumes:

Docker place ces volumes physiquement sur la machine hôte à / var / lib / docker / volumes / VOLUME_NAME / _data, gardez cela à l’esprit si vous voulez regarder ces fichiers.
    Dans le conteneur en cours d'exécution, le docker mappera le / home / mondes répertoire et d’autres répertoires à l’emplacement physique de la machine hôte.

Jusqu'à présent, nous avons déployé notre conteneur Docker dans un environnement de développement local – nous avons besoin de cela sur Internet, n'est-ce pas?
    Il y a beaucoup manières d'y parvenir: DC / OS, Kubernetes, Docker Swarm, un registre de conteneurs Azure, etc., mais je souhaitais vous présenter en quelques mots la méthode la plus simple.
    Si vous connaissez un peu ssh, vous avez peut-être utilisé une fonctionnalité appelée redirection de port.
    Lorsqu'une connexion ssh est établie, vous avez la possibilité de transférer un port sur localhost vers un port distant sur la destination de la connexion ssh.
    Heureusement, l'interface de ligne de commande du docker dispose également d'un mode permettant d'administrer à distance le docker s'exécutant sur une autre machine via un réseau.
    Nous pouvons utiliser les deux fonctionnalités ensemble pour exécuter des commandes docker localement sur notre machine virtuelle s'exécutant dans Azure.

Pour ce faire, nous devons d’abord redémarrer le démon docker sur la machine virtuelle. Par défaut, le démon docker n'autorise pas l'administration à distance, nous devons donc l'activer:

Notez que ce port n’est pas ouvert sur l’Internet public. Nous ouvrons le port sur localhost sur la machine virtuelle afin de pouvoir utiliser le tunneling SSH à distance pour y accéder.
    A partir de là, basculez vers une invite de commande sur votre ordinateur dev local:

Après avoir exécuté cette commande, vous pouvez vous connecter localement au port 2375 pour acheminer le trafic sur le tunnel SSH et arriver à localhost à l'intérieur de la machine virtuelle.
    Ce n’est pas une chose à laquelle les développeurs Windows sont habitués, mais vous pouvez toujours faire tout cela sous Windows en utilisant Putty.
    Le tunnel SSH existe depuis longtemps, mais si vous ne l'utilisez pas, jetez plutôt un coup d'oeil au registre de conteneurs Azure.
    Il s'agit d'un service Azure dans lequel vous pouvez envoyer des images du menu fixe à (un DockerHub privé), puis les abaisser pour s'exécuter dans la machine virtuelle.

Une fois le tunnel SSH établi, vous pouvez définir la variable d’environnement. DOCKER_HOST à : 2375.
    Une fois la variable env définie, toutes les commandes futures de votre menu fixe dans votre terminal communiqueront avec 2375, qui se trouve être notre machine virtuelle s'exécutant sur Azure.
    Si vous voulez tester cela fonctionne, essayez de lancer info docker et vous devriez voir des informations sur la machine avec laquelle le docker cli parle.

Pour rassembler tout cela, j'ai écrit un script shell minuscule afin de ne pas avoir à exécuter toutes ces commandes manuellement:

Une fois que votre machine virtuelle exécute publiquement l'image du menu fixe, vous pouvez vous y connecter depuis Minecraft: PE en accédant à l'onglet Amis, puis en cliquant sur le petit bouton de serveur situé à droite.
    Remplissez l'adresse IP et nommez la connexion est tout ce que vous devez faire pour vous connecter:

Écran de connexion Minecraft

Nukkit est un peu buggy, mais ne vous inquiétez pas, cela ne fera pas de mal au jeu Minecraft de quiconque sur leur appareil.
    Le pire que j'ai vu se produit est un crash de Minecraft sur iOS et un simple redémarrage de l'application vous ramène à votre situation actuelle.
    Le plus gros problème en ce moment est qu’en mode Creative, les stocks des joueurs sont parfois complètement vides.
    Une solution consiste à utiliser EssentialsNK pour donner des éléments spécifiques aux joueurs, mais c'est beaucoup de commandes si un enfant veut chaque article.

Mais attendez, Nukkit est sur Github! J'ai jeté un coup d'oeil et il y avait déjà un PR sur cette question.
    Si vous avez déjà construit Nukkit à partir des sources, il devrait être facile d’inclure cette modification et de déployer un nouveau conteneur Docker.

Espérons que cet article vous donne quelques idées sur la façon d'intéresser vos propres enfants à la programmation: ils sont probablement déjà des fanatiques de Minecraft.
    À tout le moins, ils commenceront à utiliser une pseudo-CLI avec une discussion en jeu dans Minecraft.
    S'ils s'y intéressent vraiment, ils pourraient passer du téléchargement, de l'extraction et du redémarrage du serveur à de nouveaux niveaux – à la création de plugins complets en Java.
    Maintenant, sortez et construisez des blocs dans le nuage!

PS – le meilleur niveau que nous ayons trouvé à ce jour: les Chambers.


commentaires propulsés par

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.