Serveur minecraft

Déployer 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 29 janvier 2020 - 15 minutes de lecture

Cette semaine chez Microsoft est "One Week" – un Hackathon d'une semaine où nous sommes autorisés à travailler sur des projets open source pour le plaisir. Ça me semble génial!

Pour une chose sur laquelle je voulais travailler, je voulais me concentrer sur un projet différent de ce que je faisais avec l'équipe Xamarin.Android.
    Quelque chose utilisant Windows Azure, Docker et éventuellement un langage de programmation autre que C #.
    J'ai joué avec un serveur open source pour Minecraft: Pocket Edition nommé Nukkit, ce qui semblait être un projet amusant à "pirater".
    Il est écrit en Java par des passionnés de Minecraft (comme vous pouvez l'imaginer), et est dérivé d'un serveur construit pour la version PC de Minecraft nommé Bukkit.
    Nukkit est le meilleur logiciel que j'ai trouvé pour prendre en charge Minecraft: PE, bien qu'il soit dans un état d'expérimentation.
    Soutenir l'EP est une exigence, car ma nièce, mon neveu et mon fils jouent tous à ce jeu sur seulement appareils mobiles.

J'ai fait tout cela sous OS X, mais je suppose que cela fonctionnerait également sous Windows. Commencez par cloner (ou bifurquer) leur repo depuis 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, ce ne sont que quelques commandes shell pour obtenir Nukkit à compiler:

Cela va construire nukkit-1.0-SNAPSHOT.jar à la cible annuaire.

Si vous n'avez jamais regardé Maven auparavant, c'est encore 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 travailler avec le projet dans un IDE, je recommanderais l'édition communautaire gratuite d'IntelliJ, et tout ce que vous devez faire est d'ouvrir le répertoire racine cloné à partir de Github.
    Vous devriez voir un avertissement / conseil vous invitant à pom.xml n'est pas géré par IntelliJ, si vous cliquez dessus, cela semblait être tout ce dont j'avais besoin pour travailler sur le projet et compiler dans IntelliJ.

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

À partir d'ici, je recommanderais de déménager nukkit-1.0-SNAPSHOT.jar quelque part dans son propre répertoire, j'ai choisi ~ / minecraft.
    Pour exécuter Nukkit, faites simplement:

Une fois Nukkit opérationnel, il y a une belle invite de commande pour émettre des commandes dans le jeu.
    Type Aidez-moi pour en voir une liste; Arrêtez arrête le serveur.
    Pour rejoindre le serveur, si vous avez un appareil sur le réseau local, vous devriez voir le serveur répertorié comme il le fait 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)
  • mondes répertoire – 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 loin)
  • journaux répertoire – rapports de plantage 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à vu des enfants jouer à Minecraft: PE, ils sont à peu près 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 soit 1 pour Creative ou 2 pour Survival.

Il s'avère que la fonctionnalité de base de Nukkit manque 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 depuis la source via paquet mvnou recherchez une version de téléchargement / Github contenant les fichiers jar qui en résultent.
    Pour installer un plugin, déposez simplement le fichier jar dans le plugins annuaire. Vous devriez voir un message tel que Activation d'EssentialsNK v1.0.8 lors de l'exécution de Nukkit.

Après avoir fait fonctionner votre serveur personnalisé, la première chose dont vous avez besoin est d'obtenir des niveaux que votre public cible n'a jamais vus auparavant.
    Il existe de nombreux niveaux / cartes Minecraft sur Internet, mais la recherche de Minecraft sur Google peut vous conduire à une friche pleine de logiciels malveillants – soyez prudent.
    Quelques-uns des sites que je recommanderais d'avoir des cartes de travail sont sur Curse et Minecraft Maps.
    Les liens de téléchargement sur Minecraft Maps vous envoient de terribles publicités, mais les cartes elles-mêmes sont très bonnes.

Lorsque vous téléchargez une carte, ce sera un énorme fichier zip. Je n'ai trouvé que 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.
    Créez un répertoire à NUKKIT_ROOT / mondes / diversité et copier level.dat et le Région répertoire du fichier zip en elle.

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 déposé dans le monde que vous venez de télécharger sur Internet, pas trop minable!

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 zéro, ajoutez simplement les noms au fichier yml et Nukkit créera les répertoires selon vos besoins.
    Pour parcourir les mondes pendant que votre serveur fonctionne, j'utilise quelques commandes fournies par le EssentialsNK plugin que nous avons installé plus tôt:

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

C'est assez cool, car il n'y a pas vraiment de moyen d'avoir plusieurs "mondes" à la fois 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 séparés.
    Il est également bon de savoir que ces commandes peuvent également être exécutées par les joueurs dans le chat en tapant / world WORLD_NAME, par exemple.
    Croyez-moi, toutes ces choses vont faire exploser les esprits des enfants. C'est une façon incroyable de les faire entrer en pseudo-programmation (via une CLI), et ils peuvent commencer à voir comment 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 exécutera un processus d'importation, imprimera probablement beaucoup d'erreurs, puis migrera finalement le monde vers le nouveau format.
    Ces anciennes cartes auront un db répertoire et un seul level.dat fichier. Installez-les dans le mondes 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 mettre les fichiers de niveau migrés dans votre image de docker – passons maintenant à parler de docker.

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

Tout d'abord, créez une machine virtuelle Linux de votre choix, mais je viens de choisir Serveur Ubuntu 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 dont nous aurons besoin pour installer ici, si vous utilisez d'autres distributions, vous pourriez avoir besoin de Java, etc.

Azure aurait déjà créé un groupe de sécurité réseau pour votre machine virtuelle, nous devrons ouvrir le port 19132 pour que Nukkit fonctionne selon les règles de sécurité entrantes:

Règles de sécurité entrantes

REMARQUE: je n'ai aucune idée si tout cela est sécurisé / meilleure pratique. Je recommande de simplement arrêter la machine virtuelle lorsque vous ne l'utilisez pas.

Nukkit est un parfait exemple d'une application qui peut être "dockée". Il n'a pas de dépendances et a juste besoin d'utiliser le système de fichiers local.
    Dans l'ensemble, ce fut un bon début pour moi de découvrir 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 groupe de conteneurs).
    Cela configure notre application pour avoir son propre système de fichiers dans un bac à sable isolé des autres conteneurs sur la même machine.

Si vous n'avez jamais utilisé Docker auparavant, allez-y et installez l'environnement desktop / 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 pots de plugins souhaités dans le répertoire.

Écrivons ensuite notre premier Dockerfile, un fichier texte en clair nommé comme 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
  • MAINTAINER Jon – il suffit de mettre ton nom, je suppose
  • COPY src destination – pour construire la structure des fichiers 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 c'est la meilleure pratique, mais j'ai organisé la structure de fichiers suivante dans mon image comme suit:

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

Pour créer l'image, accédez à ce répertoire et exécutez construction de docker. -t nukkit. Cela va créer une image nommée nukkit il s'agit d'une copie autonome de tous ces fichiers.

Pour exécuter un conteneur avec cette image, exécutez docker run -it -p 19132: 19132 / udp –name nukkit nukkit. Cela exécutera un conteneur nommé nukkit de manière interactive, ouvrez le port UDP 19132 et utilisez le nukkit image.
    Cela ressemblera à lorsque vous exécutiez Nukkit normalement, sauf qu'il s'exécute maintenant dans un bel environnement de sandbox docker. Vous pouvez maintenant exécuter docker ps pour afficher les conteneurs en cours d'exécution, 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 que nous avons du système de fichiers.

Alors, comment conserver des fichiers dans Docker?

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

  • docker volume create –name worlds
  • docker volume create –name logs
  • docker volume create –nom joueurs
  • 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 jeter un œil à ces fichiers.
    À l'intérieur du conteneur en cours d'exécution, docker cartographiera le / accueil / mondes et d'autres répertoires vers l'emplacement physique sur la machine hôte.

Jusqu'à présent, nous avons déployé notre conteneur Docker dans un environnement de développement local – nous en avons besoin sur Internet, non?
    Il y a beaucoup façons d'y arriver: DC / OS, Kubernetes, Docker Swarm, un Azure Container Registry, etc., mais je voulais donner une présentation de la manière la plus simple.
    Si vous êtes un peu familier avec 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, la CLI docker dispose également d'un mode permettant d'administrer à distance le docker exécuté 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 exécutée 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 ne permet pas l'administration à distance, nous devons donc l'activer:

Notez que ce port n'est pas ouvert sur Internet public. Nous ouvrons le port sur localhost sur la machine virtuelle, afin que nous puissions utiliser le tunnel SSH à distance pour y accéder.
    À partir d'ici, passez à une invite de commande sur votre machine de développement locale:

Après avoir exécuté cette commande, vous pouvez vous connecter localement au port 2375, il acheminera le trafic sur le tunnel SSH et arrivera à l'hôte local à 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 sur Windows en utilisant Putty.
    Le tunneling SSH existe depuis longtemps, mais si vous n'êtes pas à l'aise de l'utiliser, jetez plutôt un œil au registre de conteneurs Azure.
    Il s'agit d'un service Azure où vous pouvez envoyer des images de docker vers (un DockerHub privé), puis les tirer vers le bas pour qu'elles s'exécutent à l'intérieur de 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 futures commandes docker de votre terminal parleront au 2375, qui se trouve être notre machine virtuelle exécutée sur Azure.
    Si vous voulez tester que 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 petit script shell donc je n'ai pas à exécuter toutes ces commandes manuellement:

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

Écran de connexion Minecraft

Nukkit est un peu buggé, mais ne vous inquiétez pas, cela ne nuira pas au jeu Minecraft de quiconque sur leur appareil.
    Le pire que j'ai vu se produire est le crash de Minecraft sur iOS, et le simple redémarrage de l'application vous ramène là où vous étiez.
    Le plus gros problème en ce moment, c'est qu'en mode créatif, les inventaires des joueurs sont parfois complètement vides.
    Une solution consiste à utiliser EssentialsNK pour donner des objets 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'œil et il y avait déjà un PR à ce sujet.
    Si vous avez déjà construit Nukkit à partir des sources, il devrait être trivial de retirer cette modification et de déployer un nouveau conteneur Docker.

J'espère que ce post vous donnera quelques idées sur la façon dont vous pouvez intéresser vos propres enfants à la programmation: ils sont probablement déjà des fanatiques de Minecraft.
    À tout le moins, ils utiliseront une pseudo-CLI avec un chat en jeu dans Minecraft.
    S'ils s'y intéressent vraiment, ils pourraient passer du téléchargement de nouveaux niveaux, de leur extraction et du redémarrage du serveur à la création de plugins à part entière en Java.
    Maintenant, sortez et construisez des blocs dans le cloud!

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


commentaires générés par

Commentaires

Laisser un commentaire

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