Создание Minecraft-сервера на Google Colab

Google Colab – это бесплатный облачный сервис, позволяющий запускать Jupiter Notebook. Обычно его используют для машинного обучения, но в этой статье я буду запускать на нём сервер Minecraft.
Итак, приступим
В первую очередь хотелось бы отметить, что Colab, как и Jupiter Notebook, позволяет исполнять команды Linux, если поставить перед ней восклицательный знак(!).
Первым делом я решил узнать версию Linux:
lsb_release -a
Вывод был таким:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
Следующим шагом устанавливаем Java:
!apt-get update && apt-get upgrade
!apt-get install default-jdk
После этого мы можем приступить к установке ядра сервера, я выбрал Spigot:
Хочу сказать что если Вам нужно использовать команду cd, то необходимо использовать оператор && для последовательного выполнения команд.
Скачивание BuildTools и сборка ядра:
!mkdir build && cd build && wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && java -jar BuildTools.jar
Output:
...
Success! Everything completed successfully. Copying final .jar files now.
Copying spigot-1.15.2-R0.1-SNAPSHOT.jar to /content/build/./spigot-1.15.2.jar
- Saved as ./spigot-1.15.2.jar
Копируем ядро в отдельную папку:
!mkdir server && cp build/spigot-1.15.2.jar server/spigot.jar
Запускаем сервер:
!cd server && java -jar spigot.jar
После первого запуска сервер остановится и попросит согласиться с EULA в файле eula.txt, меняем строчку eula=false на eula=true
!cd server/ && sed -i 's/.*eula=false.*/eula=true/' eula.txt
Чтобы на наш сервер можно было зайти, заходим в файл server.properties и меняем в нём строчку online-mode=true на online-mode=false.
!cd server/ && sed -i 's/.*online-mode=true.*/online-mode=false/' server.properties
Получение доступа к серверу из сети:
К сожалению, наша «виртуальная машина» имеет серый IP, в этом мы можем убедиться выполнив команды:
!apt-get install net-tools
!ifconfig
Для решения этой проблемы я решил использовать ngrok
Заходим сюда и регистрируемся dashboard.ngrok.com/status
Скачиваем и распаковываем клиент:
!wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip && unzip -qq -n ngrok-stable-linux-amd64.zip
Переходим в панель управления dashboard.ngrok.com/status и копируем токен
После этого открываем тоннель:
print("Token from https://dashboard.ngrok.com/auth")
import getpass
authtoken = getpass.getpass()
get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 25565 &')
Вводим токен и получаем IP адрес:
!curl -s http://localhost:4040/api/tunnels | python3 -c \
"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"
Запускаем сервер:
!cd server && java -jar spigot.jar
Ждём, пока сервер не выдаст что запуск сервера завершён:
[12:00:00] [Server thread/INFO]: Done (63.279s)! For help, type "help"
Вводим в клиент Minecraft адрес(без tcp://) и заходим на сервер.
Тестирование
Я тестировал сервер взрывами TNT, что позволило сильно нагрузить сервер.
Сервер начинает лагать при взрыве более 10000 блоков динамита, TPS падает до 10 и ниже, что неудовлетворительно.
Однако для игры с друзьями мощностей Колаба хватит.
P.S.
Хотелось бы отметить, что наши данные исчезнут через 12 часов, поэтому лучше сохранить их заранее или держать данные сервера на примонтированом Google Drive.