# PlayerServers - Overview

An advanced plugin which allows your players to create their sub-servers as part of your BungeeCord / Waterfall / Travertine / HexaCord network and manage them with easy-to-use, friendly GUI

## Description

PlayerServers is an advanced plugin that will allow your players to create their own BungeeCord sub-server with just one command. They'll have all permissions and will be able to manage them with an easy-to-use in-game GUI in order to manage plugins and configuration files. Optionally, you can extend it's functionality by configuring Docker or deploying servers directly on Pterodactyl panel.

## Features

* **Async, lag-free:** The plugin is running asynchronously making use of all cores of your machine. Servers are created in seconds with no performance impact on your network.
* **Templates:** Make the game for your players more fun by giving them already-built templates to choose from. Servers will be initialised with predefined plugins, worlds, mods and configuration files - all at your will.
* **HubCore:** HubCore is an addon to PlayerServers which adds nice features to your lobby such as PlayerServers selector, option to create and manage servers with an intuitive GUI, options to disable some of the basic Minecraft functionalities such as rain or damage and much more - and the best part - It's completely free and opensource.
* **Automatically terminate inactive servers**: if servers are inactive (or don't have any players) for a configurable amount of time, they will automatically shutdown.
* **ControlGUI:** Once your players enter your server, they'll be presented with instructions on how to proceed and do basic tasks, the most common of which is managing their server with PlayerServer GUI. From this interface, they'll be able to install plugins, edit server variables, edit configuration files and much more!
* **Permissions-based:** In PlayerServers everything's configurable through config files, or dynamically through Permissions. Limit the amount of plugins your players may have, max players, RAM or CPU and monetise your server by giving better perks to donators that support your work.
* **Automatic & works out of the box:** The plugin is working out of the box without any need for external dependencies. Servers are added and removed from your network seamlessly without any need for reboot or greload.

## Purchase it now

{% embed url="<https://builtbybit.com/resources/15521/>" %}
Purchase on BuiltByBit (MC-Market)
{% endembed %}

{% embed url="<https://www.spigotmc.org/resources/82268/>" %}
Purchase on SpigotMC
{% endembed %}

{% embed url="<https://polymart.org/resource/playerservers.57>" %}
Purchase on Polymart
{% endembed %}


# Plugin Installation Tutorial

Here is a guide with details that you need to follow in order to complete the installation.

## Before installation

In order to install PlayerServers, you will need to have a **VPS or Dedicated** server with **root** access. If you do not have it, please do not buy the plugin or try to install it on a **Shared (Game) Hosting.**

## Picking the right OS

We understand that if you have your server already up and running, it might come hard for you to change your OS. That's why we tested our plugin on many of the popular OS-es. Even tho some of them are marked with ⚠️, it doesn't mean the plugin will not work there, it just means that the instructions from this guide will not help you while setting up the plugin on those Operating Systems, but if you configure everything correctly (like installing Java, Screen & Fuser) the plugin should work without any problems. If you have any problems with an OS marked with ✅, please contact me so we can solve it.

Operating Systems marked with ⛔️ are currently not supported at all, but the support for them come in the future versions. Below is the list of all the popular operating systems:

<table data-header-hidden><thead><tr><th>Operating System</th><th width="157">Version</th><th width="178">Supported</th><th>Notes</th></tr></thead><tbody><tr><td><strong>Operating System</strong></td><td>Version</td><td>Supported</td><td>Notes</td></tr><tr><td><strong>Ubuntu</strong></td><td><p>20.04</p><p>22.04</p></td><td>✅</td><td>Documentation written assuming Ubuntu 22.04<br>as the base OS. Heavily tested on 20.04 as well.</td></tr><tr><td><strong>Ubuntu</strong></td><td><p>18.04</p><p>(Bionic)</p></td><td>✅</td><td>The plugin was tested on this OS and confirmed to have no issues.</td></tr><tr><td><strong>Ubuntu</strong></td><td>16.04</td><td>⚠️</td><td>Untested, but the plugin should work</td></tr><tr><td><strong>Debian</strong></td><td><p>9</p><p>10</p><p>11</p></td><td>✅</td><td><p>Tested, the plugin worked but the instructions from this guide might be invalid for that OS.</p><p></p><p>Some additional repos might be required.</p></td></tr><tr><td><strong>Debian</strong></td><td>8</td><td>⚠️</td><td>Untested, additional repos may be required</td></tr><tr><td><strong>CentOS</strong></td><td>7 &#x26; 8</td><td>⚠️</td><td><strong>Not tested</strong>, though we had reports of centOS working without any issues and we do not see any reason for it not to work there.</td></tr><tr><td><strong>Windows</strong></td><td><p>Server 2016</p><p>Server 2019</p><p>Server 2022</p><p>10</p><p>11</p></td><td>✅</td><td><strong>Tested, works perfectly.</strong><br><br>PlayerServers v3+ introduced the full Windows support by using Docker for instance management</td></tr><tr><td><strong>MacOS</strong></td><td><p>Mojave</p><p>Catalina</p><p>Big Sur</p><p>Monterey<br>Ventura</p></td><td>✅</td><td><p>Should work without any problems as it comes with</p><p>screen &#x26; fuser pre-installed. <br><br>Tested on M1 processors as well. On M1 machines, ARM JVM like Azul Zulu is highly recommended.</p></td></tr></tbody></table>

## Requirements

{% hint style="info" %}
Before installing the dependencies below, it is recommended to run `apt-get update` command as the commands below might not work without it.
{% endhint %}

In order to install PlayerServers on your machine, you need to have Java. The minimum version of Java to be used with this plugin is Java 18. If you don't have it already installed, please follow the link below in order to learn how to install it.

{% embed url="<https://docs.azul.com/core/zulu-openjdk/install/debian>" %}
Azul Zulu Java installation guide (for Debian/Ubuntu)
{% endembed %}

## Installation of the plugin

In order to install the plugin, you just need to put it into your BungeeCord plugins folder. After that, please reboot your server and let the plugin generate it's config files and download some other required dependencies.

{% hint style="danger" %}
After the first boot of the server, you will see some errors generated by the plugin. Don't worry, just **shutdown** your BungeeCord server and follow the instructions below in order to solve it.
{% endhint %}

Now navigate to the `plugins folder -> PlayerServers` and open up the config.yml file. It is recommended to open it using some sort of advanced text editor (like [Notepad++](https://notepad-plus-plus.org) or [VisualStudio Code](https://code.visualstudio.com)). After that, you will have to enter your MySQL informations. If you don't have a MySQL server running already, please follow the link below.

{% content-ref url="/pages/-M7D\_vu-fF1xD0PYyi4j" %}
[Creating MySQL database](/legacy-v2.x/creating-mysql-database)
{% endcontent-ref %}

After the configuration of MySQL database, boot up your BungeeCord server. The plugin should successfully launch this time.

{% hint style="success" %}

### That's it!

If you followed the guide correctly, you will have a working version of PlayerServers installed. If there are any additional errors, or you need help with something, please don't hesitate to send me PM od MC-Market, or on Discord - `OpenSource#3310`
{% endhint %}

## Now setup your first node

After successfully installing the plugin, in order to create your first server, you'll need to configure nodes (if not running in [Pterodactyl mode - learn more](/overview/pterodactyl-configuration)). To learn how to configure nodes, click the button below.


# Adding a node

Learn how to create a node for servers to be deployed to.

## Introduction

In order to create subservers, you need to have nodes configured. Each node can have a configurable amount of servers running at the same time. A node can be the same machine that you host your BungeeCord on, or any other machine connected to the internet.

## Instructions

### Download Docker

For PlayerServers to be created, you need to have Docker installed on each of your nodes.

For a quick install of Docker CE, you can execute the command below:

```bash
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
```

<details>

<summary>Alternative approach</summary>

If you have issues with the command above, you may want to try the following one as well (Debian based systems only):

```bash
sudo apt install docker.io
```

</details>

If you would rather do a manual installation, please reference the official Docker documentation for how to install Docker CE on your server. Some quick links are listed below for commonly supported systems.

* [Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce)
* [CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce)
* [Debian](https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce)

**Start Docker on Boot**

If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine.

```bash
systemctl enable --now docker
```

### Download Daemon

In order to create a node, you'll need to download the latest Daemon.

{% file src="/files/ZTuA0F9ByO11SIn3UQZW" %}
Download the latest daemon (shipped with v3.1-RC1)
{% endfile %}

After downloading it, put it in a separate folder and extract it, preferably **out** of your BungeeCord folder. This is not a plugin, but a separate software made for handling server requests.

Now run the Daemon with the following command:

{% code title="Command to start Daemon" %}

```sh
java -Xmx500M -jar PlayerServeshersDaemon.jar
```

{% endcode %}

After running it, type `exit` to stop your Daemon.

Now, edit your config.toml generated inside Daemon folder to your preference and make sure to use the same token as in config.toml when creating a new node.

### Create node in-game

The last step would be to add the node to PlayerServers. To do so, type the following command:

{% code overflow="wrap" %}

```sh
/psadmin node create <nodename> <ip> <port> <minPort> <maxPort> <maxOnline> <token>
```

{% endcode %}

* NodeName is any name you want to give to your node
* IP is the ip of the machine the node is located on
* Port is the port, configurable in config.toml of your Daemon.
* MinPort and MaxPort represent the port range in which your servers are going to be created on. For example, if you put 30000 and 30100 as min and max port respectively, your servers will get a random port between those two numbers when created on this node.
* MaxOnline is the max number of online instances at once on this node.
* Token is the token configured in Daemon's config.toml

{% hint style="success" %}
If everything was done correctly, your node is ready to start accepting new subservers. However, make sure to have at least one template configured for it (default). Learn more below on how to do so.
{% endhint %}


# Templates

Learn how to setup templates with plugins, mods, worlds and configurations

## Introduction

In PlayerServers, Templates are an essential way of managing the creation of your servers.

{% hint style="info" %}
At minimum you are required to have a `default` Template folder with Spigot.jar file inside. Without that, it will not be possible to create a subserver.
{% endhint %}

{% hint style="warning" %}
Please keep in mind that all these steps **must be repeated across every Daemon instance equally**! Also, keep in mind that Templates do not work yet under [Pterodactyl mode](/overview/pterodactyl-configuration).
{% endhint %}

## Instructions

1. Create folder in /templates/\<yourtemplate>
2. Put all the server files there **including Spigot.jar** (you must not include server.properties or spigot.yml)
3. If the folder includes plugins, please do not include PSServerCore.jar or it's configuration files
4. If your server includes plugins, please add all of them to the server-plugins folder


# Adding pre-defined plugins

In the tutorial below, you'll learn how to add pre-defined plugins to the plugin-installer GUI.

In order to add plugins to the plugin-installer GUI and make those plugins available to all of your players and their servers, you need to navigate to your BungeeCord plugins folder, than go to the PlayerServers folder, and from there, navigate to the `server-plugins` subfolder.

After that, put the .jar files of all the plugins you want your players to be able to install on their sub-servers.


# Pterodactyl configuration

Learn how to setup and configure PlayerServers to work with Pterodactyl control panel and give your users ability to manage their server through Pterodactyl’s beautiful and easy-to-use interface.

{% hint style="info" %}
The below page explains how to use this feature on PlayerServers 3. This is only relevant if you're a beta tester.
{% endhint %}

## Introduction

> Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.

PlayerServers offers the possibility to sync with your panel and create Pterodactyl servers on the fly - offering your users all that PlayerServers offers + the ability to manage their server through Pterodactyl's amazing UI.

## How to setup

{% hint style="info" %}
In order to begin, you need to have Pterodactyl, Docker and PlayerServers properly installed on your system. To learn how to install Pterodactyl, click [here](https://pterodactyl.io/panel/1.0/getting_started.html).
{% endhint %}

1. Shutdown your BungeeCord
2. Edit PlayerServers [config.yml](/overview/config), enable pterodactyl mode
3. Insert your application token and client token
4. Insert your Minecraft nest-id, Paper egg-id and the location-id of the location your nodes are based in.
5. Just like that, you're done!

{% hint style="warning" %}
We highly recommend downloading our custom Wings and replacing Pterodactyl's Wings. This will prevent unwanted modifications to PSServerCore config and jar. Click the button below to learn more.
{% endhint %}


# Download custom wings

Learn how to download our custom wings to prevent unwanted modifications on your subservers.

In order to make sure your players can't remove ServerCore from their servers and thus removing the only thing that will stop their server from being online 24/7, this modification is highly recommended.

## Instructions

In order to replace Pterodactyl's wings, you'll first need to download our custom ones from our GitHub. You can also download the latest **dev build** which is almost always in sync with the latest Pterodactyl release [here](https://github.com/arcadiadevs/wings/actions).

{% embed url="<https://github.com/arcadiadevs/wings/releases>" %}
Download custom wings
{% endembed %}

After downloading it, navigate to `/usr/local/bin` and remove `wings` from there. Afterwards, upload our custom wings and make sure to name it `wings`. Afterwards, simply restart your wings, usually by running `service wings restart`.

Now, make sure to disable automatic restart of containers so that Wings doesn't restart the server as it shuts down due to inactivity. To do that, navigate to `/etc/pterodactyl/config.yml` and set crash\_detection.enabled to false.

{% hint style="success" %}

### Great, you're done!

Our custom wings will not negatively impact your existing non-PlayerServers servers. Any server created outside of PlayerServers environment will not be affected by PlayerServers or our modified wings.
{% endhint %}


# How to create tokens

Learn how to create Pterodactyl client and application API token.

## Introduction

Application and Client tokens are essential in the way PlayerServers communicates with your panel and thus need to be correctly set with appropriate privileges.

## How to create Application Token

In order to create an application token, please navigate to the Pterodactyl admin interface, and select "Application API"

<figure><img src="/files/TFpMvFMk1X0QJjWf5erH" alt=""><figcaption><p>Application API interface</p></figcaption></figure>

Afterwards, click on the blue Create New button on the top right and make sure to fill the fields just like on the image below.

<figure><img src="/files/mWG3ncWRv7QfzL6m407R" alt=""><figcaption><p>Application API - required permissions</p></figcaption></figure>

As that's done, you'll receive your application token which you need to put in your `config.yml`.

## How to create Client Token

In order to create an application token, please navigate to the Pterodactyl admin interface and click on your profile icon on the top right.

<figure><img src="/files/7HaLvCOMwcQVPcHSIcN2" alt=""><figcaption><p>Click on profile icon</p></figcaption></figure>

After that, navigate to the API Credentials tab.

<figure><img src="/files/KM1HSitD5WoYMN9bdula" alt=""><figcaption><p>API Credentials</p></figcaption></figure>

From here, create a new API key. Name it whatever you want and click create. Optionally, add the IP address of your BungeeCord instance to prevent unauthorised access to your API key.

From there, proceed by putting the newly generated API key to your `config.yml` file.


# Setting up plugins mount

Learn how to setup plugins repository as a mount for your Pterodactyl servers.

## Introduction

In order for your players to be able to install plugins via plugin management GUI, we need to mount the plugins repository folder to each of your virtualised containers (servers).

Unfortunately, Pterodactyl doesn't provide an API for that at the moment (until v2 is out), so we will need to perform a quick modification on your Pterodactyl's code.

{% hint style="info" %}
**You will need to perform these modifications every time you update Pterodactyl.**
{% endhint %}

## Instructions

1. Navigate to your Pterodactyl folder, preferably via some kind of SFTP file manager, like [WinSCP](https://winscp.net/eng/download.php) or [CyberDuck](https://cyberduck.io/). The directory is usually `/var/www/pterodactyl`.

2. Open up `app/Http/Controllers/Api/Application/Servers/ServerManagementController.php` preferably using some sort of text editor, like [VSCode](https://code.visualstudio.com/) or Notepad++.
   1. If you're a more advanced user, just making sure to merge [this differences](https://github.com/arcadiadevs/panel/commit/0550428a2a914fc060811445e90be8b8ffd35098) will be enough. For everyone else, please carefully follow the instructions below.

   2. Below all imports, paste `use Pterodactyl\Models\MountServer;` Your imports should look like the following:<br>

      <pre class="language-php" data-title="ServerManagementController.php" data-overflow="wrap" data-line-numbers><code class="lang-php">&#x3C;?php

      namespace Pterodactyl\Http\Controllers\Api\Application\Servers;

      use Illuminate\Http\Response;
      use Pterodactyl\Models\Server;
      use Pterodactyl\Services\Servers\SuspensionService;
      use Pterodactyl\Services\Servers\ReinstallServerService;
      use Pterodactyl\Http\Requests\Api\Application\Servers\ServerWriteRequest;
      use Pterodactyl\Http\Controllers\Api\Application\ApplicationApiController;
      use Pterodactyl\Models\MountServer; # This is the line we added
      </code></pre>

   3. Below reinstall function, paste the following code block:<br>

      <pre class="language-php" data-title="ServerManagementController.php" data-overflow="wrap"><code class="lang-php">public function mount(ServerWriteRequest $request, Server $server): Response
      {
          $mountServer = (new MountServer())->forceFill([
              'mount_id' => $request->input('mount_id'),
              'server_id' => $server->id,
          ]);

          $mountServer->saveOrFail();

          return $this->returnNoContent();
      }
      </code></pre>

   4. The end result will be the following file (which you may as well just copy and replace your whole file contents with, but a more manual approach like in steps 1 and 2 is recommended):<br>

      <pre class="language-php" data-title="ServerManagementController.php" data-line-numbers><code class="lang-php">&#x3C;?php

      namespace Pterodactyl\Http\Controllers\Api\Application\Servers;

      use Illuminate\Http\Response;
      use Pterodactyl\Models\Server;
      use Pterodactyl\Services\Servers\SuspensionService;
      use Pterodactyl\Services\Servers\ReinstallServerService;
      use Pterodactyl\Http\Requests\Api\Application\Servers\ServerWriteRequest;
      use Pterodactyl\Http\Controllers\Api\Application\ApplicationApiController;
      use Pterodactyl\Models\MountServer; # This is the line we added

      class ServerManagementController extends ApplicationApiController
      {
          /**
           * ServerManagementController constructor.
           */
          public function __construct(
              private ReinstallServerService $reinstallServerService,
              private SuspensionService $suspensionService
          ) {
              parent::__construct();
          }

          /**
           * Suspend a server on the Panel.
           *
           * @throws \Throwable
           */
          public function suspend(ServerWriteRequest $request, Server $server): Response
          {
              $this->suspensionService->toggle($server);

              return $this->returnNoContent();
          }

          /**
           * Unsuspend a server on the Panel.
           *
           * @throws \Throwable
           */
          public function unsuspend(ServerWriteRequest $request, Server $server): Response
          {
              $this->suspensionService->toggle($server, SuspensionService::ACTION_UNSUSPEND);

              return $this->returnNoContent();
          }

          /**
           * Mark a server as needing to be reinstalled.
           *
           * @throws \Pterodactyl\Exceptions\DisplayException
           * @throws \Pterodactyl\Exceptions\Model\DataValidationException
           * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
           */
          public function reinstall(ServerWriteRequest $request, Server $server): Response
          {
              $this->reinstallServerService->handle($server);

              return $this->returnNoContent();
          }

          # Our mount function
          public function mount(ServerWriteRequest $request, Server $server): Response
          {
              $mountServer = (new MountServer())->forceFill([
                  'mount_id' => $request->input('mount_id'),
                  'server_id' => $server->id,
              ]);

              $mountServer->saveOrFail();

              return $this->returnNoContent();
          }
      }
      </code></pre>

3. Now navigate to app/routes/api-application.php and open it.
   1. Below the following line:

      <pre class="language-php" data-overflow="wrap"><code class="lang-php">Route::post('/{server:id}/reinstall', [Application\Servers\ServerManagementController::class, 'reinstall'])->name('api.application.servers.reinstall');
      </code></pre>

      \
      Paste this line<br>

      <pre class="language-php" data-overflow="wrap"><code class="lang-php">Route::post('/{server:id}/mount', [Application\Servers\ServerManagementController::class, 'mount'])->name('api.application.servers.mount');
      </code></pre>

   2. The end result should look like the following. You can also just use it to completely copy-paste the content to your api-application.php, but a more manual approach like in step 1 is preferred as Pterodactyl may do additional modifications to this file in the future.<br>

      <pre class="language-php" data-title="api-application.php" data-line-numbers><code class="lang-php">&#x3C;?php

      use Illuminate\Support\Facades\Route;
      use Pterodactyl\Http\Controllers\Api\Application;

      /*
      |--------------------------------------------------------------------------
      | User Controller Routes
      |--------------------------------------------------------------------------
      |
      | Endpoint: /api/application/users
      |
      */

      Route::group(['prefix' => '/users'], function () {
          Route::get('/', [Application\Users\UserController::class, 'index'])->name('api.application.users');
          Route::get('/{user:id}', [Application\Users\UserController::class, 'view'])->name('api.application.users.view');
          Route::get('/external/{external_id}', [Application\Users\ExternalUserController::class, 'index'])->name('api.application.users.external');

          Route::post('/', [Application\Users\UserController::class, 'store']);
          Route::patch('/{user:id}', [Application\Users\UserController::class, 'update']);

          Route::delete('/{user:id}', [Application\Users\UserController::class, 'delete']);
      });

      /*
      |--------------------------------------------------------------------------
      | Node Controller Routes
      |--------------------------------------------------------------------------
      |
      | Endpoint: /api/application/nodes
      |
      */
      Route::group(['prefix' => '/nodes'], function () {
          Route::get('/', [Application\Nodes\NodeController::class, 'index'])->name('api.application.nodes');
          Route::get('/deployable', Application\Nodes\NodeDeploymentController::class);
          Route::get('/{node:id}', [Application\Nodes\NodeController::class, 'view'])->name('api.application.nodes.view');
          Route::get('/{node:id}/configuration', Application\Nodes\NodeConfigurationController::class);

          Route::post('/', [Application\Nodes\NodeController::class, 'store']);
          Route::patch('/{node:id}', [Application\Nodes\NodeController::class, 'update']);

          Route::delete('/{node:id}', [Application\Nodes\NodeController::class, 'delete']);

          Route::group(['prefix' => '/{node:id}/allocations'], function () {
              Route::get('/', [Application\Nodes\AllocationController::class, 'index'])->name('api.application.allocations');
              Route::post('/', [Application\Nodes\AllocationController::class, 'store']);
              Route::delete('/{allocation:id}', [Application\Nodes\AllocationController::class, 'delete'])->name('api.application.allocations.view');
          });
      });

      /*
      |--------------------------------------------------------------------------
      | Location Controller Routes
      |--------------------------------------------------------------------------
      |
      | Endpoint: /api/application/locations
      |
      */
      Route::group(['prefix' => '/locations'], function () {
          Route::get('/', [Application\Locations\LocationController::class, 'index'])->name('api.applications.locations');
          Route::get('/{location:id}', [Application\Locations\LocationController::class, 'view'])->name('api.application.locations.view');

          Route::post('/', [Application\Locations\LocationController::class, 'store']);
          Route::patch('/{location:id}', [Application\Locations\LocationController::class, 'update']);

          Route::delete('/{location:id}', [Application\Locations\LocationController::class, 'delete']);
      });

      /*
      |--------------------------------------------------------------------------
      | Server Controller Routes
      |--------------------------------------------------------------------------
      |
      | Endpoint: /api/application/servers
      |
      */
      Route::group(['prefix' => '/servers'], function () {
          Route::get('/', [Application\Servers\ServerController::class, 'index'])->name('api.application.servers');
          Route::get('/{server:id}', [Application\Servers\ServerController::class, 'view'])->name('api.application.servers.view');
          Route::get('/external/{external_id}', [Application\Servers\ExternalServerController::class, 'index'])->name('api.application.servers.external');

          Route::patch('/{server:id}/details', [Application\Servers\ServerDetailsController::class, 'details'])->name('api.application.servers.details');
          Route::patch('/{server:id}/build', [Application\Servers\ServerDetailsController::class, 'build'])->name('api.application.servers.build');
          Route::patch('/{server:id}/startup', [Application\Servers\StartupController::class, 'index'])->name('api.application.servers.startup');

          Route::post('/', [Application\Servers\ServerController::class, 'store']);
          Route::post('/{server:id}/suspend', [Application\Servers\ServerManagementController::class, 'suspend'])->name('api.application.servers.suspend');
          Route::post('/{server:id}/unsuspend', [Application\Servers\ServerManagementController::class, 'unsuspend'])->name('api.application.servers.unsuspend');
          Route::post('/{server:id}/reinstall', [Application\Servers\ServerManagementController::class, 'reinstall'])->name('api.application.servers.reinstall');
          # The line we added (below)
          Route::post('/{server:id}/mount', [Application\Servers\ServerManagementController::class, 'mount'])->name('api.application.servers.mount');

          Route::delete('/{server:id}', [Application\Servers\ServerController::class, 'delete']);
          Route::delete('/{server:id}/{force?}', [Application\Servers\ServerController::class, 'delete']);

          // Database Management Endpoint
          Route::group(['prefix' => '/{server:id}/databases'], function () {
              Route::get('/', [Application\Servers\DatabaseController::class, 'index'])->name('api.application.servers.databases');
              Route::get('/{database:id}', [Application\Servers\DatabaseController::class, 'view'])->name('api.application.servers.databases.view');

              Route::post('/', [Application\Servers\DatabaseController::class, 'store']);
              Route::post('/{database:id}/reset-password', [Application\Servers\DatabaseController::class, 'resetPassword']);

              Route::delete('/{database:id}', [Application\Servers\DatabaseController::class, 'delete']);
          });
      });

      /*
      |--------------------------------------------------------------------------
      | Nest Controller Routes
      |--------------------------------------------------------------------------
      |
      | Endpoint: /api/application/nests
      |
      */
      Route::group(['prefix' => '/nests'], function () {
          Route::get('/', [Application\Nests\NestController::class, 'index'])->name('api.application.nests');
          Route::get('/{nest:id}', [Application\Nests\NestController::class, 'view'])->name('api.application.nests.view');

          // Egg Management Endpoint
          Route::group(['prefix' => '/{nest:id}/eggs'], function () {
              Route::get('/', [Application\Nests\EggController::class, 'index'])->name('api.application.nests.eggs');
              Route::get('/{egg:id}', [Application\Nests\EggController::class, 'view'])->name('api.application.nests.eggs.view');
          });
      });
      </code></pre>

4. Now cd into your Pterodactyl folder via the following command: `cd /var/www/pterodactyl`

5. Execute the following commands:<br>

   ```shell-session
   root@pterodactyl:/var/www/pterodactyl# php artisan optimize:clear

      INFO  Clearing cached bootstrap files.  

     events .................................................................................................................................. 5ms DONE
     views ................................................................................................................................... 6ms DONE
     cache ................................................................................................................................... 6ms DONE
     route ................................................................................................................................... 1ms DONE
     config .................................................................................................................................. 1ms DONE
     compiled ................................................................................................................................ 2ms DONE

   root@pterodactyl:/var/www/pterodactyl# php artisan optimize

      INFO  Caching the framework bootstrap files.  

     config ................................................................................................................................. 25ms DONE
     routes ................................................................................................................................. 59ms DONE
   ```

6. After that's done, we can now create our mount. Go to the mounts tab on your Pterodactyl admin panel and click the Create New and fill the fields as in the following example. Make sure to name Target folder as /plugins-repo. Source folder should be set to the path of your plugins folder.<br>

   <figure><img src="/files/R3V82nCivJBWgep0eHHl" alt=""><figcaption><p>Mount creation example</p></figcaption></figure>


# Current Config files

{% hint style="info" %}
The below page explains how to use this feature on PlayerServers 3. This is only relevant if you're a beta tester. To view this page for PlayerServers 2, click [here.](/legacy-v2.x/config)
{% endhint %}

Below you can see the contents of the newest BungeeCord PlayerServers configuration file.

{% hint style="info" %}
Please note that in some extremely rare cases I may **forget to update the config** on this page. For the most up to date config.yml and messages.yml, click [here](https://github.com/arcadiadevs/playerservers-everything).
{% endhint %}

```yaml
#  __________.__                             _________
#  \______   \  | _____  ___.__. ___________/   _____/ ______________  __ ___________  ______
#  |     ___/  | \__  \<   |  |/ __ \_  __ \_____  \_/ __ \_  __ \  \/ // __ \_  __ \/  ___/
#  |    |   |  |__/ __ \\___  \  ___/|  | \/        \  ___/|  | \/\   /\  ___/|  | \/\___ \
#  |____|   |____(____  / ____|\___  >__| /_______  /\___  >__|    \_/  \___  >__|  /____  >
#                     \/\/         \/             \/     \/                 \/           \/
#
# An advanced plugin which allows your players to create their own sub-servers, created by thearcadia.xyz

# Please enter your MySQL information below.
mysql:
  # Url of the MySQL server, in format: jdbc:mysql://<host>:<port>/<database>
  # Any additional options can be added at the end of url, such as:
  # ?autoReconnect=true&useSSL=false?useUnicode=true&characterEncoding=UTF-8
  url: "jdbc:mysql://localhost:3306/playerservers?useSSL=false&serverTimezone=UTC"

  username: root
  password: root

  # Developer options, do not change unless you know what you are doing.
  driver: "com.mysql.cj.jdbc.Driver"
  update-policy: "update"
  debug: false
  get-from-file: false

# Should we automatically update the server core to the latest version
# for all sub-servers upon server restart?
auto-update-server-core: true

# Where should players be moved after they /stop or /ps kill their server?
balancer:
  - Hub1
  - Hub2

# Use player-name instead of server UUID? Basically, when turned on, server-names
# will be equal to player username instead of (for example) aa386b6h
use-usernames: true


# Should we use domain name instead of IP address for servers?
use-subdomain:
  # Should we enable custom subdomain formatting?
  enabled: false

  # What is the API key that we should use?
  # To create an API token, from the Cloudflare dashboard,
  # go to My Profile > API Tokens and select Create Token.
  # When creating the token, select the following permissions:
    # - Zone > DNS > Edit
  api-key: ""

  # What is the IP address that we should use?
  # If you want to use auto-detection, set this to "auto"
  # If you want to use a specific IP address, set this to the IP address
  network-ip: "auto"

  # What is the zone ID that we should use?
  zone-id: ""

  # What is the domain name that we should use?
  domain: "example.com"

  # What is the subdomain format?
  # %id% equals to player name or uuid depending on use-usernames option
  # %uuid% is a random UUID (independent of use-usernames option)
  # %uuid_short% is a random UUID without dashes (independent of use-usernames option)
  # %player% is the player name (independent of use-usernames option)
  # %playeruuid% is the player UUID
  # %playeruuid_short% is the player UUID without dashes
  # %timestamp% is a timestamp in milliseconds
  # %timestampshort% is a timestamp in seconds
  # %day% is a day of the month
  # %month% is a month of the year
  # %year% is a year
  #
  # To find out what a UUID looks like, you can use this website:
  # https://www.uuidgenerator.net
  sub-domain: "%player%"

server-name-format:
  # Should we enable custom server name formatting?
  enabled: false

  # Which format should we use?
  # %id% equals to player name or uuid depending on use-usernames option
  # %uuid% is a random UUID (independent of use-usernames option)
  # %uuid_short% is a random UUID without dashes (independent of use-usernames option)
  # %player% is the player name (independent of use-usernames option)
  # %playeruuid% is the player UUID
  # %playeruuid_short% is the player UUID without dashes
  # %timestamp% is a timestamp in milliseconds
  # %timestampshort% is a timestamp in seconds
  # %day% is a day of the month
  # %month% is a month of the year
  # %year% is a year
  #
  # To find out what a UUID looks like, you can use this website:
  # https://www.uuidgenerator.net
  format: "PS_%id%"

# What is the max amount of servers that can be running at once?
max-running-instances: 15

# If there are no online players, and the last join was before
# more than minutes-to-shutdown, the server will automatically shutdown
# to allow more space for active ones.
minutes-to-shutdown: 15

# After how many seconds after executing cp -r <templatefile> <yourserverfolder>
# should we launch the server? Increase this if you get could not connect message.
copy-delay: 3

ram-limiting:
  # Should we use permissions for ram management? If set to true, you MUST give
  # your players permission playerserver.ram.<amount> (ex: playerserver.ram.512)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have ram-per-server amount of RAM.
  use-permissions: false

  # How much RAM (in MB) should we allocate to each PlayerServer?
  ram-per-server: 512

cpu-limiting:
  # Should we use permissions for cpu management? If set to true, you MUST give
  # your players permission playerserver.cpu.<amount> (ex: playerserver.cpu.1)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have cpu-per-server amount of CPU.
  use-permissions: false

  # How much CPU (in %) should we allocate to each PlayerServer?
  cpu-per-server: 50

disk-limiting:
    # Should we use permissions for disk management? If set to true, you MUST give
    # your players permission playerserver.disk.<amount> (ex: playerserver.disk.256)
    # or, else, the command will be blocked, and player will not be able to create
    # the server. If set to false, everyone will have disk-per-server amount of disk.
    use-permissions: false

    # How much disk (in MB) should we allocate to each PlayerServer?
    disk-per-server: 1024

player-limiting:
  # Should we use permissions for max-players management? If set to true, your
  # players should have playerserver.players.<amount>. The max amount of players
  # that you could give to a single server is 100000. You can also give them
  # playerserver.players.unlimited - for unlimited players. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: false

  # What is the max players each server should have?
  max-players-per-server: 20

plugin-limiting:
  # Should we use permissions for max-plugins management? If set to true, your
  # players should have playerserver.plugins.<amount>. The max amount of plugins
  # that you could give to a single server is 20000. You can also give them
  # playerserver.plugins.unlimited - for unlimited plugins. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: false

  # What is the max players each server should have?
  max-plugins-per-server: 20

# Should we enable smart /ps command? You can find more info about it here:
# https://gitlab.com/OpenSource02/playerservers/-/issues/21
smart-command: false

# Should we enable permissions for server creation, deletion & more?
# If set to false, all the players will have access to those basic commands.
# Obviously, admin commands require permission no matter what.
enable-permissions: true

# Should we disable OOM killer? If set to true, the server will not be
# killed if it runs out of memory, but will instead slowly crash.
# Enable this if your server is crashing due to OOM killer.
disable-oom-killer: false

# Templates will not work on Pterodactyl.
templates:
  default:
    # This is just an example of what you can do with requires-permission.
    # Default template will never require permission, even if set to true.
    requires-permission: false

    # The plugin is built around itzg/minecraft-server as a base image.
    # You can use any image you want, but we do not provide support for it.
    # Use variables below to customize the way your server will be created.
    docker-image: "itzg/minecraft-server"

    # The type of the server jar. Can be "SPIGOT", "PAPER", "PUFFERFISH",
    # "PURPUR", "MAGMA", "FORGE", "FABRIC" and much more.
    #
    # For a full list of supported server jars, check out this link:
    # https://github.com/itzg/docker-minecraft-server/blob/master/README.md#server-types
    type: "PAPER"

    # The version of the template. Paper jar will be downloaded automatically
    # Please avoid using non-standard versions such as 1.7.5 or 1.10 or 1.17.1
    # If you use LATEST, server will always automatically update to the latest
    # version of Minecraft available, as soon as server is restarted.
    # If you use SNAPSHOT, server will always automatically update to the latest
    # snapshot version of Minecraft available, as soon as server is restarted.
    # SNAPSHOT may not work on all types of servers.
    version: "1.8.8"

    # These variables are always sent if you use the default docker image
    # (itzg/minecraft-server) and can not be changed.
    #
    # EULA=true
    # TYPE=%typeFromAbove%
    # VERSION=%versionFromAbove%
    # ONLINE_MODE=false
    # SERVER_PORT=%serverPort%
    #
    # Below you can add more variables for this image or in case you use a custom one.
    # Format: VARIABLE_NAME: "VARIABLE_VALUE"
    variables:
      USE_NATIVE_TRANSPORT: "false" # Required for older versions of Minecraft

# Which folders or files will not show in /config file manager?
disabled-access:
  - "ExampleFolder"
  - "Plugin.jar"

pterodactyl:
  # Should we enable Pterodactyl deployment? If set to true, you don't need
  # to configure PlayerServers Daemon. All deployments will be done by Pterodactyl.
  enabled: false

  # Url of your panel. Example: https://panel.example.com
  # Make sure not to have / at the end!!
  url: "http://localhost:8080"

  # Application token can be created under "Admin" -> "Application API."
  # Make sure to give it read/write access:
  # - Servers
  # - Allocations
  # - Users
  # For everything else except "server databases", give it read-only access.
  application-token: "token"

  # Client token can be generated under "Account" -> "API Credentials."
  # Url: https://panel.example.com/account/api
  # This token must be generated by an admin account.
  client-token: "token"

  # Important variables to configure. Make sure to enter valid nest and egg id from
  # which the servers will be deploy.
  # Location id is the ID of location used for load-balanced deployments.
  # Nodes under the selected location will be slowly filled up with servers.
  # MountID is the id of your plugins mount. If you don't have one, set it to -1.
  nest-id: 0
  egg-id: 0
  location-id: 0
  mount-id: -1

  # Should we print the docker container installation output to the user?
  # Could be useful for debugging, and nonetheless, it can be cool for the player :)
  install-output: true

  environment_map:
    SERVER_JARFILE: "server.jar"
    MINECRAFT_VERSION: "1.8.8"
```

## Current messages.toml

```toml
playerservers-default-cmd="&9PlayerServers> &7An advanced Server Management plugin which allows players to create and manage their own subserver."
license-msg="&9Licence> &7%license%"
no-server="&9Error> &7You don't own a server. Don't worry, you can create one by executing &a/ps create"
not-enough-arguments="&9Error> &7Not enough arguments. Please use &a/ps help &7for more information."
not-enough-arguments-kill="&9PlayerServers> &7Oops, not enough arguments: /playerserver kill stop <uuid (example: 1F4a2id)>"
not-enough-arguments-delete="&9PlayerServers> &7Not enough arguments. &a/playerservers admin delete <uuid>. Please keep in mind that you should not enter the full id. You should just enter the first part (example: if full UUID is 1234-5678-1223-5623, you should just enter 1234)."
no-permission="&9Error> &7Oops, it seems like you don't have permission to do that."
launching-server="&9PlayerServers> &7Your server is starting up. Please wait..."
server-online="&9PlayerServers> &7Your server is now online. You will be connected shortly. Your friends can use &a/server %uuid%&7 to connect."
server-offline="&9PlayerServers> &7Your server is offline. You can start it by executing &a/ps start&7."
already-have="&9PlayerServers> &7You already have a server!"
too-many-online="&9PlayerServers> &7You have too many servers online. Please wait until one of your servers is offline."
template-no-permission="&9PlayerServers> &7You don't have permission to use this template."
starting-creation="&9PlayerServers> &7Your server is being created. Please wait..."
teleporting-soon="&9PlayerServers> &7You will be teleported to your server in a few seconds."
sending-to-remote-server="&9PlayerServers> &7Sending you to your server..."
message="&9PlayerServers> &7%message%"
warning="&c&lAre you sure you want to do that? If you do, please repeat this command in the next 5 seconds."
successfully-renamed="&9PlayerServers> &7Your server has been successfully renamed."
too-long="&9Error> &7Your server name is too long. Please choose a shorter name."
invalid-characters="&9Error> &7Your server name contains invalid characters. Please choose a valid name."
rename-failed="&9Error> &7Renaming your server failed. Please try again later."
not-online="&9Error> &7Your server is not online."
successfully-killed="&9PlayerServers> &7Your server has been successfully killed."
connected="&9PlayerServers> &7You are being connected to your server..."
killing="&9PlayerServers> &7Killing your server..."
successfully-removed="&9PlayerServers> &7Your server has been successfully removed."
removing="&9PlayerServers> &7Deleting your server..."
remove-warning="&9PlayerServers> &7Are you sure you want to remove your server? If you do, please repeat this command in the next 5 seconds."
account-created-successfully="&9PlayerServers> &7Your account has been created successfully."
account-creation-failed="&9Error> &7Account creation failed. Please try again later.  Error: %error%"
server-created-successfully="&9PlayerServers> &7Your server has been created successfully on Pterodactyl panel. Please login at &6%link% &7 with username &6%username% &7 and password &6%password% &7 to manage your server."
server-creation-failed="&9Error> &7Server creation failed. Please try again later. Error: %error%"
no-port-available="&9Error> &7Oops, it seems like there are no ports available. Please try again later."
no-node-available="&9Error> &7Oops, it seems like there are no nodes available. Please try again later."
action-error="&9Error> &7Oops, it seems like there was an error while performing this action. Please try again later. Error: %error%"
node-created-successfully="&9PlayerServers> &7Node has been created successfully."
server-not-found="&9Error> &7Oops, we couldn't find that server."
not-enough-arguments-start="&9Error> &7You didn't provide enough arguments. Please use &a/ps admin start <uuid>&7."
sending-info-to-remote-server="&9PlayerServers> &7Sending information to the remote node..."
node-not-found="&9Error> &7Oops, we couldn't find that node."
node-removed-successfully="&9PlayerServers> &7Node has been removed successfully."
```


# Commands & permissions

Below is the list of all the commands & plugin permissions

## Commands

<table data-header-hidden><thead><tr><th width="175">Command</th><th width="119">Aliases</th><th width="107">Plugin</th><th width="123">Permission</th><th>Notes</th></tr></thead><tbody><tr><td>Command</td><td>Aliases</td><td>Plugin</td><td>Permission</td><td>Notes</td></tr><tr><td>/playerserver</td><td>/ps</td><td>Bungee</td><td>playerservers.manage</td><td>Gives you the plugin description &#x26; licence info.</td></tr><tr><td><p>/playerserver</p><p>create <strong>&#x3C;template></strong></p></td><td>/ps create</td><td>Bungee</td><td>playerservers.manage</td><td><p>Creates a new subserver if you don't already have one. </p><p></p><p>&#x3C;<strong>template</strong>> variable is optional and used to specify template name. If no tmp is specified, and if players just do /ps create, it will simply just create the server with the "default" template.</p></td></tr><tr><td><p>/playerserver</p><p>start</p></td><td><p>/ps boot</p><p>/ps enable</p></td><td>Bungee</td><td>playerservers.manage</td><td>If your server is offline, it will try to boot it up.</td></tr><tr><td><p>/playerserver</p><p>delete</p></td><td>/ps remove</td><td>Bungee</td><td>playerservers.manage</td><td>At first it asks you to confirm your decesion by repeating the command, that it removes your sub-server and removes you from the database.</td></tr><tr><td><p>/playerserver</p><p>stop</p></td><td><p>/ps shutdown</p><p>/ps forcestop</p><p>/ps disable</p></td><td>Bungee</td><td>playerservers.manage</td><td>Forcefully kills your sub-server. Not recommended at all and can cause some world destruction. Chunks could be damaged.</td></tr><tr><td><p>/playerserver</p><p>join</p></td><td>/ps connect</td><td>Bungee</td><td>none</td><td><p>Connects you to your sub-server and gives</p><p>you your ServerID and a special command that your friends can use to connect to your server.</p></td></tr><tr><td>/psadmin delete &#x3C;uuid></td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td><p>Followed by uuid, forcefully kills and</p><p>removes the server with given uuid.</p></td></tr><tr><td>/psadmin stop &#x3C;uuid></td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Stops the server with the given uuid.</td></tr><tr><td>/psadmin stopall</td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Stops all the subservers on the network.</td></tr><tr><td>/psadmin start &#x3C;uuid></td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Starts the server with the given uuid.</td></tr><tr><td>/psadmin node create</td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Used for creating nodes. Learn more <a href="/pages/7QHIoRo67XXtQQcrGKSN">here</a>.</td></tr><tr><td>/psadmin node manage &#x3C;nodeName> delete</td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Removes the specified node.</td></tr><tr><td>/psadmin node manage &#x3C;nodeName> list</td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Lists all the servers under the specified node.</td></tr><tr><td>/psadmin node manage &#x3C;nodeName> stopall</td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Stops all the servers on the specified node.</td></tr><tr><td>/psadmin node manage &#x3C;nodeName> changeportrange &#x3C;min-port> &#x3C;max-port></td><td>none</td><td>Bungee</td><td>playerservers.admin</td><td>Changes the port range of the specified node.</td></tr><tr><td>/menu</td><td>none</td><td>Server Core</td><td>none</td><td><p>Opens up Server Manager GUI for general</p><p>info and statistics, as well as for installing</p><p>predefined plugins</p></td></tr><tr><td>/config</td><td>none</td><td>Server Core</td><td>none</td><td><p>Opens up config file manager for editing</p><p>config files</p></td></tr></tbody></table>


# Limitations

Learn how to set permission-based limitations for your players.

Click on a page below to learn how to setup permissions based limitations.

{% content-ref url="/pages/PyLURF0MfneM3kuaGLXE" %}
[Permission-based RAM](/overview/limitations/permission-based-ram)
{% endcontent-ref %}

{% content-ref url="/pages/PLF1iStL9yEfqiwNLHAz" %}
[Permission-based CPU](/overview/limitations/permission-based-ram-1)
{% endcontent-ref %}

{% content-ref url="/pages/Amp4IF02HPzfdCAwHFeX" %}
[Max players limitation](/overview/limitations/max-players-limitation)
{% endcontent-ref %}

{% content-ref url="/pages/GnoKZ2PBIbBo8TeuntAF" %}
[Max plugins limitation](/overview/limitations/max-plugins-limitation)
{% endcontent-ref %}


# Permission-based RAM

Learn how to make a permission-based RAM system for your players

## Introduction

We know that making a permission-based RAM system is a crucial to our customers and could be greatly used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based RAM system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your ram-limiting part of the config looks as following:

```yaml
ram-limiting:
  # Should we use permissions for ram management? If set to true, you MUST give
  # your players permission playerservers.ram.<amount> (ex: playerserver.ram.512)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have ram-per-server amount of RAM.
  use-permissions: true

  # How much RAM (in MB) should we allocate to each of the PlayerServers?
  ram-per-server: 512
```

By enabling use-permissions, the plugin will ignore ram-per-server option and will use permission-based RAM management system.

The next thing you'll wanna do is to give all the groups that have `playerservers.manage` permission a new permission as following: `playerservers.ram.<amount in MB>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerservers.ram.512
```


# Permission-based CPU

Learn how to make a permission-based CPU system for your players

{% hint style="info" %}
The below page explains how to use this feature on PlayerServers 3. This is only relevant if you're a beta tester. This feature is not available in the public release yet.
{% endhint %}

## Introduction

We know that making a permission-based CPU system is a crucial to our customers and could be greately used for safety of your infrastructure and preventing overload as well as for stores in order to motivate players to upgrade to a higher rank, so we've implemented a permission-based CPU system. In this tutorial, you'll learn how to configure it for your needs.

{% hint style="warning" %}
This feature is only working if you have Pterodactyl or Docker enabled. Screen based servers can not have CPU limitations.
{% endhint %}

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your cpu-limiting part of the config looks as following:

```yaml
cpu-limiting:
  # Only for docker-based servers,
  # should we use permissions for cpu management? If set to true, you MUST give
  # your players permission playerservers.cpu.<amount> (ex: playerserver.cpu.1)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have cpu-per-server amount of CPU.
  use-permissions: false

  # How much CPU (in %) should we allocate to each PlayerServer?
  cpu-per-server: 50
```

By enabling use-permissions, the plugin will ignore cpu-per-server option and will use permission-based CPU management system.

The next thing you'll wanna do is to give all the groups that have `playerservers.manage` permission a new permission as following: `playerservers.cpu.<cpu as percentage>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerservers.ram.100
```

In the following example, we gave the role default ability to create a server with 1 CPU core.


# Max players limitation

## Introduction

We know that making a permission-based slots system is a crucial to our customers and could be greately used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based slots system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your player-limiting part of the config looks as following:

```yaml
player-limiting:
  # Should we use permissions for max-players management? If set to true, your
  # players should have playerservers.players.<amount>. The max amount of players
  # that you could give to a single server is 100000. You can also give them
  # playerserver.players.unlimited - for unlimited players. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: true

  # What is the max players each server should have?
  max-players-per-server: 20
```

By enabling use-permissions, the plugin will ignore max-players-per-server option and will use permission-based slots management system.

The next thing you'll wanna do is to give all the groups that have `playerservers.manage` permission a new permission as following: `playerservers.players.<amount>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerservers.players.10
```

If your groups have parent permission, the plugin will give the player the largest possible amount of slots by their permission.


# Max plugins limitation

## Introduction

We know that making a permission-based plugins limitation system is a crucial to our customers and could be greately used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based plugin limitation system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your plugin-limiting part of the config looks as following:

```yaml
plugin-limiting:
  # Should we use permissions for max-plugins management? If set to true, your
  # players should have playerservers.plugins.<amount>. The max amount of plugins
  # that you could give to a single server is 20000. You can also give them
  # playerserver.plugins.unlimited - for unlimited plugins. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: true

  # What is the max players each server should have?
  max-plugins-per-server: 20
```

By enabling use-permissions, the plugin will ignore max-plugins-per-server option and will use permission-based plugin limiting system.

The next thing you'll wanna do is to give all the groups that have `playerservers.manage` permission a new permission as following: `playerservers.plugins.<amount>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerservers.plugins.10
```

If your groups have parent permission, the plugin will give the player the largest possible amount of plugins by their permission.


# Legacy (v2.x)

Expand this category to view documentation for Legacy versions of PlayerServers (older than v3)

{% content-ref url="/pages/-M7D6aYJIZuCliApHxE-" %}
[PlayerServers - Overview](/)
{% endcontent-ref %}

{% content-ref url="/pages/-M7JE-pMhbdvlrEmmnrU" %}
[Permissions & Commands](/legacy-v2.x/permissions-and-commands)
{% endcontent-ref %}

{% content-ref url="/pages/-M7D8LCW1m-qSf6CNkpI" %}
[Plugin Installation Tutorial](/legacy-v2.x/installation)
{% endcontent-ref %}


# Updates

Here you can read update instructions between major versions

{% content-ref url="/pages/-MJnS7F\_flQ2-PRHHtCm" %}
[8.0 to v1.0](/legacy-v2.x/updates/8.0-to-v1.0)
{% endcontent-ref %}

{% content-ref url="/pages/-M9Iq3oC-bLX\_c4-tAqt" %}
[3.7-D to 4.0](/legacy-v2.x/updates/update1)
{% endcontent-ref %}

{% content-ref url="/pages/-MA8ThJxkwobHLDACu\_3" %}
[5.0 to 6.0](/legacy-v2.x/updates/5.0-to-6.0)
{% endcontent-ref %}


# PlayerServers - General

An advanced plugin which allows your players to create their sub-servers as part of your network, isolated in Docker and manageable with easy-to-use GUI or intuitive Pterodactyl panel interface

## Description

PlayerServers is an advanced plugin that will allow your players to create their own sub-server with just one command. On that server, they'll be owners and they'll have the whole control under that server. They'll even be able to install plugins on it using an advanced GUI. [**In order to purchase it, please scroll to the bottom of this page.**](/#purchase-it-now)

## Features

* **Async, lag-free:** Creation of servers happens 95% in async mode, which means that the creation of servers will be processed in a separate thread and 0 lag will be generated during that period.
* **Templates:** You'll be able to create the default template which will be used when creating the servers.
* **HubCore:** When purchasing this plugin, you'll get an additional HubCore plugin which will allow you to make a compass that will show online & offline player servers and give your players the ability to connect to them. Furthermore, it will give you some basic options for your lobby like disabling rain, hunger & damage. A special placeholder that will allow players to see current player-count on their sub server is also included.
* **Automatically terminate inactive servers**: if servers are inactive (or don't have any players) for a configurable amount of time, they will automatically shutdown.
* **Fast & Efficient:** The creation of the server happens in less than 2 seconds which will allow your players to be teleported to their sub server in less than 15 seconds (other time will be used for boot-up of spigot server, and generating the main world - also, the huge factor is your server CPU)
* **ControlGUI:** Server owners will have their GUI control panel, that they'll be able to access with command /menu. It will allow them to manage various parts of the server (whitelist, bans, weather & more) and give them an option to install, enable, or disable additional plugins (see screenshots below).
* **Permissions-based:** Configure per-group permissions on max plugins, max players or RAM
* **Automatic & works out of the box:** The plugin is working out of the box without any need for external dependencies. Thanks to the integration of the [Bungee Server Manager plugin](https://www.spigotmc.org/resources/bungeeservermanager.7388/) (which I'm allowed to integrate, as it could be seen [here](https://i.imgur.com/iMT8RAh.png)), we were able to achieve the effect of automatically adding newly created sub servers to the BungeeCord config & server list without the need of any reboot or greload. The same goes for the deletion of sub servers as well.

## Purchase it now

* SpigotMC - [https://www.spigotmc.org/resources/82268/](https://www.spigotmc.org/resources/「-playerservers-」let-your-players-have-their-own-server.82268/)
* MC-Market - <https://www.mc-market.org/resources/15521/>
* Songoda - [https://songoda.com/marketplace/product/418](https://songoda.com/marketplace/product/playerservers-let-your-players-have-their-own-server-an-advanced-plugin-which-allows-you.418)


# v1.1 to v1.2

## Updating PlayerServers

For the initial update, please reset your messages.toml, or take a look at the [new version](https://gitlab.com/OpenSource02/playerservers/-/blob/master/messages.toml) of the mentioned file and add the missing messages.

{% hint style="success" %}
Great, you're done! If you use multi-node as well, continue reading below to learn how to update it as well.
{% endhint %}

## Updating Daemon

With the new Daemon, a new Templates system from v1.2 comes as well. In the template named "Default" (located in Daemon/templates/default - which SHOULD be automatically generated after you run Daemon v1.1 for the first time), please insert at least Spigot.jar. Should you wish to edit the template further, please add any plugins/worlds to it as well.


# 8.0 to v1.0

Execute the following linux commands:

```bash
mysql -u root -p
USE dbName; # Replace dbName with your playerservers database name
ALTER TABLE PLAYERSERVERS NODE ADD COLUMN varchar(20);
```

Execute the following command:

```
/ps admin sqlhotfix
```

Add the following blocks to the bottom of your config.yml:

```yaml
# BETA FEATURES. USE AT OWN RISK!!
multi-node: false
experimental-rename: false
pterodactyl-compatibility: false
```

Make sure your messages.toml contains all the messages:

```yaml
run-in-game = "&9Error> &7Oops! You can only run this command in-game."
not-enough-arguments = "&9PlayerServers> &7Oops, not enough arguments: /playerservers admin test <node-name>"
not-enough-arguments-kill = "&9PlayerServers> &7Oops, not enough arguments: /playerserver kill stop <uuid (example: 1F4a2id)>"
not-enough-arguments-delete = "&9PlayerServers> &7Not enough arguments. &a/playerservers admin delete <uuid>. Please keep in mind that you should not enter the full id. You should just enter the first part (example: if full UUID is 1234-5678-1223-5623, you should just enter 1234)."
no-permission = "&9Error> &7Oops, it seems like you don't have permission to do that."
launching-server = "&c&lLaunching your server. This might take some time. You will be teleported as soon as it's ready."
server-online = "&9PlayerServers> &7Oops, it seems like your server is not online."
successfully-renamed = "&9PlayerServers> &7Successfully renamed server."
rename-failed = "&9PlayerServers> &7Oops, the server with that name already exists."
already-have = "&9Error> &7Oops, it seems like you already have a server!"
too-many-online = "&9Error> &7Oops, it seems like too many servers are running at the moment."

[server-creation]

process-first = "&9PlayerServer> &7Starting the creation of your server..."
process-second = "&9Process> &7Successfully copied Spigot.jar & created eula.txt"
process-third = "&9Process> &7Successfully copied the PlayerServerCore to your server."
process-fourth = "&9Process> &7Successfully created server.properties & start.sh"

post-process-one = "&9PostProcess> &7Your server has been added to the BungeeCord. Teleporting in &a%time% &7seconds..."

sending-to-remote-server = "&9Process> &7We're beginning the creation of your server on the first remote node that provides us with ample resources. This will not take a while."

[server-stop]

successfully-killed = "&9Success> &7Your server has been successfully killed."

[server-start]

prepairing = "&9PlayerServers> &7Preparing to launch your server."

successfully-started = ""

[server-connect]

connected = "&9PlayerServer> &7You've been successfully sent to your server. Your friends can use &a/server %uuid%&7 to connect."
```

{% hint style="success" %}

## Great, you're done!

If you had any problems upgrading, please contact us on our Discord [here](https://invite.gg/arcadiaxyz).
{% endhint %}


# 5.0 to 6.0

## Introduction

6.0 was probably the biggest update yet, which requires some changes. You can read all of those on our MC-Market [post here](https://www.mc-market.org/resources/15521/update?update=48897), in case you're updating between preview versions. In case you waited for the stable version, here are some info:

## Update process

1. Execute **/ps admin update** in order to update PlayerServerCore
2. Add following three blocks to your config.yml file

```yaml
player-limiting:
  # Should we use permissions for max-players management? If set to true, your
  # players should have playerserver.players.<amount>. The max amount of players
  # that you could give to a single server is 100000. You can also give them
  # playerserver.players.unlimited - for unlimited players. If the player
  # has no permission, he'll be able to have unlimited players.
  use-permissions: false

  # What is the max players each server should have?
  max-players-per-server: 20
```

```yaml
build-tools:
  # Should we log build-tools console output? Highly recommended to set
  # to true, as it will help me a lot with potential issues.
  build-tools-debug: true

  # What version should we build for PlayerServers?
  # Do "latest" for latest, do "1.8.8" for 1.8.8, etc.
  # If you want to change the sub-servers version,
  # you will have to delete templates/Spigot.jar first,
  # and than reboot the server. Btw, it is highly
  # recommended to use 1.8.8 for sub-servers.
  build-version: "1.8.8"
```

```yaml
plugin-limiting:
  # Should we use permissions for max-plugins management? If set to true, your
  # players should have playerserver.plugins.<amount>. The max amount of plugins
  # that you could give to a single server is 20000. You can also give them
  # playerserver.plugins.unlimited - for unlimited plugins. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: false

  # What is the max players each server should have?
  max-plugins-per-server: 20
```


# 3.7-D to 4.0

## Introduction

4.0 is quite a huge update, as the introduction of Permission-based RAM management requires update for other dependencies & config, and therefore requires you to do some additional steps in order to upgrade.

## Upgrade process

This update required me to change some of the functionalities of LauncherWrapper. That being said, it was required to implement a command to automatically download the latest Launcher.jar and replace it in all of your sub-servers. Begin this update process by executing:

```
/ps admin updatelauncher
```

Wait for the process to finish. After that, it is required to change a few things in your config.yml. Begin by removing the following line: `ram-per-server: 512`, and replace it with the following block:

```yaml
ram-limiting:
  # Should we use permissions for ram management? If set to true, you MUST give
  # your players permission playerserver.ram.<amount> (ex: playerserver.ram.512)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have ram-per-server amount of RAM.
  use-permissions: false

  # How much RAM (in MB) should we allocate to each of the PlayerServers?
  ram-per-server: 512
```

In case you'd like to see the default config after this update, please click the link below:

{% content-ref url="/pages/-M7JyYLauDGiZYOblXBN" %}
[Current Config & Messages File](/legacy-v2.x/config)
{% endcontent-ref %}

In case you'd like to learn more about permission-based RAM system, follow this link:

{% content-ref url="/pages/-M9IrybPLWx6k1j0JHYc" %}
[Permission-based RAM](/legacy-v2.x/limitations/permission-based-ram)
{% endcontent-ref %}


# Basic instructions

Below you can find some of the basic instructions on how to create your sub-server, how to shut it down, how to boot it back up, and how to access it.

Please note that if you need help with those commands, you should ask them on your server's website, their forums, support page, on their email / twitter or their Discord. Please do **not join** our Discord for help with the commands. It's intended to give support for server owners, not their players.

{% tabs %}
{% tab title="Creating the server" %}

## Creating the server

In order to create your player-server, you just need to run the command below:

```
/playerserver create
```

After that, you'll get a message that your server is being created. If everything went fine, you'll be sent to your sub-server and you'll get a special code that other users will be able to use in order to teleport to your server. If not, you'll get an **error** message. In that case, please contact the server administrator.

{% hint style="warning" %}
**WARNING**: You can create only one subserver. The command above will NOT work if you already own one.
{% endhint %}
{% endtab %}

{% tab title="Deletion of your server" %}
In order to delete your server, you need to shut it down first. In order to do so, you first need to join your server. If you're unsure on how to do so, please type the command below:

```
/playerserver join
```

After that, you need to type the command below:

```
/stop
```

After stopping your server, you need to run the final command which will delete your server

```
/playerserver delete
```

If everything went successfully, your server should be deleted now. If something failed, you'll get an error code. In that case, please contact the server administrator
{% endtab %}

{% tab title="Stopping & Booting up your server" %}

## Shutting down your server

In order to stop your server, you just need to execute the command below, while you're connected to your server:

```
/stop
```

## Booting up your server

If your server is down, you just need to execute command below in order to boot it up:

```
/playerserver start
```

{% endtab %}

{% tab title="How to join your server" %}

## How to join your server

If you're on the main lobby, you just need to execute the command below in order to be teleported to your server:

```
/playerserver join
```

After being teleported, you'll get a command that your friends will be able to use to teleport to your server.

{% hint style="danger" %}

## I was not teleported! What now?!

If you were not teleported, it is most likely that your server is down. In order to boot it up, please click on the Stopping & Booting up your server section in order to get instructions on how to boot up your server.
{% endhint %}
{% endtab %}
{% endtabs %}


# Plugin management

Below you can see the tutorial on how to install & remove plugins on / from your sub-server.

## Installing plugins on your sub-server

{% hint style="info" %}
In order to install plugins, you'll need to be on your server. If you're not sure on how to connect to it, the [Basic Instructions](/legacy-v2.x/basic-instructions) page might help you.
{% endhint %}

After successfully connecting to your subserver, you need to execute the command below:

```
/menu
```

A Inventory GUI should appear. If it does not, please contact the server administrator for help. The GUI should look like this:

![Server Management GUI](/files/-M7DfhbrHExSFUdgcK-x)

After entering the GUI, select the clock icon with text Plugin Management. By clicking this button, you'll see all available plugins that owners pre-configured for you to be able to install. All the plugins marked with red-stone blocks are disabled and ready for you to install them. All the plugins that are marked with emerald blocks are currently installed and can be removed with a simple click.

{% hint style="danger" %}
**WARNING**: Please make sure to reboot your server after installing new plugins by typing in the command `/stop.`After that, you can boot your server back up by executing command `/playerserver start`. For more informations, visit the [Basic Instructions](/legacy-v2.x/basic-instructions) page.
{% endhint %}


# Plugin Installation Tutorial

Here is a guide with details that you need to follow in order to complete the installation.

## Before installation

In order to install PlayerServers, you will need to have a **VPS or Dedicated** server with **root** access. If you do not have it, please do not buy the plugin or try to install it on a **Shared (Game) Hosting.**

## Picking the right OS

We understand that if you have your server already up and running, it might come hard for you to change your OS. That's why we tested our plugin on many of the popular OS-es. Even tho some of them are marked with ⚠️, it doesn't mean the plugin will not work there, it just means that the instructions from this guide will not help you while setting up the plugin on those Operating Systems, but if you configure everything correctly (like installing Java, Screen & Fuser) the plugin should work without any problems. If you have any problems with an OS marked with ✅, please contact me so we can solve it.

Operating Systems marked with ⛔️ are currently not supported at all, but the support for them come in the future versions. Below is the list of all the popular operating systems:

<table data-header-hidden><thead><tr><th>Operating System</th><th width="157">Version</th><th width="121">Supported</th><th>Notes</th></tr></thead><tbody><tr><td><strong>Operating System</strong></td><td>Version</td><td>Supported</td><td>Notes</td></tr><tr><td><strong>Ubuntu</strong></td><td><p>20.04</p><p>22.04</p></td><td>✅</td><td>Documentation written assuming Ubuntu 22.04<br>as the base OS. Heavily tested on 20.04 as well.</td></tr><tr><td><strong>Ubuntu</strong></td><td><p>18.04</p><p>(Bionic)</p></td><td>✅</td><td>The plugin was tested on this OS and confirmed to have no issues.</td></tr><tr><td><strong>Ubuntu</strong></td><td>16.04</td><td>⚠️</td><td>Untested, but the plugin should work</td></tr><tr><td><strong>Debian</strong></td><td><p>9</p><p>10</p><p>11</p></td><td>✅</td><td><p>Tested, the plugin worked but the instructions from this guide might be invalid for that OS.</p><p></p><p>Some additional repos might be required.</p></td></tr><tr><td><strong>Debian</strong></td><td>9<br>8</td><td>⚠️</td><td>Untested, additional repos may be required</td></tr><tr><td><strong>CentOS</strong></td><td>7 &#x26; 8</td><td>⚠️</td><td><strong>Not tested</strong>, though we had reports of centOS working without any issues.</td></tr><tr><td><strong>Windows</strong></td><td><p>Server 2016</p><p>Server 2019</p><p>Server 2022</p><p>10</p><p>11</p></td><td>❌❓</td><td><p><strong>Tested, not working.</strong> It <strong>may</strong> work though, by installing Ubuntu subsystem for Windows. </p><p></p><p>You can find more tutorials about that on Youtube.</p></td></tr><tr><td><strong>MacOS</strong></td><td><p>Mojave</p><p>Catalina</p><p>Big Sur</p><p>Monterey<br>Ventura</p></td><td>✅</td><td><p>Should work without any problems as it comes with</p><p>screen &#x26; fuser pre-installed. <br><br>Tested on M1 processors as well. On M1 machines, ARM JVM like Azul Zulu is highly recommended.</p></td></tr></tbody></table>

## Requirements

{% hint style="info" %}
Before installing the dependencies below, it is recommended to run `apt-get update` command as the commands below might not work without it.
{% endhint %}

In order to install PlayerServers on your machine, you obviously need to have Java (the plugin was compiled using Java 8, as it's the standard version of Java, and it's been tested on Java 11, but it should work on newer versions as well. If it does not, please report it). The recommended version of Java to be used with this plugin is Java 11. If you don't have it already installed, please execute the command below in your Linux Terminal.

{% hint style="warning" %}
If you're using 2.0+ versions of PlayerServers, you'll need to install Java 16, or preferrably Java 17 - as it'll become standard as of PlayerServers 3.0.

You can find an in-depth guide on that [here](https://linuxways.net/ubuntu/how-to-install-oracle-java-16-on-ubuntu-18-04-20-04/).
{% endhint %}

```bash
$ apt-get install default-jre -y
```

The second required dependency is Screen. We use screens for providing easy access to PlayerServers. In order to install it, you need to execute the command below. For further help with Screen, please go to the [Screen (accessing consoles)](/legacy-v2.x/screen) page.

```bash
$ apt-get install screen -y
```

After successfully installing Screen, you will need to install **fuser**. Many Linux distros already come with it **pre-installed**, but if you don't have it, make sure to install it by executing the following command:

```bash
$ apt-get install fuser -y
```

## Installation of the plugin

In order to install the plugin, you just need to put it into your BungeeCord plugins folder. After that, please reboot your server and let the plugin generate it's config files and download some other required dependencies.

{% hint style="danger" %}
After the first boot of the server, you will see some errors generated by the plugin. Don't worry, just **shutdown** your BungeeCord server and follow the instructions below in order to solve it.
{% endhint %}

Now navigate to the `plugins folder -> PlayerServers` and open up the config.yml file. It is recommended to open it usign some sort of advanced text editor (like [Notepad++](https://notepad-plus-plus.org) or [VisualStudio Code](https://code.visualstudio.com)). After that, you will have to enter your MySQL informations. If you're unsure on how to create database on Linux machine, this [Creating MySQL database](/legacy-v2.x/creating-mysql-database) page might help you.

After the configuration of MySQL database, boot up your BungeeCord server. The plugin should successfully launch this time.

{% hint style="success" %}

### That's it!

If you followed the guide correctly, you will have a working version of PlayerServers installed. If there are any additional errors, or you need help with something, please don't hesitate to send me PM od MC-Market, or on Discord - `OpenSource#3310`
{% endhint %}

## ~~Possible Issues~~

~~While installing PlayerServers for the first time, it is **required** for the plugin to download some **dependencies** from our servers. If servers are down, you might encounter some errors. If you see those errors, please contact the developer on our~~ [~~Support Discord~~](https://discord.io/arcadiaservices)~~.~~

\~\~Don't worry, **you can still install the plugin even if servers are down**. In the downloaded .zip file, you'll see sub-folder called **Use only if needed**. Copy the contents of that folder to:

`BungeeCord -> plugins -> PlayerServers -> Templates`

and you should be fine to complete the installation. If there are any other unexpected issues, don't hesitate to ask. We'll always respond in less than 24 hours.\~\~

{% hint style="warning" %}
~~**NOTE FOR SPIGOT / MINEMEN USERS:** Since spigot does not allow large file sizes, you'll need to download required files from links blow, as your download does not include **Use only if needed** folder.~~

* ~~\~\~\[~~PlayerServerCore.jar~~]\(~~<http://cdn.thearcadia.xyz/playerservers/PlayerServerCore.jar>~~)~~\~\~
* ~~\~\~\[~~Launcher.jar~~]\(~~<http://cdn.thearcadia.xyz/playerservers/Launcher.jar>~~)~~\~\~
* ~~\~\~\[~~Spigot.jar~~]\(~~<http://cdn.thearcadia.xyz/playerservers/Spigot.jar>~~)~~\~\~
* ~~\~\~\[~~eula.txt~~]\(~~<http://cdn.thearcadia.xyz/playerservers/eula.txt>~~) \~\~- copy contents of this page inside new file: eula.txt, and put it in your templates directory, as described above.~~
  {% endhint %}

If you're using 8.0+, you will not ever encounter those issues, as the plugin is no longer cloud-depandent


# Editing config files

This tutorial might be a little bit confusing for non-experienced users, but we tried to explain it step-by-step as good as we possibly could. If you need additional help, please contact server staff.

## Editing config files - full tutorial

{% hint style="info" %}
In order to edit the config files, you first need to be connected to your subserver. If you're not sure on how to do that, [Basic Instructions](/legacy-v2.x/basic-instructions) page will help you.
{% endhint %}

After connecting to your server, execute the following command:

```
/config
```

That command will open up the GUI with all the files on your server. From there, you'll be able to navigate to the folder of the plugin you want to edit. There are some screenshots below:

![The main GUI that will show all the contents of /plugins directory](/files/-M7DofMlmt8WUqiJmEs6)

![By clicking on the WorldEdit folder, we've entered the sub-folder content.](/files/-M7DoljondOo7890p7mK)

By clicking on the config.yml file, you'll be generated the link in the chat. That link will navigate you to the HasteBin (or in some cases paste.md-5.net) website. By opening it up, you'll see the contents of your config file. The worldedit example will look like the following:

![By clicking on config.yml, we've gotten the hastebin link. We'll open it up in the next screenshot.](/files/-M7DpLvaG3s4Ms2VfgxJ)

![And here is our config](/files/-M7Dpk8ZIxNx7vCvZy2_)

Now, in order to edit your config, please click on duplicate and edit button on the top right side of the screen, as it could be seen on the image below:

![By clicking on duplicate & edit button, our config will become editable](/files/-M7Dq9LVED38HB5LqO9D)

By clicking that option, you'll be granted the access to modify your config. After modifying it, be sure to click the save button:

![](/files/-M7DqRRFmhi5-694CEKz)

By clicking the save button, the config will no longer be editable once again. Now, the only thing you need to do is open up the `/config` menu once again, navigate to your config file, and this time, you need to **right click it.** After that, Anvil GUI will pop up and you need to paste the link of your new edited version of the file, **but without https\://.** For example, if you've gotten the link <https://hastebin.com/mynewconfig.yml>, you need to paste in just hastebin.com/mynewconfig.yml, **without&#x20;**~~**https\://.**~~

{% hint style="success" %}
And that's it. Your file is now modified. In order to apply the changes, please consider **restarting your server.** More detailed guide on how to stop & boot up your server can be found on the [Basic Instructions](/legacy-v2.x/basic-instructions) page. If you need any additional informations, contact the staff team.
{% endhint %}


# Current Config & Messages File

Below you can see the contents of the newest BungeeCord PlayerServers configuration file.

{% hint style="info" %}
Please note that in some extremely rare cases I may **forget to update the config** on this page.
{% endhint %}

```yaml
#  __________.__                             _________
#  \______   \  | _____  ___.__. ___________/   _____/ ______________  __ ___________  ______
#  |     ___/  | \__  \<   |  |/ __ \_  __ \_____  \_/ __ \_  __ \  \/ // __ \_  __ \/  ___/
#  |    |   |  |__/ __ \\___  \  ___/|  | \/        \  ___/|  | \/\   /\  ___/|  | \/\___ \
#  |____|   |____(____  / ____|\___  >__| /_______  /\___  >__|    \_/  \___  >__|  /____  >
#                     \/\/         \/             \/     \/                 \/           \/
#
# An advanced plugin which allows your players to create their own sub-servers, created by thearcadia.xyz

# Please enter your MySQL information below.
mysql:
  hostname: 127.0.0.1
  username: web
  password: webmaster
  database: playerservers
  useSSL: true

  additionaloptions: []
  #  - "allowPublicKeyRetrieval=true"

  url-based-connection:
    enabled: false
    driverName: "com.mysql.cj.jdbc.Driver"

    # If you're using this connection method, you'll be entering your hostname,
    # port and database name below in the jdbcUrl string. The ones above will not
    # be considered.
    jdbcUrl: "jdbc:mysql://localhost:3306/playerservers"

  # Between version v1.2-RC6 and v1.2-RC7 there was a change in
  # Database handling. Everyone upgrading that were satisfied
  # on how it worked before should keep it as false, or first
  # try enabling it and seeing if their servers are still
  # attached to their account or not. In some rare cases it
  # can happen that changing the value of this option can
  # detach servers from your account, so enabling it if it
  # worked correctly for you before is not needed.
  use-modern-database: true

# This setting defines port range
ports:
  # Server port range
  start-port: 30000
  end-port: 40000

  # Panel port range only if experimental-panel is enabled
  panel-start-port: 40000
  panel-end-port: 50000

# Where should players be moved after they /stop or /ps kill their server?
balancer:
  - Hub1
  - Hub2

# Use player-name instead of server UUID? Basically, when turned on, server-names
# will be equal to player username instead of (for example) aa386b6h
use-usernames: true

server-name-format:
  # Should we enable custom server name formatting?
  enabled: false

  # Which format should we use?
  # %id% equals to player name or uuid depending on use-usernames option
  format: "PS_%id%"

# What is the max amount of servers that can be running at once?
max-running-instances: 15

# If there are no online players, and the last join was before
# more than minutes-to-shutdown, the server will automatically shutdown
# to allow more space for active ones.
minutes-to-shutdown: 15

# After how many seconds after executing cp -r <templatefile> <yourserverfolder>
# should we launch the server? Increase this if you get could not connect message.
copy-delay: 3

# Default startup command. Supports %uuid% for server UUID and %mem% for memory.
launch-command: "screen -dmS %uuid% java -Xmx%mem%M -jar Spigot.jar"

# In how much seconds, after first boot-up of the server should we
# teleport the player to their sub-server? This depends on the strength
# of your machine CPU. If you have a stronger machine, you might wanna set
# it to something like 12 seconds, if you have some kind of Xeon with less
# than 3.9Ghz, you might wanna set this to 15-20 seconds.
teleport-time: 15

# In how many seconds should we attempt to connect player to their
# sub-server after it being launched by /playerserver start command?
teleport-time-normal: 10

ram-limiting:
  # Should we use permissions for ram management? If set to true, you MUST give
  # your players permission playerserver.ram.<amount> (ex: playerserver.ram.512)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have ram-per-server amount of RAM.
  use-permissions: false

  # How much RAM (in MB) should we allocate to each PlayerServer?
  ram-per-server: 512

player-limiting:
  # Should we use permissions for max-players management? If set to true, your
  # players should have playerserver.players.<amount>. The max amount of players
  # that you could give to a single server is 100000. You can also give them
  # playerserver.players.unlimited - for unlimited players. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: false

  # What is the max players each server should have?
  max-players-per-server: 20

plugin-limiting:
  # Should we use permissions for max-plugins management? If set to true, your
  # players should have playerserver.plugins.<amount>. The max amount of plugins
  # that you could give to a single server is 20000. You can also give them
  # playerserver.plugins.unlimited - for unlimited plugins. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: false

  # What is the max players each server should have?
  max-plugins-per-server: 20

# Should we enable smart /ps command? You can find more info about it here:
# https://gitlab.com/OpenSource02/playerservers/-/issues/21
smart-command: false

# Should we enable permissions for server creation, deletion & more?
# If set to false, all the players will have access to those basic commands.
# Obviously, admin commands require permission no matter what.
enable-permissions: true

templates:
  default:
    # This is just an example of what you can do with requires-permission.
    # Default template will never require permission, even if set to true.
    requires-permission: false
    # What launch command should be used? If set as %default%, launch-command
    # from above will be used (~line 70). Supports %mem% and %uuid% placeholders.
    launch-command: "%default%"
    # What plugins does this template contain?
    # More info: https://playerservers.thearcadia.xyz/experimental/templates
    plugins: []

# Which folders or files will not show in /config file manager?
disabled-access:
  - "ExampleFolder"
  - "Plugin.jar"

# BETA FEATURES. USE AT OWN RISK!!
multi-node: false
experimental-rename: false

# PlayerServers 2.0 experimental web-panel feature (concept only, for now).
# Enable it only for testing purposes. It can and will cause security vulnerabilities.
#
# Read instructions here https://www.spigotmc.org/resources/82268/update?update=394183
experimental-panel: false
```

## Current messages.toml

```
run-in-game = "&9Error> &7Oops! You can only run this command in-game."
not-enough-arguments = "&9PlayerServers> &7Oops, not enough arguments: /playerservers admin test <node-name>"
not-enough-arguments-kill = "&9PlayerServers> &7Oops, not enough arguments: /playerserver kill stop <uuid (example: 1F4a2id)>"
not-enough-arguments-delete = "&9PlayerServers> &7Not enough arguments. &a/playerservers admin delete <uuid>. Please keep in mind that you should not enter the full id. You should just enter the first part (example: if full UUID is 1234-5678-1223-5623, you should just enter 1234)."
no-permission = "&9Error> &7Oops, it seems like you don't have permission to do that."
launching-server = "&c&lLaunching your server. This might take some time. You will be teleported as soon as it's ready."
server-online = "&9PlayerServers> &7Oops, it seems like your server is not online."
successfully-renamed = "&9PlayerServers> &7Successfully renamed server."
rename-failed = "&9PlayerServers> &7Oops, the server with that name already exists."
already-have = "&9Error> &7Oops, it seems like you already have a server!"
too-many-online = "&9Error> &7Oops, it seems like too many servers are running at the moment."

[server-creation]

process-first = "&9PlayerServer> &7Starting the creation of your server..."
process-second = "&9Process> &7Successfully copied Spigot.jar & created eula.txt"
process-third = "&9Process> &7Successfully copied the PlayerServerCore to your server."
process-fourth = "&9Process> &7Successfully created server.properties & start.sh"

post-process-one = "&9PostProcess> &7Your server has been added to the BungeeCord. Teleporting in &a%time% &7seconds..."

sending-to-remote-server = "&9Process> &7We're beginning the creation of your server on the first remote node that provides us with ample resources. This will not take a while."

[server-stop]

not-online = "&9PlayerServers> &7Oops, it seems like your server is not online."
successfully-killed = "&9Success> &7Your server has been successfully killed."

[server-start]

prepairing = "&9PlayerServers> &7Preparing to launch your server."

[server-connect]

connected = "&9PlayerServer> &7You've been successfully sent to your server. Your friends can use &a/server %uuid%&7 to connect."

[server-restart]

killing = "&9PlayerServers> &7Trying to kill your server..."
```


# Permissions & Commands

Below is the list of all the commands & plugin permissions

## Commands

| Command                                                   | Aliases                                                   | Plugin               | Notes                                                                                                                                                                                                                                                                                 |
| --------------------------------------------------------- | --------------------------------------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| /playerserver                                             | /ps                                                       | PlayerServers Bungee | Gives you the plugin description & licence info.                                                                                                                                                                                                                                      |
| <p>/playerserver</p><p>create <strong>\<tmp></strong></p> | /ps create                                                | PlayerServers Bungee | <p>Creates a new subserver if you don't already<br>have one. \<tmp> variable is optional and</p><p>used to specify template name. If no tmp is</p><p>specified, and if players just do /ps create,</p><p>it will simply just create the server with the</p><p>"default" template.</p> |
| <p>/playerserver</p><p>start</p>                          | <p>/ps boot</p><p>/ps enable</p>                          | PlayerServers Bungee | If your server is offline, it will try to boot it up.                                                                                                                                                                                                                                 |
| <p>/playerserver</p><p>delete</p>                         | /ps remove                                                | PlayerServers Bungee | <p>At first it asks you to confirm your decesion by</p><p>repeating the command, tha it removes your</p><p>sub-server and removes you from the database.</p>                                                                                                                          |
| <p>/playerserver</p><p>reboot</p>                         | /ps restart                                               | PlayerServers Bungee | <p>Gives you some info on how to restart your</p><p>sub-server.</p>                                                                                                                                                                                                                   |
| <p>/playerserver</p><p>stop</p>                           | <p>/ps shutdown</p><p>/ps forcestop</p><p>/ps disable</p> | PlayerServers Bungee | <p>Forcefully kills your sub-server. Not</p><p>recommended at all and can cause some</p><p>world destruction. Chunks could be damaged.</p>                                                                                                                                            |
| <p>/playerserver</p><p>join</p>                           | /ps connect                                               | PlayerServers Bungee | <p>Connects you to your sub-server and gives</p><p>you your ServerID and a special command that</p><p>your friends can use to connect to your server.</p>                                                                                                                             |
| <p>/playerserver</p><p>admin delete</p>                   | none                                                      | PlayerServers Bungee | <p>Followed by serverID, forcefully kills and</p><p>removes the server with given serverID.</p>                                                                                                                                                                                       |
| <p>/playerserver</p><p>admin update</p>                   | none                                                      | PlayerServers Bungee | <p>Automatically download and update</p><p>PlayerServerCore accross all of your Player</p><p>servers. Note that this will require manual</p><p>restart of each subserver, in order to take effect</p>                                                                                 |
| /menu                                                     | none                                                      | PlayerServers Core   | <p>Opens up Server Manager GUI for general</p><p>info and statistics, as well as for installing</p><p>predefined plugins</p>                                                                                                                                                          |
| /config                                                   | none                                                      | PlayerServers Core   | <p>Opens up config file manager for editing</p><p>config files</p>                                                                                                                                                                                                                    |

## Permissions

I know, there are not much permissions, but that's just to keep things simple. Yes, I could make one permission for every single command, but I just don't see the real usage for such a thing like that.

| Permission                                   | Plugin               | Notes                                                                                                                                                                                          |
| -------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **playerserver.manage**                      | PlayerServers Bungee | <p>This permission node allows the player to create,<br>manage, and delete their sub-server. It will only work if</p><p><code>enable-permissions</code> is set to true in the config file.</p> |
| **playerserver.admin**                       | PlayerServers Bungee | <p>This permission node allows the player to execute</p><p>admin commands, such as /playerserver admin delete.</p>                                                                             |
| **playerserver.menu**                        | PlayerServers Hub    | <p>This permission allows the player to execute <code>/pslist</code></p><p>or <code>/serverlist</code> command.</p>                                                                            |
| <p>playerserver.players.</p><p>\<amount></p> | PlayerServers Bungee | <p>Limits the amount of players that player's server can</p><p>have. You can do playerserver.players.unlimited too.</p>                                                                        |
| <p>playerserver.ram.</p><p>\<amount></p>     | PlayerServers Bungee | <p>Amount of RAM in MB that player's server will be</p><p>started with. <strong>The max amount you can set is 20000</strong>.</p>                                                              |
| <p>playerserver.plugins.</p><p>\<amount></p> | PlayerServers Bungee | <p>Limits the amount of plugins that player can install.</p><p>You can do playerserver.plugins.unlimited too.</p>                                                                              |
| playerservers.templates.\<name>              | PlayerServers Bungee | If template.requires-permission is set to true, than the player must have this permission in order to create a server using this template.                                                     |


# Limitations

On pages below, you'll learn how to set permission-based limitations for your players.

{% content-ref url="/pages/-M9IrybPLWx6k1j0JHYc" %}
[Permission-based RAM](/legacy-v2.x/limitations/permission-based-ram)
{% endcontent-ref %}

{% content-ref url="/pages/-M9ooNqktr9BVKOfI4Li" %}
[Max players limitation](/legacy-v2.x/limitations/max-players-limitation)
{% endcontent-ref %}

{% content-ref url="/pages/-M9ooWAj3vlcFJABJh-m" %}
[Max plugins limitation](/legacy-v2.x/limitations/max-plugins-limitation)
{% endcontent-ref %}


# Permission-based RAM

Learn how to make a permission-based RAM system for your players

## Introduction

We know that making a permission-based RAM system is a crucial to our customers and could be greately used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based RAM system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your ram-limiting part of the config looks as following:

```yaml
ram-limiting:
  # Should we use permissions for ram management? If set to true, you MUST give
  # your players permission playerserver.ram.<amount> (ex: playerserver.ram.512)
  # or, else, the command will be blocked, and player will not be able to create
  # the server. If set to false, everyone will have ram-per-server amount of RAM.
  use-permissions: true

  # How much RAM (in MB) should we allocate to each of the PlayerServers?
  ram-per-server: 512
```

By enabling use-permissions, the plugin will ignore ram-per-server option and will use permission-based RAM management system.

The next thing you'll wanna do is to give all the groups that have `playerserver.manage` permission a new permission as following: `playerserver.ram.<amount in MB>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerserver.ram.512
```


# Max players limitation

## Introduction

We know that making a permission-based slots system is a crucial to our customers and could be greately used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based slots system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your player-limiting part of the config looks as following:

```yaml
player-limiting:
  # Should we use permissions for max-players management? If set to true, your
  # players should have playerserver.players.<amount>. The max amount of players
  # that you could give to a single server is 100000. You can also give them
  # playerserver.players.unlimited - for unlimited players. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: true

  # What is the max players each server should have?
  max-players-per-server: 20
```

By enabling use-permissions, the plugin will ignore max-players-per-server option and will use permission-based slots management system.

The next thing you'll wanna do is to give all the groups that have `playerserver.manage` permission a new permission as following: `playerserver.players.<amount>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerserver.players.10
```

If your groups have parent permission, the plugin will give the player the largest possible amount of slots by their permission.


# Max plugins limitation

## Introduction

We know that making a permission-based plugins limitation system is a crucial to our customers and could be greately used for online stores in order for them to earn money for Ranks & Perks, so we've implemented a permission-based plugin limitation system. In this tutorial, you'll learn how to configure it for your needs.

## Tutorial

In order to begin, you'll need to change a few config options. Make sure your plugin-limiting part of the config looks as following:

```yaml
plugin-limiting:
  # Should we use permissions for max-plugins management? If set to true, your
  # players should have playerserver.plugins.<amount>. The max amount of plugins
  # that you could give to a single server is 20000. You can also give them
  # playerserver.plugins.unlimited - for unlimited plugins. If the player
  # has no permission, he'll be able to have unlimited players.
  #
  # NOTE: If you use permissions, and you change player's permissions,
  # their server will need to reboot in order for changes to take place.
  use-permissions: true

  # What is the max players each server should have?
  max-plugins-per-server: 20
```

By enabling use-permissions, the plugin will ignore max-plugins-per-server option and will use permission-based plugin limiting system.

The next thing you'll wanna do is to give all the groups that have `playerserver.manage` permission a new permission as following: `playerserver.plugins.<amount>`. Here's an example in LuckPerms:

```yaml
/lp group default permission set playerserver.plugins.10
```

If your groups have parent permission, the plugin will give the player the largest possible amount of plugins by their permission.


# Adding pre-defined plugins

In the tutorial below, you'll learn how to add pre-defined plugins to the plugin-installer GUI.

In order to add plugins to the plugin-installer GUI and make those plugins available to ALL of your players and their servers, you need to navigate to your BungeeCord plugins folder, than go to the PlayerServers folder, and from there, navigate to the `plugins-to-be-added-ingame` subfolder.

After that, put the .jar files of all the plugins you want your players to be able to install on their sub-servers.

{% hint style="warning" %}
WARNING: Please do not put in too much plugins. **You should not have more than 45 plugins available there.** The plugin may handle more, but it is not recommended.

The maximum of allowed plugins is: **75**, and after that number, the plugin will most likely break and not function properly. *Please kindly note that I **will not** support anyone that is adding more than 45 plugins to this directory.*
{% endhint %}


# Creating MySQL database

In order to **create** required **MySQL database** on your server, you first need to have **mariadb-server** installed. If you don't have it, please run the command below:

{% hint style="info" %}
Please note that it is generally recommended to execute`apt-get update`before installing new packages on the machine, as else you might encounter some errors.
{% endhint %}

```
$ apt-get install mariadb-server -y
```

After successfully installing MariaDB server, you can now proceed with creating required databases. First of all, you need to login to the mysql terminal. Execute the command below in order to do so.

```
$ mysql -u root -p
```

After that, we need to create user. You can do that by executing the command below:

```sql
CREATE USER 'playerserversuser'@'127.0.0.1' IDENTIFIED BY 'somePassword';
```

After that, you need to create **new database** for PlayerServers:

```sql
CREATE DATABASE PlayerServers;
```

Next up, we need to give playerservers user permission to access the database. We can do that by executing the next two commands:

```sql
GRANT ALL PRIVILEGES ON PlayerServers.* TO 'playerserversuser'@'127.0.0.1';
FLUSH PRIVILEGES;
```

{% hint style="success" %}

### That's it!

If you've done everything correctly, you'll now have a new user called `playerserversuser` which will have password you defined in the second step under`somePassword`field and that user will be able to access the newely created database called `PlayerServers`.
{% endhint %}


# Additional Tutorials (FAQ)

Friendly asked Questions & Answers

## Below you can see some of the most asked questions & answers

{% hint style="info" %}

### Will I be able to run this plugin on GameHosting (such as Server.pro)?

**No**, you can only run this plugin on Dedicated / VPS hosting. We have our hosting too! Click this link in order to access our [Support Discord](https://discord.io/arcadiaservices), where you can contact owners & buy VPS machines starting from only **3.5€ / mo (1 core, 2GB of RAM)**.
{% endhint %}

{% hint style="info" %}

### How can I change the version sub-servers are creating with?

Navigate to `BungeeCord -> Plugins -> PlayerServers -> templates` and replace Spigot.jar with the new version of Spigot you want your users to run on their server.

**NOTE**: There'll be a VersionSelector available soon 😊.
{% endhint %}

{% hint style="info" %}

### How can I change the default RAM of SubServers?

That's pretty simple. Just navigate to the **config.yml** and edit `ram-per-server`
{% endhint %}

{% hint style="info" %}

### How can I change the limit of the currently-running subservers?

You can change the limit in the **config.yml** file, by changing `max-running-instances` option.
{% endhint %}

{% hint style="warning" %}

### ~~How to add default plugins which will be added automatically on server creation? - `Experimental, not recommended`~~` ``- REMOVED`

~~In order to do so, you'll need to add their *original name\** to the BungeeCord PlayerServers **config.yml** and add all of them to the following directories:~~

~~`BungeeCord -> Plugins -> PlayerServers -> templateplugins`~~

~~`BungeeCord -> Plugins -> PlayerServers -> plugins-to-be-added-ingame`~~

~~By "**original name**" I mean the name written in plugin.yml file of that specific plugin. For instance, the original plugin name for WorldEdit is just WorldEdit, for EssentialsX, it's just EssentialsX, but for some other plugins this might be different. Please be careful while using this option and kindly note that there will be no support for using it, as it's **EXPERIMENTAL** and it may be removed in any of the future updates.~~
{% endhint %}

{% hint style="info" %}

### Can I purchase the SourceCode of this plugin?

Yes, you can. Please contact me on Discord (`OpenSource#3310`).
{% endhint %}

{% hint style="info" %}

### Where could I get support?

For all the additiona help & support, please join our [Discord](https://discord.io/arcadiaservices)
{% endhint %}


# Screen (accessing consoles)

In the tutorial below, you'll learn how to access the console of the sub-servers

In order to make our plugin function, we use Screen. In order to access the console of sub-servers, you just need to simply execute the command below:

```
$ screen -r <the first part of the ServerID, example: screen -r 8451ld>
```

{% hint style="info" %}
If the command above does not work for you, you need to execute this one first:

`screen -d <the first part of the ServerID>`

And after that, repeat the command above.
{% endhint %}

In order to see all the active screens, you can execute the command below:

```
$ screen -ls
```

{% hint style="success" %}
That's it. If you want to learn more about Screen, you can always click on the [Screen (Advanced)](https://linuxize.com/post/how-to-use-linux-screen/) section in the Sidebar menu.
{% endhint %}


# Templates

Learn how to setup templates with plugins, mods, worlds, pre-configurations

## Instructions

1. Create folder in /templates/\<yourtemplate>
2. Put all the server files there INCLUDING Spigot.jar (do not include server.properties or spigot.yml)
3. If the folder includes plugins, please do not include PSServerCore.jar or it's configuration files
4. If your server includes plugins, please add all of them to plugins-to-be-installed-ingame folder
5. Add your template to config.yml as in the following example:

```yaml
templates:
  default:
    plugins:
      - EssentialsX-2.18.1.0.jar;Essentials;Provides an essential, core set of commands for Bukkit.
```

As you can see, the template is the following: \
JarFileNameFromPluginsToBeInstalledIngameFolder;PluginNameFromPlugin.yml;Description

* JarFileNameFromPluginsToBeInstalledIngameFolder - the name of the jar file from the plugins to be installed ingame folder (example: EssentialsX-2.18.1.0.jar)
* PluginNameFromPlugin.yml - Find it by openning the plugin with WinRar, for example. Inside, you will see plugin.yml. Copy the plugin name from there
* Description - As described in the previous step, there is also a plugin description in plugin.yml. Copy it in the description part. NOTE THAT NOT ALL THE PLUGINS CONTAIN DESCRIPTION. In that case, you can create a custom one.


# Multi-Node Support

Learn how to install and configure PlayerServers daemon and be the first to try out our experimental support for hosting your servers on multiple machines.

## Requirements

* Purchased PlayerServers. This addon is free of charge
* Have two (or more) machines
* Decent network connection
* At least 200MB of RAM dedicated to Daemon

## Instructions

{% hint style="info" %}
Before reading this, please read [update notes](https://www.spigotmc.org/resources/82268/update?update=359257) for version v1.0-dev2.
{% endhint %}

The installation process for PlayerServers Daemon, even in developer beta is pretty straight forward. The first thing you need to do is simply enable multi-node support under experimental options at the end of your configuration file. After that, just reboot your BungeeCord and let the plugin generate required files.

After that's done, create a folder Daemon (in /root directory, if possible). Download the following jar file and drop it into your Daemon folder:

{% file src="/files/-MQmwqpz0F4oRvooEZyX" %}
Daemon v1.1 - Release
{% endfile %}

After that's done, run it for the first time by using `java -Xmx200M -jar Daemon.jar` in order to let it generate the required files. Now exit it by typing in `exit`. After that's done, configure both multinode.toml inside your BungeeCord/plugins/PlayerServers/multinode.toml and your Daemon config.toml which will be generated in your Daemon root directory - please don't forget to include the same key inside both configs!

As the last step, it is required to copy all your templates to each daemon. For example, if you have PS/templates/default and PS/templates/1.8, you need to have the exact same files across each daemon with exact same templates. **Each template MUST have Spigot.jar file inside it!**

Now, you can just make a start.sh script with the following code

```
screen -dmS Daemon java -Xmx200M -jar Daemon.jar
```

and just run it with sh `start.sh` in order to make your Daemon run 24/7 on a separate screen.

{% hint style="warning" %}
Great! You're done! Now, please note that PlayerServersDaemon is still under early-access development and may have a large amount of bugs. Please report all of those to our Issue tracker [here](https://gitlab.com/OpenSource02/playerservers/-/issues). Additionally, please take a backup of your MySQL Database and your server data before proceeding. It is important to note that we did take every possible step to reduce the amount of possible issues that can happen, but we do highly encounter you to take those steps, just to be on the safe side.
{% endhint %}


