☁ CloudNet 4.0 [Часть 1] - Масштабирование, Ноды и Автомтизация. Введение для чайников.

Руководство ☁ CloudNet 4.0 [Часть 1] - Масштабирование, Ноды и Автомтизация. Введение для чайников.

Поддерживаемые версии
  1. 1.7
  2. 1.8
  3. 1.9
  4. 1.10
  5. 1.11
  6. 1.12
  7. 1.13
  8. 1.14
  9. 1.15
  10. 1.16
  11. 1.17
  12. 1.18
  13. 1.19
  14. 1.20
Требования
ОС: Использую Ubuntu / Debian
Java: Мин. 11
Системные требования:
  • Минимум: 128MB RAM для работы одного кластера CloudNet, 2GB RAM / 2 Ядра процессора для работы серверов в кластере
  • Рекомендуется: 512MB RAM для CloudNet и 8GB+ RAM / 4+ Ядра процессора
Пишите в комментариях как можно улучшить статью.

Что это и кому нужно?
CloudNet позволяет вам связать сервера в Ноды (Узлы), которые могут общаться и работать с другими нодами, размещенные даже на другом хостинге. Со всеми нодами можно работать через единую консоль, либо команду /cloud прямо в игре. Одно из преимуществ CloudNet - это возможность создания системы приближенной к децентрализованной. Если упадет ваша Head Node (Главная нода), запасная может принять на себя удар и поднять нужные сервера через настройку репликации.

Однако, CloudNet может похвастаться очень гибкими настройками автоматизации и сервисов. Функций и тонкостей тут настолько много, что одним гайдом не описать все возможности, по этому в этом гайде я расскажу как поднять свою первую ноду и использовать стандартный функционал. Технология раскрывается во всех красках, если вы разработчик. Тут под капотом мощный гигачад API, который позволяет делать невероятные вещи, по этому энтузиастам желаю удачи!!!

Установка
1. Скачайте последнею версию из GitHub (Клик) (Гайд написан на 4.0.0-RC10) и распакуйте в нужное место через SFTP. В моем случае это “/home/nodes/node-1/”
Альтернативный способ
1. Создайте папку для CloudNet с помощью команды mkdir.
2. Перейдите в только что созданную папку командой cd.
3. Скачайте CloudNet командой wget https://github.com/CloudNetService/CloudNet/releases/download/4.0.0-RC10/CloudNet.zip
4. Распакуйте скачанный архив командой unzip CloudNet.zip
2. Зайдите в папку командой cd /home/nodes/node-1, выполните команду chmod +x start.sh и запустите установку командой sh start.sh
Чтобы зайти в консоль управление CloudNet и серверами, вам нужна утилита screen или tmux(Рекомендуется).

Первая установка
Сразу же после запуска установки система попросит пройти опрос, на основе которых будет создана первая нода. Опрос включает в себя:
1. Согласны ли вы с Mojang EULA (https://account.mojang.com/documents/minecraft_eula)? ответьте “Да”.
2. Выберите IP-адрес и порт вашего сервера для CloudNet Node (например, 0.0.0.0:1410). Указанный порт будет использоваться CloudNet Node и не может быть использован другими приложениями.
3. Выберите IP-адрес и порт вашего сервера для веб-сервера CloudNet (например, 0.0.0.0:2812).
4. Укажите доступную память (RAM) в МБ, которую может использовать весь узел CloudNet. (например, 8192).
5. Ответьте на вопрос является ли этот узел частью кластера? Ответьте “нет”, если это ваш первый узел. В следящем гайде расскажу как связать несколько нод.
6. Выберите ядро для прокси (например, VELOCITY).
7. Выберите версию прокси (например, velocity-latest).
8. Выберите ядро для серверов (например, MINECRAFT_SERVER).
9. Выберите версию ядра (например, paperpigot-latest).
10. Ответьте на вопрос “Нужно ли создавать прокси по умолчанию?” словами “да” или “нет” (рекомендуется: “да”).
11. Ответьте на вопрос Нужно ли создавать лобби по умолчанию? с помощью “да” или “нет” (рекомендуется: “да”).

(Обязательно) Также вас попросит выбрать модули, которые можно сразу же установить. Рекомендую выбирать минимум Bridge, SyncProxy, NPCs, CloudFire, Dockerized-Services и удобную для вас базу данных.

(Необязательно) Если хотите настроить несколько узлов, то вам нужна хоть 1 запущенная нода и подключенная база данных (MySql, MarianDB или MongoDB). Хотя в любом случае я настоятельно рекомендую сразу же подключать базу данных.

Общие настройки
launcher.cnl - Настройки лаунчера. Например тут я меняю структуру папок и переименовываю тэг ноды.
config.json - Основные настройки. Давайте разберем пару моментов.
Код:
{
  “language”: “en_US”,
  “identity”: {
    “uniqueId”: “Node-1”,
    “listeners”: [
      {
        “host”: “11.228.30.228”,
        “port”: 1410
      }
    ],
    “properties”: {}
  },
  “clusterConfig”: {
    “clusterId”: “29rkk1f-gfn4-9ng-e2f2-1lol9blya8b03”,
    “nodes”: [
      {
        “uniqueId”: “Node-2”,
        “listeners”: [
          {
            “host”: “11.228.30.228”,
            “port”: 4010
          }
        ],
        “properties”: {}
      }
    ]
  },
  “ipWhitelist”: [
    “0:0:0:0:0:0:0:1”,
    “127.0.1.1”,
    “127.0.0.1”
  ],
  “maxCPUUsageToStartServices”: 90.0,
  “maxMemory”: 32768,
  “maxServiceConsoleLogCacheSize”: 64,
  “processTerminationTimeoutSeconds”: 5,
  “forceInitialClusterDataSync”: false,
  “printErrorStreamLinesFromServices”: true,
  “runBlockedServiceStartTryLaterAutomatic”: true,
  “jvmCommand”: “java”,
  “hostAddress”: “11.228.30.228”,
  “ipAliases”: {},
  “restConfiguration”: {
    “corsPolicy”: “*”,
    “allowedHeaders”: “*”,
    “exposedHeaders”: “Content-Encoding”,
    “accessControlMaxAge”: 3600,
    “jwtValidTimeMinutes”: 60
  },
  “httpListeners”: [
    {
      “host”: “11.228.30.228”,
      “port”: 2812
    }
  ],
  “clientSslConfig”: {
    “enabled”: false,
    “clientAuth”: false,
    “trustCertificatePath”: null,
    “certificatePath”: “cert.pem”,
    “privateKeyPath”: “private.pem”
  },
  “serverSslConfig”: {
    “enabled”: false,
    “clientAuth”: false,
    “trustCertificatePath”: null,
    “certificatePath”: “cert.pem”,
    “privateKeyPath”: “private.pem”
  },
  “webSslConfig”: {
    “enabled”: false,
    “clientAuth”: false,
    “trustCertificatePath”: null,
    “certificatePath”: “cert.pem”,
    “privateKeyPath”: “private.pem”
  },
  “properties”: {
    “database_provider”: “mysql”
  }
}
uniqueId - Под каким именем будет текущая нода. Не должно повторятся другими нодами.
listeners - На каком хосте и порте запущена текущая нода.
clusterConfig - Настройки текущего кластера.
clusterId - Уникальный ИД кластера. НЕЛЬЗЯ его распространять. По нему подключаются другие ноды к вашей сети.
nodes - Подключенные ноды (необязательно). Настройки под несколько нод разберу в другом гайде.
ipWhitelist - Список Ip, которые могут подключатся к вашему кластеру.
maxMemory - Количество выделенной оперативной памяти под ноду. Если ваши сервера по какой-то причине не запускаются, то возможно вы превысили порог памяти ноды.
database_provider - Какая база данных будет использована. Сначала вам нужно установить модуль базы данных командой modules install, вписать данные в настройки модуля, затем тут указывать базу данных (mysql/mongodb).

Настройка задач и групп
Каждый сервер в cloudnet принято называть сервисом, и каждый из сервисов запускается исходя из настроек задачи и шаблона файлов. Все эти настройки находятся в папках /local/groups, /local/tasks и /local/templates. Обычно все сервера загружаются временно (то есть удаляются после остановки сервера), но разуметься тут можно создать статичный сервер, чтобы все ваши данные сохранялись после перезагрузки.

Lobby и Proxy принято создавать временными. Ниже я приведу пример настройки этих серверов и разберу конфигурацию.
Код:
{
  “name”: “Lobby”,
  “jvmOptions”: [],
  “processParameters”: [],
  “environmentVariables”: {},
  “targetEnvironments”: [],
  “templates”: [],
  “deployments”: [],
  “includes”: [],
  “properties”: {}
}
Перед созданием задачи для сервиса желательно создать группу, к которой мы потом определим задачу. Параметры групп имеют почти такие же параметры, как и в tasks. Вы можете один раз указать их тут, чтобы не писать их по несколько раз.

По умолчанию у вас уже будут созданы некоторые группы, например Global-Server для обычных серверов и Global-Proxy для Velocity/Bungee.
Код:
{
  “name”: “Lobby”,
  “runtime”: “jvm”,
  “hostAddress”: “null”,
  “javaCommand”: “java”,
  “nameSplitter”: “-”,
  “disableIpRewrite”: false,
  “maintenance”: false,
  “autoDeleteOnStop”: false,
  “staticServices”: false,
  “groups”: [
    “Lobby”
  ],
  “associatedNodes”: [],
  “deletedFilesAfterStop”: [],
  “processConfiguration”: {
    “environment”: “MINECRAFT_SERVER”,
    “maxHeapMemorySize”: 2500,
    “jvmOptions”: [],
    “processParameters”: [],
    “environmentVariables”: {}
  },
  “startPort”: 30011,
  “minServiceCount”: 1,
  “templates”: [
    {
      “prefix”: “Global”,
      “name”: “Global-Server”,
      “storage”: “local”,
      “priority”: 0,
      “alwaysCopyToStaticServices”: false
    },
    {
      “prefix”: “Lobby”,
      “name”: “default”,
      “storage”: “local”,
      “priority”: 0,
      “alwaysCopyToStaticServices”: false
    }
  ],
  “deployments”: [],
  “includes”: [],
  “properties”: {
    “requiredPermission”: null,
    “smartConfig”: {
      “enabled”: false,
      “priority”: 10,
      “maxServices”: -1,
      “preparedServices”: 0,
      “splitLogicallyOverNodes”: true,
      “directTemplatesAndInclusionsSetup”: true,
      “templateInstaller”: “INSTALL_ALL”,
      “autoStopTimeByUnusedServiceInSeconds”: 180,
      “percentOfPlayersToCheckShouldStopTheService”: 0,
      “forAnewInstanceDelayTimeInSeconds”: 300,
      “percentOfPlayersForANewServiceByInstance”: 100
    }
  }
}
hostAddress - Адрес хоста сервиса.
runtime - Среда выполнения кода.
javaCommand - Команда для запуска исполняемого код файла.
nameSplitter - Какой символ используется после имени и перед числом сервисом.
maintenance - Режим технического обслуживания для сервиса.
autoDeleteOnStop - После обычной перезагрузке сервера не удаляются, но если написать ser lobby-1 stop (Не restart) удалится. Если включен этот параметр, то сервер будет удалятся всегда.
staticServices - Является ли этот сервис статичным? Данные никогда не будут удалятся, а сам сервер поместится в специальную папку статичных сервисов.
groups - Список групп, к которым определена эта задача.
associatedNodes - Белый список нод, на которых может запустится задача.
deletedFilesAfterStop - Список файлов, которые будут удалятся после остановки сервера. Полезно, если не хотите хранить на статичном сервисе какой-то шлак.
processConfiguration - Среда выполнения задачи и настройка памяти. Напоминаю, что количество памяти не должно превышать то число, которое вы выделили в config.json.
jvmOptions - Флаги Jvm. По умолчанию Akair флаги уже есть в Global-Server.
startPort - Миниальный порт, на котором будет запускаться сервис. Убедитесь, что все порты кроме proxy закрыты.
minServiceCount - Минимальное количество сервисов, которые всегда должны быть запущены.
templates - Какие шаблоны использует сервис.
includes - Загружает файлы из-вне перед загрузкой сервиса.
Код:
  “includes”: [
    {
      “url”: “https://ip.net/download/ViaVersion-Lasted.jar”,
      “destination”: “plugins/ViaVersion-Lasted.jar”,
      “properties”: {}
    }
  ],
deployments - После остановки сервера копирует файлы/папки в указанный шаблон, дабы их сохранить.
Код:
  “deployments”: [
    {
      “template”: {
        “prefix”: “Lobby”,
        “name”: “default”,
        “storage”: “local”,
        “alwaysCopyToStaticServices”: false
      },
      “excludes”: [
        “whitelist.yml”,
        “log.txt”
      ],
      “properties”: {}
    }
  ],
requiredPermission - Требуемые права для подключение к сервису. Полезно, если хотите сделать Premium сервера или сервера для персонала.
smartConfig - Настройки для умного модуля. Кстати, очень полезная вещь, в следующем гайде разберу все модули и фишки в реальных условиях.
Код:
{
  “name”: “Proxy”,
  “runtime”: “jvm”,
  “hostAddress”: “null”,
  “javaCommand”: “java”,
  “nameSplitter”: “-”,
  “disableIpRewrite”: false,
  “maintenance”: false,
  “autoDeleteOnStop”: true,
  “staticServices”: false,
  “groups”: [
    “Proxy”
  ],
  “associatedNodes”: [],
  “deletedFilesAfterStop”: [],
  “processConfiguration”: {
    “environment”: “VELOCITY”,
    “maxHeapMemorySize”: 512,
    “jvmOptions”: [],
    “processParameters”: [],
    “environmentVariables”: {}
  },
  “startPort”: 25565,
  “minServiceCount”: 1,
  “templates”: [
    {
      “prefix”: “Global”,
      “name”: “Global-Proxy”,
      “storage”: “local”,
      “priority”: 1,
      “alwaysCopyToStaticServices”: false
    },
    {
      “prefix”: “Proxy”,
      “name”: “default”,
      “storage”: “local”,
      “priority”: 0,
      “alwaysCopyToStaticServices”: false
    }
  ],
  “deployments”: [],
  “includes”: [],
  “properties”: {
    “requiredPermission”: null,
    “smartConfig”: {
      “enabled”: false,
      “priority”: 10,
      “maxServices”: -1,
      “preparedServices”: 0,
      “smartMinServiceCount”: 0,
      “splitLogicallyOverNodes”: true,
      “directTemplatesAndInclusionsSetup”: true,
      “templateInstaller”: “INSTALL_ALL”,
      “autoStopTimeByUnusedServiceInSeconds”: 180,
      “percentOfPlayersToCheckShouldStopTheService”: 0,
      “forAnewInstanceDelayTimeInSeconds”: 300,
      “percentOfPlayersForANewServiceByInstance”: 100
    }
  }
}

Настройка шаблонов
В папке /local/templates хранятся все файлы, которые нужно загрузить/обновить на сервисах. Вот например структура моего тестового сервера.

Global/Global-Server - Сюда я загружаю jar файлы Server-Network, Server-Core, ViaVersion, Spark и LuckPerms в папку plugins, ведь они мне нужны на всех серверах самой последней версии.
Global/Global-Proxy - Аналогично, но с другими плагинами.
Lobby - Все настройки, карта и требуемые плагины/конфиги.
Код:
config
libraries
lobby
plugins
worlds
bukkit.yml
commands.yml
ops.json
paper.jar
server.properties
spigot.yml
version_history.json
Proxy - Аналогично.
Код:
lang
plugins
forwarding.secret
velocity.jar
velocity.toml
Build - Это статический билд-сервер, но все же я залил некоторые файлы т.к у меня не один сервер, хоть это необязательно, ведь для статичных сервисов создается отдельная папка.
Код:
config
emotes
plugins
bukkit.yml
pufferfish.yml
purpur.jar
purpur.yml
server.properties
spigot.yml
MapService - Это отдельный самописный сервис карт. Вы также можете разворачивать свои jar файлы/сервисы помимо обычного маинкрафта, но это требует некоторых знаний программирования.
Код:
settings
logs
map-service.jar

Модули
Плагины для CloudNet на стеройдах. Разработчики поддерживают ряд модулей, которые могут быть очень полезны. Я могу выделить следующие, полный список можете глянуть на их GitHub.

SyncProxy - Управляйте Proxy, TabList, Motd и настраивайте режим обслуживания с белым списком.
Bridge - Это мост, через который CloudNet общается с серверами. Но там тоже есть полезные настройки, например команды для хаба.
CloudFlare - Через него можно сделать мультипрокси, хоть и есть варианты получше.
Dockerized-Services - Запускайте ваши сервера, используя контейнер Docker.
NPCs - Вы можете на сервере создать и настроить npc, которые могут быть использованы для перемещения по серверам. Есть поддержка GUI. NPC обновляются на всех нужных серверах в реальном времени.
Smart - Позволяет более гибко настроить задачи. Например автоматически запускать дополнительные лобби, если все остальные переполнены.
SFTP/S3 - Добавьте поддержку внешних хранилищ, чтобы хранить шаблоны где угодно.
Rest - Поддержка REST API.

Есть модули от сообщества, но их мало. Надеюсь разработчики будут создавать больше Open Source продуктов.

Подводные камни
На мой взгляд безопасность CloudNet оставляет желать лучшего. Да, тут очень мощный Driver-Api и в целом среда для разработки. Но из-за того что любая нода имеет полный доступ к другой ноде в кластере через API, то вполне возможно через вредоносный код делать что угодно со всеми серверами и тачками. Хотя любой сервер так или иначе пострадает от такого кода, независимо запущен там CloudNet или нет :)

Пожалуйста, постарайтесь хорошо обезопасить ваш сервер на стороне Linux. Не запускайте никогда ноду из-под root, настройте безопасность системы, используйте selinux / apparmor для более жесткого контроля, допускайте на продакшн-кластер только безопасный проверенный код и используйте грамотный CI/CD. Для Dev/Test серверов используйте отдельный кластер, чтобы ещё сильнее ограничить по правам разработчиков.
Автор
Mioji
Просмотры
977
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Поделиться ресурсом

Назад
Сверху Снизу