diff --git a/404.html b/404.html index 2c427516..8b493966 100644 --- a/404.html +++ b/404.html @@ -15,7 +15,7 @@ - + @@ -38,14 +38,14 @@ (opens new window)
- + diff --git a/assets/js/12.12802391.js b/assets/js/12.29206997.js similarity index 99% rename from assets/js/12.12802391.js rename to assets/js/12.29206997.js index bf99dcc3..2038f94f 100644 --- a/assets/js/12.12802391.js +++ b/assets/js/12.29206997.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Process_Management.516b5b6f.png"},351:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Select.5a2867ee.png"},352:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Copy_Settings_From.e3102cdd.png"},353:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Variables.3962b264.png"},354:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Startup.b6e22637.png"},371:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"creating-a-custom-egg"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-egg"}},[e._v("#")]),e._v(" Creating a Custom Egg")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor\nchanges to these, and you'll lose any changes you've made.")])]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#create-new-option"}},[e._v("Create New Option")])]),s("li",[s("a",{attrs:{href:"#configure-process-management"}},[e._v("Configure Process Management")]),s("ul",[s("li",[s("a",{attrs:{href:"#stop-command"}},[e._v("Stop Command")])]),s("li",[s("a",{attrs:{href:"#log-storage"}},[e._v("Log Storage")])]),s("li",[s("a",{attrs:{href:"#configuration-files"}},[e._v("Configuration Files")])]),s("li",[s("a",{attrs:{href:"#start-configuration"}},[e._v("Start Configuration")])])])]),s("li",[s("a",{attrs:{href:"#copy-settings-from"}},[e._v("Copy Settings From")])]),s("li",[s("a",{attrs:{href:"#egg-variables"}},[e._v("Egg Variables")])]),s("li",[s("a",{attrs:{href:"#list-of-default-variables"}},[e._v("List of default variables")])])])]),s("p"),e._v(" "),s("p",[e._v("The first thing you'll need to do is create a new service. In this case, the name and description speak for themselves\nin this case. The "),s("code",[e._v("Folder Name")]),e._v(" "),s("em",[e._v("must be a unique name")]),e._v(" not being used by any other service, and should only\ncontain letters, numbers, underscores, and dashes. This is the name of the folder where the daemon will be storing\nthe service options on the daemon.")]),e._v(" "),s("p",[e._v("The default start command is also required, however it can be changed per-option.")]),e._v(" "),s("h2",{attrs:{id:"create-new-option"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-new-option"}},[e._v("#")]),e._v(" Create New Option")]),e._v(" "),s("p",[e._v("After creating the service, in the bottom right of the page you should see a button titled "),s("code",[e._v("New Egg")]),e._v(", press it.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(351),alt:""}})]),e._v(" "),s("p",[e._v("You will be taken to a new service option page which is where most of the configuration happens. The first thing\nyou need to do is select your service that you created previously from the "),s("code",[e._v("Associated Nest")]),e._v(" dropdown.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("After that, enter an Option Name to describe it, in this case I am using "),s("code",[e._v("Widget")]),e._v(". You will also need to provide a\n"),s("em",[e._v("valid")]),e._v(" docker image, as well as a start command to be assigned to servers under this service option (remember, this\ncan be tweaked per-server if needed).")]),e._v(" "),s("p",[s("em",[e._v("Docker images must be specifically designed to work with Pterodactyl Panel.")]),e._v(" You should read more about that in\nour "),s("RouterLink",{attrs:{to:"/community/config/eggs/creating_a_custom_image.html"}},[e._v("Creating a Docker Image")]),e._v(" guide.")],1),e._v(" "),s("h2",{attrs:{id:"configure-process-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-process-management"}},[e._v("#")]),e._v(" Configure Process Management")]),e._v(" "),s("p",[e._v("This is perhaps the most important step in this service option configuration, as this tells the Daemon how to run everything.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("The first field you'll encounter is "),s("code",[e._v("Copy Settings From")]),e._v(". The default selection is "),s("code",[e._v("None")]),e._v(". That is expected, and okay.\nThis dropdown is discussed at the end of this article.")]),e._v(" "),s("h3",{attrs:{id:"stop-command"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stop-command"}},[e._v("#")]),e._v(" Stop Command")]),e._v(" "),s("p",[e._v("Next, you'll encounter "),s("code",[e._v("Stop Command")]),e._v(" and, as the name implies, this should be the command used to safely stop the\noption. For some games, this is "),s("code",[e._v("stop")]),e._v(" or "),s("code",[e._v("end")]),e._v(". Certain programs and games don't have a specified stop command, so\nyou can enter "),s("code",[e._v("^C")]),e._v(" to have the daemon execute a "),s("code",[e._v("SIGINT")]),e._v(" to end the process.")]),e._v(" "),s("h3",{attrs:{id:"log-storage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#log-storage"}},[e._v("#")]),e._v(" Log Storage")]),e._v(" "),s("p",[e._v("Logs are competely handeled by the daemon now and use the docker logs to output the complete output from the server.\nThis can be set like below.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("h3",{attrs:{id:"configuration-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-files"}},[e._v("#")]),e._v(" Configuration Files")]),e._v(" "),s("p",[e._v("The next block is one of the most complex blocks, the "),s("code",[e._v("Configuration Files")]),e._v(" descriptor. The Daemon will process this\nblock prior to booting the server to ensure all of the required settings are defined and set correctly.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server.properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-ip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"enable-query"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"true"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"query.port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are telling the Daemon to read "),s("code",[e._v("server.properties")]),e._v(" in "),s("code",[e._v("/home/container")]),e._v(". Within this block, we\ndefine a "),s("code",[e._v("parser")]),e._v(", in this case "),s("code",[e._v("properties")]),e._v(" but the following are "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/parser/parser.go#L25-L30",target:"_blank",rel:"noopener noreferrer"}},[e._v("valid parsers"),s("OutboundLink")],1),e._v(":")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("file")]),e._v(" — This parser goes based on matching the beginning of lines, and not a specific property like the other five.\nAvoid using this parser if possible.")]),e._v(" "),s("li",[s("code",[e._v("yaml")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("properties")])]),e._v(" "),s("li",[s("code",[e._v("ini")])]),e._v(" "),s("li",[s("code",[e._v("json")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("xml")])])]),e._v(" "),s("p",[e._v("Once you have defined a parser, we then define a "),s("code",[e._v("find")]),e._v(" block which tells the Daemon what specific elements to find\nand replace. In this example, we have provided four separate items within the "),s("code",[e._v("server.properties")]),e._v(" file that we want to\nfind and replace to the assigned values. You can use either an exact value, or define a specific server setting from\nthe "),s("code",[e._v("server.json")]),e._v(" file. In this case, we're assigning the default server port to be used as the "),s("code",[e._v("server-port")]),e._v(" and\n"),s("code",[e._v("query.port")]),e._v(". "),s("strong",[e._v("These placeholders are case sensitive, and should have no spaces in them.")])]),e._v(" "),s("p",[e._v("You can have multiple files listed here, the Daemon will process them in parallel before starting the server. When\nusing "),s("code",[e._v("yaml")]),e._v(" or "),s("code",[e._v("json")]),e._v(" you can use more advanced searching for elements.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"config.yml"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yaml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].host"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0:{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"servers.*.address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"127.0.0.1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"localhost"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are parsing "),s("code",[e._v("config.yml")]),e._v(" using the "),s("code",[e._v("yaml")]),e._v(" parser. The first three find items are simply assigning\nports and IPs for the first listener block. The last one, "),s("code",[e._v("servers.*.address")]),e._v(" uses wildcard matching to match any items\nwithin the "),s("code",[e._v("servers")]),e._v(" block, and then finding each "),s("code",[e._v("address")]),e._v(" block for those items.")]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("An advanced feature of this file configuration is the ability to define multiple find and replace statements for a\nsingle matching line. In this case, we are looking for either "),s("code",[e._v("127.0.0.1")]),e._v(" or "),s("code",[e._v("localhost")]),e._v(" and replacing them with the\ndocker interface defined in the configuration file using "),s("code",[e._v("{{config.docker.interface}}")]),e._v(".")])]),s("h3",{attrs:{id:"start-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-configuration"}},[e._v("#")]),e._v(" Start Configuration")]),e._v(" "),s("p",[e._v("The last block to configure is the "),s("code",[e._v("Start Configuration")]),e._v(" for servers running using this service option.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In the example block above, we define "),s("code",[e._v("done")]),e._v(" as the entire line, or part of a line that indicates a server is done\nstarting, and is ready for players to join. When the Daemon sees this output, it will mark the server as "),s("code",[e._v("ON")]),e._v(" rather\nthan "),s("code",[e._v("STARTING")]),e._v(".")]),e._v(" "),s("p",[e._v("That concludes basic service option configuration.")]),e._v(" "),s("h2",{attrs:{id:"copy-settings-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#copy-settings-from"}},[e._v("#")]),e._v(" Copy Settings From")]),e._v(" "),s("p",[e._v("As mentioned above, there is a unique "),s("code",[e._v("Copy Settings From")]),e._v(" dropdown when adding a new option. This gives you the\nability to, as the name suggests, copy settings defined above from a different option.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(352),alt:""}})]),e._v(" "),s("p",[e._v("In the panel, we use this to copy settings that remain the same between similar service options, such as many of the\nMinecraft options.")]),e._v(" "),s("p",[e._v("For example, lets look at the "),s("code",[e._v("Sponge (SpongeVanilla)")]),e._v(" service option.")]),e._v(" "),s("p",[e._v("As you can see, it as been told to copy settings from "),s("code",[e._v("Vanilla Minecraft")]),e._v(". This means that any of the fields that are\nleft blank will inherit from the assigned parent. We then define a specific "),s("code",[e._v("userInteraction")]),e._v(" line that is different in\nSponge compared to Vanilla, but tell it that everything else should remain the same.")]),e._v(" "),s("p",[s("em",[e._v("Please note that "),s("code",[e._v("Copy Settings From")]),e._v(" does not support nested copies, you can only copy from a single parent,\nand that parent "),s("strong",[e._v("must not be copying from another option.")])])]),e._v(" "),s("h2",{attrs:{id:"egg-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#egg-variables"}},[e._v("#")]),e._v(" Egg Variables")]),e._v(" "),s("p",[e._v("One of the great parts of the Egg Variables is the ability to define specific variables that users and/or admins can\ncontrol to tweak different settings without letting users modify the startup command. To create new variables, or edit\nexisting ones, visit the new service option you created, and click the "),s("code",[e._v("Variables")]),e._v(" tab at the top of the page. Lets take\na look at an example variable that we can create.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(353),alt:""}})]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("The name and description are rather self-explanitory, so I'll skip down to the "),s("code",[e._v("Environment Variable")]),e._v(" box. This should\nbe an Alpha-Numeric name with underscores, and should be uppercase. This will be the name of the environment variable\nwhich can be accessed in the startup command as "),s("code",[e._v("{{WOOZLE_WOO}}")]),e._v(", within file modifications as "),s("code",[e._v("{{env.WOOZLE_WOO}}")]),e._v(", or\njust "),s("code",[e._v("${WOOZLE_WOO}")]),e._v(" in any shell scripts (it is passed through in the environment). We also define a default value for\nthis environment variable in this example, but it is not required to do so.")])]),s("p",[e._v("The next section is "),s("code",[e._v("Permissions")]),e._v(", which is a dropdown with two options: "),s("code",[e._v("Users Can View")]),e._v(" and "),s("code",[e._v("Users Can Edit")]),e._v(".")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Users Can View")]),e._v(" — allows a user to view the field on the front-end, as well as the assigned value of that variable.\nThey will be able to see it replaced in their startup command.")]),e._v(" "),s("li",[s("code",[e._v("Users Can Edit")]),e._v(" — allows a user to edit the value of the variable, for example the name of their "),s("code",[e._v("server.jar")]),e._v(" file\nif running Minecraft.")])]),e._v(" "),s("p",[e._v("You should use caution here, even if you assign neither of the permissions it does not mean that the value will be\nhidden. Crafty users will still be able to get the environment on their server. In most cases this is simply hiding\nit from the user, and then used within the Dockerfile to perform actions, thus it is not important for the user to see.")]),e._v(" "),s("p",[e._v("Finally, you will need to define some input rules to validate the value against. In this example, we use\n"),s("code",[e._v("required|string|between:1,10")]),e._v(", which means the field is "),s("code",[e._v("required")]),e._v(", must be a "),s("code",[e._v("string")]),e._v(", and must be between "),s("code",[e._v("1")]),e._v(" and\n"),s("code",[e._v("10")]),e._v(" characters in length. You can find "),s("a",{attrs:{href:"https://laravel.com/docs/5.6/validation#available-validation-rules",target:"_blank",rel:"noopener noreferrer"}},[e._v("all of the available validation rules"),s("OutboundLink")],1),e._v("\non the Laravel website. You can also use ReGEX based validation by using the "),s("code",[e._v("regex:")]),e._v(" rule flag. For example,\n"),s("a",{attrs:{href:"https://regex101.com/r/k4oEOn/1",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("required|regex:/^([\\w\\d._-]+)(\\.jar)$/")]),s("OutboundLink")],1),e._v(" will require the field, and will match the\nregex as any letters or numbers ("),s("code",[e._v("\\w\\d")]),e._v(") including underscore ("),s("code",[e._v("_")]),e._v("), periods ("),s("code",[e._v(".")]),e._v("), and dashes ("),s("code",[e._v("-")]),e._v(") ending in "),s("code",[e._v(".jar")]),e._v(".")]),e._v(" "),s("p",[e._v("They will then be visible when managing the startup for a server in both the Admin CP and on the Front-End.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(354),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"list-of-default-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#list-of-default-variables"}},[e._v("#")]),e._v(" List of default variables")]),e._v(" "),s("p",[e._v("The default variables are always accessible to all eggs and don't have to be created separately. They can be used in the egg startup, install script, or the configuration file parser.")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Variable")]),e._v(" "),s("th",[e._v("Description")]),e._v(" "),s("th",[e._v("Example")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("TZ")]),e._v(" "),s("td",[e._v("Time Zone")]),e._v(" "),s("td",[s("code",[e._v("Etc/UTC")])])]),e._v(" "),s("tr",[s("td",[e._v("STARTUP")]),e._v(" "),s("td",[e._v("Startup command of the egg")]),e._v(" "),s("td",[s("code",[e._v("java -Xms128M -Xmx"+e._s(e.SERVER_MEMORY)+"M -jar "+e._s(e.SERVER_JARFILE))])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_MEMORY")]),e._v(" "),s("td",[e._v("Memory available for the server in MB")]),e._v(" "),s("td",[s("code",[e._v("512")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_IP")]),e._v(" "),s("td",[e._v("Default ip of the server")]),e._v(" "),s("td",[s("code",[e._v("127.0.0.1")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_PORT")]),e._v(" "),s("td",[e._v("Primary Server Port")]),e._v(" "),s("td",[s("code",[e._v("27015")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_LOCATION")]),e._v(" "),s("td",[e._v("Location of the server")]),e._v(" "),s("td",[s("code",[e._v("Example City")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_UUID")]),e._v(" "),s("td",[e._v("UUID of the server")]),e._v(" "),s("td",[s("code",[e._v("539fdca8-4a08-4551-a8d2-8ee5475b50d9")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_ALLOCATION_LIMIT")]),e._v(" "),s("td",[e._v("Limit of allocations allowed for the server")]),e._v(" "),s("td",[s("code",[e._v("0")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Process_Management.516b5b6f.png"},351:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Select.5a2867ee.png"},352:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Copy_Settings_From.e3102cdd.png"},353:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Variables.3962b264.png"},354:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Startup.b6e22637.png"},372:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"creating-a-custom-egg"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-egg"}},[e._v("#")]),e._v(" Creating a Custom Egg")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor\nchanges to these, and you'll lose any changes you've made.")])]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#create-new-option"}},[e._v("Create New Option")])]),s("li",[s("a",{attrs:{href:"#configure-process-management"}},[e._v("Configure Process Management")]),s("ul",[s("li",[s("a",{attrs:{href:"#stop-command"}},[e._v("Stop Command")])]),s("li",[s("a",{attrs:{href:"#log-storage"}},[e._v("Log Storage")])]),s("li",[s("a",{attrs:{href:"#configuration-files"}},[e._v("Configuration Files")])]),s("li",[s("a",{attrs:{href:"#start-configuration"}},[e._v("Start Configuration")])])])]),s("li",[s("a",{attrs:{href:"#copy-settings-from"}},[e._v("Copy Settings From")])]),s("li",[s("a",{attrs:{href:"#egg-variables"}},[e._v("Egg Variables")])]),s("li",[s("a",{attrs:{href:"#list-of-default-variables"}},[e._v("List of default variables")])])])]),s("p"),e._v(" "),s("p",[e._v("The first thing you'll need to do is create a new service. In this case, the name and description speak for themselves\nin this case. The "),s("code",[e._v("Folder Name")]),e._v(" "),s("em",[e._v("must be a unique name")]),e._v(" not being used by any other service, and should only\ncontain letters, numbers, underscores, and dashes. This is the name of the folder where the daemon will be storing\nthe service options on the daemon.")]),e._v(" "),s("p",[e._v("The default start command is also required, however it can be changed per-option.")]),e._v(" "),s("h2",{attrs:{id:"create-new-option"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-new-option"}},[e._v("#")]),e._v(" Create New Option")]),e._v(" "),s("p",[e._v("After creating the service, in the bottom right of the page you should see a button titled "),s("code",[e._v("New Egg")]),e._v(", press it.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(351),alt:""}})]),e._v(" "),s("p",[e._v("You will be taken to a new service option page which is where most of the configuration happens. The first thing\nyou need to do is select your service that you created previously from the "),s("code",[e._v("Associated Nest")]),e._v(" dropdown.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("After that, enter an Option Name to describe it, in this case I am using "),s("code",[e._v("Widget")]),e._v(". You will also need to provide a\n"),s("em",[e._v("valid")]),e._v(" docker image, as well as a start command to be assigned to servers under this service option (remember, this\ncan be tweaked per-server if needed).")]),e._v(" "),s("p",[s("em",[e._v("Docker images must be specifically designed to work with Pterodactyl Panel.")]),e._v(" You should read more about that in\nour "),s("RouterLink",{attrs:{to:"/community/config/eggs/creating_a_custom_image.html"}},[e._v("Creating a Docker Image")]),e._v(" guide.")],1),e._v(" "),s("h2",{attrs:{id:"configure-process-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-process-management"}},[e._v("#")]),e._v(" Configure Process Management")]),e._v(" "),s("p",[e._v("This is perhaps the most important step in this service option configuration, as this tells the Daemon how to run everything.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("The first field you'll encounter is "),s("code",[e._v("Copy Settings From")]),e._v(". The default selection is "),s("code",[e._v("None")]),e._v(". That is expected, and okay.\nThis dropdown is discussed at the end of this article.")]),e._v(" "),s("h3",{attrs:{id:"stop-command"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stop-command"}},[e._v("#")]),e._v(" Stop Command")]),e._v(" "),s("p",[e._v("Next, you'll encounter "),s("code",[e._v("Stop Command")]),e._v(" and, as the name implies, this should be the command used to safely stop the\noption. For some games, this is "),s("code",[e._v("stop")]),e._v(" or "),s("code",[e._v("end")]),e._v(". Certain programs and games don't have a specified stop command, so\nyou can enter "),s("code",[e._v("^C")]),e._v(" to have the daemon execute a "),s("code",[e._v("SIGINT")]),e._v(" to end the process.")]),e._v(" "),s("h3",{attrs:{id:"log-storage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#log-storage"}},[e._v("#")]),e._v(" Log Storage")]),e._v(" "),s("p",[e._v("Logs are competely handeled by the daemon now and use the docker logs to output the complete output from the server.\nThis can be set like below.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("h3",{attrs:{id:"configuration-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-files"}},[e._v("#")]),e._v(" Configuration Files")]),e._v(" "),s("p",[e._v("The next block is one of the most complex blocks, the "),s("code",[e._v("Configuration Files")]),e._v(" descriptor. The Daemon will process this\nblock prior to booting the server to ensure all of the required settings are defined and set correctly.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server.properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-ip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"enable-query"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"true"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"query.port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are telling the Daemon to read "),s("code",[e._v("server.properties")]),e._v(" in "),s("code",[e._v("/home/container")]),e._v(". Within this block, we\ndefine a "),s("code",[e._v("parser")]),e._v(", in this case "),s("code",[e._v("properties")]),e._v(" but the following are "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/parser/parser.go#L25-L30",target:"_blank",rel:"noopener noreferrer"}},[e._v("valid parsers"),s("OutboundLink")],1),e._v(":")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("file")]),e._v(" — This parser goes based on matching the beginning of lines, and not a specific property like the other five.\nAvoid using this parser if possible.")]),e._v(" "),s("li",[s("code",[e._v("yaml")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("properties")])]),e._v(" "),s("li",[s("code",[e._v("ini")])]),e._v(" "),s("li",[s("code",[e._v("json")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("xml")])])]),e._v(" "),s("p",[e._v("Once you have defined a parser, we then define a "),s("code",[e._v("find")]),e._v(" block which tells the Daemon what specific elements to find\nand replace. In this example, we have provided four separate items within the "),s("code",[e._v("server.properties")]),e._v(" file that we want to\nfind and replace to the assigned values. You can use either an exact value, or define a specific server setting from\nthe "),s("code",[e._v("server.json")]),e._v(" file. In this case, we're assigning the default server port to be used as the "),s("code",[e._v("server-port")]),e._v(" and\n"),s("code",[e._v("query.port")]),e._v(". "),s("strong",[e._v("These placeholders are case sensitive, and should have no spaces in them.")])]),e._v(" "),s("p",[e._v("You can have multiple files listed here, the Daemon will process them in parallel before starting the server. When\nusing "),s("code",[e._v("yaml")]),e._v(" or "),s("code",[e._v("json")]),e._v(" you can use more advanced searching for elements.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"config.yml"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yaml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].host"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0:{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"servers.*.address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"127.0.0.1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"localhost"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are parsing "),s("code",[e._v("config.yml")]),e._v(" using the "),s("code",[e._v("yaml")]),e._v(" parser. The first three find items are simply assigning\nports and IPs for the first listener block. The last one, "),s("code",[e._v("servers.*.address")]),e._v(" uses wildcard matching to match any items\nwithin the "),s("code",[e._v("servers")]),e._v(" block, and then finding each "),s("code",[e._v("address")]),e._v(" block for those items.")]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("An advanced feature of this file configuration is the ability to define multiple find and replace statements for a\nsingle matching line. In this case, we are looking for either "),s("code",[e._v("127.0.0.1")]),e._v(" or "),s("code",[e._v("localhost")]),e._v(" and replacing them with the\ndocker interface defined in the configuration file using "),s("code",[e._v("{{config.docker.interface}}")]),e._v(".")])]),s("h3",{attrs:{id:"start-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-configuration"}},[e._v("#")]),e._v(" Start Configuration")]),e._v(" "),s("p",[e._v("The last block to configure is the "),s("code",[e._v("Start Configuration")]),e._v(" for servers running using this service option.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In the example block above, we define "),s("code",[e._v("done")]),e._v(" as the entire line, or part of a line that indicates a server is done\nstarting, and is ready for players to join. When the Daemon sees this output, it will mark the server as "),s("code",[e._v("ON")]),e._v(" rather\nthan "),s("code",[e._v("STARTING")]),e._v(".")]),e._v(" "),s("p",[e._v("That concludes basic service option configuration.")]),e._v(" "),s("h2",{attrs:{id:"copy-settings-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#copy-settings-from"}},[e._v("#")]),e._v(" Copy Settings From")]),e._v(" "),s("p",[e._v("As mentioned above, there is a unique "),s("code",[e._v("Copy Settings From")]),e._v(" dropdown when adding a new option. This gives you the\nability to, as the name suggests, copy settings defined above from a different option.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(352),alt:""}})]),e._v(" "),s("p",[e._v("In the panel, we use this to copy settings that remain the same between similar service options, such as many of the\nMinecraft options.")]),e._v(" "),s("p",[e._v("For example, lets look at the "),s("code",[e._v("Sponge (SpongeVanilla)")]),e._v(" service option.")]),e._v(" "),s("p",[e._v("As you can see, it as been told to copy settings from "),s("code",[e._v("Vanilla Minecraft")]),e._v(". This means that any of the fields that are\nleft blank will inherit from the assigned parent. We then define a specific "),s("code",[e._v("userInteraction")]),e._v(" line that is different in\nSponge compared to Vanilla, but tell it that everything else should remain the same.")]),e._v(" "),s("p",[s("em",[e._v("Please note that "),s("code",[e._v("Copy Settings From")]),e._v(" does not support nested copies, you can only copy from a single parent,\nand that parent "),s("strong",[e._v("must not be copying from another option.")])])]),e._v(" "),s("h2",{attrs:{id:"egg-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#egg-variables"}},[e._v("#")]),e._v(" Egg Variables")]),e._v(" "),s("p",[e._v("One of the great parts of the Egg Variables is the ability to define specific variables that users and/or admins can\ncontrol to tweak different settings without letting users modify the startup command. To create new variables, or edit\nexisting ones, visit the new service option you created, and click the "),s("code",[e._v("Variables")]),e._v(" tab at the top of the page. Lets take\na look at an example variable that we can create.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(353),alt:""}})]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("The name and description are rather self-explanitory, so I'll skip down to the "),s("code",[e._v("Environment Variable")]),e._v(" box. This should\nbe an Alpha-Numeric name with underscores, and should be uppercase. This will be the name of the environment variable\nwhich can be accessed in the startup command as "),s("code",[e._v("{{WOOZLE_WOO}}")]),e._v(", within file modifications as "),s("code",[e._v("{{env.WOOZLE_WOO}}")]),e._v(", or\njust "),s("code",[e._v("${WOOZLE_WOO}")]),e._v(" in any shell scripts (it is passed through in the environment). We also define a default value for\nthis environment variable in this example, but it is not required to do so.")])]),s("p",[e._v("The next section is "),s("code",[e._v("Permissions")]),e._v(", which is a dropdown with two options: "),s("code",[e._v("Users Can View")]),e._v(" and "),s("code",[e._v("Users Can Edit")]),e._v(".")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Users Can View")]),e._v(" — allows a user to view the field on the front-end, as well as the assigned value of that variable.\nThey will be able to see it replaced in their startup command.")]),e._v(" "),s("li",[s("code",[e._v("Users Can Edit")]),e._v(" — allows a user to edit the value of the variable, for example the name of their "),s("code",[e._v("server.jar")]),e._v(" file\nif running Minecraft.")])]),e._v(" "),s("p",[e._v("You should use caution here, even if you assign neither of the permissions it does not mean that the value will be\nhidden. Crafty users will still be able to get the environment on their server. In most cases this is simply hiding\nit from the user, and then used within the Dockerfile to perform actions, thus it is not important for the user to see.")]),e._v(" "),s("p",[e._v("Finally, you will need to define some input rules to validate the value against. In this example, we use\n"),s("code",[e._v("required|string|between:1,10")]),e._v(", which means the field is "),s("code",[e._v("required")]),e._v(", must be a "),s("code",[e._v("string")]),e._v(", and must be between "),s("code",[e._v("1")]),e._v(" and\n"),s("code",[e._v("10")]),e._v(" characters in length. You can find "),s("a",{attrs:{href:"https://laravel.com/docs/5.6/validation#available-validation-rules",target:"_blank",rel:"noopener noreferrer"}},[e._v("all of the available validation rules"),s("OutboundLink")],1),e._v("\non the Laravel website. You can also use ReGEX based validation by using the "),s("code",[e._v("regex:")]),e._v(" rule flag. For example,\n"),s("a",{attrs:{href:"https://regex101.com/r/k4oEOn/1",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("required|regex:/^([\\w\\d._-]+)(\\.jar)$/")]),s("OutboundLink")],1),e._v(" will require the field, and will match the\nregex as any letters or numbers ("),s("code",[e._v("\\w\\d")]),e._v(") including underscore ("),s("code",[e._v("_")]),e._v("), periods ("),s("code",[e._v(".")]),e._v("), and dashes ("),s("code",[e._v("-")]),e._v(") ending in "),s("code",[e._v(".jar")]),e._v(".")]),e._v(" "),s("p",[e._v("They will then be visible when managing the startup for a server in both the Admin CP and on the Front-End.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(354),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"list-of-default-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#list-of-default-variables"}},[e._v("#")]),e._v(" List of default variables")]),e._v(" "),s("p",[e._v("The default variables are always accessible to all eggs and don't have to be created separately. They can be used in the egg startup, install script, or the configuration file parser.")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Variable")]),e._v(" "),s("th",[e._v("Description")]),e._v(" "),s("th",[e._v("Example")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("TZ")]),e._v(" "),s("td",[e._v("Time Zone")]),e._v(" "),s("td",[s("code",[e._v("Etc/UTC")])])]),e._v(" "),s("tr",[s("td",[e._v("STARTUP")]),e._v(" "),s("td",[e._v("Startup command of the egg")]),e._v(" "),s("td",[s("code",[e._v("java -Xms128M -Xmx"+e._s(e.SERVER_MEMORY)+"M -jar "+e._s(e.SERVER_JARFILE))])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_MEMORY")]),e._v(" "),s("td",[e._v("Memory available for the server in MB")]),e._v(" "),s("td",[s("code",[e._v("512")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_IP")]),e._v(" "),s("td",[e._v("Default ip of the server")]),e._v(" "),s("td",[s("code",[e._v("127.0.0.1")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_PORT")]),e._v(" "),s("td",[e._v("Primary Server Port")]),e._v(" "),s("td",[s("code",[e._v("27015")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_LOCATION")]),e._v(" "),s("td",[e._v("Location of the server")]),e._v(" "),s("td",[s("code",[e._v("Example City")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_UUID")]),e._v(" "),s("td",[e._v("UUID of the server")]),e._v(" "),s("td",[s("code",[e._v("539fdca8-4a08-4551-a8d2-8ee5475b50d9")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_ALLOCATION_LIMIT")]),e._v(" "),s("td",[e._v("Limit of allocations allowed for the server")]),e._v(" "),s("td",[s("code",[e._v("0")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/30.ed70d76a.js b/assets/js/30.6cc47499.js similarity index 62% rename from assets/js/30.ed70d76a.js rename to assets/js/30.6cc47499.js index f8b5294a..32e6a477 100644 --- a/assets/js/30.ed70d76a.js +++ b/assets/js/30.6cc47499.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{372:function(t,e,n){"use strict";n.r(e);var s=n(48),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{370:function(t,e,n){"use strict";n.r(e);var s=n(48),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/31.6cbb938e.js b/assets/js/31.d561e4f4.js similarity index 92% rename from assets/js/31.6cbb938e.js rename to assets/js/31.d561e4f4.js index 581501fc..cf7ec854 100644 --- a/assets/js/31.6cbb938e.js +++ b/assets/js/31.d561e4f4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{370:function(t,e,o){"use strict";o.r(e);var a=o(48),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"community-guides-and-tutorials"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#community-guides-and-tutorials"}},[t._v("#")]),t._v(" Community Guides and Tutorials")]),t._v(" "),o("h2",{attrs:{id:"about"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#about"}},[t._v("#")]),t._v(" About")]),t._v(" "),o("p",[t._v("This section of Pterodactyl's site is dedicated to more complex topics, tutorials, and features that we\nfeel are important to share with the community, but do not fit into the theme of our core documentation.")]),t._v(" "),o("p",[t._v("Here you'll find in-depth OS-specific installation guides, advanced network configurations, individual game\nsetup instructions, and so much more.")])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{371:function(t,e,o){"use strict";o.r(e);var a=o(48),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"community-guides-and-tutorials"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#community-guides-and-tutorials"}},[t._v("#")]),t._v(" Community Guides and Tutorials")]),t._v(" "),o("h2",{attrs:{id:"about"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#about"}},[t._v("#")]),t._v(" About")]),t._v(" "),o("p",[t._v("This section of Pterodactyl's site is dedicated to more complex topics, tutorials, and features that we\nfeel are important to share with the community, but do not fit into the theme of our core documentation.")]),t._v(" "),o("p",[t._v("Here you'll find in-depth OS-specific installation guides, advanced network configurations, individual game\nsetup instructions, and so much more.")])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/65.66dec248.js b/assets/js/65.66dec248.js deleted file mode 100644 index 86a2e79a..00000000 --- a/assets/js/65.66dec248.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{410:function(a,e,s){"use strict";s.r(e);var t=s(48),r=Object(t.a)({},(function(){var a=this,e=a.$createElement,s=a._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"additional-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[a._v("#")]),a._v(" Additional Configuration")]),a._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#backups"}},[a._v("Backups")]),s("ul",[s("li",[s("a",{attrs:{href:"#using-local-backups"}},[a._v("Using Local Backups")])]),s("li",[s("a",{attrs:{href:"#using-s3-backups"}},[a._v("Using S3 Backups")])])])]),s("li",[s("a",{attrs:{href:"#reverse-proxy-setup"}},[a._v("Reverse Proxy Setup")]),s("ul",[s("li",[s("a",{attrs:{href:"#nginx-specific-configuration"}},[a._v("NGINX Specific Configuration")])]),s("li",[s("a",{attrs:{href:"#cloudflare-specific-configuration"}},[a._v("Cloudflare Specific Configuration")])])])]),s("li",[s("a",{attrs:{href:"#recaptcha"}},[a._v("reCAPTCHA")]),s("ul",[s("li",[s("a",{attrs:{href:"#configuring-recaptcha"}},[a._v("Configuring reCAPTCHA")])]),s("li",[s("a",{attrs:{href:"#disabling-recaptcha"}},[a._v("Disabling reCAPTCHA")])])])]),s("li",[s("a",{attrs:{href:"#_2fa"}},[a._v("2FA")]),s("ul",[s("li",[s("a",{attrs:{href:"#disable-2fa-requirement"}},[a._v("Disable 2FA requirement")])]),s("li",[s("a",{attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("Disable 2FA for a specific user")])])])])])]),s("p"),a._v(" "),s("h2",{attrs:{id:"backups"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#backups"}},[a._v("#")]),a._v(" Backups")]),a._v(" "),s("p",[a._v("Pterodactyl Panel allows users to create backups of their servers. In order to create backups, a backup storage method has to be configured.")]),a._v(" "),s("p",[a._v("When changing Pterodactyl Panel's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method.")]),a._v(" "),s("h3",{attrs:{id:"using-local-backups"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-local-backups"}},[a._v("#")]),a._v(" Using Local Backups")]),a._v(" "),s("p",[a._v("By default, Pterodactyl Panel uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set with the following configuration in the "),s("code",[a._v(".env")]),a._v(" file:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Sets your panel to use local storage via Wings for backups")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("APP_BACKUP_DRIVER")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("wings\n")])])]),s("p",[a._v("Do note that, when using local storage via Wings, the destination for backups is set in Wings' "),s("code",[a._v("config.yml")]),a._v(" with the following setting key:")]),a._v(" "),s("div",{staticClass:"language-yml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-yml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("system")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token key atrule"}},[a._v("backup_directory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(":")]),a._v(" /path/to/backup/storage\n")])])]),s("h3",{attrs:{id:"using-s3-backups"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-s3-backups"}},[a._v("#")]),a._v(" Using S3 Backups")]),a._v(" "),s("p",[a._v("AWS S3 (or compatible storage) can be used to store remote or cloud-based backups. The following configuration options have to be set in the "),s("code",[a._v(".env")]),a._v(" file or as environment variables in order to enable it:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Sets your panel to use s3 for backups")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("APP_BACKUP_DRIVER")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Info to actually use s3")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_DEFAULT_REGION")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ACCESS_KEY_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_SECRET_ACCESS_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_BACKUPS_BUCKET")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ENDPOINT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n")])])]),s("p",[a._v("For some configurations, you might have to change your S3 URL from "),s("code",[a._v("bucket.domain.com")]),a._v(" to "),s("code",[a._v("domain.com/bucket")]),a._v(". To accomplish this, add "),s("code",[a._v("AWS_USE_PATH_STYLE_ENDPOINT=true")]),a._v(" to your "),s("code",[a._v(".env")]),a._v(" file.")]),a._v(" "),s("h4",{attrs:{id:"multipart-upload"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#multipart-upload"}},[a._v("#")]),a._v(" Multipart Upload")]),a._v(" "),s("p",[a._v("The S3 backup is using the S3 multipart upload capabilities. In rare situations, you might want to adjust the size of a single part or the lifespan of the generated pre-signed URLs. The default part size is 5GB, and the default pre-signed URL lifespan is 60 minutes.")]),a._v(" "),s("p",[a._v("You can configure the maximal part size using the "),s("code",[a._v("BACKUP_MAX_PART_SIZE")]),a._v(" environment variable. You must specify the size in bytes. To define the pre-signed URL lifespan, use the "),s("code",[a._v("BACKUP_PRESIGNED_URL_LIFESPAN")]),a._v(" variable. The expected unit is minutes.")]),a._v(" "),s("p",[a._v("The following "),s("code",[a._v(".env")]),a._v(" snippet configures 1GB parts and uses 120 minutes as the pre-signed URL lifespan:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BACKUP_MAX_PART_SIZE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1073741824")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BACKUP_PRESIGNED_URL_LIFESPAN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("120")]),a._v("\n")])])]),s("h4",{attrs:{id:"storage-class"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#storage-class"}},[a._v("#")]),a._v(" Storage Class")]),a._v(" "),s("p",[a._v("Should you need to specify a storage class, use the "),s("code",[a._v("AWS_BACKUPS_STORAGE_CLASS")]),a._v(" environment variable. Default option is "),s("code",[a._v("STANDARD")]),a._v(" (S3 Standard).")]),a._v(" "),s("p",[a._v("The following "),s("code",[a._v(".env")]),a._v(" snippet sets the class to "),s("code",[a._v("STANDARD_IA")]),a._v(" (this is an example).")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# STANDARD_IA is an example.")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_BACKUPS_STORAGE_CLASS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("STANDARD_IA\n")])])]),s("h2",{attrs:{id:"reverse-proxy-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#reverse-proxy-setup"}},[a._v("#")]),a._v(" Reverse Proxy Setup")]),a._v(" "),s("p",[a._v("When running Pterodactyl behind a reverse proxy, such as "),s("a",{attrs:{href:"https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-",target:"_blank",rel:"noopener noreferrer"}},[a._v("Cloudflare's Flexible SSL"),s("OutboundLink")],1),a._v("\nor Nginx/Apache/Caddy, etc., you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default, when using these reverse proxies,\nyour Panel will not correctly handle requests. You'll most likely be unable to login or see security warnings in your browser console as it attempts to load insecure assets.\nThis is because the internal logic the Panel uses to determine how links should be generated thinks it is running over HTTP and not over HTTPS.")]),a._v(" "),s("p",[a._v("You will need to edit the "),s("code",[a._v(".env")]),a._v(" file in the Panel's root directory to contain "),s("code",[a._v("TRUSTED_PROXIES=*")]),a._v(" at minimum. We highly suggest providing a specific IP address\n(or comma-separated list of IPs) rather than allowing "),s("code",[a._v("*")]),a._v(". For example, if your proxy is running on the same machine as the server,\nthe chances are that something like "),s("code",[a._v("TRUSTED_PROXIES=127.0.0.1")]),a._v(" will work for you.")]),a._v(" "),s("h3",{attrs:{id:"nginx-specific-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-specific-configuration"}},[a._v("#")]),a._v(" NGINX Specific Configuration")]),a._v(" "),s("p",[a._v("For Pterodactyl to properly respond to an NGINX reverse proxy, the NGINX "),s("code",[a._v("location")]),a._v(" config must contain the following lines:")]),a._v(" "),s("div",{staticClass:"language-Nginx extra-class"},[s("pre",{pre:!0,attrs:{class:"language-nginx"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_set_header")]),a._v(" X"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Real"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("IP "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$remote_addr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_set_header")]),a._v(" Host "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$host")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_set_header")]),a._v(" X"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Forwarded"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("For "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$proxy_add_x_forwarded_for")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_set_header")]),a._v(" X"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Forwarded"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("Proto "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$scheme")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_redirect")]),a._v(" off"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("proxy_buffering")]),a._v(" off"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\nproxy_request_buffering off"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"cloudflare-specific-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cloudflare-specific-configuration"}},[a._v("#")]),a._v(" Cloudflare Specific Configuration")]),a._v(" "),s("p",[a._v("If you're using Cloudflare's Flexible SSL you should set "),s("code",[a._v("TRUSTED_PROXIES")]),a._v(" to contain "),s("a",{attrs:{href:"https://www.cloudflare.com/ips/",target:"_blank",rel:"noopener noreferrer"}},[a._v("their IP addresses"),s("OutboundLink")],1),a._v(".\nBelow is an example of how to set this.")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("TRUSTED_PROXIES=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22\n")])])]),s("h2",{attrs:{id:"recaptcha"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#recaptcha"}},[a._v("#")]),a._v(" reCAPTCHA")]),a._v(" "),s("p",[a._v("The Panel uses invisible reCAPTCHA to secure the login page from brute-force attacks. If the login attempt is considered suspicious, users may be required to perform a reCAPTCHA challenge.")]),a._v(" "),s("h3",{attrs:{id:"configuring-recaptcha"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuring-recaptcha"}},[a._v("#")]),a._v(" Configuring reCAPTCHA")]),a._v(" "),s("p",[a._v("While we provide a global Site Key and Secret Key by default, we highly recommend changing it for your own setup.")]),a._v(" "),s("p",[a._v("You can generate your own keys in the "),s("a",{attrs:{href:"https://www.google.com/recaptcha/admin",target:"_blank",rel:"noopener noreferrer"}},[a._v("reCAPTCHA Admin Console"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("p",[a._v("The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the "),s("strong",[a._v("Advanced")]),a._v(" tab.")]),a._v(" "),s("h3",{attrs:{id:"disabling-recaptcha"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disabling-recaptcha"}},[a._v("#")]),a._v(" Disabling reCAPTCHA")]),a._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[a._v("SECURITY WARNING")]),a._v(" "),s("p",[a._v("We do not recommend disabling reCAPTCHA. It is a security mechanism that makes it harder to perform brute-force attacks on user accounts.")])]),a._v(" "),s("p",[a._v("If users have trouble logging in, or your Panel isn't exposed to the internet, it can make sense to disable reCAPTCHA.")]),a._v(" "),s("p",[a._v("reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the "),s("strong",[a._v("Advanced")]),a._v(" tab and set the "),s("strong",[a._v("Status")]),a._v(" of reCAPTCHA to "),s("strong",[a._v("disabled")]),a._v(".")]),a._v(" "),s("h4",{attrs:{id:"editing-your-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#editing-your-database"}},[a._v("#")]),a._v(" Editing your database")]),a._v(" "),s("p",[a._v("If you cannot access your panel, you can modify the database directly using the following commands.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[a._v("mysql "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'false'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::recaptcha:enabled'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h2",{attrs:{id:"_2fa"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_2fa"}},[a._v("#")]),a._v(" 2FA")]),a._v(" "),s("p",[a._v("If possible you should use the panel to update your 2FA settings. If you can't access your panel for what ever reason you can use the following steps.")]),a._v(" "),s("h3",{attrs:{id:"disable-2fa-requirement"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-requirement"}},[a._v("#")]),a._v(" Disable 2FA requirement")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[a._v("mysql "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::pterodactyl:auth:2fa_required'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"disable-2fa-for-a-specific-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("#")]),a._v(" Disable 2FA for a specific user")]),a._v(" "),s("p",[a._v("Run the following command in your "),s("code",[a._v("/var/www/pterodactyl")]),a._v(" directory.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:user:disable2fa\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/65.c4ac4f66.js b/assets/js/65.c4ac4f66.js new file mode 100644 index 00000000..5081c3a5 --- /dev/null +++ b/assets/js/65.c4ac4f66.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{410:function(e,t,a){"use strict";a.r(t);var s=a(48),r=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"additional-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[e._v("#")]),e._v(" Additional Configuration")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#backups"}},[e._v("Backups")]),a("ul",[a("li",[a("a",{attrs:{href:"#using-local-backups"}},[e._v("Using Local Backups")])]),a("li",[a("a",{attrs:{href:"#using-s3-backups"}},[e._v("Using S3 Backups")])])])]),a("li",[a("a",{attrs:{href:"#reverse-proxy-setup"}},[e._v("Reverse Proxy Setup")]),a("ul",[a("li",[a("a",{attrs:{href:"#nginx-specific-configuration"}},[e._v("NGINX Specific Configuration")])]),a("li",[a("a",{attrs:{href:"#cloudflare-specific-configuration"}},[e._v("Cloudflare Specific Configuration")])])])]),a("li",[a("a",{attrs:{href:"#recaptcha"}},[e._v("reCAPTCHA")]),a("ul",[a("li",[a("a",{attrs:{href:"#configuring-recaptcha"}},[e._v("Configuring reCAPTCHA")])]),a("li",[a("a",{attrs:{href:"#disabling-recaptcha"}},[e._v("Disabling reCAPTCHA")])])])]),a("li",[a("a",{attrs:{href:"#_2fa"}},[e._v("2FA")]),a("ul",[a("li",[a("a",{attrs:{href:"#disable-2fa-requirement"}},[e._v("Disable 2FA requirement")])]),a("li",[a("a",{attrs:{href:"#disable-2fa-for-a-specific-user"}},[e._v("Disable 2FA for a specific user")])])])]),a("li",[a("a",{attrs:{href:"#telemetry"}},[e._v("Telemetry")]),a("ul",[a("li",[a("a",{attrs:{href:"#how-does-it-work"}},[e._v("How does it work?")])]),a("li",[a("a",{attrs:{href:"#what-data-is-collected"}},[e._v("What data is collected?")])]),a("li",[a("a",{attrs:{href:"#how-is-the-data-stored"}},[e._v("How is the data stored?")])]),a("li",[a("a",{attrs:{href:"#why"}},[e._v("Why?")])]),a("li",[a("a",{attrs:{href:"#enabling-telemetry"}},[e._v("Enabling Telemetry")])]),a("li",[a("a",{attrs:{href:"#disabling-telemetry"}},[e._v("Disabling Telemetry")])])])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"backups"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#backups"}},[e._v("#")]),e._v(" Backups")]),e._v(" "),a("p",[e._v("Pterodactyl Panel allows users to create backups of their servers. In order to create backups, a backup storage method has to be configured.")]),e._v(" "),a("p",[e._v("When changing Pterodactyl Panel's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method.")]),e._v(" "),a("h3",{attrs:{id:"using-local-backups"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-local-backups"}},[e._v("#")]),e._v(" Using Local Backups")]),e._v(" "),a("p",[e._v("By default, Pterodactyl Panel uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set with the following configuration in the "),a("code",[e._v(".env")]),e._v(" file:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Sets your panel to use local storage via Wings for backups")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("APP_BACKUP_DRIVER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("wings\n")])])]),a("p",[e._v("Do note that, when using local storage via Wings, the destination for backups is set in Wings' "),a("code",[e._v("config.yml")]),e._v(" with the following setting key:")]),e._v(" "),a("div",{staticClass:"language-yml extra-class"},[a("pre",{pre:!0,attrs:{class:"language-yml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("system")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("backup_directory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" /path/to/backup/storage\n")])])]),a("h3",{attrs:{id:"using-s3-backups"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-s3-backups"}},[e._v("#")]),e._v(" Using S3 Backups")]),e._v(" "),a("p",[e._v("AWS S3 (or compatible storage) can be used to store remote or cloud-based backups. The following configuration options have to be set in the "),a("code",[e._v(".env")]),e._v(" file or as environment variables in order to enable it:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Sets your panel to use s3 for backups")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("APP_BACKUP_DRIVER")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("s3\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Info to actually use s3")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_DEFAULT_REGION")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_ACCESS_KEY_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_SECRET_ACCESS_KEY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_BACKUPS_BUCKET")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_ENDPOINT")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("\n")])])]),a("p",[e._v("For some configurations, you might have to change your S3 URL from "),a("code",[e._v("bucket.domain.com")]),e._v(" to "),a("code",[e._v("domain.com/bucket")]),e._v(". To accomplish this, add "),a("code",[e._v("AWS_USE_PATH_STYLE_ENDPOINT=true")]),e._v(" to your "),a("code",[e._v(".env")]),e._v(" file.")]),e._v(" "),a("h4",{attrs:{id:"multipart-upload"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#multipart-upload"}},[e._v("#")]),e._v(" Multipart Upload")]),e._v(" "),a("p",[e._v("The S3 backup is using the S3 multipart upload capabilities. In rare situations, you might want to adjust the size of a single part or the lifespan of the generated pre-signed URLs. The default part size is 5GB, and the default pre-signed URL lifespan is 60 minutes.")]),e._v(" "),a("p",[e._v("You can configure the maximal part size using the "),a("code",[e._v("BACKUP_MAX_PART_SIZE")]),e._v(" environment variable. You must specify the size in bytes. To define the pre-signed URL lifespan, use the "),a("code",[e._v("BACKUP_PRESIGNED_URL_LIFESPAN")]),e._v(" variable. The expected unit is minutes.")]),e._v(" "),a("p",[e._v("The following "),a("code",[e._v(".env")]),e._v(" snippet configures 1GB parts and uses 120 minutes as the pre-signed URL lifespan:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_MAX_PART_SIZE")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1073741824")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PRESIGNED_URL_LIFESPAN")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("120")]),e._v("\n")])])]),a("h4",{attrs:{id:"storage-class"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#storage-class"}},[e._v("#")]),e._v(" Storage Class")]),e._v(" "),a("p",[e._v("Should you need to specify a storage class, use the "),a("code",[e._v("AWS_BACKUPS_STORAGE_CLASS")]),e._v(" environment variable. Default option is "),a("code",[e._v("STANDARD")]),e._v(" (S3 Standard).")]),e._v(" "),a("p",[e._v("The following "),a("code",[e._v(".env")]),e._v(" snippet sets the class to "),a("code",[e._v("STANDARD_IA")]),e._v(" (this is an example).")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# STANDARD_IA is an example.")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("AWS_BACKUPS_STORAGE_CLASS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("STANDARD_IA\n")])])]),a("h2",{attrs:{id:"reverse-proxy-setup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reverse-proxy-setup"}},[e._v("#")]),e._v(" Reverse Proxy Setup")]),e._v(" "),a("p",[e._v("When running Pterodactyl behind a reverse proxy, such as "),a("a",{attrs:{href:"https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cloudflare's Flexible SSL"),a("OutboundLink")],1),e._v("\nor Nginx/Apache/Caddy, etc., you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default, when using these reverse proxies,\nyour Panel will not correctly handle requests. You'll most likely be unable to login or see security warnings in your browser console as it attempts to load insecure assets.\nThis is because the internal logic the Panel uses to determine how links should be generated thinks it is running over HTTP and not over HTTPS.")]),e._v(" "),a("p",[e._v("You will need to edit the "),a("code",[e._v(".env")]),e._v(" file in the Panel's root directory to contain "),a("code",[e._v("TRUSTED_PROXIES=*")]),e._v(" at minimum. We highly suggest providing a specific IP address\n(or comma-separated list of IPs) rather than allowing "),a("code",[e._v("*")]),e._v(". For example, if your proxy is running on the same machine as the server,\nthe chances are that something like "),a("code",[e._v("TRUSTED_PROXIES=127.0.0.1")]),e._v(" will work for you.")]),e._v(" "),a("h3",{attrs:{id:"nginx-specific-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nginx-specific-configuration"}},[e._v("#")]),e._v(" NGINX Specific Configuration")]),e._v(" "),a("p",[e._v("For Pterodactyl to properly respond to an NGINX reverse proxy, the NGINX "),a("code",[e._v("location")]),e._v(" config must contain the following lines:")]),e._v(" "),a("div",{staticClass:"language-Nginx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-nginx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_set_header")]),e._v(" X"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("Real"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("IP "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$remote_addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_set_header")]),e._v(" Host "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$host")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_set_header")]),e._v(" X"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("Forwarded"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("For "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$proxy_add_x_forwarded_for")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_set_header")]),e._v(" X"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("Forwarded"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("Proto "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$scheme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_redirect")]),e._v(" off"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("proxy_buffering")]),e._v(" off"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\nproxy_request_buffering off"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("h3",{attrs:{id:"cloudflare-specific-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cloudflare-specific-configuration"}},[e._v("#")]),e._v(" Cloudflare Specific Configuration")]),e._v(" "),a("p",[e._v("If you're using Cloudflare's Flexible SSL you should set "),a("code",[e._v("TRUSTED_PROXIES")]),e._v(" to contain "),a("a",{attrs:{href:"https://www.cloudflare.com/ips/",target:"_blank",rel:"noopener noreferrer"}},[e._v("their IP addresses"),a("OutboundLink")],1),e._v(".\nBelow is an example of how to set this.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("TRUSTED_PROXIES=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22\n")])])]),a("h2",{attrs:{id:"recaptcha"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recaptcha"}},[e._v("#")]),e._v(" reCAPTCHA")]),e._v(" "),a("p",[e._v("The Panel uses invisible reCAPTCHA to secure the login page from brute-force attacks. If the login attempt is considered suspicious, users may be required to perform a reCAPTCHA challenge.")]),e._v(" "),a("h3",{attrs:{id:"configuring-recaptcha"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-recaptcha"}},[e._v("#")]),e._v(" Configuring reCAPTCHA")]),e._v(" "),a("p",[e._v("While we provide a global Site Key and Secret Key by default, we highly recommend changing it for your own setup.")]),e._v(" "),a("p",[e._v("You can generate your own keys in the "),a("a",{attrs:{href:"https://www.google.com/recaptcha/admin",target:"_blank",rel:"noopener noreferrer"}},[e._v("reCAPTCHA Admin Console"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the "),a("strong",[e._v("Advanced")]),e._v(" tab.")]),e._v(" "),a("h3",{attrs:{id:"disabling-recaptcha"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disabling-recaptcha"}},[e._v("#")]),e._v(" Disabling reCAPTCHA")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("SECURITY WARNING")]),e._v(" "),a("p",[e._v("We do not recommend disabling reCAPTCHA. It is a security mechanism that makes it harder to perform brute-force attacks on user accounts.")])]),e._v(" "),a("p",[e._v("If users have trouble logging in, or your Panel isn't exposed to the internet, it can make sense to disable reCAPTCHA.")]),e._v(" "),a("p",[e._v("reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the "),a("strong",[e._v("Advanced")]),e._v(" tab and set the "),a("strong",[e._v("Status")]),e._v(" of reCAPTCHA to "),a("strong",[e._v("disabled")]),e._v(".")]),e._v(" "),a("h4",{attrs:{id:"editing-your-database"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#editing-your-database"}},[e._v("#")]),e._v(" Editing your database")]),e._v(" "),a("p",[e._v("If you cannot access your panel, you can modify the database directly using the following commands.")]),e._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[e._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("u root "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("p\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("UPDATE")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("settings "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("SET")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("value")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'false'")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("WHERE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("`")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'settings::recaptcha:enabled'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("h2",{attrs:{id:"_2fa"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2fa"}},[e._v("#")]),e._v(" 2FA")]),e._v(" "),a("p",[e._v("If possible you should use the panel to update your 2FA settings. If you can't access your panel for what ever reason you can use the following steps.")]),e._v(" "),a("h3",{attrs:{id:"disable-2fa-requirement"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-requirement"}},[e._v("#")]),e._v(" Disable 2FA requirement")]),e._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[e._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("u root "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("p\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("UPDATE")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("settings "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("SET")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("value")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("WHERE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("`")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'settings::pterodactyl:auth:2fa_required'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("h3",{attrs:{id:"disable-2fa-for-a-specific-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-for-a-specific-user"}},[e._v("#")]),e._v(" Disable 2FA for a specific user")]),e._v(" "),a("p",[e._v("Run the following command in your "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:user:disable2fa\n")])])]),a("h2",{attrs:{id:"telemetry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#telemetry"}},[e._v("#")]),e._v(" Telemetry")]),e._v(" "),a("p",[e._v("Since 1.11, the Panel collects anonymous metrics about the Panel and all connected nodes.\nThis feature is enabled by default, but can be disabled.")]),e._v(" "),a("p",[e._v("The data collected by this feature is not sold or used for advertising purposes. Aggregate statistics\nmay be made public or shared with third-parties for the purposes of improving the software.")]),e._v(" "),a("h3",{attrs:{id:"how-does-it-work"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),a("p",[e._v("The Telemetry system works by first generating a random UUIDv4 identifier for the Panel installation.\nThis identifier is stored in the database so people load-balancing multiple Panel instances can still\nhave a unique identifier. This identifier is then sent to a remote server, along the associated\ntelemetry data. The telemetry data is collected every 24 hours, there is no ongoing collection\nor local storage of the telemetry data, we collect the data right before we send it to the remote\nserver.")]),e._v(" "),a("p",[e._v("Currently, all telemetry collection logic is handled by the "),a("a",{attrs:{href:"https://github.com/pterodactyl/panel/blob/1.0-develop/app/Services/Telemetry/TelemetryCollectionService.php#L53",target:"_blank",rel:"noopener noreferrer"}},[e._v("TelemetryCollectionService"),a("OutboundLink")],1),e._v("\non the panel. This service is responsible for collecting all the data that is sent to the remote\nserver.")]),e._v(" "),a("h3",{attrs:{id:"what-data-is-collected"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#what-data-is-collected"}},[e._v("#")]),e._v(" What data is collected?")]),e._v(" "),a("p",[e._v("If you wish to see the full data that is collected, please look at the TelemetryCollectionService\n(as linked above), or use the "),a("code",[e._v("php artisan p:telemetry")]),e._v(" command to view the exact data that will\nbe sent to the remote server.")]),e._v(" "),a("p",[e._v("As of 2022-12-01, the data collected consists of:")]),e._v(" "),a("ul",[a("li",[e._v("Unique identifier for the Panel")]),e._v(" "),a("li",[e._v("Version of the Panel")]),e._v(" "),a("li",[e._v("PHP version")]),e._v(" "),a("li",[e._v("Backup storage driver (S3, Local, etc.)")]),e._v(" "),a("li",[e._v("Cache driver (Redis, Memcached, etc.)")]),e._v(" "),a("li",[e._v("Database driver and version (MySQL, MariaDB, PostgreSQL, etc.)")]),e._v(" "),a("li",[e._v("Resources\n"),a("ul",[a("li",[e._v("Allocations\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Total number of used allocations (assigned to a server)")])])]),e._v(" "),a("li",[e._v("Backups\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Sum of the total amount of bytes stored by backups")])])]),e._v(" "),a("li",[e._v("Eggs\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Map of egg UUIDs to the number of servers using that egg")])])]),e._v(" "),a("li",[e._v("Locations\n"),a("ul",[a("li",[e._v("Total number")])])]),e._v(" "),a("li",[e._v("Mounts\n"),a("ul",[a("li",[e._v("Total number")])])]),e._v(" "),a("li",[e._v("Nests\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Map of nest UUIDs to the number of servers using eggs in that nest")])])]),e._v(" "),a("li",[e._v("Nodes\n"),a("ul",[a("li",[e._v("Total number")])])]),e._v(" "),a("li",[e._v("Servers\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Number of servers that are suspended")])])]),e._v(" "),a("li",[e._v("Users\n"),a("ul",[a("li",[e._v("Total number")]),e._v(" "),a("li",[e._v("Number of users that are admins")])])])])]),e._v(" "),a("li",[e._v("Nodes\n"),a("ul",[a("li",[e._v("Node UUID")]),e._v(" "),a("li",[e._v("Version of Wings on the node")]),e._v(" "),a("li",[e._v("Docker\n"),a("ul",[a("li",[e._v("Version")]),e._v(" "),a("li",[e._v("Cgroups\n"),a("ul",[a("li",[e._v("Driver")]),e._v(" "),a("li",[e._v("Version")])])]),e._v(" "),a("li",[e._v("Containers\n"),a("ul",[a("li",[e._v("Total")]),e._v(" "),a("li",[e._v("Running")]),e._v(" "),a("li",[e._v("Paused")]),e._v(" "),a("li",[e._v("Stopped")])])]),e._v(" "),a("li",[e._v("Storage\n"),a("ul",[a("li",[e._v("Driver")]),e._v(" "),a("li",[e._v("Filesystem")])])]),e._v(" "),a("li",[e._v("runc\n"),a("ul",[a("li",[e._v("Version")])])])])]),e._v(" "),a("li",[e._v("System\n"),a("ul",[a("li",[e._v("Architecture ("),a("code",[e._v("amd64")]),e._v(", "),a("code",[e._v("arm64")]),e._v(", etc.)")]),e._v(" "),a("li",[e._v("CPU Threads")]),e._v(" "),a("li",[e._v("Memory Bytes")]),e._v(" "),a("li",[e._v("Kernel Version")]),e._v(" "),a("li",[e._v("Operating System (Debian, Fedora, RHEL, Ubuntu, etc.)")]),e._v(" "),a("li",[e._v("Operating System Type (bsd, linux, windows, etc.)")])])])])])]),e._v(" "),a("h3",{attrs:{id:"how-is-the-data-stored"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-is-the-data-stored"}},[e._v("#")]),e._v(" How is the data stored?")]),e._v(" "),a("p",[e._v("Currently, the data is stored with Cloudflare, exact specifics about the format and products used\nis not available at this time as our implementation is still very much an alpha. Right now, there\nis "),a("strong",[e._v("NO")]),e._v(" way to query or view this information, both for project team members and the public. We\nexpect this to change in the future, but for now we are not making any guarantees about the data\nbeing publicly available.")]),e._v(" "),a("h3",{attrs:{id:"why"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why"}},[e._v("#")]),e._v(" Why?")]),e._v(" "),a("p",[e._v("The primary reason for collecting this data is to help us make better decisions about the future of\nthis software. With the release of 1.11, the minimum PHP version requirement jumped from 7.4 to 8.0,\nhowever, we wanted to add a feature that required PHP 8.1 which would've made the version requirement\njump larger and potentially cause issues for some users. By collecting this data, we can hopefully\nhave more insight to how changes like this will affect the community and make better decisions in the\nfuture. This is especially important for information like the architecture, kernel version, and\noperating system nodes are using. For example, we want to utilize a feature that is only present in\nsome filesystems, but we have no idea how many people are using those filesystems, so we cannot\ndetermine if it's worth the effort to implement.")]),e._v(" "),a("p",[e._v("Some of the data is not as useful for making decisions, but is still useful for us to know.\nFor example, have you ever wondered how many Panel instances there are? How many servers are being\nran across all of those instances? How many users are using the Panel? How many of those users are\nadmins? How many servers are using a specific egg? How many servers are using a specific nest?\nAll of these questions can be answered by the data we collect, and can help us and the community\nbetter understand how the software is being used.")]),e._v(" "),a("p",[e._v("If you have any questions about the data we collect, please feel free to reach out to us on Discord.\nOur goal is to be as transparent as possible, and we want to make sure that the community understands\nwhat we are doing and why.")]),e._v(" "),a("h3",{attrs:{id:"enabling-telemetry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-telemetry"}},[e._v("#")]),e._v(" Enabling Telemetry")]),e._v(" "),a("p",[e._v("Telemetry is enabled by default, if you want to enable it after disabling it, edit your "),a("code",[e._v(".env")]),e._v(" file\nand either remove the "),a("code",[e._v("PTERODACTYL_TELEMETRY_ENABLED")]),e._v(" line, or set it to "),a("code",[e._v("true")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_TELEMETRY_ENABLED=true\n")])])]),a("h3",{attrs:{id:"disabling-telemetry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disabling-telemetry"}},[e._v("#")]),e._v(" Disabling Telemetry")]),e._v(" "),a("p",[e._v("To disable telemetry, edit your "),a("code",[e._v(".env")]),e._v(" file and set "),a("code",[e._v("PTERODACTYL_TELEMETRY_ENABLED")]),e._v(" to "),a("code",[e._v("false")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_TELEMETRY_ENABLED=false\n")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/66.2a7e5a10.js b/assets/js/66.2a7e5a10.js deleted file mode 100644 index 1717f789..00000000 --- a/assets/js/66.2a7e5a10.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{411:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#picking-a-server-os"}},[e._v("Picking a Server OS")])]),a("li",[a("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-dependency-installation"}},[e._v("Example Dependency Installation")])]),a("li",[a("a",{attrs:{href:"#installing-composer"}},[e._v("Installing Composer")])])])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),a("li",[a("a",{attrs:{href:"#installation"}},[e._v("Installation")]),a("ul",[a("li",[a("a",{attrs:{href:"#environment-configuration"}},[e._v("Environment Configuration")])]),a("li",[a("a",{attrs:{href:"#database-setup"}},[e._v("Database Setup")])]),a("li",[a("a",{attrs:{href:"#add-the-first-user"}},[e._v("Add The First User")])]),a("li",[a("a",{attrs:{href:"#set-permissions"}},[e._v("Set Permissions")])])])]),a("li",[a("a",{attrs:{href:"#queue-listeners"}},[e._v("Queue Listeners")]),a("ul",[a("li",[a("a",{attrs:{href:"#crontab-configuration"}},[e._v("Crontab Configuration")])]),a("li",[a("a",{attrs:{href:"#create-queue-worker"}},[e._v("Create Queue Worker")])])])])])]),a("p"),e._v(" "),a("p",[e._v("Pterodactyl Panel is designed to run on your own web server. You will need to have root access to your server in order to run and use this panel.")]),e._v(" "),a("p",[e._v("You are expected to understand how to read documentation to use this Panel. We have spent many hours detailing how to install or upgrade our\nsoftware; take some time and read rather than copy and pasting and then complaining when things do not work. This panel does\nnot exist as a drag-and-drop service to run your servers. It is a highly complex system requiring multiple dependencies and\nadministrators willing to spend some time learning how to use it. "),a("strong",[e._v("If you expect to be able to install this with no understanding\nof basic linux system administration you should stop and turn around now.")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Looking for something simple to setup?")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://wisp.gg",target:"_blank",rel:"noopener noreferrer"}},[e._v("WISP"),a("OutboundLink")],1),e._v(" is a Pterodactyl powered SaaS suitable for enterprise and personal use. Offering all the features without the setup hassle, and fully compatible with Pterodactyl eggs. Comparable to MultiCraft or TCAdmin while offering new and unique features. Click here to "),a("a",{attrs:{href:"https://wisp.gg/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("learn more"),a("OutboundLink")],1),e._v(".")])]),e._v(" "),a("h2",{attrs:{id:"picking-a-server-os"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#picking-a-server-os"}},[e._v("#")]),e._v(" Picking a Server OS")]),e._v(" "),a("p",[e._v("Pterodactyl runs on a wide range of operating systems, so pick whichever you are most comfortable using.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("Pterodactyl does not support most OpenVZ systems due to incompatibilities with Docker. If you are planning on running\nthis software on an OpenVZ based system you will — most likely — not be successful.")])]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Operating System")]),e._v(" "),a("th",[e._v("Version")]),e._v(" "),a("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),a("th",[e._v("Notes")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[a("strong",[e._v("Ubuntu")])]),e._v(" "),a("td",[e._v("18.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("20.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("22.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("22.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("MariaDB can be installed without the repo setup script.")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("CentOS")])]),e._v(" "),a("td",[e._v("7")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Extra repos are required.")])]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("8")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Note that CentOS 8 is EOL. Use Rocky or Alma Linux.")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("Debian")])]),e._v(" "),a("td",[e._v("10")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("11")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")])])]),e._v(" "),a("h2",{attrs:{id:"dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(", "),a("code",[e._v("8.0")]),e._v(" or "),a("code",[e._v("8.1")]),e._v(" (recommended) with the following extensions: "),a("code",[e._v("cli")]),e._v(", "),a("code",[e._v("openssl")]),e._v(", "),a("code",[e._v("gd")]),e._v(", "),a("code",[e._v("mysql")]),e._v(", "),a("code",[e._v("PDO")]),e._v(", "),a("code",[e._v("mbstring")]),e._v(", "),a("code",[e._v("tokenizer")]),e._v(", "),a("code",[e._v("bcmath")]),e._v(", "),a("code",[e._v("xml")]),e._v(" or "),a("code",[e._v("dom")]),e._v(", "),a("code",[e._v("curl")]),e._v(", "),a("code",[e._v("zip")]),e._v(", and "),a("code",[e._v("fpm")]),e._v(" if you are planning to use NGINX.")]),e._v(" "),a("li",[e._v("MySQL "),a("code",[e._v("5.7.22")]),e._v(" and higher (MySQL "),a("code",[e._v("8")]),e._v(" recommended) "),a("strong",[e._v("or")]),e._v(" MariaDB "),a("code",[e._v("10.2")]),e._v(" and higher.")]),e._v(" "),a("li",[e._v("Redis ("),a("code",[e._v("redis-server")]),e._v(")")]),e._v(" "),a("li",[e._v("A webserver (Apache, NGINX, Caddy, etc.)")]),e._v(" "),a("li",[a("code",[e._v("curl")])]),e._v(" "),a("li",[a("code",[e._v("tar")])]),e._v(" "),a("li",[a("code",[e._v("unzip")])]),e._v(" "),a("li",[a("code",[e._v("git")])]),e._v(" "),a("li",[a("code",[e._v("composer")]),e._v(" v2")])]),e._v(" "),a("h3",{attrs:{id:"example-dependency-installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-dependency-installation"}},[e._v("#")]),e._v(" Example Dependency Installation")]),e._v(" "),a("p",[e._v("The commands below are simply an example of how you might install these dependencies. Please consult with your\noperating system's package manager to determine the correct packages to install.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# Add "add-apt-repository" command')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" software-properties-common "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" apt-transport-https ca-certificates gnupg\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add additional repositories for PHP, Redis, and MariaDB")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("LC_ALL")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("C.UTF-8 add-apt-repository -y ppa:ondrej/php\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add Redis official APT repository")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -fsSL https://packages.redis.io/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(' main"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tee")]),e._v(" /etc/apt/sources.list.d/redis.list\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# MariaDB repo setup script can be skipped on Ubuntu 22.04")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Update repositories list")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add universe repository if you are on Ubuntu 18.04")]),e._v("\napt-add-repository universe\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Install Dependencies")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" php8.1 php8.1-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" mariadb-server nginx "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("unzip")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" redis-server\n")])])]),a("h3",{attrs:{id:"installing-composer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-composer"}},[e._v("#")]),e._v(" Installing Composer")]),e._v(" "),a("p",[e._v("Composer is a dependency manager for PHP that allows us to ship everything you'll need code wise to operate the Panel. You'll\nneed composer installed before continuing in this process.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://getcomposer.org/installer "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" php -- --install-dir"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/usr/local/bin --filename"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("composer\n")])])]),a("h2",{attrs:{id:"download-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-files"}},[e._v("#")]),e._v(" Download Files")]),e._v(" "),a("p",[e._v("The first step in this process is to create the folder where the panel will live and then move ourselves into that\nnewly created folder. Below is an example of how to perform this operation.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /var/www/pterodactyl\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n")])])]),a("p",[e._v("Once you have created a new directory for the Panel and moved into it you'll need to download the Panel files. This\nis as simple as using "),a("code",[e._v("curl")]),e._v(" to download our pre-packaged content. Once it is downloaded you'll need to unpack the archive\nand then set the correct permissions on the "),a("code",[e._v("storage/")]),e._v(" and "),a("code",[e._v("bootstrap/cache/")]),e._v(" directories. These directories\nallow us to store files as well as keep a speedy cache available to reduce load times.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzvf panel.tar.gz\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache/\n")])])]),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),a("p",[e._v("Now that all of the files have been downloaded we need to configure some core aspects of the Panel.")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Database Configuration")]),e._v(" "),a("p",[e._v("You will need a database setup and a user with the correct permissions created for that database before\ncontinuing any further. See below to create a user and database for your Pterodactyl panel quickly. To find more detailed information\nplease have a look at "),a("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1),e._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[e._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("u root "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("p\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Remember to change 'yourPassword' below to be a unique password")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("CREATE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("USER")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'pterodactyl'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("@'127.0.0.1'")]),e._v(" IDENTIFIED "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("BY")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'yourPassword'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("CREATE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("DATABASE")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("GRANT")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("ALL")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("PRIVILEGES")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("ON")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("*")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("TO")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'pterodactyl'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("@'127.0.0.1'")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("WITH")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("GRANT")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("OPTION")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("exit")]),e._v("\n")])])])]),e._v(" "),a("p",[e._v("First we will copy over our default environment settings file, install core dependencies, and then generate a\nnew application encryption key.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("cp")]),e._v(" .env.example .env\ncomposer "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Only run the command below if you are installing this Panel for")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# the first time and do not have any Pterodactyl Panel data in the database.")]),e._v("\nphp artisan key:generate --force\n")])])]),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Back up your encryption key (APP_KEY in the "),a("code",[e._v(".env")]),e._v(" file). It is used as an encryption key for all data that needs to be stored securely (e.g. api keys).\nStore it somewhere safe - not just on your server. If you lose it all encrypted data is irrecoverable -- even if you have database backups.")])]),e._v(" "),a("h3",{attrs:{id:"environment-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),a("p",[e._v("Pterodactyl's core environment is easily configured using a few different CLI commands built into the app. This step\nwill cover setting up things such as sessions, caching, database credentials, and email sending.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:database\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# To use PHP\'s internal mail sending (not recommended), select "mail". To use a')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# custom SMTP server, select "smtp".')]),e._v("\nphp artisan p:environment:mail\n")])])]),a("h3",{attrs:{id:"database-setup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-setup"}},[e._v("#")]),e._v(" Database Setup")]),e._v(" "),a("p",[e._v("Now we need to setup all of the base data for the Panel in the database you created earlier. "),a("strong",[e._v("The command below\nmay take some time to run depending on your machine. Please "),a("em",[e._v("DO NOT")]),e._v(" exit the process until it is completed!")]),e._v(" This\ncommand will setup the database tables and then add all of the Nests & Eggs that power Pterodactyl.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --seed --force\n")])])]),a("h3",{attrs:{id:"add-the-first-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#add-the-first-user"}},[e._v("#")]),e._v(" Add The First User")]),e._v(" "),a("p",[e._v("You'll then need to create an administrative user so that you can log into the panel. To do so, run the command below.\nAt this time passwords "),a("strong",[e._v("must")]),e._v(" meet the following requirements: 8 characters, mixed case, at least one number.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:user:make\n")])])]),a("h3",{attrs:{id:"set-permissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),a("p",[e._v("The last step in the installation process is to set the correct permissions on the Panel files so that the webserver can\nuse them correctly.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache /var/www/pterodactyl/*\n")])])]),a("h2",{attrs:{id:"queue-listeners"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#queue-listeners"}},[e._v("#")]),e._v(" Queue Listeners")]),e._v(" "),a("p",[e._v("We make use of queues to make the application faster and handle sending emails and other actions in the background.\nYou will need to setup the queue worker for these actions to be processed.")]),e._v(" "),a("h3",{attrs:{id:"crontab-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#crontab-configuration"}},[e._v("#")]),e._v(" Crontab Configuration")]),e._v(" "),a("p",[e._v("The first thing we need to do is create a new cronjob that runs every minute to process specific Pterodactyl tasks, such\nas session cleanup and sending scheduled tasks to daemons. You'll want to open your crontab using "),a("code",[e._v("sudo crontab -e")]),e._v(" and\nthen paste the line below.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("* * * * * php /var/www/pterodactyl/artisan schedule:run "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /dev/null "),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("2")]),e._v(">")]),a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("&1")]),e._v("\n")])])]),a("h3",{attrs:{id:"create-queue-worker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-queue-worker"}},[e._v("#")]),e._v(" Create Queue Worker")]),e._v(" "),a("p",[e._v("Next you need to create a new systemd worker to keep our queue process running in the background. This queue is responsible\nfor sending emails and handling many other background tasks for Pterodactyl.")]),e._v(" "),a("p",[e._v("Create a file called "),a("code",[e._v("pteroq.service")]),e._v(" in "),a("code",[e._v("/etc/systemd/system")]),e._v(" with the contents below.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("# Pterodactyl Queue Worker File\n# ----------------------------------\n\n[Unit]\nDescription=Pterodactyl Queue Worker\nAfter=redis-server.service\n\n[Service]\n# On some systems the user and group might be different.\n# Some systems use `apache` or `nginx` as the user and group.\nUser=www-data\nGroup=www-data\nRestart=always\nExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3\nStartLimitInterval=180\nStartLimitBurst=30\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Redis on CentOS")]),e._v(" "),a("p",[e._v("If you are using CentOS, you will need to replace "),a("code",[e._v("redis-server.service")]),e._v(" with "),a("code",[e._v("redis.service")]),e._v(" at the "),a("code",[e._v("After=")]),e._v(" line in order to ensure "),a("code",[e._v("redis")]),e._v(" starts before the queue worker.")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[e._v("If you are not using "),a("code",[e._v("redis")]),e._v(" for anything you should remove the "),a("code",[e._v("After=")]),e._v(" line, otherwise you will encounter errors\nwhen the service starts.")])]),e._v(" "),a("p",[e._v("If you are using redis for your system, you will want to make sure to enable that it will start on boot. You can do that by running the following command:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now redis-server\n")])])]),a("p",[e._v("Finally, enable the service and set it to boot on machine start.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pteroq.service\n")])])]),a("h4",{attrs:{id:"next-step-webserver-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#next-step-webserver-configuration"}},[e._v("#")]),e._v(" Next Step: "),a("a",{attrs:{href:"./webserver_configuration"}},[e._v("Webserver Configuration")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/66.38ba9f8f.js b/assets/js/66.38ba9f8f.js new file mode 100644 index 00000000..10e6bef2 --- /dev/null +++ b/assets/js/66.38ba9f8f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{411:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#picking-a-server-os"}},[e._v("Picking a Server OS")])]),a("li",[a("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-dependency-installation"}},[e._v("Example Dependency Installation")])]),a("li",[a("a",{attrs:{href:"#installing-composer"}},[e._v("Installing Composer")])])])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),a("li",[a("a",{attrs:{href:"#installation"}},[e._v("Installation")]),a("ul",[a("li",[a("a",{attrs:{href:"#environment-configuration"}},[e._v("Environment Configuration")])]),a("li",[a("a",{attrs:{href:"#database-setup"}},[e._v("Database Setup")])]),a("li",[a("a",{attrs:{href:"#add-the-first-user"}},[e._v("Add The First User")])]),a("li",[a("a",{attrs:{href:"#set-permissions"}},[e._v("Set Permissions")])])])]),a("li",[a("a",{attrs:{href:"#queue-listeners"}},[e._v("Queue Listeners")]),a("ul",[a("li",[a("a",{attrs:{href:"#crontab-configuration"}},[e._v("Crontab Configuration")])]),a("li",[a("a",{attrs:{href:"#create-queue-worker"}},[e._v("Create Queue Worker")])]),a("li",[a("a",{attrs:{href:"#telemetry"}},[e._v("Telemetry")])])])])])]),a("p"),e._v(" "),a("p",[e._v("Pterodactyl Panel is designed to run on your own web server. You will need to have root access to your server in order to run and use this panel.")]),e._v(" "),a("p",[e._v("You are expected to understand how to read documentation to use this Panel. We have spent many hours detailing how to install or upgrade our\nsoftware; take some time and read rather than copy and pasting and then complaining when things do not work. This panel does\nnot exist as a drag-and-drop service to run your servers. It is a highly complex system requiring multiple dependencies and\nadministrators willing to spend some time learning how to use it. "),a("strong",[e._v("If you expect to be able to install this with no understanding\nof basic linux system administration you should stop and turn around now.")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Looking for something simple to setup?")]),e._v(" "),a("p",[a("a",{attrs:{href:"https://wisp.gg",target:"_blank",rel:"noopener noreferrer"}},[e._v("WISP"),a("OutboundLink")],1),e._v(" is a Pterodactyl powered SaaS suitable for enterprise and personal use. Offering all the features without the setup hassle, and fully compatible with Pterodactyl eggs. Comparable to MultiCraft or TCAdmin while offering new and unique features. Click here to "),a("a",{attrs:{href:"https://wisp.gg/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("learn more"),a("OutboundLink")],1),e._v(".")])]),e._v(" "),a("h2",{attrs:{id:"picking-a-server-os"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#picking-a-server-os"}},[e._v("#")]),e._v(" Picking a Server OS")]),e._v(" "),a("p",[e._v("Pterodactyl runs on a wide range of operating systems, so pick whichever you are most comfortable using.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("Pterodactyl does not support most OpenVZ systems due to incompatibilities with Docker. If you are planning on running\nthis software on an OpenVZ based system you will — most likely — not be successful.")])]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Operating System")]),e._v(" "),a("th",[e._v("Version")]),e._v(" "),a("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),a("th",[e._v("Notes")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[a("strong",[e._v("Ubuntu")])]),e._v(" "),a("td",[e._v("18.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("20.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("22.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("22.04")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("MariaDB can be installed without the repo setup script.")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("CentOS")])]),e._v(" "),a("td",[e._v("7")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Extra repos are required.")])]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("8")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td",[e._v("Note that CentOS 8 is EOL. Use Rocky or Alma Linux.")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("Debian")])]),e._v(" "),a("td",[e._v("10")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td"),e._v(" "),a("td",[e._v("11")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")])])]),e._v(" "),a("h2",{attrs:{id:"dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("8.0")]),e._v(" or "),a("code",[e._v("8.1")]),e._v(" (recommended) with the following extensions: "),a("code",[e._v("cli")]),e._v(", "),a("code",[e._v("openssl")]),e._v(", "),a("code",[e._v("gd")]),e._v(", "),a("code",[e._v("mysql")]),e._v(", "),a("code",[e._v("PDO")]),e._v(", "),a("code",[e._v("mbstring")]),e._v(", "),a("code",[e._v("tokenizer")]),e._v(", "),a("code",[e._v("bcmath")]),e._v(", "),a("code",[e._v("xml")]),e._v(" or "),a("code",[e._v("dom")]),e._v(", "),a("code",[e._v("curl")]),e._v(", "),a("code",[e._v("zip")]),e._v(", and "),a("code",[e._v("fpm")]),e._v(" if you are planning to use NGINX.")]),e._v(" "),a("li",[e._v("MySQL "),a("code",[e._v("5.7.22")]),e._v(" and higher (MySQL "),a("code",[e._v("8")]),e._v(" recommended) "),a("strong",[e._v("or")]),e._v(" MariaDB "),a("code",[e._v("10.2")]),e._v(" and higher.")]),e._v(" "),a("li",[e._v("Redis ("),a("code",[e._v("redis-server")]),e._v(")")]),e._v(" "),a("li",[e._v("A webserver (Apache, NGINX, Caddy, etc.)")]),e._v(" "),a("li",[a("code",[e._v("curl")])]),e._v(" "),a("li",[a("code",[e._v("tar")])]),e._v(" "),a("li",[a("code",[e._v("unzip")])]),e._v(" "),a("li",[a("code",[e._v("git")])]),e._v(" "),a("li",[a("code",[e._v("composer")]),e._v(" v2")])]),e._v(" "),a("h3",{attrs:{id:"example-dependency-installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-dependency-installation"}},[e._v("#")]),e._v(" Example Dependency Installation")]),e._v(" "),a("p",[e._v("The commands below are simply an example of how you might install these dependencies. Please consult with your\noperating system's package manager to determine the correct packages to install.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# Add "add-apt-repository" command')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" software-properties-common "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" apt-transport-https ca-certificates gnupg\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add additional repositories for PHP, Redis, and MariaDB")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("LC_ALL")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("C.UTF-8 add-apt-repository -y ppa:ondrej/php\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add Redis official APT repository")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -fsSL https://packages.redis.io/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(' main"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tee")]),e._v(" /etc/apt/sources.list.d/redis.list\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# MariaDB repo setup script can be skipped on Ubuntu 22.04")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Update repositories list")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add universe repository if you are on Ubuntu 18.04")]),e._v("\napt-add-repository universe\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Install Dependencies")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" php8.1 php8.1-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" mariadb-server nginx "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("unzip")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" redis-server\n")])])]),a("h3",{attrs:{id:"installing-composer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-composer"}},[e._v("#")]),e._v(" Installing Composer")]),e._v(" "),a("p",[e._v("Composer is a dependency manager for PHP that allows us to ship everything you'll need code wise to operate the Panel. You'll\nneed composer installed before continuing in this process.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://getcomposer.org/installer "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" php -- --install-dir"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/usr/local/bin --filename"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("composer\n")])])]),a("h2",{attrs:{id:"download-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-files"}},[e._v("#")]),e._v(" Download Files")]),e._v(" "),a("p",[e._v("The first step in this process is to create the folder where the panel will live and then move ourselves into that\nnewly created folder. Below is an example of how to perform this operation.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /var/www/pterodactyl\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n")])])]),a("p",[e._v("Once you have created a new directory for the Panel and moved into it you'll need to download the Panel files. This\nis as simple as using "),a("code",[e._v("curl")]),e._v(" to download our pre-packaged content. Once it is downloaded you'll need to unpack the archive\nand then set the correct permissions on the "),a("code",[e._v("storage/")]),e._v(" and "),a("code",[e._v("bootstrap/cache/")]),e._v(" directories. These directories\nallow us to store files as well as keep a speedy cache available to reduce load times.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzvf panel.tar.gz\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache/\n")])])]),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),a("p",[e._v("Now that all of the files have been downloaded we need to configure some core aspects of the Panel.")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Database Configuration")]),e._v(" "),a("p",[e._v("You will need a database setup and a user with the correct permissions created for that database before\ncontinuing any further. See below to create a user and database for your Pterodactyl panel quickly. To find more detailed information\nplease have a look at "),a("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1),e._v(" "),a("div",{staticClass:"language-sql extra-class"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[e._v("mysql "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("u root "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("p\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Remember to change 'yourPassword' below to be a unique password")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("CREATE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("USER")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'pterodactyl'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("@'127.0.0.1'")]),e._v(" IDENTIFIED "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("BY")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'yourPassword'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("CREATE")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("DATABASE")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("GRANT")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("ALL")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("PRIVILEGES")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("ON")]),e._v(" panel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("*")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("TO")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'pterodactyl'")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("@'127.0.0.1'")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("WITH")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("GRANT")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("OPTION")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("exit")]),e._v("\n")])])])]),e._v(" "),a("p",[e._v("First we will copy over our default environment settings file, install core dependencies, and then generate a\nnew application encryption key.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("cp")]),e._v(" .env.example .env\ncomposer "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Only run the command below if you are installing this Panel for")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# the first time and do not have any Pterodactyl Panel data in the database.")]),e._v("\nphp artisan key:generate --force\n")])])]),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Back up your encryption key (APP_KEY in the "),a("code",[e._v(".env")]),e._v(" file). It is used as an encryption key for all data that needs to be stored securely (e.g. api keys).\nStore it somewhere safe - not just on your server. If you lose it all encrypted data is irrecoverable -- even if you have database backups.")])]),e._v(" "),a("h3",{attrs:{id:"environment-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),a("p",[e._v("Pterodactyl's core environment is easily configured using a few different CLI commands built into the app. This step\nwill cover setting up things such as sessions, caching, database credentials, and email sending.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:database\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# To use PHP\'s internal mail sending (not recommended), select "mail". To use a')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# custom SMTP server, select "smtp".')]),e._v("\nphp artisan p:environment:mail\n")])])]),a("h3",{attrs:{id:"database-setup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-setup"}},[e._v("#")]),e._v(" Database Setup")]),e._v(" "),a("p",[e._v("Now we need to setup all of the base data for the Panel in the database you created earlier. "),a("strong",[e._v("The command below\nmay take some time to run depending on your machine. Please "),a("em",[e._v("DO NOT")]),e._v(" exit the process until it is completed!")]),e._v(" This\ncommand will setup the database tables and then add all of the Nests & Eggs that power Pterodactyl.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --seed --force\n")])])]),a("h3",{attrs:{id:"add-the-first-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#add-the-first-user"}},[e._v("#")]),e._v(" Add The First User")]),e._v(" "),a("p",[e._v("You'll then need to create an administrative user so that you can log into the panel. To do so, run the command below.\nAt this time passwords "),a("strong",[e._v("must")]),e._v(" meet the following requirements: 8 characters, mixed case, at least one number.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:user:make\n")])])]),a("h3",{attrs:{id:"set-permissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),a("p",[e._v("The last step in the installation process is to set the correct permissions on the Panel files so that the webserver can\nuse them correctly.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache /var/www/pterodactyl/*\n")])])]),a("h2",{attrs:{id:"queue-listeners"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#queue-listeners"}},[e._v("#")]),e._v(" Queue Listeners")]),e._v(" "),a("p",[e._v("We make use of queues to make the application faster and handle sending emails and other actions in the background.\nYou will need to setup the queue worker for these actions to be processed.")]),e._v(" "),a("h3",{attrs:{id:"crontab-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#crontab-configuration"}},[e._v("#")]),e._v(" Crontab Configuration")]),e._v(" "),a("p",[e._v("The first thing we need to do is create a new cronjob that runs every minute to process specific Pterodactyl tasks, such\nas session cleanup and sending scheduled tasks to daemons. You'll want to open your crontab using "),a("code",[e._v("sudo crontab -e")]),e._v(" and\nthen paste the line below.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("* * * * * php /var/www/pterodactyl/artisan schedule:run "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /dev/null "),a("span",{pre:!0,attrs:{class:"token operator"}},[a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("2")]),e._v(">")]),a("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("&1")]),e._v("\n")])])]),a("h3",{attrs:{id:"create-queue-worker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-queue-worker"}},[e._v("#")]),e._v(" Create Queue Worker")]),e._v(" "),a("p",[e._v("Next you need to create a new systemd worker to keep our queue process running in the background. This queue is responsible\nfor sending emails and handling many other background tasks for Pterodactyl.")]),e._v(" "),a("p",[e._v("Create a file called "),a("code",[e._v("pteroq.service")]),e._v(" in "),a("code",[e._v("/etc/systemd/system")]),e._v(" with the contents below.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("# Pterodactyl Queue Worker File\n# ----------------------------------\n\n[Unit]\nDescription=Pterodactyl Queue Worker\nAfter=redis-server.service\n\n[Service]\n# On some systems the user and group might be different.\n# Some systems use `apache` or `nginx` as the user and group.\nUser=www-data\nGroup=www-data\nRestart=always\nExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3\nStartLimitInterval=180\nStartLimitBurst=30\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n")])])]),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Redis on CentOS")]),e._v(" "),a("p",[e._v("If you are using CentOS, you will need to replace "),a("code",[e._v("redis-server.service")]),e._v(" with "),a("code",[e._v("redis.service")]),e._v(" at the "),a("code",[e._v("After=")]),e._v(" line in order to ensure "),a("code",[e._v("redis")]),e._v(" starts before the queue worker.")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[e._v("If you are not using "),a("code",[e._v("redis")]),e._v(" for anything you should remove the "),a("code",[e._v("After=")]),e._v(" line, otherwise you will encounter errors\nwhen the service starts.")])]),e._v(" "),a("p",[e._v("If you are using redis for your system, you will want to make sure to enable that it will start on boot. You can do that by running the following command:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now redis-server\n")])])]),a("p",[e._v("Finally, enable the service and set it to boot on machine start.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pteroq.service\n")])])]),a("h3",{attrs:{id:"telemetry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#telemetry"}},[e._v("#")]),e._v(" Telemetry")]),e._v(" "),a("p",[e._v("Since 1.11, Pterodactyl will collect anonymous telemetry to help us better understand how the\nsoftware is being used. To learn more about this feature and to opt-out, please see our "),a("RouterLink",{attrs:{to:"/panel/1.0/additional_configuration.html#telemetry"}},[e._v("Telemetry")]),e._v("\ndocumentation. Make sure to continue with the rest of the installation process.")],1),e._v(" "),a("h4",{attrs:{id:"next-step-webserver-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#next-step-webserver-configuration"}},[e._v("#")]),e._v(" Next Step: "),a("a",{attrs:{href:"./webserver_configuration"}},[e._v("Webserver Configuration")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/69.98a6ef85.js b/assets/js/69.98a6ef85.js new file mode 100644 index 00000000..c498bfdd --- /dev/null +++ b/assets/js/69.98a6ef85.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{414:function(e,t,a){"use strict";a.r(t);var s=a(48),r=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"updating-the-panel"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#updating-the-panel"}},[e._v("#")]),e._v(" Updating the Panel")]),e._v(" "),a("p",[e._v("This documentation covers the process for updating within the "),a("code",[e._v("1.x")]),e._v(" series of releases. This means updating from\n— for example — "),a("code",[e._v("1.5.0")]),e._v(" to "),a("code",[e._v("1.6.0")]),e._v(". "),a("strong",[e._v("Do not use this guide for upgrading from "),a("code",[e._v("0.7")]),e._v(".")])]),e._v(" "),a("h2",{attrs:{id:"panel-version-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#panel-version-requirements"}},[e._v("#")]),e._v(" Panel Version Requirements")]),e._v(" "),a("p",[e._v("Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that\nis required for it to run. Please see the chart below for how these versions line up. In\nmost cases your base Wings version should match that of your Panel.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Panel Version")]),e._v(" "),a("th",[e._v("Wings Version")]),e._v(" "),a("th",[e._v("Supported")]),e._v(" "),a("th",[e._v("PHP Versions")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1.0.x")]),e._v(" "),a("td",[e._v("1.0.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.1.x")]),e._v(" "),a("td",[e._v("1.1.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.2.x")]),e._v(" "),a("td",[e._v("1.2.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.3.x")]),e._v(" "),a("td",[e._v("1.3.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.4.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.5.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.6.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.7.x")]),e._v(" "),a("td",[e._v("1.5.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.8.x")]),e._v(" "),a("td",[e._v("1.6.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0, 8.1")])]),e._v(" "),a("tr",[a("td",[e._v("1.9.x")]),e._v(" "),a("td",[e._v("1.6.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0, 8.1")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("1.10.x")])]),e._v(" "),a("td",[a("strong",[e._v("1.7.x")])]),e._v(" "),a("td",[e._v("✅")]),e._v(" "),a("td",[e._v("7.4, 8.0, "),a("strong",[e._v("8.1")]),e._v(" (7.4 deprecated)")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("1.11.x")])]),e._v(" "),a("td",[a("strong",[e._v("1.11.x")])]),e._v(" "),a("td",[e._v("✅")]),e._v(" "),a("td",[e._v("8.0, "),a("strong",[e._v("8.1")]),e._v(" (8.0 deprecated)")])])])]),e._v(" "),a("p",[a("em",[e._v("NOTE: There are no 1.8.x, 1.9.x, or 1.10.x releases of Wings.")])]),e._v(" "),a("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("8.0")]),e._v(" or "),a("code",[e._v("8.1")]),e._v(" (recommended)")]),e._v(" "),a("li",[e._v("Composer "),a("code",[e._v("2.X")])])]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("PHP 7.4")]),e._v(" "),a("p",[e._v("Support for PHP 7.4 has been removed with the release of 1.11.0. Please upgrade\nto PHP 8.0, 8.1 or newer.\n::")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Future PHP Version Changes")]),e._v(" "),a("p",[a("strong",[e._v("Support for PHP 8.0 is deprecated")]),e._v(". Please plan accordingly — PHP 8.1 or newer\nwill be the only supported version in 1.12 and beyond.")])])]),e._v(" "),a("p",[a("strong",[e._v("Before continuing")]),e._v(", please ensure that your system and web server configuration has been upgraded to at least PHP 8.0 by running "),a("code",[e._v("php -v")]),e._v(" and Composer 2 by running "),a("code",[e._v("composer --version")]),e._v(". You\nshould see an output similar to the result below. If you do not see at least PHP 8.0 and Composer 2, you will need to upgrade by following\nour "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("PHP Upgrade Guide")]),e._v(" and return to this documentation afterward.")],1),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("vagrant@pterodactyl:~/app$ php -v\nPHP 8.1.5 (cli) (built: Apr 21 2022 10:32:13) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.1.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies\n\nvagrant@pterodactyl:~/app$ composer --version\nComposer version 2.3.5 2022-04-13 16:43:00\n")])])]),a("h2",{attrs:{id:"self-upgrade"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#self-upgrade"}},[e._v("#")]),e._v(" Self Upgrade")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("The self-upgrade is currently in-operable due to issues with some dependencies we make use of.\nFor the time being please perform a manual upgrade until this issue can be resolved.")])]),e._v(" "),a("h2",{attrs:{id:"manual-upgrade"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manual-upgrade"}},[e._v("#")]),e._v(" Manual Upgrade")]),e._v(" "),a("p",[e._v("If you prefer not to perform the automatic self-upgrade, or need to reference any upgrade steps you can follow\nthe documentation below.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("If you've already performed the self-upgrade successfully you do not need to do anything else on this page.")])]),e._v(" "),a("h3",{attrs:{id:"enter-maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enter-maintenance-mode"}},[e._v("#")]),e._v(" Enter Maintenance Mode")]),e._v(" "),a("p",[e._v("Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent\nusers from encountering unexpected errors and ensure everything can be updated before users encounter\npotentially new features.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n\nphp artisan down\n")])])]),a("h3",{attrs:{id:"download-the-update"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-the-update"}},[e._v("#")]),e._v(" Download the Update")]),e._v(" "),a("p",[e._v("The first step in the update process is to download the new panel files from GitHub. The command below will download\nthe release archive for the most recent version of Pterodactyl, save it in the current directory and will automatically\nunpack the archive into your current folder.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzv\n")])])]),a("p",[e._v("Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid\nany webserver related errors.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache\n")])])]),a("h3",{attrs:{id:"update-dependencies-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies-2"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("p",[e._v("After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this,\nsimply run the commands below and follow any prompts.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("composer "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n")])])]),a("h3",{attrs:{id:"clear-compiled-template-cache"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#clear-compiled-template-cache"}},[e._v("#")]),e._v(" Clear Compiled Template Cache")]),e._v(" "),a("p",[e._v("You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for\nusers.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan view:clear\nphp artisan config:clear\n")])])]),a("h3",{attrs:{id:"database-updates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-updates"}},[e._v("#")]),e._v(" Database Updates")]),e._v(" "),a("p",[e._v("You'll also need to update your database schema for the newest version of Pterodactyl. Running the command below\nwill update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just\nremember, "),a("em",[e._v("never edit core eggs we ship")]),e._v("! They will be overwritten by this update process.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --seed --force\n")])])]),a("h3",{attrs:{id:"set-permissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),a("p",[e._v("The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this\nis "),a("code",[e._v("www-data")]),e._v(" but can vary from system to system — sometimes being "),a("code",[e._v("nginx")]),e._v(", "),a("code",[e._v("caddy")]),e._v(", "),a("code",[e._v("apache")]),e._v(", or even "),a("code",[e._v("nobody")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache /var/www/pterodactyl/*\n")])])]),a("h3",{attrs:{id:"restarting-queue-workers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restarting-queue-workers"}},[e._v("#")]),e._v(" Restarting Queue Workers")]),e._v(" "),a("p",[e._v("After "),a("em",[e._v("every")]),e._v(" update you should restart the queue worker to ensure that the new code is loaded in and used.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan queue:restart\n")])])]),a("h3",{attrs:{id:"exit-maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exit-maintenance-mode"}},[e._v("#")]),e._v(" Exit Maintenance Mode")]),e._v(" "),a("p",[e._v("Now that everything has been updated you need to exit maintenance mode so that the Panel can resume accepting\nconnections.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan up\n")])])]),a("h3",{attrs:{id:"telemetry"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#telemetry"}},[e._v("#")]),e._v(" Telemetry")]),e._v(" "),a("p",[e._v("Since 1.11, Pterodactyl will collect anonymous telemetry to help us better understand how the\nsoftware is being used. To learn more about this feature and to opt-out, please see our "),a("RouterLink",{attrs:{to:"/panel/1.0/additional_configuration.html#telemetry"}},[e._v("Telemetry")]),e._v("\ndocumentation. Remember to continue with the rest of the upgrade.")],1),e._v(" "),a("p",[a("RouterLink",{attrs:{to:"/wings/1.0/upgrading.html"}},[e._v("Final Step: Upgrade Wings")])],1)])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/69.cbb453d1.js b/assets/js/69.cbb453d1.js deleted file mode 100644 index dc103281..00000000 --- a/assets/js/69.cbb453d1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{414:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"updating-the-panel"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#updating-the-panel"}},[e._v("#")]),e._v(" Updating the Panel")]),e._v(" "),a("p",[e._v("This documentation covers the process for updating within the "),a("code",[e._v("1.x")]),e._v(" series of releases. This means updating from\n— for example — "),a("code",[e._v("1.5.0")]),e._v(" to "),a("code",[e._v("1.6.0")]),e._v(". "),a("strong",[e._v("Do not use this guide for upgrading from "),a("code",[e._v("0.7")]),e._v(".")])]),e._v(" "),a("h2",{attrs:{id:"panel-version-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#panel-version-requirements"}},[e._v("#")]),e._v(" Panel Version Requirements")]),e._v(" "),a("p",[e._v("Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that\nis required for it to run. Please see the chart below for how these versions line up. In\nmost cases your base Wings version should match that of your Panel.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Panel Version")]),e._v(" "),a("th",[e._v("Wings Version")]),e._v(" "),a("th",[e._v("Supported")]),e._v(" "),a("th",[e._v("PHP Versions")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1.0.x")]),e._v(" "),a("td",[e._v("1.0.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.1.x")]),e._v(" "),a("td",[e._v("1.1.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.2.x")]),e._v(" "),a("td",[e._v("1.2.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.3.x")]),e._v(" "),a("td",[e._v("1.3.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.4.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.5.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.6.x")]),e._v(" "),a("td",[e._v("1.4.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.7.x")]),e._v(" "),a("td",[e._v("1.5.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0")])]),e._v(" "),a("tr",[a("td",[e._v("1.8.x")]),e._v(" "),a("td",[e._v("1.6.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0, 8.1")])]),e._v(" "),a("tr",[a("td",[e._v("1.9.x")]),e._v(" "),a("td",[e._v("1.6.x")]),e._v(" "),a("td"),e._v(" "),a("td",[e._v("7.4, 8.0, 8.1")])]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("1.10.x")])]),e._v(" "),a("td",[a("strong",[e._v("1.7.x")])]),e._v(" "),a("td",[e._v("✅")]),e._v(" "),a("td",[a("strong",[e._v("8.1")]),e._v(" (7.4 & 8.0 deprecated)")])])])]),e._v(" "),a("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(", "),a("code",[e._v("8.0")]),e._v(" or "),a("code",[e._v("8.1")]),e._v(" (recommended)")]),e._v(" "),a("li",[e._v("Composer "),a("code",[e._v("2.X")])])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Future PHP Version Changes")]),e._v(" "),a("p",[a("strong",[e._v("Support for PHP 7.4 and 8.0 is deprecated")]),e._v(". Please plan accordingly — PHP 8.1 will be the only\nsupported version in future releases.")])]),e._v(" "),a("p",[a("strong",[e._v("Before continuing")]),e._v(", please ensure that your system and web server configuration has been upgraded to at least PHP 7.4 by running "),a("code",[e._v("php -v")]),e._v(" and Composer 2 by running "),a("code",[e._v("composer --version")]),e._v(". You\nshould see an output similar to the result below. If you do not see at least PHP 7.4 and Composer 2, you will need to upgrade by following\nour "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("PHP Upgrade Guide")]),e._v(" and return to this documentation afterward.")],1),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("vagrant@pterodactyl:~/app$ php -v\nPHP 8.1.5 (cli) (built: Apr 21 2022 10:32:13) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.1.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies\n\nvagrant@pterodactyl:~/app$ composer --version\nComposer version 2.3.5 2022-04-13 16:43:00\n")])])]),a("h2",{attrs:{id:"self-upgrade"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#self-upgrade"}},[e._v("#")]),e._v(" Self Upgrade")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("The self-upgrade is currently in-operable due to issues with some dependencies we make use of.\nFor the time being please perform a manual upgrade until this issue can be resolved.")])]),e._v(" "),a("h2",{attrs:{id:"manual-upgrade"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manual-upgrade"}},[e._v("#")]),e._v(" Manual Upgrade")]),e._v(" "),a("p",[e._v("If you prefer not to perform the automatic self-upgrade, or need to reference any upgrade steps you can follow\nthe documentation below.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("If you've already performed the self-upgrade successfully you do not need to do anything else on this page.")])]),e._v(" "),a("h3",{attrs:{id:"enter-maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enter-maintenance-mode"}},[e._v("#")]),e._v(" Enter Maintenance Mode")]),e._v(" "),a("p",[e._v("Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent\nusers from encountering unexpected errors and ensure everything can be updated before users encounter\npotentially new features.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n\nphp artisan down\n")])])]),a("h3",{attrs:{id:"download-the-update"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-the-update"}},[e._v("#")]),e._v(" Download the Update")]),e._v(" "),a("p",[e._v("The first step in the update process is to download the new panel files from GitHub. The command below will download\nthe release archive for the most recent version of Pterodactyl, save it in the current directory and will automatically\nunpack the archive into your current folder.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzv\n")])])]),a("p",[e._v("Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid\nany webserver related errors.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache\n")])])]),a("h3",{attrs:{id:"update-dependencies-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies-2"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("p",[e._v("After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this,\nsimply run the commands below and follow any prompts.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("composer "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n")])])]),a("h3",{attrs:{id:"clear-compiled-template-cache"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#clear-compiled-template-cache"}},[e._v("#")]),e._v(" Clear Compiled Template Cache")]),e._v(" "),a("p",[e._v("You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for\nusers.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan view:clear\nphp artisan config:clear\n")])])]),a("h3",{attrs:{id:"database-updates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-updates"}},[e._v("#")]),e._v(" Database Updates")]),e._v(" "),a("p",[e._v("You'll also need to update your database schema for the newest version of Pterodactyl. Running the command below\nwill update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just\nremember, "),a("em",[e._v("never edit core eggs we ship")]),e._v("! They will be overwritten by this update process.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --seed --force\n")])])]),a("h3",{attrs:{id:"set-permissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),a("p",[e._v("The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this\nis "),a("code",[e._v("www-data")]),e._v(" but can vary from system to system — sometimes being "),a("code",[e._v("nginx")]),e._v(", "),a("code",[e._v("caddy")]),e._v(", "),a("code",[e._v("apache")]),e._v(", or even "),a("code",[e._v("nobody")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx /var/www/pterodactyl/*\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache /var/www/pterodactyl/*\n")])])]),a("h3",{attrs:{id:"restarting-queue-workers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restarting-queue-workers"}},[e._v("#")]),e._v(" Restarting Queue Workers")]),e._v(" "),a("p",[e._v("After "),a("em",[e._v("every")]),e._v(" update you should restart the queue worker to ensure that the new code is loaded in and used.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan queue:restart\n")])])]),a("h3",{attrs:{id:"exit-maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exit-maintenance-mode"}},[e._v("#")]),e._v(" Exit Maintenance Mode")]),e._v(" "),a("p",[e._v("Now that everything has been updated you need to exit maintenance mode so that the Panel can resume accepting\nconnections.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan up\n")])])]),a("p",[a("RouterLink",{attrs:{to:"/wings/1.0/upgrading.html"}},[e._v("Final Step: Upgrade Wings")])],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/77.8717480c.js b/assets/js/77.8717480c.js new file mode 100644 index 00000000..e8518f84 --- /dev/null +++ b/assets/js/77.8717480c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{425:function(t,s,a){"use strict";a.r(s);var e=a(48),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"upgrading-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-wings"}},[t._v("#")]),t._v(" Upgrading Wings")]),t._v(" "),a("p",[t._v("Upgrading Wings is a painless process and should take less than a minute to complete.")]),t._v(" "),a("h2",{attrs:{id:"wings-version-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#wings-version-requirements"}},[t._v("#")]),t._v(" Wings Version Requirements")]),t._v(" "),a("p",[t._v("Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that\nis required for it to run. Please see the chart below for how these versions line up. In\nmost cases your base Wings version should match that of your Panel.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Panel Version")]),t._v(" "),a("th",[t._v("Wings Version")]),t._v(" "),a("th",[t._v("Supported")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1.0.x")]),t._v(" "),a("td",[t._v("1.0.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.1.x")]),t._v(" "),a("td",[t._v("1.1.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.2.x")]),t._v(" "),a("td",[t._v("1.2.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.3.x")]),t._v(" "),a("td",[t._v("1.3.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.4.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.5.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.6.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.7.x")]),t._v(" "),a("td",[t._v("1.5.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.8.x")]),t._v(" "),a("td",[t._v("1.6.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.9.x")]),t._v(" "),a("td",[t._v("1.6.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("strong",[t._v("1.10.x")])]),t._v(" "),a("td",[a("strong",[t._v("1.7.x")])]),t._v(" "),a("td",[t._v("✅")])]),t._v(" "),a("tr",[a("td",[a("strong",[t._v("1.11.x")])]),t._v(" "),a("td",[a("strong",[t._v("1.11.x")])]),t._v(" "),a("td",[t._v("✅")])])])]),t._v(" "),a("p",[a("em",[t._v("NOTE: There are no 1.8.x, 1.9.x, or 1.10.x releases of Wings.")])]),t._v(" "),a("h2",{attrs:{id:"download-updated-binary"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-updated-binary"}},[t._v("#")]),t._v(" Download Updated Binary")]),t._v(" "),a("p",[t._v("First, download the updated wings binary into "),a("code",[t._v("/usr/local/bin")]),t._v(". You will need to stop Wings briefly. "),a("em",[t._v("Your running\nservers "),a("strong",[t._v("will not")]),t._v(" be affected.")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("systemctl stop wings\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -L -o /usr/local/bin/wings "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("uname")]),t._v(" -m"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"amd64"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"arm64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"\n'),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" u+x /usr/local/bin/wings\n")])])]),a("h2",{attrs:{id:"restart-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restart-process"}},[t._v("#")]),t._v(" Restart Process")]),t._v(" "),a("p",[t._v("Finally, restart the wings process. Your running servers will not be affected and any open\nconnections to the instance will re-connect automatically.")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("systemctl restart wings\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/77.fe567edd.js b/assets/js/77.fe567edd.js deleted file mode 100644 index e3aeb590..00000000 --- a/assets/js/77.fe567edd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{425:function(t,s,a){"use strict";a.r(s);var e=a(48),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"upgrading-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-wings"}},[t._v("#")]),t._v(" Upgrading Wings")]),t._v(" "),a("p",[t._v("Upgrading Wings is a painless process and should take less than a minute to complete.")]),t._v(" "),a("h2",{attrs:{id:"wings-version-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#wings-version-requirements"}},[t._v("#")]),t._v(" Wings Version Requirements")]),t._v(" "),a("p",[t._v("Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that\nis required for it to run. Please see the chart below for how these versions line up. In\nmost cases your base Wings version should match that of your Panel.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Panel Version")]),t._v(" "),a("th",[t._v("Wings Version")]),t._v(" "),a("th",[t._v("Supported")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("1.0.x")]),t._v(" "),a("td",[t._v("1.0.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.1.x")]),t._v(" "),a("td",[t._v("1.1.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.2.x")]),t._v(" "),a("td",[t._v("1.2.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.3.x")]),t._v(" "),a("td",[t._v("1.3.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.4.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.5.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.6.x")]),t._v(" "),a("td",[t._v("1.4.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.7.x")]),t._v(" "),a("td",[t._v("1.5.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.8.x")]),t._v(" "),a("td",[t._v("1.6.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("1.9.x")]),t._v(" "),a("td",[t._v("1.6.x")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("strong",[t._v("1.10.x")])]),t._v(" "),a("td",[a("strong",[t._v("1.7.x")])]),t._v(" "),a("td",[t._v("✅")])])])]),t._v(" "),a("h2",{attrs:{id:"download-updated-binary"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-updated-binary"}},[t._v("#")]),t._v(" Download Updated Binary")]),t._v(" "),a("p",[t._v("First, download the updated wings binary into "),a("code",[t._v("/usr/local/bin")]),t._v(". You will need to stop Wings briefly. "),a("em",[t._v("Your running\nservers "),a("strong",[t._v("will not")]),t._v(" be affected.")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("systemctl stop wings\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -L -o /usr/local/bin/wings "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("uname")]),t._v(" -m"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"amd64"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"arm64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v('"\n'),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" u+x /usr/local/bin/wings\n")])])]),a("h2",{attrs:{id:"restart-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restart-process"}},[t._v("#")]),t._v(" Restart Process")]),t._v(" "),a("p",[t._v("Finally, restart the wings process. Your running servers will not be affected and any open\nconnections to the instance will re-connect automatically.")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("systemctl restart wings\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/app.bb267f12.js b/assets/js/app.ad427fbe.js similarity index 72% rename from assets/js/app.bb267f12.js rename to assets/js/app.ad427fbe.js index f8459080..1f8ca4c6 100644 --- a/assets/js/app.bb267f12.js +++ b/assets/js/app.ad427fbe.js @@ -1,11 +1,11 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,u=e[0],s=e[1],l=e[2],f=0,p=[];f=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return o(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||c(t)&&t.toString===l?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function _(t,e){return b.call(t,e)}function w(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var x=/-(\w)/g,S=w((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),C=w((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),O=/\B([A-Z])/g,k=w((function(t){return t.replace(O,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function P(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function j(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,J=K&&K.indexOf("edge/")>0,Y=(K&&K.indexOf("android"),K&&/iphone|ipad|ipod|ios/.test(K)||"ios"===G),Z=(K&&/chrome\/\d+/.test(K),K&&/phantomjs/.test(K),K&&K.match(/firefox\/(\d+)/)),tt={}.watch,et=!1;if(H)try{var nt={};Object.defineProperty(nt,"passive",{get:function(){et=!0}}),window.addEventListener("test-passive",null,nt)}catch(t){}var rt=function(){return void 0===q&&(q=!H&&!W&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),q},it=H&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ot(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,ut="undefined"!=typeof Symbol&&ot(Symbol)&&"undefined"!=typeof Reflect&&ot(Reflect.ownKeys);at="undefined"!=typeof Set&&ot(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var st=$,lt=0,ct=function(){this.id=lt++,this.subs=[]};ct.prototype.addSub=function(t){this.subs.push(t)},ct.prototype.removeSub=function(t){y(this.subs,t)},ct.prototype.depend=function(){ct.target&&ct.target.addDep(this)},ct.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(o&&!_(i,"default"))a=!1;else if(""===a||a===k(t)){var s=Bt(String,i.type);(s<0||u0&&(ce((s=t(s,(n||"")+"_"+r))[0])&&ce(c)&&(f[l]=mt(c.text+s[0].text),s.shift()),f.push.apply(f,s)):u(s)?ce(c)?f[l]=mt(c.text+s):""!==s&&f.push(mt(s)):ce(s)&&ce(c)?f[l]=mt(c.text+s.text):(a(e._isVList)&&o(s.tag)&&i(s.key)&&o(n)&&(s.key="__vlist"+n+"_"+r+"__"),f.push(s)));return f}(t):void 0}function ce(t){return o(t)&&o(t.text)&&!1===t.isComment}function fe(t,e){if(t){for(var n=Object.create(null),r=ut?Reflect.ownKeys(t):Object.keys(t),i=0;i0,a=t?!!t.$stable:!o,u=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&u===n.$key&&!o&&!n.$hasNormal)return n;for(var s in i={},t)t[s]&&"$"!==s[0]&&(i[s]=ve(e,s,t[s]))}else i={};for(var l in e)l in i||(i[l]=ge(e,l));return t&&Object.isExtensible(t)&&(t._normalized=i),B(i,"$stable",a),B(i,"$key",u),B(i,"$hasNormal",o),i}function ve(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({});return(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:le(t))&&(0===t.length||1===t.length&&t[0].isComment)?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function ge(t,e){return function(){return t[e]}}function me(t,e){var n,r,i,a,u;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,i=t.length;rdocument.createEvent("Event").timeStamp&&(sn=function(){return ln.now()})}function cn(){var t,e;for(un=sn(),on=!0,tn.sort((function(t,e){return t.id-e.id})),an=0;anan&&tn[n].id>t.id;)n--;tn.splice(n+1,0,t)}else tn.push(t);rn||(rn=!0,ee(cn))}}(this)},pn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||s(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){zt(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},pn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},pn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},pn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var dn={enumerable:!0,configurable:!0,get:$,set:$};function hn(t,e,n){dn.get=function(){return this[e][n]},dn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,dn)}function vn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},i=t.$options._propKeys=[];t.$parent&&St(!1);var o=function(o){i.push(o);var a=Nt(o,e,n,t);kt(r,o,a),o in t||hn(t,"_props",o)};for(var a in e)o(a);St(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?$:E(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;c(e=t._data="function"==typeof e?function(t,e){pt();try{return t.call(e,e)}catch(t){return zt(t,e,"data()"),{}}finally{dt()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,i=(t.$options.methods,n.length);for(;i--;){var o=n[i];0,r&&_(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&hn(t,"_data",o))}var a;Ot(e,!0)}(t):Ot(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=rt();for(var i in e){var o=e[i],a="function"==typeof o?o:o.get;0,r||(n[i]=new pn(t,a||$,$,gn)),i in t||mn(t,i,o)}}(t,e.computed),e.watch&&e.watch!==tt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function En(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var u=On(a.componentOptions);u&&!e(u)&&Pn(n,o,r,i)}}}function Pn(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,y(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=wn++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Dt(xn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ke(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,i=n&&n.context;t.$slots=pe(e._renderChildren,i),t.$scopedSlots=r,t._c=function(e,n,r,i){return Ue(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Ue(t,e,n,r,i,!0)};var o=n&&n.data;kt(t,"$attrs",o&&o.attrs||r,null,!0),kt(t,"$listeners",e._parentListeners||r,null,!0)}(e),Ze(e,"beforeCreate"),function(t){var e=fe(t.$options.inject,t);e&&(St(!1),Object.keys(e).forEach((function(n){kt(t,n,e[n])})),St(!0))}(e),vn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),Ze(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(Sn),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Et,t.prototype.$delete=Pt,t.prototype.$watch=function(t,e,n){if(c(e))return _n(this,t,e,n);(n=n||{}).user=!0;var r=new pn(this,t,e,n);if(n.immediate)try{e.call(this,r.value)}catch(t){zt(t,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(Sn),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var i=0,o=t.length;i1?P(n):n;for(var r=P(arguments,1),i='event handler for "'+t+'"',o=0,a=n.length;oparseInt(this.max)&&Pn(a,u[0],u,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return U}};Object.defineProperty(t,"config",e),t.util={warn:st,extend:j,mergeOptions:Dt,defineReactive:kt},t.set=Et,t.delete=Pt,t.nextTick=ee,t.observable=function(t){return Ot(t),t},t.options=Object.create(null),M.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,j(t.options.components,An),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=P(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Dt(this.options,t),this}}(t),Cn(t),function(t){M.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&c(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Sn),Object.defineProperty(Sn.prototype,"$isServer",{get:rt}),Object.defineProperty(Sn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Sn,"FunctionalRenderContext",{value:Te}),Sn.version="2.6.11";var $n=g("style,class"),Tn=g("input,textarea,option,select,progress"),Ln=g("contenteditable,draggable,spellcheck"),Rn=g("events,caret,typing,plaintext-only"),In=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Dn="http://www.w3.org/1999/xlink",Mn=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Nn=function(t){return Mn(t)?t.slice(6,t.length):""},Un=function(t){return null==t||!1===t};function Fn(t){for(var e=t.data,n=t,r=t;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Bn(r.data,e));for(;o(n=n.parent);)n&&n.data&&(e=Bn(e,n.data));return function(t,e){if(o(t)||o(e))return zn(t,qn(e));return""}(e.staticClass,e.class)}function Bn(t,e){return{staticClass:zn(t.staticClass,e.staticClass),class:o(t.class)?[t.class,e.class]:e.class}}function zn(t,e){return t?e?t+" "+e:t:e||""}function qn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,i=t.length;r-1?pr(t,e,n):In(e)?Un(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Ln(e)?t.setAttribute(e,function(t,e){return Un(e)||"false"===e?"false":"contenteditable"===t&&Rn(e)?e:"true"}(e,n)):Mn(e)?Un(n)?t.removeAttributeNS(Dn,Nn(e)):t.setAttributeNS(Dn,e,n):pr(t,e,n)}function pr(t,e,n){if(Un(n))t.removeAttribute(e);else{if(X&&!Q&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var dr={create:cr,update:cr};function hr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var u=Fn(e),s=n._transitionClasses;o(s)&&(u=zn(u,qn(s))),u!==n._prevClass&&(n.setAttribute("class",u),n._prevClass=u)}}var vr,gr={create:hr,update:hr};function mr(t,e,n){var r=vr;return function i(){var o=e.apply(null,arguments);null!==o&&_r(t,i,n,r)}}var yr=Gt&&!(Z&&Number(Z[1])<=53);function br(t,e,n,r){if(yr){var i=un,o=e;e=o._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=i||t.timeStamp<=0||t.target.ownerDocument!==document)return o.apply(this,arguments)}}vr.addEventListener(t,e,et?{capture:n,passive:r}:n)}function _r(t,e,n,r){(r||vr).removeEventListener(t,e._wrapper||e,n)}function wr(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};vr=e.elm,function(t){if(o(t.__r)){var e=X?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}o(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),ae(n,r,br,_r,mr,e.context),vr=void 0}}var xr,Sr={create:wr,update:wr};function Cr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,a=e.elm,u=t.data.domProps||{},s=e.data.domProps||{};for(n in o(s.__ob__)&&(s=e.data.domProps=j({},s)),u)n in s||(a[n]="");for(n in s){if(r=s[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===u[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var l=i(r)?"":String(r);Or(a,l)&&(a.value=l)}else if("innerHTML"===n&&Wn(a.tagName)&&i(a.innerHTML)){(xr=xr||document.createElement("div")).innerHTML=""+r+"";for(var c=xr.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;c.firstChild;)a.appendChild(c.firstChild)}else if(r!==u[n])try{a[n]=r}catch(t){}}}}function Or(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(o(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var kr={create:Cr,update:Cr},Er=w((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Pr(t){var e=jr(t.style);return t.staticStyle?j(t.staticStyle,e):e}function jr(t){return Array.isArray(t)?A(t):"string"==typeof t?Er(t):t}var Ar,$r=/^--/,Tr=/\s*!important$/,Lr=function(t,e,n){if($r.test(e))t.style.setProperty(e,n);else if(Tr.test(n))t.style.setProperty(k(e),n.replace(Tr,""),"important");else{var r=Ir(e);if(Array.isArray(n))for(var i=0,o=n.length;i-1?e.split(Nr).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Fr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Nr).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function Br(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&j(e,zr(t.name||"v")),j(e,t),e}return"string"==typeof t?zr(t):void 0}}var zr=w((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),qr=H&&!Q,Vr="transition",Hr="transitionend",Wr="animation",Gr="animationend";qr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Vr="WebkitTransition",Hr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Wr="WebkitAnimation",Gr="webkitAnimationEnd"));var Kr=H?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Xr(t){Kr((function(){Kr(t)}))}function Qr(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Ur(t,e))}function Jr(t,e){t._transitionClasses&&y(t._transitionClasses,e),Fr(t,e)}function Yr(t,e,n){var r=ti(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var u="transition"===i?Hr:Gr,s=0,l=function(){t.removeEventListener(u,c),n()},c=function(e){e.target===t&&++s>=a&&l()};setTimeout((function(){s0&&(n="transition",c=a,f=o.length):"animation"===e?l>0&&(n="animation",c=l,f=s.length):f=(n=(c=Math.max(a,l))>0?a>l?"transition":"animation":null)?"transition"===n?o.length:s.length:0,{type:n,timeout:c,propCount:f,hasTransform:"transition"===n&&Zr.test(r[Vr+"Property"])}}function ei(t,e){for(;t.length1}function ui(t,e){!0!==e.data.show&&ri(e)}var si=function(t){var e,n,r={},s=t.modules,l=t.nodeOps;for(e=0;eh?b(t,i(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&w(e,p,h)}(p,g,m,n,c):o(m)?(o(t.text)&&l.setTextContent(p,""),b(p,null,m,0,m.length-1,n)):o(g)?w(g,0,g.length-1):o(t.text)&&l.setTextContent(p,""):t.text!==e.text&&l.setTextContent(p,e.text),o(h)&&o(d=h.hook)&&o(d=d.postpatch)&&d(t,e)}}}function O(t,e,n){if(a(n)&&o(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==o&&(a.selected=o);else if(R(di(a),r))return void(t.selectedIndex!==u&&(t.selectedIndex=u));i||(t.selectedIndex=-1)}}function pi(t,e){return e.every((function(e){return!R(e,t)}))}function di(t){return"_value"in t?t._value:t.value}function hi(t){t.target.composing=!0}function vi(t){t.target.composing&&(t.target.composing=!1,gi(t.target,"input"))}function gi(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function mi(t){return!t.componentInstance||t.data&&t.data.transition?t:mi(t.componentInstance._vnode)}var yi={model:li,show:{bind:function(t,e,n){var r=e.value,i=(n=mi(n)).data&&n.data.transition,o=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&i?(n.data.show=!0,ri(n,(function(){t.style.display=o}))):t.style.display=r?o:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=mi(n)).data&&n.data.transition?(n.data.show=!0,r?ri(n,(function(){t.style.display=t.__vOriginalDisplay})):ii(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,i){i||(t.style.display=t.__vOriginalDisplay)}}},bi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function _i(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?_i(Ve(e.children)):t}function wi(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[S(o)]=i[o];return e}function xi(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Si=function(t){return t.tag||qe(t)},Ci=function(t){return"show"===t.name},Oi={name:"transition",props:bi,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Si)).length){0;var r=this.mode;0;var i=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return i;var o=_i(i);if(!o)return i;if(this._leaving)return xi(t,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:u(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var s=(o.data||(o.data={})).transition=wi(this),l=this._vnode,c=_i(l);if(o.data.directives&&o.data.directives.some(Ci)&&(o.data.show=!0),c&&c.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(o,c)&&!qe(c)&&(!c.componentInstance||!c.componentInstance._vnode.isComment)){var f=c.data.transition=j({},s);if("out-in"===r)return this._leaving=!0,ue(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),xi(t,i);if("in-out"===r){if(qe(o))return l;var p,d=function(){p()};ue(s,"afterEnter",d),ue(s,"enterCancelled",d),ue(f,"delayLeave",(function(t){p=t}))}}return i}}},ki=j({tag:String,moveClass:String},bi);function Ei(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function Pi(t){t.data.newPos=t.elm.getBoundingClientRect()}function ji(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete ki.mode;var Ai={Transition:Oi,TransitionGroup:{props:ki,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var i=Qe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,i(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=wi(this),u=0;u-1?Kn[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Kn[t]=/HTMLUnknownElement/.test(e.toString())},j(Sn.options.directives,yi),j(Sn.options.components,Ai),Sn.prototype.__patch__=H?si:$,Sn.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=gt),Ze(t,"beforeMount"),r=function(){t._update(t._render(),n)},new pn(t,r,$,{before:function(){t._isMounted&&!t._isDestroyed&&Ze(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,Ze(t,"mounted")),t}(this,t=t&&H?function(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}(t):void 0,e)},H&&setTimeout((function(){U.devtools&&it&&it.emit("init",Sn)}),0),e.a=Sn},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(4),i=n(77),o=n(9),a=n(55),u=n(80),s=n(115),l=i("wks"),c=r.Symbol,f=s?c:c&&c.withoutSetter||a;t.exports=function(t){return o(l,t)||(u&&o(c,t)?l[t]=c[t]:l[t]=f("Symbol."+t)),l[t]}},function(t,e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof global&&global)||Function("return this")()},function(t,e,n){var r=n(2);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(6);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){var r=n(5),i=n(114),o=n(7),a=n(53),u=Object.defineProperty;e.f=r?u:function(t,e,n){if(o(t),e=a(e,!0),o(n),i)try{return u(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(38),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e,n){var r=n(4),i=n(15),o=n(9),a=n(78),u=n(83),s=n(27),l=s.get,c=s.enforce,f=String(String).split("String");(t.exports=function(t,e,n,u){var s=!!u&&!!u.unsafe,l=!!u&&!!u.enumerable,p=!!u&&!!u.noTargetGet;"function"==typeof n&&("string"!=typeof e||o(n,"name")||i(n,"name",e),c(n).source=f.join("string"==typeof e?e:"")),t!==r?(s?!p&&t[e]&&(l=!0):delete t[e],l?t[e]=n:i(t,e,n)):l?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||u(this)}))},function(t,e,n){var r=n(35),i=n(25);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(25);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(87),i=n(11),o=n(196);r||i(Object.prototype,"toString",o,{unsafe:!0})},function(t,e,n){var r=n(5),i=n(8),o=n(36);t.exports=r?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(152),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e){var n=Array.isArray;t.exports=n},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(5),i=n(2),o=n(9),a=Object.defineProperty,u={},s=function(t){throw t};t.exports=function(t,e){if(o(u,t))return u[t];e||(e={});var n=[][t],l=!!o(e,"ACCESSORS")&&e.ACCESSORS,c=o(e,0)?e[0]:s,f=o(e,1)?e[1]:void 0;return u[t]=!!n&&!i((function(){if(l&&!r)return!0;var t={length:-1};l?a(t,1,{enumerable:!0,get:s}):t[1]=1,n.call(t,c,f)}))}},function(t,e,n){var r=n(120),i=n(4),o=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?o(r[t])||o(i[t]):r[t]&&r[t][e]||i[t]&&i[t][e]}},function(t,e,n){var r=n(5),i=n(57),o=n(36),a=n(12),u=n(53),s=n(9),l=n(114),c=Object.getOwnPropertyDescriptor;e.f=r?c:function(t,e){if(t=a(t),e=u(e,!0),l)try{return c(t,e)}catch(t){}if(s(t,e))return o(!i.f.call(t,e),t[e])}},function(t,e){t.exports=!1},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e,n){var r=n(223),i=n(226);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),i=n(33).filter,o=n(59),a=n(19),u=o("filter"),s=a("filter");r({target:"Array",proto:!0,forced:!u||!s},{filter:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r,i,o,a=n(184),u=n(4),s=n(6),l=n(15),c=n(9),f=n(56),p=n(39),d=u.WeakMap;if(a){var h=new d,v=h.get,g=h.has,m=h.set;r=function(t,e){return m.call(h,t,e),e},i=function(t){return v.call(h,t)||{}},o=function(t){return g.call(h,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return l(t,y,e),e},i=function(t){return c(t,y)?t[y]:{}},o=function(t){return c(t,y)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!s(e)||(n=i(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(18);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){"use strict";var r=n(139).charAt,i=n(27),o=n(121),a=i.set,u=i.getterFor("String Iterator");o(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,i=e.index;return i>=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));n(73);var r=n(47);n(44),n(61),n(92),n(150),n(34),n(14),n(29),n(42);var i=n(69);function o(t){return function(t){if(Array.isArray(t))return Object(r.a)(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||Object(i.a)(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(t,e,n){var r,i=n(7),o=n(116),a=n(82),u=n(39),s=n(119),l=n(79),c=n(56),f=c("IE_PROTO"),p=function(){},d=function(t){return" + diff --git a/community/config/eggs/creating_a_custom_egg.html b/community/config/eggs/creating_a_custom_egg.html index aebb7da7..fc99d6b6 100644 --- a/community/config/eggs/creating_a_custom_egg.html +++ b/community/config/eggs/creating_a_custom_egg.html @@ -15,7 +15,7 @@ - + @@ -117,6 +117,6 @@ regex as any letters or numbers (\w\d) including underscore (Debian 11
- + diff --git a/community/config/eggs/creating_a_custom_image.html b/community/config/eggs/creating_a_custom_image.html index aacecbe6..8f8ab3d2 100644 --- a/community/config/eggs/creating_a_custom_image.html +++ b/community/config/eggs/creating_a_custom_image.html @@ -15,7 +15,7 @@ - + @@ -102,6 +102,6 @@ curly braces {{EXAMPLE}} with a matching environment variable (such ← Creating a Custom Egg
- + diff --git a/community/config/nodes/add_node.html b/community/config/nodes/add_node.html index 734d6136..93edc1b0 100644 --- a/community/config/nodes/add_node.html +++ b/community/config/nodes/add_node.html @@ -15,7 +15,7 @@ - + @@ -50,6 +50,6 @@ for more information, or try one of the community guides for Minecraft
- + diff --git a/community/customization/panel.html b/community/customization/panel.html index 7f4ea5b6..37b4609d 100644 --- a/community/customization/panel.html +++ b/community/customization/panel.html @@ -15,7 +15,7 @@ - + @@ -56,6 +56,6 @@ This also applies to style sheets. The following sections explain how to do so.< ← Artisan CLI
- + diff --git a/community/customization/wings.html b/community/customization/wings.html index 19ccbad0..b9774207 100644 --- a/community/customization/wings.html +++ b/community/customization/wings.html @@ -15,7 +15,7 @@ - + @@ -49,6 +49,6 @@ systemctl start wings
- + diff --git a/community/games/minecraft.html b/community/games/minecraft.html index cac291d7..58b4a4ae 100644 --- a/community/games/minecraft.html +++ b/community/games/minecraft.html @@ -15,7 +15,7 @@ - + @@ -43,6 +43,6 @@ ← Creating a Custom Docker Image
- + diff --git a/community/installation-guides/panel/centos7.html b/community/installation-guides/panel/centos7.html index 71e9c16b..83ecb931 100644 --- a/community/installation-guides/panel/centos7.html +++ b/community/installation-guides/panel/centos7.html @@ -15,7 +15,7 @@ - + @@ -172,6 +172,6 @@ server { ← Community Guides and Tutorials
- + diff --git a/community/installation-guides/panel/centos8.html b/community/installation-guides/panel/centos8.html index f2d0201b..8d26d71f 100644 --- a/community/installation-guides/panel/centos8.html +++ b/community/installation-guides/panel/centos8.html @@ -15,7 +15,7 @@ - + @@ -154,6 +154,6 @@ server { ← CentOS 7
- + diff --git a/community/installation-guides/panel/debian10.html b/community/installation-guides/panel/debian10.html index ad7ee29d..1e4abd43 100644 --- a/community/installation-guides/panel/debian10.html +++ b/community/installation-guides/panel/debian10.html @@ -15,7 +15,7 @@ - + @@ -139,6 +139,6 @@ server { ← CentOS 8, Rocky Linux 8, AlmaLinux 8
- + diff --git a/community/installation-guides/panel/debian11.html b/community/installation-guides/panel/debian11.html index 518d53c1..d35696c3 100644 --- a/community/installation-guides/panel/debian11.html +++ b/community/installation-guides/panel/debian11.html @@ -15,7 +15,7 @@ - + @@ -71,6 +71,6 @@ need composer installed before continuing in this process.

Debian 10
- + diff --git a/community/installation-guides/panel/ubuntu1804.html b/community/installation-guides/panel/ubuntu1804.html index 35417da9..2806ebc8 100644 --- a/community/installation-guides/panel/ubuntu1804.html +++ b/community/installation-guides/panel/ubuntu1804.html @@ -15,7 +15,7 @@ - + @@ -130,6 +130,6 @@ server { }

# Redis Setup

The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into running another Redis instance (opens new window).

# Installing the Panel

Excellent, we now have all of the required dependencies installed and configured. From here, follow the official Panel installation documentation.

- + diff --git a/community/installation-guides/panel/ubuntu2004.html b/community/installation-guides/panel/ubuntu2004.html index fe4b0328..053aa9e8 100644 --- a/community/installation-guides/panel/ubuntu2004.html +++ b/community/installation-guides/panel/ubuntu2004.html @@ -15,7 +15,7 @@ - + @@ -64,6 +64,6 @@ commands below.

# Nginx Configuration 

Follow this guide to setup Nginx for Pterodactyl, choose whether to use Nginx with or without SSL.

# Redis Setup

The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into running another Redis instance (opens new window).

# Installing the Panel

Excellent, we now have all of the required dependencies installed and configured. From here, follow the official Panel installation documentation.

- + diff --git a/community/installation-guides/wings/centos7.html b/community/installation-guides/wings/centos7.html index faedc7f2..5ae28f17 100644 --- a/community/installation-guides/wings/centos7.html +++ b/community/installation-guides/wings/centos7.html @@ -15,7 +15,7 @@ - + @@ -58,6 +58,6 @@ firewall-cmd --reload ← Debian 11
- + diff --git a/community/installation-guides/wings/centos8.html b/community/installation-guides/wings/centos8.html index 2dd3b5dc..58fc5d6b 100644 --- a/community/installation-guides/wings/centos8.html +++ b/community/installation-guides/wings/centos8.html @@ -15,7 +15,7 @@ - + @@ -58,6 +58,6 @@ firewall-cmd --reload ← CentOS 7
- + diff --git a/community/installation-guides/wings/debian10.html b/community/installation-guides/wings/debian10.html index 24e9a3b9..f6878011 100644 --- a/community/installation-guides/wings/debian10.html +++ b/community/installation-guides/wings/debian10.html @@ -15,7 +15,7 @@ - + @@ -57,6 +57,6 @@ systemctl start docker ← CentOS 8, Rocky Linux 8, AlmaLinux 8
- + diff --git a/community/installation-guides/wings/debian11.html b/community/installation-guides/wings/debian11.html index 632a676d..c97c5e50 100644 --- a/community/installation-guides/wings/debian11.html +++ b/community/installation-guides/wings/debian11.html @@ -15,7 +15,7 @@ - + @@ -41,6 +41,6 @@ ← Debian 10
- + diff --git a/community/installation-guides/wings/ubuntu1804.html b/community/installation-guides/wings/ubuntu1804.html index f54fa076..70b7dba0 100644 --- a/community/installation-guides/wings/ubuntu1804.html +++ b/community/installation-guides/wings/ubuntu1804.html @@ -15,7 +15,7 @@ - + @@ -44,6 +44,6 @@ systemctl enable docker systemctl start docker

# Installing Wings

Great, now all of the dependencies and firewall rules have been dealt with. From here follow the official Wings installation documentation.

- + diff --git a/community/installation-guides/wings/ubuntu2004.html b/community/installation-guides/wings/ubuntu2004.html index 5107c6e7..54705b89 100644 --- a/community/installation-guides/wings/ubuntu2004.html +++ b/community/installation-guides/wings/ubuntu2004.html @@ -15,7 +15,7 @@ - + @@ -44,6 +44,6 @@ systemctl enable docker systemctl start docker

# Installing Wings

Great, now all of the dependencies and firewall rules have been dealt with. From here follow the official Wings installation documentation.

- + diff --git a/community/tutorials/artisan.html b/community/tutorials/artisan.html index 8b3296f8..9d66e0c2 100644 --- a/community/tutorials/artisan.html +++ b/community/tutorials/artisan.html @@ -15,7 +15,7 @@ - + @@ -64,6 +64,6 @@ ← Creating a New Node
- + diff --git a/daemon/0.6/configuration.html b/daemon/0.6/configuration.html index 888970a9..b13d072d 100644 --- a/daemon/0.6/configuration.html +++ b/daemon/0.6/configuration.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Additional Configuration

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

WARNING

These are advanced configurations for the daemon. You risk breaking your daemon and making containers un-usable if @@ -99,6 +99,6 @@ a private instance and are willing to decrease some of the security measures.

, ]

# Enabling Cloudflare

Enabling Cloudflare on the daemon isn't particularly useful since users do not connect directly to the daemon port, and users need an unproxied hostname to access any servers on the node. As a result it's not possible to conceal the IP address of your node machine, but some people want to enable it regardless.

Cloudflare only proxies the default daemon port (8080) when using HTTP. In order to get the daemon to work with Cloudflare when HTTPS is enabled you must change the daemon port to one that Cloudflare will proxy such as 8443. Since Cloudflare only proxies HTTP/HTTPS traffic for non-enterprise plans you cannot proxy the SFTP port.

- + diff --git a/daemon/0.6/debian_8_docker.html b/daemon/0.6/debian_8_docker.html index 3233455e..9b07f4a7 100644 --- a/daemon/0.6/debian_8_docker.html +++ b/daemon/0.6/debian_8_docker.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Docker on Debian 8

WARNING

There is a potential for broken software after this upgrade as we are moving to a non-stable kernel (in regards to mainline Debian). Please take backups and only proceed if you are comfortable with this process.

# Install Docker

To begin with, we're going to install docker just like we would for any other OS by following Docker's official documentation for Debian (opens new window).

Once you've done that, if you run docker info you'll notice some missing features at the bottom, something @@ -71,6 +71,6 @@ supported on this kernel currently. Run the command below to do so.

Finally, update systemd and start docker using the following commands.

systemctl daemon-reload
 service docker start
 

Docker should now be running and reporting no errors if you run docker info!

- + diff --git a/daemon/0.6/installing.html b/daemon/0.6/installing.html index ecd988a2..d6819f57 100644 --- a/daemon/0.6/installing.html +++ b/daemon/0.6/installing.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Installation

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

WARNING

This specific software is for Pterodactyl v0.7 and must not be used for Pterodactyl v1.0. If you have installed 1.0 you should use Wings instead.

# Supported Systems

Operating System Version Supported Notes
Ubuntu 18.04 Documentation written assuming Ubuntu 18.04 as the base OS.
20.04
CentOS 7 ⚠️ Extra repos are required
8
Debian 9
10

# System Requirements

In order to run the Daemon you will need a system capable of running Docker containers. Most VPS and almost all @@ -106,6 +106,6 @@ StartLimitInterval=600 WantedBy=multi-user.target

Then, run the commands below to reload systemd and start the daemon.

systemctl enable --now wings
 
- + diff --git a/daemon/0.6/kernel_modifications.html b/daemon/0.6/kernel_modifications.html index fccce531..c44e1568 100644 --- a/daemon/0.6/kernel_modifications.html +++ b/daemon/0.6/kernel_modifications.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Kernel Modifications

TIP

In most cases, only users with a server provided by OVH will need to make any modifications to their kernel.

# Update Kernel

Install the new kernels using apt-get. In this case we are installing the latest version of the kernel, but feel free to browse using apt-cache search linux-image-extra to find all possible image versions you can install. You'll want to install the latest.

apt-get install linux-image-generic linux-image-extra-virtual
@@ -71,6 +71,6 @@ command and also the version of the kernel that we installed above. Once you've
 update grub and reboot, and you should be set.

sudo update-grub
 sudo reboot
 

# Boot from hard disk

It's possible that even after you modified the GRUB configuration the server's still booted into a OVH kernel. If this happens to you, go to the OVH control panel and check the server's booting settings and make sure it's booting from hard disk instead of network boot.

- + diff --git a/daemon/0.6/standalone_sftp.html b/daemon/0.6/standalone_sftp.html index 04853d0b..877c7b6e 100644 --- a/daemon/0.6/standalone_sftp.html +++ b/daemon/0.6/standalone_sftp.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Standalone SFTP Server

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

WARNING

Standalone SFTP support was introduced in Panel@v0.7.11 and Daemon@v0.6.8 and will not work with prior versions.

Pterodactyl now ships with the option to use a standalone SFTP server (opens new window) @@ -86,6 +86,6 @@ WantedBy=multi-user.target

Then, run the command below to enable it in systemd and start the SFTP server.

systemctl enable --now pterosftp
 

# Customizing Startup

If you're trying to pass additional arguments to the server when starting it using SystemD you'll want to modify the ExecStart line. Something like ExecStart=/srv/daemon/sftp-server --port 2022 for example.

- + diff --git a/daemon/0.6/upgrade/0.4_to_0.5.html b/daemon/0.6/upgrade/0.4_to_0.5.html index b1c7536f..ce2550d3 100644 --- a/daemon/0.6/upgrade/0.4_to_0.5.html +++ b/daemon/0.6/upgrade/0.4_to_0.5.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.4.X to 0.5.X

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

DANGER

This upgrade process will require that all servers running through the Daemon be offline for a short period @@ -77,6 +77,6 @@ well as push the latest information to their configurations. Once this is done, and then boot it. If you have all daemons running and wish to update them all at once, remove the --node flag.

Boot the Daemon one last time in the foreground, make sure it completes without errors, and then you can stop it and restart it using your service: sudo systemctl start wings.

Thanks!

You're all finished! Thanks for bearing with us, this update addresses a lot of flaws in the previous implementations of the software, and also prepares your data for the eventual migration to our new daemon — which is still in the works.

- + diff --git a/daemon/0.6/upgrade/0.5.html b/daemon/0.6/upgrade/0.5.html index c844a887..2d4e3918 100644 --- a/daemon/0.6/upgrade/0.5.html +++ b/daemon/0.6/upgrade/0.5.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.5 Series

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

TIP

Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection @@ -54,6 +54,6 @@ that, run the command below to pull down the latest files and unpack them in the components and then restart the daemon.

npm update --only=production
 systemctl restart wings
 
- + diff --git a/daemon/0.6/upgrade/0.5_to_0.6.html b/daemon/0.6/upgrade/0.5_to_0.6.html index 547e0804..af85cf6d 100644 --- a/daemon/0.6/upgrade/0.5_to_0.6.html +++ b/daemon/0.6/upgrade/0.5_to_0.6.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.5.X to 0.6.X

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

Server Restart Required

Your servers will need to be restarted after upgrading the daemon in order to see the expected log output in the Panel.

# Breaking Changes

This release introduces a few breaking changes to how the Daemon operates, but maintains compatibility with v0.7.X of @@ -64,6 +64,6 @@ you will not be able to see any console output.

Run the following command ID of the node you just upgraded, or remove the --node flag entirely to rebuild on all nodes.

php artisan p:server:rebuild --node=###
 

Then, restart all of the servers using the following command, or by manually restarting them one at a time in the Panel.

php artisan p:server:bulk-power restart --nodes=###
 
- + diff --git a/daemon/0.6/upgrade/0.6.html b/daemon/0.6/upgrade/0.6.html index 54532140..1f7735d1 100644 --- a/daemon/0.6/upgrade/0.6.html +++ b/daemon/0.6/upgrade/0.6.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.6 Series

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

Minor Versions Only

DO NOT use this guide to upgrade from 0.5.X to 0.6.X, it will not work and you will encounter errors afterwards. Please check the 0.5 to 0.6 upgrade documentation to perform that update.

TIP

Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection @@ -56,6 +56,6 @@ you are running at least version 10. You can run node -v to check, You can safely ignore this output. Do not run the audit fix command, you will break your Daemon.

npm install --only=production --no-audit --unsafe-perm
 systemctl restart wings
 
- + diff --git a/daemon/0.6/upgrading.html b/daemon/0.6/upgrading.html index 196d85bd..9cc34f2c 100644 --- a/daemon/0.6/upgrading.html +++ b/daemon/0.6/upgrading.html @@ -15,7 +15,7 @@ - + @@ -38,16 +38,16 @@ (opens new window)

# Upgrading

This Software is Abandoned

This documentation is for abandoned software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Wings in production environments with Pterodactyl Panel 1.0.

# Version Specific Guides

- + diff --git a/guides/mounts.html b/guides/mounts.html index 51059481..76bf7fcc 100644 --- a/guides/mounts.html +++ b/guides/mounts.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Using Mounts

Mounts is a feature that allows administrators to mount other directories from the host file-system into a Server's container.

# Wings Configuration

For security reasons it is not possible to mount directories on a node by default. Directories that should be mountable have to be specified explicitly in the Wings configuration.

In the Wings configuration file (/etc/pterodactyl/config.yml) the allowed_mounts field is used to list mountable directories. The listed directories and all their subdirectories can be mounted.

allowed_mounts:
 - /example
 

You have to restart Wings to apply new changes to your Wings config.

# Panel Configuration

You have to configure mounts in admin Panel in order to use them with your servers. They consist of a source pad on the node and a target path where it will be mounted in the container.

Path in the container

Mounts cannot be mounted to or inside of /home/container or any subdirectory of it, nor can you cross-mount servers such as Server A's directory into Server B.

# Creating a Mount

  1. In the admin Panel go to Mounts.
  2. Create a new mount.
  3. Fill in the details as required. @@ -53,6 +53,6 @@

- + diff --git a/guides/php_upgrade.html b/guides/php_upgrade.html index d4400976..4d31a001 100644 --- a/guides/php_upgrade.html +++ b/guides/php_upgrade.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading PHP

This documentation includes instructions for upgrading your system to the latest version of PHP. Please reference the table below to check what version you need for your version of Pterodactyl.

Panel Version PHP Version
1.0.0 - 1.2.0 7.3, 7.4
1.3.0+ 7.4, 8.0
1.8.0+ 7.4, 8.0, 8.1

# Install PHP

In order to install PHP 8.1, you will need to run the following command. Please keep in mind different operating systems may have slightly different requirements for how this command is formatted.

# Add additional repository for PHP
@@ -64,6 +64,6 @@ a2dismod php*
 a2enmod php8.1
 
 

# Return to the 1.X.X Upgrade Guide

- + diff --git a/index.html b/index.html index ed0a4851..5f5e4a18 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

Pterodactyl Panel

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 @@ -59,6 +59,6 @@ Take the plunge today and discover why thousands of users trust Pterodactyl® to manage their game servers.

- + diff --git a/panel/0.7/configuration.html b/panel/0.7/configuration.html index 52c51f37..8016c253 100644 --- a/panel/0.7/configuration.html +++ b/panel/0.7/configuration.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Environment Configuration

Pterodactyl's environment settings are configured and stored in an environment file — .env — located in the installation root directory — generally /var/www/pterodactyl. Some of these settings are also stored in the database and will override settings found in the environment file.

To change this behavior you can edit the .env file and change the setting APP_ENVIRONMENT_ONLY=false to @@ -82,6 +82,6 @@ also be set using the .env file. The default value is 50,000<

# Disable or Modify ReCaptcha

To disable reCAPTCHA on login or password reset, simply set RECAPTCHA_ENABLED=false in the environment file. This change will take effect immediately.

# Using Your Own Keys

Pterodactyl comes preconfigured using a public set of reCAPTCHA keys but you may wish to use your own site specific keys. To do so, follow the instructions below.

  1. Visit Google's reCAPTCHA Admin Console (opens new window).
  2. Click "Register New Site" and fill in a name for your keys.
  3. Choose reCAPTCHA v2 and ensure that the option for Invisible is selected.
  4. Include the domain that your panel is located on.
  5. On the next page displayed, locate the "Site Key" and "Secret Key". In Pterodactyl's control panel click on "Settings" and then the "Advanced" tab. Enter the keys in the boxes "Site Key" and "Secret Key", respectively.

Disabling Domain Verification

If you do not want reCAPTCHA to verify the domain making the validation request you can uncheck "Verify the origin of reCaptcha solution" under "Advanced Settings" after generating your key.

- + diff --git a/panel/0.7/getting_started.html b/panel/0.7/getting_started.html index 7484dbe9..951f01e6 100644 --- a/panel/0.7/getting_started.html +++ b/panel/0.7/getting_started.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Getting Started

This Version is End-of-Life

This documentation is for end-of-life software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Pterodactyl Panel 1.0 in production environments.

Pterodactyl Panel is designed to run on your own web server. You will need to have root access to your server in order to run and use this panel.

This panel does not exist as a drag-and-drop service to run your servers. It is a highly complex system @@ -142,6 +142,6 @@ WantedBy=multi-user.target when the service starts.

If you are are using redis for your system, you will want to make sure to enable that it will start on boot. You can do that by running the following command:

sudo systemctl enable --now redis-server
 

Finally, enable the service and set it to boot on machine start.

sudo systemctl enable --now pteroq.service
 

# Next Step: Webserver Configuration

- + diff --git a/panel/0.7/troubleshooting.html b/panel/0.7/troubleshooting.html index 31b85dde..13130567 100644 --- a/panel/0.7/troubleshooting.html +++ b/panel/0.7/troubleshooting.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Troubleshooting

# Reading Error Logs

If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs. To retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.

tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log
 

# Parsing the Error

When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not, @@ -96,6 +96,6 @@ semodule -i http_port_t.pp firewall-cmd --reload

restart docker and wings after running these to be sure the rules are applied.

# Database Errors

# DatabaseController.php:142

production.ERROR: ErrorException: Undefined variable: host in /var/www/pterodactyl/app/Http/Controllers/Admin/DatabaseController.php:142
 

The database user you are trying to use doesn't have appropriate grants/has used incorrect password.

- + diff --git a/panel/0.7/upgrade/0.6_to_0.7.html b/panel/0.7/upgrade/0.6_to_0.7.html index ba803130..61df838b 100644 --- a/panel/0.7/upgrade/0.6_to_0.7.html +++ b/panel/0.7/upgrade/0.6_to_0.7.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.6 to 0.7

This Version is End-of-Life

This documentation is for end-of-life software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Pterodactyl Panel 1.0 in production environments.

# Fetch Updated Files

The first step in the update process is to download the new panel files from GitHub. The command below will download the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time @@ -83,6 +83,6 @@ is www-data but can vary from system to system — sometimes being # If using Apache on CentOS chown -R apache:apache *

- + diff --git a/panel/0.7/upgrade/0.7.html b/panel/0.7/upgrade/0.7.html index fd513e9a..3c658b63 100644 --- a/panel/0.7/upgrade/0.7.html +++ b/panel/0.7/upgrade/0.7.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading 0.7 Series

This Version is End-of-Life

This documentation is for end-of-life software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Pterodactyl Panel 1.0 in production environments.

This documentation covers the process for upgrading within the 0.7.X series of releases. This means upgrading from — for example — 0.7.3 to 0.7.11. Do not use this guide for upgrading from 0.6 or upgrading to 1.0.

WARNING

If you are using a custom theme please be aware that upgrading will remove those files. You will need to re-upload @@ -73,6 +73,6 @@ is www-data but can vary from system to system — sometimes being # If using Apache on CentOS chown -R apache:apache *

- + diff --git a/panel/0.7/upgrading.html b/panel/0.7/upgrading.html index df82e397..770441fe 100644 --- a/panel/0.7/upgrading.html +++ b/panel/0.7/upgrading.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Upgrading

Upgrading the Panel is a relatively simple process. Below you will find a list of articles that will walk you through the upgrade process for each version of the software.

This Version is End-of-Life

This documentation is for end-of-life software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Pterodactyl Panel 1.0 in production environments.

# Maintenance Mode

Whenever you are performing an upgrade, you should be sure to place your Panel into "maintenance mode". This will prevent @@ -55,6 +55,6 @@ php artisan down php artisan up

# Restarting Queue Workers

After every update, you should restart the queue worker to ensure that the new code is being loaded in and used.

php artisan queue:restart
 

# Version Specific Guides

- + diff --git a/panel/0.7/webserver_configuration.html b/panel/0.7/webserver_configuration.html index 072dca6e..0281cac6 100644 --- a/panel/0.7/webserver_configuration.html +++ b/panel/0.7/webserver_configuration.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

# Webserver Configuration

This Version is End-of-Life

This documentation is for end-of-life software which does not recieve any security updates or support from the community. This documentation has been left accessible for historial reasons.

You should be installing and using Pterodactyl Panel 1.0 in production environments.

DANGER

You should remove the default Apache or NGINX configuration as it will expose application secrets to malicious users by default.

# NGINX

You should paste the contents of the file below, replacing <domain> with your domain name being used in a file called @@ -212,6 +212,6 @@ below! You only need to run systemctl restart httpd.

sudo a2enmod rewrite systemctl restart apache2
- + diff --git a/panel/1.0/additional_configuration.html b/panel/1.0/additional_configuration.html index fd746b27..ab3f6175 100644 --- a/panel/1.0/additional_configuration.html +++ b/panel/1.0/additional_configuration.html @@ -15,7 +15,7 @@ - + @@ -38,14 +38,14 @@ (opens new window)

# Additional Configuration

# Backups

Pterodactyl Panel allows users to create backups of their servers. In order to create backups, a backup storage method has to be configured.

When changing Pterodactyl Panel's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method.

# Using Local Backups

By default, Pterodactyl Panel uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set with the following configuration in the .env file:

# Sets your panel to use local storage via Wings for backups
+  1.11
+  current

  • # Additional Configuration

    # Backups

    Pterodactyl Panel allows users to create backups of their servers. In order to create backups, a backup storage method has to be configured.

    When changing Pterodactyl Panel's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method.

    # Using Local Backups

    By default, Pterodactyl Panel uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set with the following configuration in the .env file:

    # Sets your panel to use local storage via Wings for backups
     APP_BACKUP_DRIVER=wings
     

    Do note that, when using local storage via Wings, the destination for backups is set in Wings' config.yml with the following setting key:

    system:
       backup_directory: /path/to/backup/storage
    @@ -81,7 +81,57 @@ Below is an example of how to set this.

    # 2FA

    If possible you should use the panel to update your 2FA settings. If you can't access your panel for what ever reason you can use the following steps.

    # Disable 2FA requirement

    mysql -u root -p
     UPDATE panel.settings SET value = 0 WHERE `key` = 'settings::pterodactyl:auth:2fa_required';
     

    # Disable 2FA for a specific user

    Run the following command in your /var/www/pterodactyl directory.

    php artisan p:user:disable2fa
    +

    # Telemetry

    Since 1.11, the Panel collects anonymous metrics about the Panel and all connected nodes. +This feature is enabled by default, but can be disabled.

    The data collected by this feature is not sold or used for advertising purposes. Aggregate statistics +may be made public or shared with third-parties for the purposes of improving the software.

    # How does it work?

    The Telemetry system works by first generating a random UUIDv4 identifier for the Panel installation. +This identifier is stored in the database so people load-balancing multiple Panel instances can still +have a unique identifier. This identifier is then sent to a remote server, along the associated +telemetry data. The telemetry data is collected every 24 hours, there is no ongoing collection +or local storage of the telemetry data, we collect the data right before we send it to the remote +server.

    Currently, all telemetry collection logic is handled by the TelemetryCollectionService (opens new window) +on the panel. This service is responsible for collecting all the data that is sent to the remote +server.

    # What data is collected?

    If you wish to see the full data that is collected, please look at the TelemetryCollectionService +(as linked above), or use the php artisan p:telemetry command to view the exact data that will +be sent to the remote server.

    As of 2022-12-01, the data collected consists of:

    • Unique identifier for the Panel
    • Version of the Panel
    • PHP version
    • Backup storage driver (S3, Local, etc.)
    • Cache driver (Redis, Memcached, etc.)
    • Database driver and version (MySQL, MariaDB, PostgreSQL, etc.)
    • Resources +
      • Allocations +
        • Total number
        • Total number of used allocations (assigned to a server)
      • Backups +
        • Total number
        • Sum of the total amount of bytes stored by backups
      • Eggs +
        • Total number
        • Map of egg UUIDs to the number of servers using that egg
      • Locations +
        • Total number
      • Mounts +
        • Total number
      • Nests +
        • Total number
        • Map of nest UUIDs to the number of servers using eggs in that nest
      • Nodes +
        • Total number
      • Servers +
        • Total number
        • Number of servers that are suspended
      • Users +
        • Total number
        • Number of users that are admins
    • Nodes +
      • Node UUID
      • Version of Wings on the node
      • Docker +
        • Version
        • Cgroups +
          • Driver
          • Version
        • Containers +
          • Total
          • Running
          • Paused
          • Stopped
        • Storage +
          • Driver
          • Filesystem
        • runc +
          • Version
      • System +
        • Architecture (amd64, arm64, etc.)
        • CPU Threads
        • Memory Bytes
        • Kernel Version
        • Operating System (Debian, Fedora, RHEL, Ubuntu, etc.)
        • Operating System Type (bsd, linux, windows, etc.)

    # How is the data stored?

    Currently, the data is stored with Cloudflare, exact specifics about the format and products used +is not available at this time as our implementation is still very much an alpha. Right now, there +is NO way to query or view this information, both for project team members and the public. We +expect this to change in the future, but for now we are not making any guarantees about the data +being publicly available.

    # Why?

    The primary reason for collecting this data is to help us make better decisions about the future of +this software. With the release of 1.11, the minimum PHP version requirement jumped from 7.4 to 8.0, +however, we wanted to add a feature that required PHP 8.1 which would've made the version requirement +jump larger and potentially cause issues for some users. By collecting this data, we can hopefully +have more insight to how changes like this will affect the community and make better decisions in the +future. This is especially important for information like the architecture, kernel version, and +operating system nodes are using. For example, we want to utilize a feature that is only present in +some filesystems, but we have no idea how many people are using those filesystems, so we cannot +determine if it's worth the effort to implement.

    Some of the data is not as useful for making decisions, but is still useful for us to know. +For example, have you ever wondered how many Panel instances there are? How many servers are being +ran across all of those instances? How many users are using the Panel? How many of those users are +admins? How many servers are using a specific egg? How many servers are using a specific nest? +All of these questions can be answered by the data we collect, and can help us and the community +better understand how the software is being used.

    If you have any questions about the data we collect, please feel free to reach out to us on Discord. +Our goal is to be as transparent as possible, and we want to make sure that the community understands +what we are doing and why.

    # Enabling Telemetry

    Telemetry is enabled by default, if you want to enable it after disabling it, edit your .env file +and either remove the PTERODACTYL_TELEMETRY_ENABLED line, or set it to true.

    PTERODACTYL_TELEMETRY_ENABLED=true
    +

    # Disabling Telemetry

    To disable telemetry, edit your .env file and set PTERODACTYL_TELEMETRY_ENABLED to false.

    PTERODACTYL_TELEMETRY_ENABLED=false
     
    - + diff --git a/panel/1.0/getting_started.html b/panel/1.0/getting_started.html index ef19d868..c00d34e1 100644 --- a/panel/1.0/getting_started.html +++ b/panel/1.0/getting_started.html @@ -15,7 +15,7 @@ - + @@ -38,19 +38,19 @@ (opens new window)

    # Getting Started

    Pterodactyl Panel is designed to run on your own web server. You will need to have root access to your server in order to run and use this panel.

    You are expected to understand how to read documentation to use this Panel. We have spent many hours detailing how to install or upgrade our + 1.11 + current

  • # Getting Started

    Pterodactyl Panel is designed to run on your own web server. You will need to have root access to your server in order to run and use this panel.

    You are expected to understand how to read documentation to use this Panel. We have spent many hours detailing how to install or upgrade our software; take some time and read rather than copy and pasting and then complaining when things do not work. This panel does not exist as a drag-and-drop service to run your servers. It is a highly complex system requiring multiple dependencies and administrators willing to spend some time learning how to use it. If you expect to be able to install this with no understanding of basic linux system administration you should stop and turn around now.

    Looking for something simple to setup?

    WISP (opens new window) is a Pterodactyl powered SaaS suitable for enterprise and personal use. Offering all the features without the setup hassle, and fully compatible with Pterodactyl eggs. Comparable to MultiCraft or TCAdmin while offering new and unique features. Click here to learn more (opens new window).

    # Picking a Server OS

    Pterodactyl runs on a wide range of operating systems, so pick whichever you are most comfortable using.

    WARNING

    Pterodactyl does not support most OpenVZ systems due to incompatibilities with Docker. If you are planning on running -this software on an OpenVZ based system you will — most likely — not be successful.

    Operating System Version Supported Notes
    Ubuntu 18.04 Documentation written assuming Ubuntu 18.04 as the base OS.
    20.04
    22.04
    22.04 MariaDB can be installed without the repo setup script.
    CentOS 7 Extra repos are required.
    8 Note that CentOS 8 is EOL. Use Rocky or Alma Linux.
    Debian 10
    11

    # Dependencies

    • PHP 7.4, 8.0 or 8.1 (recommended) with the following extensions: cli, openssl, gd, mysql, PDO, mbstring, tokenizer, bcmath, xml or dom, curl, zip, and fpm if you are planning to use NGINX.
    • MySQL 5.7.22 and higher (MySQL 8 recommended) or MariaDB 10.2 and higher.
    • Redis (redis-server)
    • A webserver (Apache, NGINX, Caddy, etc.)
    • curl
    • tar
    • unzip
    • git
    • composer v2

    # Example Dependency Installation

    The commands below are simply an example of how you might install these dependencies. Please consult with your +this software on an OpenVZ based system you will — most likely — not be successful.

    Operating System Version Supported Notes
    Ubuntu 18.04 Documentation written assuming Ubuntu 18.04 as the base OS.
    20.04
    22.04
    22.04 MariaDB can be installed without the repo setup script.
    CentOS 7 Extra repos are required.
    8 Note that CentOS 8 is EOL. Use Rocky or Alma Linux.
    Debian 10
    11

    # Dependencies

    • PHP 8.0 or 8.1 (recommended) with the following extensions: cli, openssl, gd, mysql, PDO, mbstring, tokenizer, bcmath, xml or dom, curl, zip, and fpm if you are planning to use NGINX.
    • MySQL 5.7.22 and higher (MySQL 8 recommended) or MariaDB 10.2 and higher.
    • Redis (redis-server)
    • A webserver (Apache, NGINX, Caddy, etc.)
    • curl
    • tar
    • unzip
    • git
    • composer v2

    # Example Dependency Installation

    The commands below are simply an example of how you might install these dependencies. Please consult with your operating system's package manager to determine the correct packages to install.

    # Add "add-apt-repository" command
     apt -y install software-properties-common curl apt-transport-https ca-certificates gnupg
     
    @@ -149,7 +149,9 @@ WantedBy=multi-user.target
     

    Redis on CentOS

    If you are using CentOS, you will need to replace redis-server.service with redis.service at the After= line in order to ensure redis starts before the queue worker.

    TIP

    If you are not using redis for anything you should remove the After= line, otherwise you will encounter errors when the service starts.

    If you are using redis for your system, you will want to make sure to enable that it will start on boot. You can do that by running the following command:

    sudo systemctl enable --now redis-server
     

    Finally, enable the service and set it to boot on machine start.

    sudo systemctl enable --now pteroq.service
    -

    # Next Step: Webserver Configuration

    - +

    # Telemetry

    Since 1.11, Pterodactyl will collect anonymous telemetry to help us better understand how the +software is being used. To learn more about this feature and to opt-out, please see our Telemetry +documentation. Make sure to continue with the rest of the installation process.

    # Next Step: Webserver Configuration

    + diff --git a/panel/1.0/legacy_upgrade.html b/panel/1.0/legacy_upgrade.html index 8e7cd68a..3c9a5cc9 100644 --- a/panel/1.0/legacy_upgrade.html +++ b/panel/1.0/legacy_upgrade.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

    # Legacy Upgrades

    This upgrade guide is for upgrading from 0.7.X to 1.3.x. If you are trying to do an upgrade on a 1.X Panel please use this guide instead. During this upgrade process you will have some periods of Panel unavailability, however none of the underlying game server instances will be stopped.

    # Enter Maintenance Mode

    You'll want to put your Panel into maintenance mode by running the down command below before starting. This @@ -95,6 +95,6 @@ php artisan up control plane written in Go. This new system is significantly faster, easier to install, and much smaller. All you need to do is install a single binary on your system and configure it to run on boot. You cannot use the old Node.js Daemon to run servers with Pterodactyl Panel 1.0.

    Please see Migrating to Wings for instructions.

    - + diff --git a/panel/1.0/troubleshooting.html b/panel/1.0/troubleshooting.html index b629418c..7bc5476a 100644 --- a/panel/1.0/troubleshooting.html +++ b/panel/1.0/troubleshooting.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

    # Troubleshooting

    # Reading Error Logs

    If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs. To retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.

    tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log
     

    # Parsing the Error

    When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not, @@ -94,6 +94,6 @@ semodule -i http_port_t.pp

    # FirewallD issues

    If you are on a RHEL/CentOS server with firewalld installed you may have broken DNS.

    firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0
     firewall-cmd --reload
     

    Restart docker and wings after running these to be sure the rules are applied.

    - + diff --git a/panel/1.0/updating.html b/panel/1.0/updating.html index 086d0404..3c35eee4 100644 --- a/panel/1.0/updating.html +++ b/panel/1.0/updating.html @@ -15,7 +15,7 @@ - + @@ -38,19 +38,21 @@ (opens new window)

    # Updating the Panel

    This documentation covers the process for updating within the 1.x series of releases. This means updating from — for example — 1.5.0 to 1.6.0. Do not use this guide for upgrading from 0.7.

    # Panel Version Requirements

    Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that is required for it to run. Please see the chart below for how these versions line up. In -most cases your base Wings version should match that of your Panel.

    Panel Version Wings Version Supported PHP Versions
    1.0.x 1.0.x 7.3, 7.4
    1.1.x 1.1.x 7.3, 7.4
    1.2.x 1.2.x 7.3, 7.4
    1.3.x 1.3.x 7.4, 8.0
    1.4.x 1.4.x 7.4, 8.0
    1.5.x 1.4.x 7.4, 8.0
    1.6.x 1.4.x 7.4, 8.0
    1.7.x 1.5.x 7.4, 8.0
    1.8.x 1.6.x 7.4, 8.0, 8.1
    1.9.x 1.6.x 7.4, 8.0, 8.1
    1.10.x 1.7.x 8.1 (7.4 & 8.0 deprecated)

    # Update Dependencies

    • PHP 7.4, 8.0 or 8.1 (recommended)
    • Composer 2.X

    Future PHP Version Changes

    Support for PHP 7.4 and 8.0 is deprecated. Please plan accordingly — PHP 8.1 will be the only -supported version in future releases.

    Before continuing, please ensure that your system and web server configuration has been upgraded to at least PHP 7.4 by running php -v and Composer 2 by running composer --version. You -should see an output similar to the result below. If you do not see at least PHP 7.4 and Composer 2, you will need to upgrade by following +most cases your base Wings version should match that of your Panel.

    Panel Version Wings Version Supported PHP Versions
    1.0.x 1.0.x 7.3, 7.4
    1.1.x 1.1.x 7.3, 7.4
    1.2.x 1.2.x 7.3, 7.4
    1.3.x 1.3.x 7.4, 8.0
    1.4.x 1.4.x 7.4, 8.0
    1.5.x 1.4.x 7.4, 8.0
    1.6.x 1.4.x 7.4, 8.0
    1.7.x 1.5.x 7.4, 8.0
    1.8.x 1.6.x 7.4, 8.0, 8.1
    1.9.x 1.6.x 7.4, 8.0, 8.1
    1.10.x 1.7.x 7.4, 8.0, 8.1 (7.4 deprecated)
    1.11.x 1.11.x 8.0, 8.1 (8.0 deprecated)

    NOTE: There are no 1.8.x, 1.9.x, or 1.10.x releases of Wings.

    # Update Dependencies

    • PHP 8.0 or 8.1 (recommended)
    • Composer 2.X

    PHP 7.4

    Support for PHP 7.4 has been removed with the release of 1.11.0. Please upgrade +to PHP 8.0, 8.1 or newer. +::

    Future PHP Version Changes

    Support for PHP 8.0 is deprecated. Please plan accordingly — PHP 8.1 or newer +will be the only supported version in 1.12 and beyond.

    Before continuing, please ensure that your system and web server configuration has been upgraded to at least PHP 8.0 by running php -v and Composer 2 by running composer --version. You +should see an output similar to the result below. If you do not see at least PHP 8.0 and Composer 2, you will need to upgrade by following our PHP Upgrade Guide and return to this documentation afterward.

    vagrant@pterodactyl:~/app$ php -v
     PHP 8.1.5 (cli) (built: Apr 21 2022 10:32:13) (NTS)
     Copyright (c) The PHP Group
    @@ -91,7 +93,9 @@ is www-data but can vary from system to system — sometimes being
     

    # Restarting Queue Workers

    After every update you should restart the queue worker to ensure that the new code is loaded in and used.

    php artisan queue:restart
     

    # Exit Maintenance Mode

    Now that everything has been updated you need to exit maintenance mode so that the Panel can resume accepting connections.

    php artisan up
    -

    Final Step: Upgrade Wings

    - +

    # Telemetry

    Since 1.11, Pterodactyl will collect anonymous telemetry to help us better understand how the +software is being used. To learn more about this feature and to opt-out, please see our Telemetry +documentation. Remember to continue with the rest of the upgrade.

    Final Step: Upgrade Wings

    + diff --git a/panel/1.0/webserver_configuration.html b/panel/1.0/webserver_configuration.html index 822cb970..c63fe8ee 100644 --- a/panel/1.0/webserver_configuration.html +++ b/panel/1.0/webserver_configuration.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

    # Webserver Configuration

    WARNING

    When using the SSL configuration you MUST create SSL certificates, otherwise your webserver will fail to start. See the Creating SSL Certificates documentation page to learn how to create these certificates before continuing.

      # Next Step: Wings Installation

      - + diff --git a/project/about.html b/project/about.html index 91a0cb47..2154994a 100644 --- a/project/about.html +++ b/project/about.html @@ -15,7 +15,7 @@ - + @@ -38,18 +38,18 @@ (opens new window)

      # About

      # Core Project Team

      Name Discord Name Primary Role
      Dane Everitt (opens new window) Tactical Fish#8008 Founder & Former Project Maintainer
      Matthew Penner (opens new window) matthewp#0001 Project Maintainer
      Stepan Fedotov Trixter#0001 WISP & WHMCS Module Maintainer
      Michael Parker parkervcp#6789 Egg Developer, Docker Integration
      Jakob Schrettenbrunner (opens new window) schrej#1337 Developer
      Lance Pioch (opens new window) ShadowLancer#5209 Developer

      Members of the project team have a red username in our Discord server.

      # Community Team

      Pterodactyl would not be as successful as it is today without the help of our fantastic community support team. These members can be found in our Discord server and are distinguished with a yellow username.

      # Sponsors

      The following companies help to fund Pterodactyl's development. Interested in becoming a sponsor? (opens new window)

      Company About
      WISP (opens new window) Extra features.
      Fragnet (opens new window) Providing low latency, high-end game hosting solutions to gamers, game studios and eSports platforms.
      RocketNode (opens new window) Innovative game server hosting combined with a straightforward control panel, affordable prices, and Rocket-Fast support.
      Aussie Server Hosts (opens new window) No frills Australian Owned and operated High Performance Server hosting for some of the most demanding games serving Australia and New Zealand.
      BisectHosting (opens new window) BisectHosting provides Minecraft, Valheim and other server hosting services with the highest reliability and lightning fast support since 2012.
      MineStrator (opens new window) Looking for the most highend French hosting company for your minecraft server? More than 24,000 members on our discord trust us. Give us a try!
      Skynode (opens new window) Skynode provides blazing fast game servers along with a top-notch user experience. Whatever our clients are looking for, we're able to provide it!
      VibeGAMES (opens new window) VibeGAMES is a game server provider that specializes in DDOS protection for the games we offer. We have multiple locations in the US, Brazil, France, Germany, Singapore, Australia and South Africa.
      Pterodactyl Market (opens new window) Pterodactyl Market is a one-and-stop shop for Pterodactyl. In our market, you can find Add-ons, Themes, Eggs, and more for Pterodactyl.
      UltraServers (opens new window) Deploy premium games hosting with the click of a button. Manage and swap games with ease and let us take care of the rest. We currently support Minecraft, Rust, ARK, 7 Days to Die, Garys MOD, CS:GO, Satisfactory and others.

      # License

      Pterodactyl® Copyright © 2015 - 2022 Dane Everitt and contributors.

      Code released under the MIT License (opens new window).

      - + diff --git a/project/community.html b/project/community.html index e1dd5dc4..f58793b2 100644 --- a/project/community.html +++ b/project/community.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

      # Community Standards

      Pterodactyl has grown from a community of tens in 2015 to a community of thousands in 2020. During that time there have been countless growing pains and community has changed in an innumerable number of ways. At our heart however, Pterodactyl continues to exist for one purpose: to be the platform for running your game servers.

      In order to keep true to that goal, and continue to foster one of the largest open-source game panel communities @@ -71,6 +71,6 @@ directly if they're not already involved in a discussion with you.

      Terminology
      - + diff --git a/project/introduction.html b/project/introduction.html index 6c1d6892..f4804cf0 100644 --- a/project/introduction.html +++ b/project/introduction.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

      # Introduction

      Pterodactyl is the 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 administrators and users. What more are you waiting for? Make game servers a first-class @@ -55,6 +55,6 @@ code base and hunt for security issues. If you come across anything that raises hesitate to reach out directly to support@pterodactyl.io. We ask that you please be responsible when disclosing any security concerns and do not report them on our public facing bug tracker.

      - + diff --git a/project/terms.html b/project/terms.html index 3e005a54..6bdfd4b7 100644 --- a/project/terms.html +++ b/project/terms.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

      # Terminology

      Panel — This refers to Pterodactyl Panel itself, and is what allows you to add additional nodes and servers to the system.

      Node — A node is a physical machine that runs an instance of Wings.

      Wings — The newer service written in Go that interfaces with Docker and the Panel to provide secure access for controlling servers via the Panel.

      Server — In this case, a server refers to a running instance that is created by the panel. These servers are @@ -53,6 +53,6 @@ created on nodes, and you can have multiple servers per node.

      Doc ← About

      - + diff --git a/tutorials/creating_ssl_certificates.html b/tutorials/creating_ssl_certificates.html index 31132bb9..1e1de036 100644 --- a/tutorials/creating_ssl_certificates.html +++ b/tutorials/creating_ssl_certificates.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

      # Creating SSL Certificates

      This tutorial briefly covers creating new SSL certificates for your panel and wings.

        - + diff --git a/tutorials/mysql_setup.html b/tutorials/mysql_setup.html index 796e6310..9ed1fedf 100644 --- a/tutorials/mysql_setup.html +++ b/tutorials/mysql_setup.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

        # Setting up MySQL

        # Creating a database for Pterodactyl

        MySQL is a core component of Pterodactyl Panel but it can be confusing to setup and use if you've never done so before. This is a very basic tutorial that skims just enough of the surface to set MySQL up and running with the panel. If you're interested in learning more, there are some great tutorials available on the Internet.

        # Logging In

        The first step in this process is to login to the MySQL command line where we will be executing some statements to get @@ -70,6 +70,6 @@ bind-address=0.0.0.0 ← Community Standards

        - + diff --git a/wings/1.0/configuration.html b/wings/1.0/configuration.html index 81a04eec..f3eca0aa 100644 --- a/wings/1.0/configuration.html +++ b/wings/1.0/configuration.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

        # Additional Configuration

        WARNING

        These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if you misconfigure something. Proceed only if you know what each configuration value does.

        You must apply all changes to your Wings config.yml file located at /etc/pterodactyl and restart wings. Verify your config file using Yaml Lint (opens new window) should you receive errors related to YAML parsing.

        # Private Registries

        You can use these settings to authenticate against (private) docker registries when pulling images.

        # Available Keys

        Setting Key Default Value Notes
        name null Registry address
        username null Registry username
        password null Registry password

        # Example of usage

        docker:
           registries:
        @@ -73,6 +73,6 @@ Restart wings and your game server to apply the new limit.

        memory: 1024 cpu: 100

        # Other values

        More commonly discussed values. View all Wings config values and explanations in these two files. (opens new window)

        Setting Key Default Value Notes
        debug false Force Wings to run in debug mode
        tmpfs_size 100 The size of the /tmp directory in MB when mounted into a container
        websocket_log_count 150 The number of lines to display in the console
        detect_clean_exit_as_crash true Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button
        (crash detection) timeout 60 Timeout between server crashes that will not cause the server to be automatically restarted
        app_name "Pterodactyl" Changes the name of the daemon, shown in the panel's game console
        check_permissions_on_boot true Check all file permissions on each boot. Disable this when you have a very large amount of files and the server startup is hanging on checking permissions
        - + diff --git a/wings/1.0/installing.html b/wings/1.0/installing.html index 6f6e4163..413b26af 100644 --- a/wings/1.0/installing.html +++ b/wings/1.0/installing.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

        # Installing Wings

        Wings is the next generation server control plane from Pterodactyl. It has been rebuilt from the ground up using Go and lessons learned from our first Nodejs Daemon.

        WARNING

        You should only install Wings if you are running Pterodactyl 1.x. Do not install this software for previous versions of Pterodactyl.

        # Supported Systems

        The following is a list of supported operating systems. Please be aware that this is not an exhaustive list, @@ -93,6 +93,6 @@ RestartSec=5s WantedBy=multi-user.target

        Then, run the commands below to reload systemd and start Wings.

        systemctl enable --now wings
         

        # Node Allocations

        Allocation is a combination of IP and Port that you can assign to a server. Each created server must have at least one allocation. The allocation would be the IP address of your network interface. In some cases, such as when behind NAT, it would be the internal IP. To create new allocations go to Nodes > your node > Allocation.

        example image of node allocations

        Type hostname -I | awk '{print $1}' to find the IP to be used for the allocation. Alternatively, you can type ip addr | grep "inet " to see all your available interfaces and IP addresses. Do not use 127.0.0.1 for allocations.

        - + diff --git a/wings/1.0/migrating.html b/wings/1.0/migrating.html index 967db5c6..0d7a8818 100644 --- a/wings/1.0/migrating.html +++ b/wings/1.0/migrating.html @@ -15,7 +15,7 @@ - + @@ -38,13 +38,13 @@ (opens new window)

        # Migrating to Wings

        This guide is for people looking to migrate from the old Node.JS daemon to Wings. Please see the install guide if you are trying to install Wings for the first time on a new node.

        Panel Version Requirement

        You must be running Pterodactyl Panel 1.X in order to use Wings.

        You'll have a brief offline period as you perform this process, however no running game processes @@ -95,6 +95,6 @@ systemctl enable --now wings

        What if Wings doesn't start?

        If you encounter issues starting Wings at this point, run the following command to start Wings directly and check for any specific error output.

        sudo wings --debug
         
        - + diff --git a/wings/1.0/upgrading.html b/wings/1.0/upgrading.html index 3a910bb8..e829b1e4 100644 --- a/wings/1.0/upgrading.html +++ b/wings/1.0/upgrading.html @@ -15,7 +15,7 @@ - + @@ -38,22 +38,22 @@ (opens new window)

        # Upgrading Wings

        Upgrading Wings is a painless process and should take less than a minute to complete.

        # Wings Version Requirements

        Each version of Pterodactyl Panel also has a corresponding minimum version of Wings that is required for it to run. Please see the chart below for how these versions line up. In -most cases your base Wings version should match that of your Panel.

        Panel Version Wings Version Supported
        1.0.x 1.0.x
        1.1.x 1.1.x
        1.2.x 1.2.x
        1.3.x 1.3.x
        1.4.x 1.4.x
        1.5.x 1.4.x
        1.6.x 1.4.x
        1.7.x 1.5.x
        1.8.x 1.6.x
        1.9.x 1.6.x
        1.10.x 1.7.x

        # Download Updated Binary

        First, download the updated wings binary into /usr/local/bin. You will need to stop Wings briefly. Your running +most cases your base Wings version should match that of your Panel.

        Panel Version Wings Version Supported
        1.0.x 1.0.x
        1.1.x 1.1.x
        1.2.x 1.2.x
        1.3.x 1.3.x
        1.4.x 1.4.x
        1.5.x 1.4.x
        1.6.x 1.4.x
        1.7.x 1.5.x
        1.8.x 1.6.x
        1.9.x 1.6.x
        1.10.x 1.7.x
        1.11.x 1.11.x

        NOTE: There are no 1.8.x, 1.9.x, or 1.10.x releases of Wings.

        # Download Updated Binary

        First, download the updated wings binary into /usr/local/bin. You will need to stop Wings briefly. Your running servers will not be affected.

        systemctl stop wings
         curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"
         chmod u+x /usr/local/bin/wings
         

        # Restart Process

        Finally, restart the wings process. Your running servers will not be affected and any open connections to the instance will re-connect automatically.

        systemctl restart wings
         
        - +