From 85827e7237ad0d7ffe8ed23beaacdcb8d74391ef Mon Sep 17 00:00:00 2001 From: DaneEveritt Date: Sun, 2 May 2021 17:55:22 +0000 Subject: [PATCH] deploy: 77a7267a0b3fa851f65172e2cf261acf6edbb6f1 --- 404.html | 4 ++-- assets/img/node_allocations.323d67f2.png | Bin 0 -> 129194 bytes assets/js/{12.9bbfc2f6.js => 12.55bef2af.js} | 2 +- assets/js/{14.2e96f1b8.js => 14.57b7488c.js} | 2 +- assets/js/{17.67e35315.js => 17.c2840444.js} | 2 +- assets/js/19.308a7ac5.js | 1 + assets/js/{19.bb80f931.js => 20.b1deab3a.js} | 2 +- assets/js/21.abae94a8.js | 1 - assets/js/{20.d065b2c5.js => 21.d6c9c101.js} | 2 +- assets/js/{22.3ff292b3.js => 22.db83ce68.js} | 2 +- assets/js/{23.6b778859.js => 23.3a0120cf.js} | 2 +- assets/js/{24.18e132d5.js => 24.6e894c0a.js} | 2 +- assets/js/{28.17b33d85.js => 28.317f71e4.js} | 2 +- assets/js/{29.9c25f524.js => 29.69216217.js} | 2 +- assets/js/{30.34c4472a.js => 30.8204ea7c.js} | 2 +- assets/js/{31.4a35c00f.js => 31.e7b25719.js} | 2 +- assets/js/{32.d98a3373.js => 32.db8f117e.js} | 2 +- assets/js/{33.88a8819c.js => 33.731812d7.js} | 2 +- assets/js/{34.0edc39f4.js => 34.30f48224.js} | 2 +- assets/js/{35.969d92c8.js => 35.39990a3a.js} | 2 +- assets/js/{36.49b831e2.js => 36.8ec9602c.js} | 2 +- assets/js/{37.46d8127b.js => 37.81b1b06a.js} | 2 +- assets/js/{38.9d9c367c.js => 38.e1f447b2.js} | 2 +- assets/js/{39.4e9577b6.js => 39.d8c67b81.js} | 2 +- assets/js/{4.9dfb277d.js => 4.6431cc96.js} | 2 +- assets/js/{40.273f9b41.js => 40.f8a8112a.js} | 2 +- assets/js/{41.32790d14.js => 41.bdff0171.js} | 2 +- assets/js/{42.d9689e6d.js => 42.89114514.js} | 2 +- assets/js/{43.9992155a.js => 43.40649380.js} | 2 +- assets/js/{44.e7f6dd0e.js => 44.ad1ccee8.js} | 2 +- assets/js/{45.32b9b890.js => 45.e976638f.js} | 2 +- assets/js/{46.c04b0749.js => 46.f2988dba.js} | 2 +- assets/js/{47.8a528b5d.js => 47.3dc1dfde.js} | 2 +- assets/js/{48.0bb564a9.js => 48.c14d7ed1.js} | 2 +- assets/js/{49.70313a9d.js => 49.fc33633a.js} | 2 +- assets/js/{50.6b4f4718.js => 50.fb19455f.js} | 2 +- assets/js/{51.75e9c6d8.js => 51.786f6418.js} | 2 +- assets/js/{52.5803bd20.js => 52.24fbb394.js} | 2 +- assets/js/{53.c0284790.js => 53.c517ee4e.js} | 2 +- assets/js/{54.14aa3f16.js => 54.11009636.js} | 2 +- assets/js/{55.4e7ca13f.js => 55.dac5f93e.js} | 2 +- assets/js/{56.cbbea30d.js => 56.f286a8ea.js} | 2 +- assets/js/{57.b9237770.js => 57.4f76cdaf.js} | 2 +- assets/js/{58.df220808.js => 58.78f0d59d.js} | 2 +- assets/js/{59.06f08aee.js => 59.7681f6ba.js} | 2 +- assets/js/{60.a3853cbe.js => 60.cdccfa2a.js} | 2 +- assets/js/{61.360ebc59.js => 61.bca7dd5a.js} | 2 +- assets/js/{62.db0d6812.js => 62.0d6c7a24.js} | 2 +- assets/js/{63.8a89fed0.js => 63.318bb69c.js} | 2 +- assets/js/{64.8fe43c5c.js => 64.b0806748.js} | 2 +- assets/js/{65.d4df1bb2.js => 65.3ca34732.js} | 2 +- assets/js/{66.6cb57e40.js => 66.ef6f7035.js} | 2 +- assets/js/{67.cc039676.js => 67.38d5b57b.js} | 2 +- assets/js/{68.0031d838.js => 68.321dd68b.js} | 2 +- assets/js/{69.74d5f183.js => 69.0a4d59ac.js} | 2 +- assets/js/{70.2c6f25e4.js => 70.e5c87b26.js} | 2 +- assets/js/{71.f94f8363.js => 71.cd5fcd07.js} | 2 +- assets/js/{72.be219eed.js => 72.c1a0015d.js} | 2 +- assets/js/{73.11b803e4.js => 73.0f242c47.js} | 2 +- assets/js/{74.282a4100.js => 74.3dbad093.js} | 2 +- assets/js/{75.7fd29139.js => 75.b2e7a917.js} | 2 +- assets/js/{76.52a50904.js => 76.408e20f8.js} | 2 +- assets/js/{77.c4108655.js => 77.87c74d94.js} | 2 +- assets/js/{78.eff775df.js => 78.4e09480d.js} | 2 +- assets/js/{app.8b0b6dd8.js => app.a2e98793.js} | 4 ++-- community/about.html | 4 ++-- .../config/eggs/creating_a_custom_egg.html | 4 ++-- .../config/eggs/creating_a_custom_image.html | 4 ++-- community/config/nodes/add_node.html | 4 ++-- community/customization/panel.html | 4 ++-- community/customization/wings.html | 4 ++-- community/games/minecraft.html | 4 ++-- .../installation-guides/panel/centos7.html | 4 ++-- .../installation-guides/panel/centos8.html | 4 ++-- .../installation-guides/panel/debian10.html | 4 ++-- .../installation-guides/panel/debian9.html | 4 ++-- .../installation-guides/panel/ubuntu1804.html | 4 ++-- .../installation-guides/panel/ubuntu2004.html | 4 ++-- .../installation-guides/wings/centos7.html | 4 ++-- .../installation-guides/wings/centos8.html | 4 ++-- .../installation-guides/wings/debian10.html | 4 ++-- .../installation-guides/wings/debian9.html | 4 ++-- .../installation-guides/wings/ubuntu1804.html | 4 ++-- .../installation-guides/wings/ubuntu2004.html | 4 ++-- community/tutorials/artisan.html | 4 ++-- daemon/0.6/configuration.html | 4 ++-- daemon/0.6/debian_8_docker.html | 4 ++-- daemon/0.6/installing.html | 4 ++-- daemon/0.6/kernel_modifications.html | 4 ++-- daemon/0.6/standalone_sftp.html | 4 ++-- daemon/0.6/upgrade/0.4_to_0.5.html | 4 ++-- daemon/0.6/upgrade/0.5.html | 4 ++-- daemon/0.6/upgrade/0.5_to_0.6.html | 4 ++-- daemon/0.6/upgrade/0.6.html | 4 ++-- daemon/0.6/upgrading.html | 4 ++-- guides/mounts.html | 4 ++-- guides/php_upgrade.html | 4 ++-- index.html | 4 ++-- node_allocations.png | Bin 0 -> 129194 bytes ops/publish_release.html | 4 ++-- panel/0.7/configuration.html | 4 ++-- panel/0.7/getting_started.html | 4 ++-- panel/0.7/troubleshooting.html | 4 ++-- panel/0.7/upgrade/0.6_to_0.7.html | 4 ++-- panel/0.7/upgrade/0.7.html | 4 ++-- panel/0.7/upgrading.html | 4 ++-- panel/0.7/webserver_configuration.html | 4 ++-- panel/1.0/additional_configuration.html | 4 ++-- panel/1.0/getting_started.html | 4 ++-- panel/1.0/legacy_upgrade.html | 4 ++-- panel/1.0/troubleshooting.html | 4 ++-- panel/1.0/updating.html | 4 ++-- panel/1.0/webserver_configuration.html | 4 ++-- project/about.html | 4 ++-- project/community.html | 4 ++-- project/introduction.html | 4 ++-- project/terms.html | 4 ++-- tutorials/creating_ssl_certificates.html | 4 ++-- tutorials/mysql_setup.html | 4 ++-- wings/1.0/configuration.html | 4 ++-- wings/1.0/installing.html | 10 +++++----- wings/1.0/migrating.html | 4 ++-- wings/1.0/upgrading.html | 4 ++-- 123 files changed, 182 insertions(+), 182 deletions(-) create mode 100644 assets/img/node_allocations.323d67f2.png rename assets/js/{12.9bbfc2f6.js => 12.55bef2af.js} (99%) rename assets/js/{14.2e96f1b8.js => 14.57b7488c.js} (99%) rename assets/js/{17.67e35315.js => 17.c2840444.js} (98%) create mode 100644 assets/js/19.308a7ac5.js rename assets/js/{19.bb80f931.js => 20.b1deab3a.js} (99%) delete mode 100644 assets/js/21.abae94a8.js rename assets/js/{20.d065b2c5.js => 21.d6c9c101.js} (98%) rename assets/js/{22.3ff292b3.js => 22.db83ce68.js} (98%) rename assets/js/{23.6b778859.js => 23.3a0120cf.js} (74%) rename assets/js/{24.18e132d5.js => 24.6e894c0a.js} (86%) rename assets/js/{28.17b33d85.js => 28.317f71e4.js} (62%) rename assets/js/{29.9c25f524.js => 29.69216217.js} (62%) rename assets/js/{30.34c4472a.js => 30.8204ea7c.js} (92%) rename assets/js/{31.4a35c00f.js => 31.e7b25719.js} (99%) rename assets/js/{32.d98a3373.js => 32.db8f117e.js} (97%) rename assets/js/{33.88a8819c.js => 33.731812d7.js} (97%) rename assets/js/{34.0edc39f4.js => 34.30f48224.js} (99%) rename assets/js/{35.969d92c8.js => 35.39990a3a.js} (99%) rename assets/js/{36.49b831e2.js => 36.8ec9602c.js} (99%) rename assets/js/{37.46d8127b.js => 37.81b1b06a.js} (99%) rename assets/js/{38.9d9c367c.js => 38.e1f447b2.js} (99%) rename assets/js/{39.4e9577b6.js => 39.d8c67b81.js} (99%) rename assets/js/{4.9dfb277d.js => 4.6431cc96.js} (99%) rename assets/js/{40.273f9b41.js => 40.f8a8112a.js} (97%) rename assets/js/{41.32790d14.js => 41.bdff0171.js} (97%) rename assets/js/{42.d9689e6d.js => 42.89114514.js} (97%) rename assets/js/{43.9992155a.js => 43.40649380.js} (97%) rename assets/js/{44.e7f6dd0e.js => 44.ad1ccee8.js} (97%) rename assets/js/{45.32b9b890.js => 45.e976638f.js} (97%) rename assets/js/{46.c04b0749.js => 46.f2988dba.js} (99%) rename assets/js/{47.8a528b5d.js => 47.3dc1dfde.js} (99%) rename assets/js/{48.0bb564a9.js => 48.c14d7ed1.js} (98%) rename assets/js/{49.70313a9d.js => 49.fc33633a.js} (98%) rename assets/js/{50.6b4f4718.js => 50.fb19455f.js} (98%) rename assets/js/{51.75e9c6d8.js => 51.786f6418.js} (98%) rename assets/js/{52.5803bd20.js => 52.24fbb394.js} (97%) rename assets/js/{53.c0284790.js => 53.c517ee4e.js} (98%) rename assets/js/{54.14aa3f16.js => 54.11009636.js} (97%) rename assets/js/{55.4e7ca13f.js => 55.dac5f93e.js} (95%) rename assets/js/{56.cbbea30d.js => 56.f286a8ea.js} (97%) rename assets/js/{57.b9237770.js => 57.4f76cdaf.js} (98%) rename assets/js/{58.df220808.js => 58.78f0d59d.js} (99%) rename assets/js/{59.06f08aee.js => 59.7681f6ba.js} (98%) rename assets/js/{60.a3853cbe.js => 60.cdccfa2a.js} (99%) rename assets/js/{61.360ebc59.js => 61.bca7dd5a.js} (99%) rename assets/js/{62.db0d6812.js => 62.0d6c7a24.js} (98%) rename assets/js/{63.8a89fed0.js => 63.318bb69c.js} (98%) rename assets/js/{64.8fe43c5c.js => 64.b0806748.js} (97%) rename assets/js/{65.d4df1bb2.js => 65.3ca34732.js} (99%) rename assets/js/{66.6cb57e40.js => 66.ef6f7035.js} (98%) rename assets/js/{67.cc039676.js => 67.38d5b57b.js} (99%) rename assets/js/{68.0031d838.js => 68.321dd68b.js} (99%) rename assets/js/{69.74d5f183.js => 69.0a4d59ac.js} (99%) rename assets/js/{70.2c6f25e4.js => 70.e5c87b26.js} (99%) rename assets/js/{71.f94f8363.js => 71.cd5fcd07.js} (99%) rename assets/js/{72.be219eed.js => 72.c1a0015d.js} (99%) rename assets/js/{73.11b803e4.js => 73.0f242c47.js} (98%) rename assets/js/{74.282a4100.js => 74.3dbad093.js} (97%) rename assets/js/{75.7fd29139.js => 75.b2e7a917.js} (99%) rename assets/js/{76.52a50904.js => 76.408e20f8.js} (99%) rename assets/js/{77.c4108655.js => 77.87c74d94.js} (99%) rename assets/js/{78.eff775df.js => 78.4e09480d.js} (96%) rename assets/js/{app.8b0b6dd8.js => app.a2e98793.js} (93%) create mode 100644 node_allocations.png diff --git a/404.html b/404.html index 76dd1c99..e4e4d6a6 100644 --- a/404.html +++ b/404.html @@ -15,7 +15,7 @@ - + @@ -44,6 +44,6 @@ current

  • - + diff --git a/assets/img/node_allocations.323d67f2.png b/assets/img/node_allocations.323d67f2.png new file mode 100644 index 0000000000000000000000000000000000000000..c7547b6a1bfc0e4822397a4a41a01a2c31c93112 GIT binary patch literal 129194 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")]),A._v(" with the allocated localhost ports of the game servers.")]),A._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[A._v("WARNING")]),A._v(" "),a("p",[A._v("The following commands will allow any server on the node to access the opened ports.")])]),A._v(" "),a("h4",{attrs:{id:"ufw-ubuntu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ufw-ubuntu"}},[A._v("#")]),A._v(" UFW (Ubuntu)")]),A._v(" "),a("p",[A._v("Allow access to the pterodactyl pterodactyl0 network on a specific port.")]),A._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[A._v("ufw allow "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("in")]),A._v(" on pterodactyl0 to "),a("span",{pre:!0,attrs:{class:"token number"}},[A._v("172.18")]),A._v(".0.1 port "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("<")]),A._v("LOCALHOST_PORT"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v(">")]),A._v(" proto tcp\n")])])]),a("h4",{attrs:{id:"firewalld-centos"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-centos"}},[A._v("#")]),A._v(" Firewalld (CentOS)")]),A._v(" "),a("p",[A._v("Allow access to pterodactyl0 from the pterodactyl0 network.")]),A._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[A._v("WARNING")]),A._v(" "),a("p",[A._v("This command will allow any server to access all other servers as well as all ports on the node.")])]),A._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[A._v("firewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v("public --add-source"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[A._v("172.18")]),A._v(".0.1\n")])])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{358:function(A,e){A.exports="data:image/png;base64,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"},359:function(A,e){A.exports="data:image/png;base64,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"},360:function(A,e){A.exports="data:image/png;base64,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"},361:function(A,e){A.exports="data:image/png;base64,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"},375:function(A,e,t){"use strict";t.r(e);var a=t(48),s=Object(a.a)({},(function(){var A=this,e=A.$createElement,a=A._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[a("h1",{attrs:{id:"minecraft"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#minecraft"}},[A._v("#")]),A._v(" Minecraft")]),A._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#configuring-a-server-network-bungeecord-waterfall-hexacord-etc"}},[A._v("Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)")]),a("ul",[a("li",[a("a",{attrs:{href:"#allocations-in-the-panel"}},[A._v("Allocations in the Panel")])]),a("li",[a("a",{attrs:{href:"#proxy-server-settings"}},[A._v("proxy server settings")])]),a("li",[a("a",{attrs:{href:"#paper-spigot-bukkit-settings"}},[A._v("paper/spigot/bukkit settings")])]),a("li",[a("a",{attrs:{href:"#firewalls"}},[A._v("Firewalls")])])])])])]),a("p"),A._v(" "),a("h2",{attrs:{id:"configuring-a-server-network-bungeecord-waterfall-hexacord-etc"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-a-server-network-bungeecord-waterfall-hexacord-etc"}},[A._v("#")]),A._v(" Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)")]),A._v(" "),a("p",[A._v("If you want to operate Minecraft proxy servers like BungeeCord, Waterfall, HexaCord, etc. securely, you can do so with pterodactyl alone as long as you stay on the same node. It differs from a traditional setup in a few ways and might require additonal firewall rules, which is what this guide is for.")]),A._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[A._v("WARNING")]),A._v(" "),a("p",[A._v("For the setup described below, it is necessary that all servers are on the same node.")])]),A._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[A._v("DANGER")]),A._v(" "),a("p",[A._v("If you are a hosting provider, you should only allow a single proxy network per node, if you are selling them to customers.")])]),A._v(" "),a("h3",{attrs:{id:"allocations-in-the-panel"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#allocations-in-the-panel"}},[A._v("#")]),A._v(" Allocations in the Panel")]),A._v(" "),a("p",[A._v("Create a regular allocation for the proxy server which uses the external IP of the node, so users can reach it.")]),A._v(" "),a("p",[A._v("The actual game servers behind the proxy should use allocations with "),a("code",[A._v("127.0.0.1")]),A._v(" as the address, so they are only reachable on the node, and not from the public.")]),A._v(" "),a("h4",{attrs:{id:"example"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[A._v("#")]),A._v(" Example")]),A._v(" "),a("p",[a("img",{attrs:{src:t(358),alt:""}})]),A._v(" "),a("p",[a("code",[A._v("10.1.70.62")]),A._v(" is an example, replace it with your own public IP address.")]),A._v(" "),a("h3",{attrs:{id:"proxy-server-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#proxy-server-settings"}},[A._v("#")]),A._v(" proxy server settings")]),A._v(" "),a("p",[A._v("As the proxy server, like all servers, is running in a docker container with network isolation, "),a("code",[A._v("localhost")]),A._v("/"),a("code",[A._v("127.0.0.1")]),A._v(" doesn't refer to the node, but to the container. The node can be reached from within the container using "),a("code",[A._v("172.18.0.1")]),A._v(" (unless the pterodactyl network is configured differently) instead. You therefore need to use this IP in your proxy server configuration.")]),A._v(" "),a("h4",{attrs:{id:"bungeecord-waterfall-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bungeecord-waterfall-configuration"}},[A._v("#")]),A._v(" bungeecord/waterfall configuration")]),A._v(" "),a("p",[A._v("This will be different for other proxy servers, please refer to their documentation.")]),A._v(" "),a("p",[a("img",{attrs:{src:t(359),alt:""}})]),A._v(" "),a("h3",{attrs:{id:"paper-spigot-bukkit-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#paper-spigot-bukkit-settings"}},[A._v("#")]),A._v(" paper/spigot/bukkit settings")]),A._v(" "),a("p",[A._v("The servers itself require the regular config options required by server proxies, which usually comes down to disabling online mode. This will differ for other server software, please refer to their documentation.")]),A._v(" "),a("h4",{attrs:{id:"server-properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-properties"}},[A._v("#")]),A._v(" server.properties")]),A._v(" "),a("p",[A._v("set online-mode "),a("code",[A._v("false")]),A._v(" "),a("img",{attrs:{src:t(360),alt:""}})]),A._v(" "),a("h4",{attrs:{id:"spigot-yml"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spigot-yml"}},[A._v("#")]),A._v(" spigot.yml")]),A._v(" "),a("p",[A._v("set bungeecord to "),a("code",[A._v("true")]),A._v(" "),a("img",{attrs:{src:t(361),alt:""}})]),A._v(" "),a("h3",{attrs:{id:"firewalls"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalls"}},[A._v("#")]),A._v(" Firewalls")]),A._v(" "),a("p",[A._v("If you are using a firewall, additional rules might be required to allow servers to reach each other on the node. In this case the proxy server needs to reach all of the game servers behind it. Therefore we need to allow traffic from the pterodactyl network to the server ports on localhost.")]),A._v(" "),a("p",[A._v("You can use the following commands as an example. "),a("code",[A._v("172.18.0.1")]),A._v(" is the default address referring to the node within the pterodactyl network. Replace "),a("code",[A._v("")]),A._v(" with the allocated localhost ports of the game servers.")]),A._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[A._v("WARNING")]),A._v(" "),a("p",[A._v("The following commands will allow any server on the node to access the opened ports.")])]),A._v(" "),a("h4",{attrs:{id:"ufw-ubuntu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ufw-ubuntu"}},[A._v("#")]),A._v(" UFW (Ubuntu)")]),A._v(" "),a("p",[A._v("Allow access to the pterodactyl pterodactyl0 network on a specific port.")]),A._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[A._v("ufw allow "),a("span",{pre:!0,attrs:{class:"token keyword"}},[A._v("in")]),A._v(" on pterodactyl0 to "),a("span",{pre:!0,attrs:{class:"token number"}},[A._v("172.18")]),A._v(".0.1 port "),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("<")]),A._v("LOCALHOST_PORT"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v(">")]),A._v(" proto tcp\n")])])]),a("h4",{attrs:{id:"firewalld-centos"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-centos"}},[A._v("#")]),A._v(" Firewalld (CentOS)")]),A._v(" "),a("p",[A._v("Allow access to pterodactyl0 from the pterodactyl0 network.")]),A._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[A._v("WARNING")]),A._v(" "),a("p",[A._v("This command will allow any server to access all other servers as well as all ports on the node.")])]),A._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[A._v("firewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),A._v("public --add-source"),a("span",{pre:!0,attrs:{class:"token operator"}},[A._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[A._v("172.18")]),A._v(".0.1\n")])])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/17.67e35315.js b/assets/js/17.c2840444.js similarity index 98% rename from assets/js/17.67e35315.js rename to assets/js/17.c2840444.js index 75ebaf15..499b0b41 100644 --- a/assets/js/17.67e35315.js +++ b/assets/js/17.c2840444.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{355:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_create_button.05642c32.png"},356:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_new_page.17d70664.png"},357:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_config.f87f425f.png"},371:function(t,e,o){"use strict";o.r(e);var a=o(48),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"creating-a-new-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-node"}},[t._v("#")]),t._v(" Creating a New Node")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#location"}},[t._v("Location")])]),a("li",[a("a",{attrs:{href:"#information-required"}},[t._v("Information Required")])]),a("li",[a("a",{attrs:{href:"#install-the-daemon"}},[t._v("Install the Daemon")])]),a("li",[a("a",{attrs:{href:"#configuring-the-node"}},[t._v("Configuring the Node")]),a("ul",[a("li",[a("a",{attrs:{href:"#auto-deploy"}},[t._v("Auto-Deploy")])])])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"location"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#location"}},[t._v("#")]),t._v(" Location")]),t._v(" "),a("p",[t._v("Head to the admin panel and click the Nodes tab on the left sidebar. After that, click 'Create New' on the\ntop right side to open the page to add a node.")]),t._v(" "),a("p",[a("img",{attrs:{src:o(355),alt:""}})]),t._v(" "),a("h2",{attrs:{id:"information-required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#information-required"}},[t._v("#")]),t._v(" Information Required")]),t._v(" "),a("p",[a("img",{attrs:{src:o(356),alt:""}})]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Name")]),t._v(": a quick identifiable name for the node.")]),t._v(" "),a("li",[a("strong",[t._v("Description")]),t._v(": a long description that is used to help you identify the node.")]),t._v(" "),a("li",[a("strong",[t._v("Location")]),t._v(": the location you want the node in. These are configured in the 'Locations' section of the panel and one\nmust be created before a node can be created. These simply act as categories for nodes and serve no other purpose at\nthis time.")]),t._v(" "),a("li",[a("strong",[t._v("FQDN")]),t._v(": the fully qualified domain name for the node — for example: "),a("code",[t._v("node.pterodactyl.io")])]),t._v(" "),a("li",[a("strong",[t._v("Communicate over SSL")]),t._v(": if the panel is using SSL the Daemon is required to use SSL as well.")]),t._v(" "),a("li",[a("strong",[t._v("Behind Proxy")]),t._v(": if you have the Daemon behind a proxy that terminates SSL connections before arriving at the Daemon\nthen this option should be selected. If none of that sentence made sense, this doesn't affect you.")]),t._v(" "),a("li",[a("strong",[t._v("Server File Directory")]),t._v(": the location on the physical server where the daemon is to store the files the servers\ngenerate. By default this is "),a("code",[t._v("/var/lib/pterodactyl/volumes")]),t._v(".")])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("OVH Users")]),t._v(" "),a("p",[t._v("Some OVH users regularly have their "),a("code",[t._v("/home")]),t._v(" folder be the largest filesystem. You may want to change to use\n"),a("code",[t._v("/home/pterodactyl/volumes")]),t._v(" if you are on a default OVH box.")])]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Total Memory")]),t._v(": the total amount of RAM the node should be able to allocate automatically.")]),t._v(" "),a("li",[a("strong",[t._v("Memory Overallocate")]),t._v(": the percentage of RAM to over-allocate on a node. For example, if you have set a 10GB memory\nlimit, with a 20% overallocation, the Panel will allocate up to 12GB of memory on this node in total.")]),t._v(" "),a("li",[a("strong",[t._v("Total Disk Space")]),t._v(": the total amount of disk space the node should be able to allocate automatically.")]),t._v(" "),a("li",[a("strong",[t._v("Disk Overallocate")]),t._v(": works the same way as memory overallocation.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),a("p",[t._v("Don't forget to account for OS overhead and other software requirements on machines.")])]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Daemon Port")]),t._v(": the port that the Daemon should listen on.")]),t._v(" "),a("li",[a("strong",[t._v("Daemon SFTP Port")]),t._v(": the port the Daemon sftp-server or standalone SFTP server should listen on.")])]),t._v(" "),a("h2",{attrs:{id:"install-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-the-daemon"}},[t._v("#")]),t._v(" Install the Daemon")]),t._v(" "),a("p",[t._v("At this point you'll need to have the Daemon installed on your machine. Check out the "),a("RouterLink",{attrs:{to:"/wings/installing.html"}},[t._v("documentation")]),t._v("\nfor more information, or try one of the community guides for "),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/centos7.html"}},[t._v("CentOS")]),t._v(",\n"),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/ubuntu1804.html"}},[t._v("Ubuntu")]),t._v(", or "),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/debian9.html"}},[t._v("Debian")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"configuring-the-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-node"}},[t._v("#")]),t._v(" Configuring the Node")]),t._v(" "),a("p",[t._v("Go to the Node Configuration page")]),t._v(" "),a("p",[a("img",{attrs:{src:o(357),alt:""}})]),t._v(" "),a("p",[t._v("Copy and paste the config into the "),a("code",[t._v("config.yml")]),t._v(" file. (Default location is "),a("code",[t._v("/etc/pterodactyl/config.yml")]),t._v(")")]),t._v(" "),a("h3",{attrs:{id:"auto-deploy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-deploy"}},[t._v("#")]),t._v(" Auto-Deploy")]),t._v(" "),a("p",[t._v("This will generate a command to run on the node server to configure the daemon for you.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{355:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_create_button.05642c32.png"},356:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_new_page.17d70664.png"},357:function(t,e,o){t.exports=o.p+"assets/img/pterodactyl_add_node_config.f87f425f.png"},372:function(t,e,o){"use strict";o.r(e);var a=o(48),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"creating-a-new-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-node"}},[t._v("#")]),t._v(" Creating a New Node")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#location"}},[t._v("Location")])]),a("li",[a("a",{attrs:{href:"#information-required"}},[t._v("Information Required")])]),a("li",[a("a",{attrs:{href:"#install-the-daemon"}},[t._v("Install the Daemon")])]),a("li",[a("a",{attrs:{href:"#configuring-the-node"}},[t._v("Configuring the Node")]),a("ul",[a("li",[a("a",{attrs:{href:"#auto-deploy"}},[t._v("Auto-Deploy")])])])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"location"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#location"}},[t._v("#")]),t._v(" Location")]),t._v(" "),a("p",[t._v("Head to the admin panel and click the Nodes tab on the left sidebar. After that, click 'Create New' on the\ntop right side to open the page to add a node.")]),t._v(" "),a("p",[a("img",{attrs:{src:o(355),alt:""}})]),t._v(" "),a("h2",{attrs:{id:"information-required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#information-required"}},[t._v("#")]),t._v(" Information Required")]),t._v(" "),a("p",[a("img",{attrs:{src:o(356),alt:""}})]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Name")]),t._v(": a quick identifiable name for the node.")]),t._v(" "),a("li",[a("strong",[t._v("Description")]),t._v(": a long description that is used to help you identify the node.")]),t._v(" "),a("li",[a("strong",[t._v("Location")]),t._v(": the location you want the node in. These are configured in the 'Locations' section of the panel and one\nmust be created before a node can be created. These simply act as categories for nodes and serve no other purpose at\nthis time.")]),t._v(" "),a("li",[a("strong",[t._v("FQDN")]),t._v(": the fully qualified domain name for the node — for example: "),a("code",[t._v("node.pterodactyl.io")])]),t._v(" "),a("li",[a("strong",[t._v("Communicate over SSL")]),t._v(": if the panel is using SSL the Daemon is required to use SSL as well.")]),t._v(" "),a("li",[a("strong",[t._v("Behind Proxy")]),t._v(": if you have the Daemon behind a proxy that terminates SSL connections before arriving at the Daemon\nthen this option should be selected. If none of that sentence made sense, this doesn't affect you.")]),t._v(" "),a("li",[a("strong",[t._v("Server File Directory")]),t._v(": the location on the physical server where the daemon is to store the files the servers\ngenerate. By default this is "),a("code",[t._v("/var/lib/pterodactyl/volumes")]),t._v(".")])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("OVH Users")]),t._v(" "),a("p",[t._v("Some OVH users regularly have their "),a("code",[t._v("/home")]),t._v(" folder be the largest filesystem. You may want to change to use\n"),a("code",[t._v("/home/pterodactyl/volumes")]),t._v(" if you are on a default OVH box.")])]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Total Memory")]),t._v(": the total amount of RAM the node should be able to allocate automatically.")]),t._v(" "),a("li",[a("strong",[t._v("Memory Overallocate")]),t._v(": the percentage of RAM to over-allocate on a node. For example, if you have set a 10GB memory\nlimit, with a 20% overallocation, the Panel will allocate up to 12GB of memory on this node in total.")]),t._v(" "),a("li",[a("strong",[t._v("Total Disk Space")]),t._v(": the total amount of disk space the node should be able to allocate automatically.")]),t._v(" "),a("li",[a("strong",[t._v("Disk Overallocate")]),t._v(": works the same way as memory overallocation.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),a("p",[t._v("Don't forget to account for OS overhead and other software requirements on machines.")])]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Daemon Port")]),t._v(": the port that the Daemon should listen on.")]),t._v(" "),a("li",[a("strong",[t._v("Daemon SFTP Port")]),t._v(": the port the Daemon sftp-server or standalone SFTP server should listen on.")])]),t._v(" "),a("h2",{attrs:{id:"install-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-the-daemon"}},[t._v("#")]),t._v(" Install the Daemon")]),t._v(" "),a("p",[t._v("At this point you'll need to have the Daemon installed on your machine. Check out the "),a("RouterLink",{attrs:{to:"/wings/installing.html"}},[t._v("documentation")]),t._v("\nfor more information, or try one of the community guides for "),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/centos7.html"}},[t._v("CentOS")]),t._v(",\n"),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/ubuntu1804.html"}},[t._v("Ubuntu")]),t._v(", or "),a("RouterLink",{attrs:{to:"/community/installation-guides/wings/debian9.html"}},[t._v("Debian")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"configuring-the-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-node"}},[t._v("#")]),t._v(" Configuring the Node")]),t._v(" "),a("p",[t._v("Go to the Node Configuration page")]),t._v(" "),a("p",[a("img",{attrs:{src:o(357),alt:""}})]),t._v(" "),a("p",[t._v("Copy and paste the config into the "),a("code",[t._v("config.yml")]),t._v(" file. (Default location is "),a("code",[t._v("/etc/pterodactyl/config.yml")]),t._v(")")]),t._v(" "),a("h3",{attrs:{id:"auto-deploy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-deploy"}},[t._v("#")]),t._v(" Auto-Deploy")]),t._v(" "),a("p",[t._v("This will generate a command to run on the node server to configure the daemon for you.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/19.308a7ac5.js b/assets/js/19.308a7ac5.js new file mode 100644 index 00000000..f6f7ea92 --- /dev/null +++ b/assets/js/19.308a7ac5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{339:function(e,t,a){e.exports=a.p+"assets/img/wings_configuration_example.9f3fdd0b.png"},364:function(e,t,a){e.exports=a.p+"assets/img/node_allocations.323d67f2.png"},422: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:"installing-wings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[e._v("#")]),e._v(" Installing Wings")]),e._v(" "),s("p",[e._v("Wings is the next generation server control plane from Pterodactyl. It has been rebuilt from the\nground up using Go and lessons learned from our first Nodejs Daemon.")]),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 only install Wings if you are running "),s("strong",[e._v("Pterodactyl 1.x")]),e._v(". Do not install this software\nfor previous versions of Pterodactyl.")])]),e._v(" "),s("h2",{attrs:{id:"supported-systems"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#supported-systems"}},[e._v("#")]),e._v(" Supported Systems")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Operating System")]),e._v(" "),s("th",[e._v("Version")]),e._v(" "),s("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),s("th",[e._v("Notes")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("Ubuntu")])]),e._v(" "),s("td",[e._v("18.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[e._v("20.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("CentOS")])]),e._v(" "),s("td",[e._v("7")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[e._v("8")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("Debian")])]),e._v(" "),s("td",[e._v("9")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[e._v("10")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")])])]),e._v(" "),s("h2",{attrs:{id:"system-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),s("p",[e._v("In order to run Wings you will need a system capable of running Docker containers. Most VPS and almost all\ndedicated servers should be capable of running Docker, but there are edge cases.")]),e._v(" "),s("p",[e._v("If your provider makes use of "),s("code",[e._v("Virtuozzo")]),e._v(", "),s("code",[e._v("OpenVZ")]),e._v(" (or "),s("code",[e._v("OVZ")]),e._v("), or "),s("code",[e._v("LXC")]),e._v(" then you will most likely be unable to\nrun Wings. If you are unsure what your host is using there are a couple of options. The easiest is to check\ntheir website, or reach out to their support team.")]),e._v(" "),s("p",[e._v("If you want to take a different approach, try using "),s("code",[e._v("lscpu")]),e._v(" and checking what the virtualization type listed is. An\nexample of this is shown below which shows my hypervisor running with full virtualization — this means it will\nsupport Docker without issues. If you see "),s("code",[e._v("KVM")]),e._v(" for the vendor, chances are you're fine as well.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@pterodactyl:~$ lscpu "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v("'vendor\\|type'")]),e._v("\nHypervisor vendor: VMware\nVirtualization type: full\n")])])]),s("p",[e._v("If that doesn't work for some reason, or you're still unsure, you can also run the command below and as long as it\ndoesn't report "),s("code",[e._v("Xen")]),e._v(" or "),s("code",[e._v("LXC")]),e._v(" you're probably okay to continue.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@pterodactyl:~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" dmidecode -s system-manufacturer\nVMware, Inc.\n")])])]),s("h2",{attrs:{id:"dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),s("ul",[s("li",[e._v("curl")]),e._v(" "),s("li",[e._v("Docker")])]),e._v(" "),s("h3",{attrs:{id:"installing-docker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-docker"}},[e._v("#")]),e._v(" Installing Docker")]),e._v(" "),s("p",[e._v("For a quick install of Docker CE, you can execute the command below:")]),e._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 function"}},[e._v("curl")]),e._v(" -sSL https://get.docker.com/ "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CHANNEL")]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("stable "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n")])])]),s("p",[e._v("If you would rather do a manual installation, please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),s("OutboundLink")],1)])]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("Check your Kernel")]),e._v(" "),s("p",[e._v("Please be aware that some hosts install a modified kernel that does not support important docker features. Please\ncheck your kernel by running "),s("code",[e._v("uname -r")]),e._v(". If your kernel ends in "),s("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or "),s("code",[e._v("-xxxx-mod-std-ipv6-64")]),e._v(" you're\nprobably using a non-supported kernel. Check our "),s("RouterLink",{attrs:{to:"/wings/1.0/kernel_modifications.html"}},[e._v("Kernel Modifications")]),e._v(" guide for details.")],1)]),e._v(" "),s("h4",{attrs:{id:"start-docker-on-boot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-docker-on-boot"}},[e._v("#")]),e._v(" Start Docker on Boot")]),e._v(" "),s("p",[e._v("If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now docker\n")])])]),s("h4",{attrs:{id:"enabling-swap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enabling-swap"}},[e._v("#")]),e._v(" Enabling Swap")]),e._v(" "),s("p",[e._v("On most systems, docker will be unable to setup swap space, you can check if this is the case by running "),s("code",[e._v("docker info")]),e._v(".\nIf it outputs "),s("code",[e._v("WARNING: No swap limit support")]),e._v(" near the bottom, this is the case. Enabling swap is completely optional,\nbut we recommended doing it if you will be hosting for others, and to prevent OOM errors.")]),e._v(" "),s("p",[e._v("To do so, open "),s("code",[e._v("/etc/default/grub")]),e._v(" as a root user, and find the line starting with "),s("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(". Make\nsure the line includes "),s("code",[e._v("swapaccount=1")]),e._v(".")]),e._v(" "),s("p",[e._v("After doing that, simply run "),s("code",[e._v("sudo update-grub")]),e._v(" followed by "),s("code",[e._v("sudo reboot")]),e._v(" to restart the server and have swap enabled.\nBelow is an example of what the line should look like, "),s("em",[e._v("do not copy this line verbatium, it often has additional\nOS specific parameters.")])]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1"\n')])])]),s("h2",{attrs:{id:"installing-wings-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings-2"}},[e._v("#")]),e._v(" Installing Wings")]),e._v(" "),s("p",[e._v("The first step for installing Wings is to make sure we have the required directory structure setup. To do so,\nrun the commands below which will create the base directory and download the wings executable.")]),e._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 function"}},[e._v("mkdir")]),e._v(" -p /etc/pterodactyl\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" u+x /usr/local/bin/wings\n")])])]),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("OVH/SYS Servers")]),e._v(" "),s("p",[e._v("If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to\n"),s("code",[e._v("/home")]),e._v(", and not "),s("code",[e._v("/")]),e._v(" by default. Please consider using "),s("code",[e._v("/home/daemon-data")]),e._v(" for server data. This can be easily\nset when creating the node.")])]),e._v(" "),s("h2",{attrs:{id:"configure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure"}},[e._v("#")]),e._v(" Configure")]),e._v(" "),s("p",[e._v("Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button.")]),e._v(" "),s("p",[e._v("After you have created a node, click on it and there will be a tab called Configuration. Copy the code block content, paste it into a new file called "),s("code",[e._v("config.yml")]),e._v(" in "),s("code",[e._v("/etc/pterodactyl")]),e._v(" and save it.")]),e._v(" "),s("p",[e._v("Alternatively, you can click on the Generate Token button, copy the bash command and paste it into your terminal.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(339),alt:""}})]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("When your Panel is using SSL, the Wings must also have one created for its FQDN. See "),s("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[e._v("Creating SSL Certificates")]),e._v(" documentation page for how to create these certificates before continuing.")],1)]),e._v(" "),s("h3",{attrs:{id:"starting-wings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#starting-wings"}},[e._v("#")]),e._v(" Starting Wings")]),e._v(" "),s("p",[e._v("To start Wings, simply run the command below, which will start it in a debug mode. Once you confirmed that it is running without errors, use "),s("code",[e._v("CTRL+C")]),e._v(" to terminate the process and daemonize it by following the instructions below. Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes.")]),e._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 function"}},[e._v("sudo")]),e._v(" wings --debug\n")])])]),s("p",[e._v("You may optionally add the "),s("code",[e._v("--debug")]),e._v(" flag to run Wings in debug mode.")]),e._v(" "),s("h3",{attrs:{id:"daemonizing-using-systemd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#daemonizing-using-systemd"}},[e._v("#")]),e._v(" Daemonizing (using systemd)")]),e._v(" "),s("p",[e._v("Running Wings in the background is a simple task, just make sure that it runs without errors before doing\nthis. Place the contents below in a file called "),s("code",[e._v("wings.service")]),e._v(" in the "),s("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\nRequires=docker.service\nPartOf=docker.service\n\n[Service]\nUser=root\nWorkingDirectory=/etc/pterodactyl\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/local/bin/wings\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[e._v("Then, run the commands below to reload systemd and start Wings.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now wings\n")])])]),s("h3",{attrs:{id:"node-allocations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#node-allocations"}},[e._v("#")]),e._v(" Node Allocations")]),e._v(" "),s("p",[e._v("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.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(364),alt:""}})]),e._v(" "),s("p",[e._v("Type "),s("code",[e._v("hostname -I | awk '{print $1}'")]),e._v(" to find the IP to be used for the allocation. Alternatively, you can type "),s("code",[e._v('ip addr | grep "inet "')]),e._v(" to see all your available interfaces and IP addresses. Do not use 127.0.0.1 for allocations.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/19.bb80f931.js b/assets/js/20.b1deab3a.js similarity index 99% rename from assets/js/19.bb80f931.js rename to assets/js/20.b1deab3a.js index 0c4586be..a642ad32 100644 --- a/assets/js/19.bb80f931.js +++ b/assets/js/20.b1deab3a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{362:function(e,t,a){e.exports=a.p+"assets/img/daemon_configuration_example.7d1665c4.png"},390: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:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("This specific software is for Pterodactyl v0.7 and "),s("strong",[e._v("must not be used for Pterodactyl v1.0")]),e._v(". If you have installed 1.0 you should use "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" instead.")],1)]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#supported-systems"}},[e._v("Supported Systems")])]),s("li",[s("a",{attrs:{href:"#system-requirements"}},[e._v("System Requirements")])]),s("li",[s("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),s("ul",[s("li",[s("a",{attrs:{href:"#installing-docker"}},[e._v("Installing Docker")])]),s("li",[s("a",{attrs:{href:"#installing-nodejs"}},[e._v("Installing Nodejs")])])])]),s("li",[s("a",{attrs:{href:"#installing-daemon-software"}},[e._v("Installing Daemon Software")])]),s("li",[s("a",{attrs:{href:"#configure-daemon"}},[e._v("Configure Daemon")])]),s("li",[s("a",{attrs:{href:"#starting-the-daemon"}},[e._v("Starting the Daemon")]),s("ul",[s("li",[s("a",{attrs:{href:"#daemonizing-using-systemd"}},[e._v("Daemonizing (using systemd)")])])])])])]),s("p"),e._v(" "),s("h2",{attrs:{id:"supported-systems"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#supported-systems"}},[e._v("#")]),e._v(" Supported Systems")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Operating System")]),e._v(" "),s("th",[e._v("Version")]),e._v(" "),s("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),s("th",[e._v("Notes")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("Ubuntu")])]),e._v(" "),s("td",[e._v("18.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/ubuntu2004.html"}},[e._v("20.04")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("CentOS")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos7.html"}},[e._v("7")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("⚠️")]),e._v(" "),s("td",[e._v("Extra repos are required")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos8.html"}},[e._v("8")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("Debian")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian9.html"}},[e._v("9")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian10.html"}},[e._v("10")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")])])]),e._v(" "),s("h2",{attrs:{id:"system-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),s("p",[e._v("In order to run the Daemon you will need a system capable of running Docker containers. Most VPS and almost all\ndedicated servers should be capable of running Docker, but there are edge cases.")]),e._v(" "),s("p",[e._v("If your provider makes use of "),s("code",[e._v("Virtuozzo")]),e._v(", "),s("code",[e._v("OpenVZ")]),e._v(" (or "),s("code",[e._v("OVZ")]),e._v("), or "),s("code",[e._v("LXC")]),e._v(" then you will most likely be unable to\nrun the Daemon. If you are unsure what your host is using there are a couple of options. The easiest is to check\ntheir website, or reach out to their support team.")]),e._v(" "),s("p",[e._v("If you want to take a different approach, try using "),s("code",[e._v("lscpu")]),e._v(" and checking what the virtualization type listed is. An\nexample of this is shown below which shows my hypervisor running with full virtualization — this means it will\nsupport Docker without issues. If you see "),s("code",[e._v("KVM")]),e._v(" for the vendor, chances are you're fine as well.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@daemon:~$ lscpu "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v("'vendor\\|type'")]),e._v("\nHypervisor vendor: VMware\nVirtualization type: full\n")])])]),s("p",[e._v("If that doesn't work for some reason, or you're still unsure, you can also run the command below and as long as it\ndoesn't report "),s("code",[e._v("Xen")]),e._v(" or "),s("code",[e._v("LXC")]),e._v(" you're probably okay to continue.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@daemon:~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" dmidecode -s system-manufacturer\nVMware, Inc.\n")])])]),s("h2",{attrs:{id:"dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),s("p",[e._v("Pterodactyl's Daemon requires the following dependencies be installed on your system in order for it to operate.")]),e._v(" "),s("ul",[s("li",[e._v("Docker")]),e._v(" "),s("li",[e._v("Nodejs ("),s("code",[e._v("v10")]),e._v(", "),s("code",[e._v("v12")]),e._v(", higher versions likely work, but are untested)")]),e._v(" "),s("li",[s("code",[e._v("node-gyp")])]),e._v(" "),s("li",[s("code",[e._v("tar")])]),e._v(" "),s("li",[s("code",[e._v("unzip")])]),e._v(" "),s("li",[s("code",[e._v("make")]),e._v(", "),s("code",[e._v("gcc")]),e._v(" ("),s("code",[e._v("gcc-c++")]),e._v(" on CentOS), "),s("code",[e._v("g++")])]),e._v(" "),s("li",[s("code",[e._v("python")])])]),e._v(" "),s("h3",{attrs:{id:"installing-docker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-docker"}},[e._v("#")]),e._v(" Installing Docker")]),e._v(" "),s("p",[e._v("For a quick install of Docker CE, you can execute the command below:")]),e._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 function"}},[e._v("curl")]),e._v(" -sSL https://get.docker.com/ "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CHANNEL")]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("stable "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n")])])]),s("p",[e._v("If you would rather do a manual installation, please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),s("OutboundLink")],1)])]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("Check your Kernel")]),e._v(" "),s("p",[e._v("Please be aware that some hosts install a modified kernel that does not support important docker features. Please\ncheck your kernel by running "),s("code",[e._v("uname -r")]),e._v(". If your kernel ends in "),s("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or "),s("code",[e._v("-xxxx-mod-std-ipv6-64")]),e._v(" you're\nprobably using a non-supported kernel. Check our "),s("RouterLink",{attrs:{to:"/daemon/0.6/kernel_modifications.html"}},[e._v("Kernel Modifications")]),e._v(" guide for details.")],1)]),e._v(" "),s("h4",{attrs:{id:"start-docker-on-boot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-docker-on-boot"}},[e._v("#")]),e._v(" Start Docker on Boot")]),e._v(" "),s("p",[e._v("If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" docker\n")])])]),s("h4",{attrs:{id:"enabling-swap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enabling-swap"}},[e._v("#")]),e._v(" Enabling Swap")]),e._v(" "),s("p",[e._v("On most systems, docker will be unable to setup swap space, you can check if this is the case by running "),s("code",[e._v("docker info")]),e._v(".\nIf it outputs "),s("code",[e._v("WARNING: No swap limit support")]),e._v(" near the bottom, this is the case. Enabling swap is completely optional,\nbut we recommended doing it if you will be hosting for others, and to prevent OOM errors.")]),e._v(" "),s("p",[e._v("To do so, open "),s("code",[e._v("/etc/default/grub")]),e._v(" as a root user, and find the line starting with "),s("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(". Make\nsure the line includes "),s("code",[e._v("swapaccount=1")]),e._v(".")]),e._v(" "),s("p",[e._v("After doing that, simply run "),s("code",[e._v("sudo update-grub")]),e._v(" followed by "),s("code",[e._v("sudo reboot")]),e._v(" to restart the server and have swap enabled.\nBelow is an example of what the line should look like, "),s("em",[e._v("do not copy this line verbatium, it often has additional\nOS specific parameters.")])]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1"\n')])])]),s("h3",{attrs:{id:"installing-nodejs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-nodejs"}},[e._v("#")]),e._v(" Installing Nodejs")]),e._v(" "),s("p",[e._v("NodeJS is also super easy to install! Simply run the command below to make the package accessible to your system.")]),e._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 function"}},[e._v("curl")]),e._v(" -sL https://deb.nodesource.com/setup_10.x "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" -E "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v(" -\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" nodejs "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v(" gcc g++\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Other OS Distributions")]),e._v(" "),s("p",[e._v("If you are using CentOS, "),s("a",{attrs:{href:"https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora",target:"_blank",rel:"noopener noreferrer"}},[e._v("please follow these instructions"),s("OutboundLink")],1),e._v(". Ubuntu and Debian users may also follow the "),s("a",{attrs:{href:"https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions",target:"_blank",rel:"noopener noreferrer"}},[e._v("official\ninstructions provided by Nodejs"),s("OutboundLink")],1),e._v(".")])]),e._v(" "),s("h2",{attrs:{id:"installing-daemon-software"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-daemon-software"}},[e._v("#")]),e._v(" Installing Daemon Software")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("p",[e._v("The first step for installing the daemon is to make sure we have the required directory structure setup. To do so,\nrun the commands below.")]),e._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 function"}},[e._v("mkdir")]),e._v(" -p /srv/daemon /srv/daemon-data\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /srv/daemon\n")])])]),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("OVH/SYS Servers")]),e._v(" "),s("p",[e._v("If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to\n"),s("code",[e._v("/home")]),e._v(", and not "),s("code",[e._v("/")]),e._v(" by default. Please consider using "),s("code",[e._v("/home/daemon-data")]),e._v(" for server data. This can be easily\nset when creating the node.")])]),e._v(" "),s("p",[e._v("The next step is to download the software and unpack the archive.")]),e._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 function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.6.13/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),s("p",[e._v("Finally, we need to install the dependencies that allow the Daemon to run properly. This command will most likely\ntake a few minutes to run, please do not interrupt it.")]),e._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 function"}},[e._v("npm")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production --no-audit --unsafe-perm\n")])])]),s("h2",{attrs:{id:"configure-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-daemon"}},[e._v("#")]),e._v(" Configure Daemon")]),e._v(" "),s("p",[e._v("Once you have installed the daemon and required components, the next step is to create a node on your installed Panel\nOnce you have done that there will be a tab called Configuration when you view the node.")]),e._v(" "),s("p",[e._v("Simply copy and paste the code block and paste it into a file called "),s("code",[e._v("core.json")]),e._v(" in "),s("code",[e._v("/srv/daemon/config")]),e._v(" and save it.\nYou may also use the Auto-Deployment feature rather than manually creating the files.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(362),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"starting-the-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-daemon"}},[e._v("#")]),e._v(" Starting the Daemon")]),e._v(" "),s("p",[e._v("To start your daemon simply move into the daemon directory and run the command below which will start the daemon in\nforeground mode. Once you are done, use "),s("code",[e._v("CTRL+C")]),e._v(" to terminate the process. Depending on your server's internet connection\npulling and starting the Daemon for the first time may take a few minutes.")]),e._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 function"}},[e._v("sudo")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" start\n")])])]),s("h3",{attrs:{id:"daemonizing-using-systemd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#daemonizing-using-systemd"}},[e._v("#")]),e._v(" Daemonizing (using systemd)")]),e._v(" "),s("p",[e._v("Running Pterodactyl Daemon in the background is a simple task, just make sure that it runs without errors before doing\nthis. Place the contents below in a file called "),s("code",[e._v("wings.service")]),e._v(" in the "),s("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\n\n[Service]\nUser=root\n#Group=some_group\nWorkingDirectory=/srv/daemon\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/bin/node /srv/daemon/src/index.js\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[e._v("Then, run the commands below to reload systemd and start the daemon.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now wings\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{362:function(e,t,a){e.exports=a.p+"assets/img/daemon_configuration_example.7d1665c4.png"},391: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:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("This specific software is for Pterodactyl v0.7 and "),s("strong",[e._v("must not be used for Pterodactyl v1.0")]),e._v(". If you have installed 1.0 you should use "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" instead.")],1)]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#supported-systems"}},[e._v("Supported Systems")])]),s("li",[s("a",{attrs:{href:"#system-requirements"}},[e._v("System Requirements")])]),s("li",[s("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),s("ul",[s("li",[s("a",{attrs:{href:"#installing-docker"}},[e._v("Installing Docker")])]),s("li",[s("a",{attrs:{href:"#installing-nodejs"}},[e._v("Installing Nodejs")])])])]),s("li",[s("a",{attrs:{href:"#installing-daemon-software"}},[e._v("Installing Daemon Software")])]),s("li",[s("a",{attrs:{href:"#configure-daemon"}},[e._v("Configure Daemon")])]),s("li",[s("a",{attrs:{href:"#starting-the-daemon"}},[e._v("Starting the Daemon")]),s("ul",[s("li",[s("a",{attrs:{href:"#daemonizing-using-systemd"}},[e._v("Daemonizing (using systemd)")])])])])])]),s("p"),e._v(" "),s("h2",{attrs:{id:"supported-systems"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#supported-systems"}},[e._v("#")]),e._v(" Supported Systems")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Operating System")]),e._v(" "),s("th",[e._v("Version")]),e._v(" "),s("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),s("th",[e._v("Notes")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("Ubuntu")])]),e._v(" "),s("td",[e._v("18.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/ubuntu2004.html"}},[e._v("20.04")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("CentOS")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos7.html"}},[e._v("7")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("⚠️")]),e._v(" "),s("td",[e._v("Extra repos are required")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos8.html"}},[e._v("8")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("Debian")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian9.html"}},[e._v("9")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian10.html"}},[e._v("10")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")])])]),e._v(" "),s("h2",{attrs:{id:"system-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),s("p",[e._v("In order to run the Daemon you will need a system capable of running Docker containers. Most VPS and almost all\ndedicated servers should be capable of running Docker, but there are edge cases.")]),e._v(" "),s("p",[e._v("If your provider makes use of "),s("code",[e._v("Virtuozzo")]),e._v(", "),s("code",[e._v("OpenVZ")]),e._v(" (or "),s("code",[e._v("OVZ")]),e._v("), or "),s("code",[e._v("LXC")]),e._v(" then you will most likely be unable to\nrun the Daemon. If you are unsure what your host is using there are a couple of options. The easiest is to check\ntheir website, or reach out to their support team.")]),e._v(" "),s("p",[e._v("If you want to take a different approach, try using "),s("code",[e._v("lscpu")]),e._v(" and checking what the virtualization type listed is. An\nexample of this is shown below which shows my hypervisor running with full virtualization — this means it will\nsupport Docker without issues. If you see "),s("code",[e._v("KVM")]),e._v(" for the vendor, chances are you're fine as well.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@daemon:~$ lscpu "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v("'vendor\\|type'")]),e._v("\nHypervisor vendor: VMware\nVirtualization type: full\n")])])]),s("p",[e._v("If that doesn't work for some reason, or you're still unsure, you can also run the command below and as long as it\ndoesn't report "),s("code",[e._v("Xen")]),e._v(" or "),s("code",[e._v("LXC")]),e._v(" you're probably okay to continue.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("dane@daemon:~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" dmidecode -s system-manufacturer\nVMware, Inc.\n")])])]),s("h2",{attrs:{id:"dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),s("p",[e._v("Pterodactyl's Daemon requires the following dependencies be installed on your system in order for it to operate.")]),e._v(" "),s("ul",[s("li",[e._v("Docker")]),e._v(" "),s("li",[e._v("Nodejs ("),s("code",[e._v("v10")]),e._v(", "),s("code",[e._v("v12")]),e._v(", higher versions likely work, but are untested)")]),e._v(" "),s("li",[s("code",[e._v("node-gyp")])]),e._v(" "),s("li",[s("code",[e._v("tar")])]),e._v(" "),s("li",[s("code",[e._v("unzip")])]),e._v(" "),s("li",[s("code",[e._v("make")]),e._v(", "),s("code",[e._v("gcc")]),e._v(" ("),s("code",[e._v("gcc-c++")]),e._v(" on CentOS), "),s("code",[e._v("g++")])]),e._v(" "),s("li",[s("code",[e._v("python")])])]),e._v(" "),s("h3",{attrs:{id:"installing-docker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-docker"}},[e._v("#")]),e._v(" Installing Docker")]),e._v(" "),s("p",[e._v("For a quick install of Docker CE, you can execute the command below:")]),e._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 function"}},[e._v("curl")]),e._v(" -sSL https://get.docker.com/ "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CHANNEL")]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("stable "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n")])])]),s("p",[e._v("If you would rather do a manual installation, please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),s("OutboundLink")],1)])]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("Check your Kernel")]),e._v(" "),s("p",[e._v("Please be aware that some hosts install a modified kernel that does not support important docker features. Please\ncheck your kernel by running "),s("code",[e._v("uname -r")]),e._v(". If your kernel ends in "),s("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or "),s("code",[e._v("-xxxx-mod-std-ipv6-64")]),e._v(" you're\nprobably using a non-supported kernel. Check our "),s("RouterLink",{attrs:{to:"/daemon/0.6/kernel_modifications.html"}},[e._v("Kernel Modifications")]),e._v(" guide for details.")],1)]),e._v(" "),s("h4",{attrs:{id:"start-docker-on-boot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-docker-on-boot"}},[e._v("#")]),e._v(" Start Docker on Boot")]),e._v(" "),s("p",[e._v("If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" docker\n")])])]),s("h4",{attrs:{id:"enabling-swap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enabling-swap"}},[e._v("#")]),e._v(" Enabling Swap")]),e._v(" "),s("p",[e._v("On most systems, docker will be unable to setup swap space, you can check if this is the case by running "),s("code",[e._v("docker info")]),e._v(".\nIf it outputs "),s("code",[e._v("WARNING: No swap limit support")]),e._v(" near the bottom, this is the case. Enabling swap is completely optional,\nbut we recommended doing it if you will be hosting for others, and to prevent OOM errors.")]),e._v(" "),s("p",[e._v("To do so, open "),s("code",[e._v("/etc/default/grub")]),e._v(" as a root user, and find the line starting with "),s("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(". Make\nsure the line includes "),s("code",[e._v("swapaccount=1")]),e._v(".")]),e._v(" "),s("p",[e._v("After doing that, simply run "),s("code",[e._v("sudo update-grub")]),e._v(" followed by "),s("code",[e._v("sudo reboot")]),e._v(" to restart the server and have swap enabled.\nBelow is an example of what the line should look like, "),s("em",[e._v("do not copy this line verbatium, it often has additional\nOS specific parameters.")])]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1"\n')])])]),s("h3",{attrs:{id:"installing-nodejs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-nodejs"}},[e._v("#")]),e._v(" Installing Nodejs")]),e._v(" "),s("p",[e._v("NodeJS is also super easy to install! Simply run the command below to make the package accessible to your system.")]),e._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 function"}},[e._v("curl")]),e._v(" -sL https://deb.nodesource.com/setup_10.x "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" -E "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v(" -\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" nodejs "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v(" gcc g++\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Other OS Distributions")]),e._v(" "),s("p",[e._v("If you are using CentOS, "),s("a",{attrs:{href:"https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora",target:"_blank",rel:"noopener noreferrer"}},[e._v("please follow these instructions"),s("OutboundLink")],1),e._v(". Ubuntu and Debian users may also follow the "),s("a",{attrs:{href:"https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions",target:"_blank",rel:"noopener noreferrer"}},[e._v("official\ninstructions provided by Nodejs"),s("OutboundLink")],1),e._v(".")])]),e._v(" "),s("h2",{attrs:{id:"installing-daemon-software"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-daemon-software"}},[e._v("#")]),e._v(" Installing Daemon Software")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("p",[e._v("The first step for installing the daemon is to make sure we have the required directory structure setup. To do so,\nrun the commands below.")]),e._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 function"}},[e._v("mkdir")]),e._v(" -p /srv/daemon /srv/daemon-data\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /srv/daemon\n")])])]),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("OVH/SYS Servers")]),e._v(" "),s("p",[e._v("If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to\n"),s("code",[e._v("/home")]),e._v(", and not "),s("code",[e._v("/")]),e._v(" by default. Please consider using "),s("code",[e._v("/home/daemon-data")]),e._v(" for server data. This can be easily\nset when creating the node.")])]),e._v(" "),s("p",[e._v("The next step is to download the software and unpack the archive.")]),e._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 function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.6.13/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),s("p",[e._v("Finally, we need to install the dependencies that allow the Daemon to run properly. This command will most likely\ntake a few minutes to run, please do not interrupt it.")]),e._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 function"}},[e._v("npm")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production --no-audit --unsafe-perm\n")])])]),s("h2",{attrs:{id:"configure-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-daemon"}},[e._v("#")]),e._v(" Configure Daemon")]),e._v(" "),s("p",[e._v("Once you have installed the daemon and required components, the next step is to create a node on your installed Panel\nOnce you have done that there will be a tab called Configuration when you view the node.")]),e._v(" "),s("p",[e._v("Simply copy and paste the code block and paste it into a file called "),s("code",[e._v("core.json")]),e._v(" in "),s("code",[e._v("/srv/daemon/config")]),e._v(" and save it.\nYou may also use the Auto-Deployment feature rather than manually creating the files.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(362),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"starting-the-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#starting-the-daemon"}},[e._v("#")]),e._v(" Starting the Daemon")]),e._v(" "),s("p",[e._v("To start your daemon simply move into the daemon directory and run the command below which will start the daemon in\nforeground mode. Once you are done, use "),s("code",[e._v("CTRL+C")]),e._v(" to terminate the process. Depending on your server's internet connection\npulling and starting the Daemon for the first time may take a few minutes.")]),e._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 function"}},[e._v("sudo")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" start\n")])])]),s("h3",{attrs:{id:"daemonizing-using-systemd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#daemonizing-using-systemd"}},[e._v("#")]),e._v(" Daemonizing (using systemd)")]),e._v(" "),s("p",[e._v("Running Pterodactyl Daemon in the background is a simple task, just make sure that it runs without errors before doing\nthis. Place the contents below in a file called "),s("code",[e._v("wings.service")]),e._v(" in the "),s("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\n\n[Service]\nUser=root\n#Group=some_group\nWorkingDirectory=/srv/daemon\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/bin/node /srv/daemon/src/index.js\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[e._v("Then, run the commands below to reload systemd and start the daemon.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now wings\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/21.abae94a8.js b/assets/js/21.abae94a8.js deleted file mode 100644 index 4b719897..00000000 --- a/assets/js/21.abae94a8.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{339:function(e,t,s){e.exports=s.p+"assets/img/wings_configuration_example.9f3fdd0b.png"},421:function(e,t,s){"use strict";s.r(t);var a=s(48),n=Object(a.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:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[e._v("#")]),e._v(" Installing Wings")]),e._v(" "),a("p",[e._v("Wings is the next generation server control plane from Pterodactyl. It has been rebuilt from the\nground up using Go and lessons learned from our first Nodejs Daemon.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("You should only install Wings if you are running "),a("strong",[e._v("Pterodactyl 1.0")]),e._v(". Do not install this software\nfor previous versions of Pterodactyl.")])]),e._v(" "),a("h2",{attrs:{id:"supported-systems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#supported-systems"}},[e._v("#")]),e._v(" Supported Systems")]),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",[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(" "),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(" "),a("tr",[a("td",[a("strong",[e._v("Debian")])]),e._v(" "),a("td",[e._v("9")]),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("10")]),e._v(" "),a("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),a("td")])])]),e._v(" "),a("h2",{attrs:{id:"system-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#system-requirements"}},[e._v("#")]),e._v(" System Requirements")]),e._v(" "),a("p",[e._v("In order to run Wings you will need a system capable of running Docker containers. Most VPS and almost all\ndedicated servers should be capable of running Docker, but there are edge cases.")]),e._v(" "),a("p",[e._v("If your provider makes use of "),a("code",[e._v("Virtuozzo")]),e._v(", "),a("code",[e._v("OpenVZ")]),e._v(" (or "),a("code",[e._v("OVZ")]),e._v("), or "),a("code",[e._v("LXC")]),e._v(" then you will most likely be unable to\nrun Wings. If you are unsure what your host is using there are a couple of options. The easiest is to check\ntheir website, or reach out to their support team.")]),e._v(" "),a("p",[e._v("If you want to take a different approach, try using "),a("code",[e._v("lscpu")]),e._v(" and checking what the virtualization type listed is. An\nexample of this is shown below which shows my hypervisor running with full virtualization — this means it will\nsupport Docker without issues. If you see "),a("code",[e._v("KVM")]),e._v(" for the vendor, chances are you're fine as well.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("dane@pterodactyl:~$ lscpu "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'vendor\\|type'")]),e._v("\nHypervisor vendor: VMware\nVirtualization type: full\n")])])]),a("p",[e._v("If that doesn't work for some reason, or you're still unsure, you can also run the command below and as long as it\ndoesn't report "),a("code",[e._v("Xen")]),e._v(" or "),a("code",[e._v("LXC")]),e._v(" you're probably okay to continue.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("dane@pterodactyl:~$ "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" dmidecode -s system-manufacturer\nVMware, Inc.\n")])])]),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("curl")]),e._v(" "),a("li",[e._v("Docker")])]),e._v(" "),a("h3",{attrs:{id:"installing-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-docker"}},[e._v("#")]),e._v(" Installing Docker")]),e._v(" "),a("p",[e._v("For a quick install of Docker CE, you can execute the command below:")]),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(" -sSL https://get.docker.com/ "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CHANNEL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("stable "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n")])])]),a("p",[e._v("If you would rather do a manual installation, please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),a("OutboundLink")],1)])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Check your Kernel")]),e._v(" "),a("p",[e._v("Please be aware that some hosts install a modified kernel that does not support important docker features. Please\ncheck your kernel by running "),a("code",[e._v("uname -r")]),e._v(". If your kernel ends in "),a("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or "),a("code",[e._v("-xxxx-mod-std-ipv6-64")]),e._v(" you're\nprobably using a non-supported kernel. Check our "),a("RouterLink",{attrs:{to:"/wings/1.0/kernel_modifications.html"}},[e._v("Kernel Modifications")]),e._v(" guide for details.")],1)]),e._v(" "),a("h4",{attrs:{id:"start-docker-on-boot"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-docker-on-boot"}},[e._v("#")]),e._v(" Start Docker on Boot")]),e._v(" "),a("p",[e._v("If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now docker\n")])])]),a("h4",{attrs:{id:"enabling-swap"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-swap"}},[e._v("#")]),e._v(" Enabling Swap")]),e._v(" "),a("p",[e._v("On most systems, docker will be unable to setup swap space, you can check if this is the case by running "),a("code",[e._v("docker info")]),e._v(".\nIf it outputs "),a("code",[e._v("WARNING: No swap limit support")]),e._v(" near the bottom, this is the case. Enabling swap is completely optional,\nbut we recommended doing it if you will be hosting for others, and to prevent OOM errors.")]),e._v(" "),a("p",[e._v("To do so, open "),a("code",[e._v("/etc/default/grub")]),e._v(" as a root user, and find the line starting with "),a("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(". Make\nsure the line includes "),a("code",[e._v("swapaccount=1")]),e._v(".")]),e._v(" "),a("p",[e._v("After doing that, simply run "),a("code",[e._v("sudo update-grub")]),e._v(" followed by "),a("code",[e._v("sudo reboot")]),e._v(" to restart the server and have swap enabled.\nBelow is an example of what the line should look like, "),a("em",[e._v("do not copy this line verbatium, it often has additional\nOS specific parameters.")])]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1"\n')])])]),a("h2",{attrs:{id:"installing-wings-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings-2"}},[e._v("#")]),e._v(" Installing Wings")]),e._v(" "),a("p",[e._v("The first step for installing Wings is to make sure we have the required directory structure setup. To do so,\nrun the commands below which will create the base directory and download the wings executable.")]),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 /etc/pterodactyl\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" u+x /usr/local/bin/wings\n")])])]),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("OVH/SYS Servers")]),e._v(" "),a("p",[e._v("If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to\n"),a("code",[e._v("/home")]),e._v(", and not "),a("code",[e._v("/")]),e._v(" by default. Please consider using "),a("code",[e._v("/home/daemon-data")]),e._v(" for server data. This can be easily\nset when creating the node.")])]),e._v(" "),a("h2",{attrs:{id:"configure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configure"}},[e._v("#")]),e._v(" Configure")]),e._v(" "),a("p",[e._v("Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button.")]),e._v(" "),a("p",[e._v("After you have created a node, click on it and there will be a tab called Configuration. Copy the code block content, paste it into a new file called "),a("code",[e._v("config.yml")]),e._v(" in "),a("code",[e._v("/etc/pterodactyl")]),e._v(" and save it.")]),e._v(" "),a("p",[e._v("Alternatively, you can click on the Generate Token button, copy the bash command and paste it into your terminal.")]),e._v(" "),a("p",[a("img",{attrs:{src:s(339),alt:""}})]),e._v(" "),a("h3",{attrs:{id:"starting-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#starting-wings"}},[e._v("#")]),e._v(" Starting Wings")]),e._v(" "),a("p",[e._v("To start Wings, simply run the command below, which will start it in a debug mode. Once you confirmed that it is running without errors, use "),a("code",[e._v("CTRL+C")]),e._v(" to terminate the process and daemonize it by following the instructions below. Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes.")]),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(" wings --debug\n")])])]),a("p",[e._v("You may optionally add the "),a("code",[e._v("--debug")]),e._v(" flag to run Wings in debug mode.")]),e._v(" "),a("h3",{attrs:{id:"daemonizing-using-systemd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#daemonizing-using-systemd"}},[e._v("#")]),e._v(" Daemonizing (using systemd)")]),e._v(" "),a("p",[e._v("Running Wings in the background is a simple task, just make sure that it runs without errors before doing\nthis. Place the contents below in a file called "),a("code",[e._v("wings.service")]),e._v(" in the "),a("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\nRequires=docker.service\nPartOf=docker.service\n\n[Service]\nUser=root\nWorkingDirectory=/etc/pterodactyl\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/local/bin/wings\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),a("p",[e._v("Then, run the commands below to reload systemd and start Wings.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now wings\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/20.d065b2c5.js b/assets/js/21.d6c9c101.js similarity index 98% rename from assets/js/20.d065b2c5.js rename to assets/js/21.d6c9c101.js index 27ddccbc..f67199fb 100644 --- a/assets/js/20.d065b2c5.js +++ b/assets/js/21.d6c9c101.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{363:function(A,e){A.exports="data:image/png;base64,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"},417:function(A,e,n){"use strict";n.r(e);var a=n(48),i=Object(a.a)({},(function(){var A=this,e=A.$createElement,a=A._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[a("h1",{attrs:{id:"terminology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#terminology"}},[A._v("#")]),A._v(" Terminology")]),A._v(" "),a("p",[a("strong",[A._v("Panel")]),A._v(" — This refers to Pterodactyl Panel itself, and is what allows you to add additional\nnodes and servers to the system.")]),A._v(" "),a("p",[a("strong",[A._v("Node")]),A._v(" — A node is a physical machine that runs an instance of Wings.")]),A._v(" "),a("p",[a("strong",[A._v("Wings")]),A._v(" — The newer service written in Go that interfaces with Docker and the Panel to provide secure access for\ncontrolling servers via the Panel.")]),A._v(" "),a("p",[a("strong",[A._v("Server")]),A._v(" — In this case, a server refers to a running instance that is created by the panel. These servers are\ncreated on nodes, and you can have multiple servers per node.")]),A._v(" "),a("p",[a("strong",[A._v("Container")]),A._v(" — Each server will be running inside an isolated container to enforce hardware limitations\n(such as CPU and RAM) and avoid any interference between servers on one node. These are created by Docker.")]),A._v(" "),a("p",[a("strong",[A._v("Nest")]),A._v(" — Each nest is usually used as a specific game or service, for example: Minecraft, Teamspeak or Terraria and can contain many eggs.")]),A._v(" "),a("p",[a("strong",[A._v("Egg")]),A._v(" — Each egg is usually used to store the configuration of a specific type of game, for example: Vanilla, Spigot or Bungeecord for Minecraft.")]),A._v(" "),a("h2",{attrs:{id:"example-setup-diagram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-setup-diagram"}},[A._v("#")]),A._v(" Example Setup Diagram")]),A._v(" "),a("p",[a("img",{attrs:{src:n(363),alt:""}})])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{363:function(A,e){A.exports="data:image/png;base64,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"},418:function(A,e,n){"use strict";n.r(e);var a=n(48),i=Object(a.a)({},(function(){var A=this,e=A.$createElement,a=A._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[a("h1",{attrs:{id:"terminology"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#terminology"}},[A._v("#")]),A._v(" Terminology")]),A._v(" "),a("p",[a("strong",[A._v("Panel")]),A._v(" — This refers to Pterodactyl Panel itself, and is what allows you to add additional\nnodes and servers to the system.")]),A._v(" "),a("p",[a("strong",[A._v("Node")]),A._v(" — A node is a physical machine that runs an instance of Wings.")]),A._v(" "),a("p",[a("strong",[A._v("Wings")]),A._v(" — The newer service written in Go that interfaces with Docker and the Panel to provide secure access for\ncontrolling servers via the Panel.")]),A._v(" "),a("p",[a("strong",[A._v("Server")]),A._v(" — In this case, a server refers to a running instance that is created by the panel. These servers are\ncreated on nodes, and you can have multiple servers per node.")]),A._v(" "),a("p",[a("strong",[A._v("Container")]),A._v(" — Each server will be running inside an isolated container to enforce hardware limitations\n(such as CPU and RAM) and avoid any interference between servers on one node. These are created by Docker.")]),A._v(" "),a("p",[a("strong",[A._v("Nest")]),A._v(" — Each nest is usually used as a specific game or service, for example: Minecraft, Teamspeak or Terraria and can contain many eggs.")]),A._v(" "),a("p",[a("strong",[A._v("Egg")]),A._v(" — Each egg is usually used to store the configuration of a specific type of game, for example: Vanilla, Spigot or Bungeecord for Minecraft.")]),A._v(" "),a("h2",{attrs:{id:"example-setup-diagram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-setup-diagram"}},[A._v("#")]),A._v(" Example Setup Diagram")]),A._v(" "),a("p",[a("img",{attrs:{src:n(363),alt:""}})])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/22.3ff292b3.js b/assets/js/22.db83ce68.js similarity index 98% rename from assets/js/22.3ff292b3.js rename to assets/js/22.db83ce68.js index 3c8b196b..be3c5f7b 100644 --- a/assets/js/22.3ff292b3.js +++ b/assets/js/22.db83ce68.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{339:function(e,t,s){e.exports=s.p+"assets/img/wings_configuration_example.9f3fdd0b.png"},422:function(e,t,s){"use strict";s.r(t);var n=s(48),a=Object(n.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"migrating-to-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#migrating-to-wings"}},[e._v("#")]),e._v(" Migrating to Wings")]),e._v(" "),n("p",[e._v("This guide is for people looking to migrate from the old Node.JS daemon to Wings. Please see the\n"),n("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("install guide")]),e._v(" if you are trying to install Wings for the first time on\na new node.")],1),e._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[e._v("Panel Version Requirement")]),e._v(" "),n("p",[e._v("You "),n("strong",[e._v("must")]),e._v(" be running Pterodactyl Panel 1.X in order to use Wings.")])]),e._v(" "),n("p",[e._v("You'll have a brief offline period as you perform this process, however no running game processes\nwill be affected. Plus, chances are your Panel will be offline (or in maintenance mode) during this\nso your users should not notice anything out of the ordinary.")]),e._v(" "),n("h2",{attrs:{id:"install-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#install-wings"}},[e._v("#")]),e._v(" Install Wings")]),e._v(" "),n("p",[e._v("The first step for installing the daemon is to make sure we have the required directory structure setup. To do so,\nrun the commands below which will create the base directory and download the wings executable.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /etc/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" u+x /usr/local/bin/wings\n")])])]),n("h2",{attrs:{id:"copy-new-configuration-file"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#copy-new-configuration-file"}},[e._v("#")]),e._v(" Copy New Configuration File")]),e._v(" "),n("p",[e._v("Once you have installed Wings, you'll need to copy over a new configuration file from the Panel. This file\nis in a new format, and should be easier for you to manage and edit in the future.")]),e._v(" "),n("p",[e._v("Simply copy and paste the code block and paste it into a file called "),n("code",[e._v("config.yml")]),e._v(" within the "),n("code",[e._v("/etc/pterodactyl")]),e._v("\ndirectory and save it.")]),e._v(" "),n("p",[n("img",{attrs:{src:s(339),alt:""}})]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("Please note that any modifications you previously made to the configuration will be lost with this. If you have\nmodifications to our default settings, the best option is to start Wings once with the copied configuration which\nwill then populate all of the other configuration settings.")]),e._v(" "),n("p",[e._v("From there you can make any adjustments as necessary.")])]),e._v(" "),n("h2",{attrs:{id:"remove-old-daemon"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#remove-old-daemon"}},[e._v("#")]),e._v(" Remove Old Daemon")]),e._v(" "),n("p",[e._v("Now that Wings is installed, we need to remove all of the old daemon code from the server since it is not being\nused anymore. To do this, simply execute the following commands — assuming your old daemon is in the default\n"),n("code",[e._v("/srv/daemon")]),e._v(" directory.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Stop the old daemon.")]),e._v("\nsystemctl stop wings\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete the entire directory. There is nothing stored in here that we actually need for the")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# purposes of this migration. Remeber, server data is stored in /srv/daemon-data.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" -rf /srv/daemon\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optionally, remove NodeJS from your system if it was not used for anything else.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y remove nodejs "),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or: yum remove nodejs")]),e._v("\n")])])]),n("h3",{attrs:{id:"remove-standalone-sftp"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#remove-standalone-sftp"}},[e._v("#")]),e._v(" Remove Standalone SFTP")]),e._v(" "),n("p",[e._v("If you've used the "),n("RouterLink",{attrs:{to:"/daemon/0.6/standalone_sftp.html"}},[e._v("standalone SFTP server")]),e._v(" with the old daemon, we need to remove it's systemd service as well, as it's no longer needed.\nYou can do so using the following commands.")],1),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# stop and disable the standalone sftp")]),e._v("\nsystemctl disable --now pterosftp\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# delete the systemd service")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" /etc/systemd/system/pterosftp.service\n")])])]),n("h2",{attrs:{id:"daemonize-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#daemonize-wings"}},[e._v("#")]),e._v(" Daemonize Wings")]),e._v(" "),n("p",[e._v("You'll then need to edit your existing "),n("code",[e._v("systemd")]),e._v(" service file for Wings to point to the new control software. To do\nthis, open "),n("code",[e._v("/etc/systemd/system/wings.service")]),e._v(" and replace the entire contents of the file with the following:")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\n\n[Service]\nUser=root\nWorkingDirectory=/etc/pterodactyl\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/local/bin/wings\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),n("p",[e._v("Then, start wings.")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("systemctl daemon-reload\nsystemctl enable --now wings\n")])])]),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("What if Wings doesn't start?")]),e._v(" "),n("p",[e._v("If you encounter issues starting Wings at this point, run the following command to start Wings directly and check\nfor any specific error output.")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("sudo wings --debug\n")])])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{339:function(e,t,s){e.exports=s.p+"assets/img/wings_configuration_example.9f3fdd0b.png"},423:function(e,t,s){"use strict";s.r(t);var n=s(48),a=Object(n.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"migrating-to-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#migrating-to-wings"}},[e._v("#")]),e._v(" Migrating to Wings")]),e._v(" "),n("p",[e._v("This guide is for people looking to migrate from the old Node.JS daemon to Wings. Please see the\n"),n("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("install guide")]),e._v(" if you are trying to install Wings for the first time on\na new node.")],1),e._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[e._v("Panel Version Requirement")]),e._v(" "),n("p",[e._v("You "),n("strong",[e._v("must")]),e._v(" be running Pterodactyl Panel 1.X in order to use Wings.")])]),e._v(" "),n("p",[e._v("You'll have a brief offline period as you perform this process, however no running game processes\nwill be affected. Plus, chances are your Panel will be offline (or in maintenance mode) during this\nso your users should not notice anything out of the ordinary.")]),e._v(" "),n("h2",{attrs:{id:"install-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#install-wings"}},[e._v("#")]),e._v(" Install Wings")]),e._v(" "),n("p",[e._v("The first step for installing the daemon is to make sure we have the required directory structure setup. To do so,\nrun the commands below which will create the base directory and download the wings executable.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /etc/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" u+x /usr/local/bin/wings\n")])])]),n("h2",{attrs:{id:"copy-new-configuration-file"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#copy-new-configuration-file"}},[e._v("#")]),e._v(" Copy New Configuration File")]),e._v(" "),n("p",[e._v("Once you have installed Wings, you'll need to copy over a new configuration file from the Panel. This file\nis in a new format, and should be easier for you to manage and edit in the future.")]),e._v(" "),n("p",[e._v("Simply copy and paste the code block and paste it into a file called "),n("code",[e._v("config.yml")]),e._v(" within the "),n("code",[e._v("/etc/pterodactyl")]),e._v("\ndirectory and save it.")]),e._v(" "),n("p",[n("img",{attrs:{src:s(339),alt:""}})]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("Please note that any modifications you previously made to the configuration will be lost with this. If you have\nmodifications to our default settings, the best option is to start Wings once with the copied configuration which\nwill then populate all of the other configuration settings.")]),e._v(" "),n("p",[e._v("From there you can make any adjustments as necessary.")])]),e._v(" "),n("h2",{attrs:{id:"remove-old-daemon"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#remove-old-daemon"}},[e._v("#")]),e._v(" Remove Old Daemon")]),e._v(" "),n("p",[e._v("Now that Wings is installed, we need to remove all of the old daemon code from the server since it is not being\nused anymore. To do this, simply execute the following commands — assuming your old daemon is in the default\n"),n("code",[e._v("/srv/daemon")]),e._v(" directory.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Stop the old daemon.")]),e._v("\nsystemctl stop wings\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete the entire directory. There is nothing stored in here that we actually need for the")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# purposes of this migration. Remeber, server data is stored in /srv/daemon-data.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" -rf /srv/daemon\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optionally, remove NodeJS from your system if it was not used for anything else.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y remove nodejs "),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or: yum remove nodejs")]),e._v("\n")])])]),n("h3",{attrs:{id:"remove-standalone-sftp"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#remove-standalone-sftp"}},[e._v("#")]),e._v(" Remove Standalone SFTP")]),e._v(" "),n("p",[e._v("If you've used the "),n("RouterLink",{attrs:{to:"/daemon/0.6/standalone_sftp.html"}},[e._v("standalone SFTP server")]),e._v(" with the old daemon, we need to remove it's systemd service as well, as it's no longer needed.\nYou can do so using the following commands.")],1),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# stop and disable the standalone sftp")]),e._v("\nsystemctl disable --now pterosftp\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# delete the systemd service")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" /etc/systemd/system/pterosftp.service\n")])])]),n("h2",{attrs:{id:"daemonize-wings"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#daemonize-wings"}},[e._v("#")]),e._v(" Daemonize Wings")]),e._v(" "),n("p",[e._v("You'll then need to edit your existing "),n("code",[e._v("systemd")]),e._v(" service file for Wings to point to the new control software. To do\nthis, open "),n("code",[e._v("/etc/systemd/system/wings.service")]),e._v(" and replace the entire contents of the file with the following:")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("[Unit]\nDescription=Pterodactyl Wings Daemon\nAfter=docker.service\n\n[Service]\nUser=root\nWorkingDirectory=/etc/pterodactyl\nLimitNOFILE=4096\nPIDFile=/var/run/wings/daemon.pid\nExecStart=/usr/local/bin/wings\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),n("p",[e._v("Then, start wings.")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("systemctl daemon-reload\nsystemctl enable --now wings\n")])])]),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("What if Wings doesn't start?")]),e._v(" "),n("p",[e._v("If you encounter issues starting Wings at this point, run the following command to start Wings directly and check\nfor any specific error output.")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("sudo wings --debug\n")])])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/23.6b778859.js b/assets/js/23.3a0120cf.js similarity index 74% rename from assets/js/23.6b778859.js rename to assets/js/23.3a0120cf.js index c6b208e3..cf28da80 100644 --- a/assets/js/23.6b778859.js +++ b/assets/js/23.3a0120cf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{424:function(t,e,n){"use strict";n.r(e);var l={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,l=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||l().default)}},p=n(48),r=Object(p.a)(l,void 0,void 0,!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{425:function(t,e,n){"use strict";n.r(e);var l={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,l=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||l().default)}},p=n(48),r=Object(p.a)(l,void 0,void 0,!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/24.18e132d5.js b/assets/js/24.6e894c0a.js similarity index 86% rename from assets/js/24.18e132d5.js rename to assets/js/24.6e894c0a.js index 2824f834..db3a8f16 100644 --- a/assets/js/24.18e132d5.js +++ b/assets/js/24.6e894c0a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{365:function(e,t,o){"use strict";o.r(t);var n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links.","Who let Dogmeat mess with the documentation again?","Someone unplugged the ethernet cable... again.","Couldn't locate that cap'n, should we start over?","I don't like this game of hide'n'seek anymore."],s={methods:{getMsg:function(){return n[Math.floor(Math.random()*n.length)]}}},a=o(48),h=Object(a.a)(s,(function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"content error-page"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("router-link",{attrs:{to:"/"}},[this._v("Take me home.")])],1)])}),[],!1,null,null,null);t.default=h.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{366:function(e,t,o){"use strict";o.r(t);var n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links.","Who let Dogmeat mess with the documentation again?","Someone unplugged the ethernet cable... again.","Couldn't locate that cap'n, should we start over?","I don't like this game of hide'n'seek anymore."],s={methods:{getMsg:function(){return n[Math.floor(Math.random()*n.length)]}}},a=o(48),h=Object(a.a)(s,(function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"content error-page"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("router-link",{attrs:{to:"/"}},[this._v("Take me home.")])],1)])}),[],!1,null,null,null);t.default=h.exports}}]); \ No newline at end of file diff --git a/assets/js/28.17b33d85.js b/assets/js/28.317f71e4.js similarity index 62% rename from assets/js/28.17b33d85.js rename to assets/js/28.317f71e4.js index 3e7f1b55..2ffd475a 100644 --- a/assets/js/28.17b33d85.js +++ b/assets/js/28.317f71e4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{366: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([[28],{367: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/29.9c25f524.js b/assets/js/29.69216217.js similarity index 62% rename from assets/js/29.9c25f524.js rename to assets/js/29.69216217.js index f14f485b..3f89d189 100644 --- a/assets/js/29.9c25f524.js +++ b/assets/js/29.69216217.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{367: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([[29],{368: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/30.34c4472a.js b/assets/js/30.8204ea7c.js similarity index 92% rename from assets/js/30.34c4472a.js rename to assets/js/30.8204ea7c.js index b0d768d0..bcd88c1f 100644 --- a/assets/js/30.34c4472a.js +++ b/assets/js/30.8204ea7c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{368: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([[30],{369: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/31.4a35c00f.js b/assets/js/31.e7b25719.js similarity index 99% rename from assets/js/31.4a35c00f.js rename to assets/js/31.e7b25719.js index f7639ffb..21393aea 100644 --- a/assets/js/31.4a35c00f.js +++ b/assets/js/31.e7b25719.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{370:function(e,t,a){"use strict";a.r(t);var n=a(48),s=Object(n.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:"creating-a-custom-docker-image"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-docker-image"}},[e._v("#")]),e._v(" Creating a Custom Docker Image")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#creating-the-dockerfile"}},[e._v("Creating the Dockerfile")])]),a("li",[a("a",{attrs:{href:"#installing-dependencies"}},[e._v("Installing Dependencies")])]),a("li",[a("a",{attrs:{href:"#creating-a-container-user"}},[e._v("Creating a Container User")])]),a("li",[a("a",{attrs:{href:"#work-directory-entrypoint"}},[e._v("Work Directory & Entrypoint")])]),a("li",[a("a",{attrs:{href:"#entrypoint-script"}},[e._v("Entrypoint Script")])]),a("li",[a("a",{attrs:{href:"#modifying-the-startup-command"}},[e._v("Modifying the Startup Command")])]),a("li",[a("a",{attrs:{href:"#run-the-command"}},[e._v("Run the Command")]),a("ul",[a("li",[a("a",{attrs:{href:"#note"}},[e._v("Note")])])])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("This tutorial uses examples from our "),a("a",{attrs:{href:"https://github.com/pterodactyl/images/tree/java",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("core:java")]),a("OutboundLink")],1),e._v(" docker image,\nwhich can be found on GitHub. This tutorial also assumes some knowledge of "),a("a",{attrs:{href:"https://docker.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker"),a("OutboundLink")],1),e._v(", we suggest\nreading up if this all looks foreign to you.")])]),e._v(" "),a("h2",{attrs:{id:"creating-the-dockerfile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-dockerfile"}},[e._v("#")]),e._v(" Creating the Dockerfile")]),e._v(" "),a("p",[e._v("The most important part of this process is to create the "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("Dockerfile")]),a("OutboundLink")],1),e._v("\nthat will be used by the Daemon. Due to heavy restrictions on server containers, you must setup this file in a specific manner.")]),e._v(" "),a("p",[e._v("We try to make use of "),a("a",{attrs:{href:"https://alpinelinux.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Alpine Linux"),a("OutboundLink")],1),e._v(" as much as possible for our images in order to keep their size down.")]),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("# ----------------------------------")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Pterodactyl Core Dockerfile")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Environment: Java")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Minimum Panel Version: 0.6.0")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# ----------------------------------")]),e._v("\nFROM openjdk:8-jdk-alpine\n\nMAINTAINER Pterodactyl Software, "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("support@pterodactyl.io"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nRUN apk "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" --no-cache --update "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" ca-certificates openssl "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v(" sqlite fontconfig "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" adduser --disabled-password --home /home/container container\n\n"),a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("USER")]),e._v(" container\nENV "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("USER")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("container "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("HOME")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/home/container\n\nWORKDIR /home/container\n\nCOPY ./entrypoint.sh /entrypoint.sh\n\nCMD "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/bin/bash"')]),e._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/entrypoint.sh"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])]),a("p",[e._v("Lets walk through the "),a("code",[e._v("Dockerfile")]),e._v(" above. The first thing you'll notice is the "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#from",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("FROM")]),a("OutboundLink")],1),e._v(" declaration.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("FROM openjdk:8-jdk-alpine\n")])])]),a("p",[e._v("In this case, we are using "),a("a",{attrs:{href:"https://github.com/docker-library/openjdk",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("openjdk:8-jdk-alpine")]),a("OutboundLink")],1),e._v(" which provides us with Java 8.")]),e._v(" "),a("h2",{attrs:{id:"installing-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-dependencies"}},[e._v("#")]),e._v(" Installing Dependencies")]),e._v(" "),a("p",[e._v("The next thing we do is install the dependencies we will need using Alpine's package manager: "),a("code",[e._v("apk")]),e._v(". You'll notice some\nspecific flags that keep the container small, including "),a("code",[e._v("--no-cache")]),e._v(", as well as everything being contained in a\nsingle "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#run",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("RUN")]),a("OutboundLink")],1),e._v(" block.")]),e._v(" "),a("h2",{attrs:{id:"creating-a-container-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-container-user"}},[e._v("#")]),e._v(" Creating a Container User")]),e._v(" "),a("p",[e._v("Within this "),a("code",[e._v("RUN")]),e._v(" block, you'll notice the "),a("code",[e._v("useradd")]),e._v(" command.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("adduser -D -h /home/container container\n")])])]),a("p",{staticClass:"callout warning"},[e._v("All Pterodactyl containers must have a user named `container`, and the user home **must** be `/home/container`.")]),e._v(" "),a("p",[e._v("After we create that user, we then define the default container "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#user",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("USER")]),a("OutboundLink")],1),e._v("\nas well as a few "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#env",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("ENV")]),a("OutboundLink")],1),e._v(" settings to be applied to things running\nwithin the container.")]),e._v(" "),a("h2",{attrs:{id:"work-directory-entrypoint"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#work-directory-entrypoint"}},[e._v("#")]),e._v(" Work Directory & Entrypoint")]),e._v(" "),a("p",[e._v("One of the last things we do is define a "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#workdir",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("WORKDIR")]),a("OutboundLink")],1),e._v(" which\nis where everything else will be executed. The "),a("code",[e._v("WORKDIR")]),e._v(" must be set the "),a("code",[e._v("/home/container")]),e._v(".")]),e._v(" "),a("p",[e._v("Finally, we need to copy our "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#entrypoint",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("ENTRYPOINT")]),a("OutboundLink")],1),e._v(" script into\nthe docker image root. This is done using "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#copy",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("COPY")]),a("OutboundLink")],1),e._v(", after which\nwe define the command to be used when the container is started using "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#cmd",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("CMD")]),a("OutboundLink")],1),e._v(".\nThe "),a("code",[e._v("CMD")]),e._v(" line should always point to the "),a("code",[e._v("entrypoint.sh")]),e._v(" file.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("COPY ./entrypoint.sh /entrypoint.sh\nCMD "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/bin/bash"')]),e._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/entrypoint.sh"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])]),a("h2",{attrs:{id:"entrypoint-script"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#entrypoint-script"}},[e._v("#")]),e._v(" Entrypoint Script")]),e._v(" "),a("p",[e._v("In order to complete this "),a("code",[e._v("Dockerfile")]),e._v(", we will need an "),a("code",[e._v("entrypoint.sh")]),e._v(" file which tells Docker how to run this\nspecific server type.")]),e._v(" "),a("p",[e._v("These entrypoint files are actually fairly abstracted, and the Daemon will pass in the start command as an environment\nvariable before processing it and then executing the 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 shebang important"}},[e._v("#!/bin/bash")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /home/container\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Output Current Java Version")]),e._v("\njava -version "),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("## only really needed to show what version is being used. Should be changed for different applications")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Replace Startup Variables")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("MODIFIED_STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("eval")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("echo $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("STARTUP"),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 function"}},[e._v("sed")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/{{/${/g'")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/}}/}/g'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v("\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('":/home/container$ '),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MODIFIED_STARTUP}")]),e._v('"')]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the Server")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MODIFIED_STARTUP}")]),e._v("\n")])])]),a("p",[e._v("The second command, "),a("code",[e._v("cd /home/container")]),e._v(", simply ensures we are in the correct directory when running the rest of the\ncommands. We then follow that up with "),a("code",[e._v("java -version")]),e._v(" to output this information to end-users, but that is not necessary.")]),e._v(" "),a("h2",{attrs:{id:"modifying-the-startup-command"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modifying-the-startup-command"}},[e._v("#")]),e._v(" Modifying the Startup Command")]),e._v(" "),a("p",[e._v("The most significant part of this file is the "),a("code",[e._v("MODIFIED_STARTUP")]),e._v(" environment variable. What we are doing in this case\nis parsing the environment "),a("code",[e._v("STARTUP")]),e._v(" that is passed into the container by the Daemon. In most cases, this variable\nlooks something like the example below:")]),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("STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}"')]),e._v("\n")])])]),a("div",{pre:!0},[a("p",[e._v("You'll notice some placeholders there, specifically "),a("code",[e._v("{{SERVER_MEMORY}}")]),e._v(" and "),a("code",[e._v("{{SERVER_JARFILE}}")]),e._v(". These both refer to\nother environment variables being passed in, and they look something like the example below.")])]),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("SERVER_MEMORY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1024")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SERVER_JARFILE")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("server.jar\n")])])]),a("p",[e._v("There are a host of different environment variables, and they change depending on the specific service option\nconfiguration. However, that is not necessarily anything to worry about here.")]),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("MODIFIED_STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("eval")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("echo $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("STARTUP"),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 function"}},[e._v("sed")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/{{/${/g'")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/}}/}/g'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v("\n")])])]),a("div",{pre:!0},[a("p",[e._v("The command above simply evaluates the "),a("code",[e._v("STARTUP")]),e._v(" environment variable, and then replaces anything surrounded in\ncurly braces "),a("code",[e._v("{{EXAMPLE}}")]),e._v(" with a matching environment variable (such as "),a("code",[e._v("EXAMPLE")]),e._v("). Thus, our "),a("code",[e._v("STARTUP")]),e._v(" command:")])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("java -Xms128M -Xmx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("SERVER_MEMORY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("M -jar "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("SERVER_JARFILE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[e._v("Becomes:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("java -Xms128M -Xmx1024M -jar server.jar\n")])])]),a("h2",{attrs:{id:"run-the-command"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#run-the-command"}},[e._v("#")]),e._v(" Run the Command")]),e._v(" "),a("p",[e._v("The last step is to run this modified startup command, which is done with the line "),a("code",[e._v("${MODIFIED_STARTUP}")]),e._v(".")]),e._v(" "),a("h3",{attrs:{id:"note"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[e._v("#")]),e._v(" Note")]),e._v(" "),a("p",[e._v("Sometimes you may need to change the permissions of the "),a("code",[e._v("entrypoint.sh")]),e._v(" file, on linux you can do this by executing "),a("code",[e._v("chmod +x entrypoint.sh")]),e._v(" in the directory where the file is.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{371:function(e,t,a){"use strict";a.r(t);var n=a(48),s=Object(n.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:"creating-a-custom-docker-image"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-docker-image"}},[e._v("#")]),e._v(" Creating a Custom Docker Image")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#creating-the-dockerfile"}},[e._v("Creating the Dockerfile")])]),a("li",[a("a",{attrs:{href:"#installing-dependencies"}},[e._v("Installing Dependencies")])]),a("li",[a("a",{attrs:{href:"#creating-a-container-user"}},[e._v("Creating a Container User")])]),a("li",[a("a",{attrs:{href:"#work-directory-entrypoint"}},[e._v("Work Directory & Entrypoint")])]),a("li",[a("a",{attrs:{href:"#entrypoint-script"}},[e._v("Entrypoint Script")])]),a("li",[a("a",{attrs:{href:"#modifying-the-startup-command"}},[e._v("Modifying the Startup Command")])]),a("li",[a("a",{attrs:{href:"#run-the-command"}},[e._v("Run the Command")]),a("ul",[a("li",[a("a",{attrs:{href:"#note"}},[e._v("Note")])])])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("This tutorial uses examples from our "),a("a",{attrs:{href:"https://github.com/pterodactyl/images/tree/java",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("core:java")]),a("OutboundLink")],1),e._v(" docker image,\nwhich can be found on GitHub. This tutorial also assumes some knowledge of "),a("a",{attrs:{href:"https://docker.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker"),a("OutboundLink")],1),e._v(", we suggest\nreading up if this all looks foreign to you.")])]),e._v(" "),a("h2",{attrs:{id:"creating-the-dockerfile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-dockerfile"}},[e._v("#")]),e._v(" Creating the Dockerfile")]),e._v(" "),a("p",[e._v("The most important part of this process is to create the "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("Dockerfile")]),a("OutboundLink")],1),e._v("\nthat will be used by the Daemon. Due to heavy restrictions on server containers, you must setup this file in a specific manner.")]),e._v(" "),a("p",[e._v("We try to make use of "),a("a",{attrs:{href:"https://alpinelinux.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Alpine Linux"),a("OutboundLink")],1),e._v(" as much as possible for our images in order to keep their size down.")]),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("# ----------------------------------")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Pterodactyl Core Dockerfile")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Environment: Java")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Minimum Panel Version: 0.6.0")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# ----------------------------------")]),e._v("\nFROM openjdk:8-jdk-alpine\n\nMAINTAINER Pterodactyl Software, "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("support@pterodactyl.io"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nRUN apk "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" --no-cache --update "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" ca-certificates openssl "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v(" sqlite fontconfig "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" adduser --disabled-password --home /home/container container\n\n"),a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("USER")]),e._v(" container\nENV "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("USER")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("container "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("HOME")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/home/container\n\nWORKDIR /home/container\n\nCOPY ./entrypoint.sh /entrypoint.sh\n\nCMD "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/bin/bash"')]),e._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/entrypoint.sh"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])]),a("p",[e._v("Lets walk through the "),a("code",[e._v("Dockerfile")]),e._v(" above. The first thing you'll notice is the "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#from",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("FROM")]),a("OutboundLink")],1),e._v(" declaration.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("FROM openjdk:8-jdk-alpine\n")])])]),a("p",[e._v("In this case, we are using "),a("a",{attrs:{href:"https://github.com/docker-library/openjdk",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("openjdk:8-jdk-alpine")]),a("OutboundLink")],1),e._v(" which provides us with Java 8.")]),e._v(" "),a("h2",{attrs:{id:"installing-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-dependencies"}},[e._v("#")]),e._v(" Installing Dependencies")]),e._v(" "),a("p",[e._v("The next thing we do is install the dependencies we will need using Alpine's package manager: "),a("code",[e._v("apk")]),e._v(". You'll notice some\nspecific flags that keep the container small, including "),a("code",[e._v("--no-cache")]),e._v(", as well as everything being contained in a\nsingle "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#run",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("RUN")]),a("OutboundLink")],1),e._v(" block.")]),e._v(" "),a("h2",{attrs:{id:"creating-a-container-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-container-user"}},[e._v("#")]),e._v(" Creating a Container User")]),e._v(" "),a("p",[e._v("Within this "),a("code",[e._v("RUN")]),e._v(" block, you'll notice the "),a("code",[e._v("useradd")]),e._v(" command.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("adduser -D -h /home/container container\n")])])]),a("p",{staticClass:"callout warning"},[e._v("All Pterodactyl containers must have a user named `container`, and the user home **must** be `/home/container`.")]),e._v(" "),a("p",[e._v("After we create that user, we then define the default container "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#user",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("USER")]),a("OutboundLink")],1),e._v("\nas well as a few "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#env",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("ENV")]),a("OutboundLink")],1),e._v(" settings to be applied to things running\nwithin the container.")]),e._v(" "),a("h2",{attrs:{id:"work-directory-entrypoint"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#work-directory-entrypoint"}},[e._v("#")]),e._v(" Work Directory & Entrypoint")]),e._v(" "),a("p",[e._v("One of the last things we do is define a "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#workdir",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("WORKDIR")]),a("OutboundLink")],1),e._v(" which\nis where everything else will be executed. The "),a("code",[e._v("WORKDIR")]),e._v(" must be set the "),a("code",[e._v("/home/container")]),e._v(".")]),e._v(" "),a("p",[e._v("Finally, we need to copy our "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#entrypoint",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("ENTRYPOINT")]),a("OutboundLink")],1),e._v(" script into\nthe docker image root. This is done using "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#copy",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("COPY")]),a("OutboundLink")],1),e._v(", after which\nwe define the command to be used when the container is started using "),a("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/#cmd",target:"_blank",rel:"noopener noreferrer"}},[a("code",[e._v("CMD")]),a("OutboundLink")],1),e._v(".\nThe "),a("code",[e._v("CMD")]),e._v(" line should always point to the "),a("code",[e._v("entrypoint.sh")]),e._v(" file.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("COPY ./entrypoint.sh /entrypoint.sh\nCMD "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/bin/bash"')]),e._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/entrypoint.sh"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])]),a("h2",{attrs:{id:"entrypoint-script"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#entrypoint-script"}},[e._v("#")]),e._v(" Entrypoint Script")]),e._v(" "),a("p",[e._v("In order to complete this "),a("code",[e._v("Dockerfile")]),e._v(", we will need an "),a("code",[e._v("entrypoint.sh")]),e._v(" file which tells Docker how to run this\nspecific server type.")]),e._v(" "),a("p",[e._v("These entrypoint files are actually fairly abstracted, and the Daemon will pass in the start command as an environment\nvariable before processing it and then executing the 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 shebang important"}},[e._v("#!/bin/bash")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /home/container\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Output Current Java Version")]),e._v("\njava -version "),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("## only really needed to show what version is being used. Should be changed for different applications")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Replace Startup Variables")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("MODIFIED_STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("eval")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("echo $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("STARTUP"),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 function"}},[e._v("sed")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/{{/${/g'")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/}}/}/g'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v("\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('":/home/container$ '),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MODIFIED_STARTUP}")]),e._v('"')]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the Server")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MODIFIED_STARTUP}")]),e._v("\n")])])]),a("p",[e._v("The second command, "),a("code",[e._v("cd /home/container")]),e._v(", simply ensures we are in the correct directory when running the rest of the\ncommands. We then follow that up with "),a("code",[e._v("java -version")]),e._v(" to output this information to end-users, but that is not necessary.")]),e._v(" "),a("h2",{attrs:{id:"modifying-the-startup-command"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modifying-the-startup-command"}},[e._v("#")]),e._v(" Modifying the Startup Command")]),e._v(" "),a("p",[e._v("The most significant part of this file is the "),a("code",[e._v("MODIFIED_STARTUP")]),e._v(" environment variable. What we are doing in this case\nis parsing the environment "),a("code",[e._v("STARTUP")]),e._v(" that is passed into the container by the Daemon. In most cases, this variable\nlooks something like the example below:")]),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("STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}"')]),e._v("\n")])])]),a("div",{pre:!0},[a("p",[e._v("You'll notice some placeholders there, specifically "),a("code",[e._v("{{SERVER_MEMORY}}")]),e._v(" and "),a("code",[e._v("{{SERVER_JARFILE}}")]),e._v(". These both refer to\nother environment variables being passed in, and they look something like the example below.")])]),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("SERVER_MEMORY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1024")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SERVER_JARFILE")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("server.jar\n")])])]),a("p",[e._v("There are a host of different environment variables, and they change depending on the specific service option\nconfiguration. However, that is not necessarily anything to worry about here.")]),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("MODIFIED_STARTUP")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("eval")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("echo $"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("STARTUP"),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 function"}},[e._v("sed")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/{{/${/g'")]),e._v(" -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/}}/}/g'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v("\n")])])]),a("div",{pre:!0},[a("p",[e._v("The command above simply evaluates the "),a("code",[e._v("STARTUP")]),e._v(" environment variable, and then replaces anything surrounded in\ncurly braces "),a("code",[e._v("{{EXAMPLE}}")]),e._v(" with a matching environment variable (such as "),a("code",[e._v("EXAMPLE")]),e._v("). Thus, our "),a("code",[e._v("STARTUP")]),e._v(" command:")])]),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("java -Xms128M -Xmx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("SERVER_MEMORY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("M -jar "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("SERVER_JARFILE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[e._v("Becomes:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("java -Xms128M -Xmx1024M -jar server.jar\n")])])]),a("h2",{attrs:{id:"run-the-command"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#run-the-command"}},[e._v("#")]),e._v(" Run the Command")]),e._v(" "),a("p",[e._v("The last step is to run this modified startup command, which is done with the line "),a("code",[e._v("${MODIFIED_STARTUP}")]),e._v(".")]),e._v(" "),a("h3",{attrs:{id:"note"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[e._v("#")]),e._v(" Note")]),e._v(" "),a("p",[e._v("Sometimes you may need to change the permissions of the "),a("code",[e._v("entrypoint.sh")]),e._v(" file, on linux you can do this by executing "),a("code",[e._v("chmod +x entrypoint.sh")]),e._v(" in the directory where the file is.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/32.d98a3373.js b/assets/js/32.db8f117e.js similarity index 97% rename from assets/js/32.d98a3373.js rename to assets/js/32.db8f117e.js index 560c0d04..892da79c 100644 --- a/assets/js/32.d98a3373.js +++ b/assets/js/32.db8f117e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{372:function(s,t,n){"use strict";n.r(t);var e=n(48),a=Object(e.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h1",{attrs:{id:"building-panel-assets"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#building-panel-assets"}},[s._v("#")]),s._v(" Building Panel Assets")]),s._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[s._v("WARNING")]),s._v(" "),n("p",[s._v("Do "),n("strong",[s._v("not")]),s._v(" run the following steps on your production nodes.")])]),s._v(" "),n("p",[s._v("Instructions on how to build the panel are also available in the "),n("a",{attrs:{href:"https://github.com/pterodactyl/panel/blob/develop/BUILDING.md",target:"_blank",rel:"noopener noreferrer"}},[s._v("BUILDING.md"),n("OutboundLink")],1),s._v(" file.")]),s._v(" "),n("p",[s._v("The frontend of the Panel is built with React. Any changes to the source files require to recompile it.\nThis also applies to style sheets. The following sections explain how to do so.")]),s._v(" "),n("h2",{attrs:{id:"install-dependencies"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#install-dependencies"}},[s._v("#")]),s._v(" Install Dependencies")]),s._v(" "),n("p",[s._v("The following commands will install the necessary dependencies for building the Panel assets.")]),s._v(" "),n("p",[s._v("The build tools require NodeJS, yarn is used as the package manager.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Ubuntu/Debian")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sL https://deb.nodesource.com/setup_14.x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" -E "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v(" -\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sL https://rpm.nodesource.com/setup_14.x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" -E "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v(" -\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS 7")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" dnf "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS 8")]),s._v("\n")])])]),n("p",[s._v("Install required javascript packages.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i -g "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Install Yarn")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /var/www/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Installs panel build dependencies")]),s._v("\n")])])]),n("h2",{attrs:{id:"build-panel-assets"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#build-panel-assets"}},[s._v("#")]),s._v(" Build Panel Assets")]),s._v(" "),n("p",[s._v("The following command will rebuild the Panel frontend.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /var/www/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" build:production "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Build panel")]),s._v("\n")])])]),n("p",[s._v("You can use command "),n("code",[s._v("yarn run watch")]),s._v(" to view the progress of your changes in almost real-time for easier development. Once you're satisfied with your changes build the panel using the previously mentioned "),n("code",[s._v("yarn build:production")]),s._v(" command.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{373:function(s,t,n){"use strict";n.r(t);var e=n(48),a=Object(e.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h1",{attrs:{id:"building-panel-assets"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#building-panel-assets"}},[s._v("#")]),s._v(" Building Panel Assets")]),s._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[s._v("WARNING")]),s._v(" "),n("p",[s._v("Do "),n("strong",[s._v("not")]),s._v(" run the following steps on your production nodes.")])]),s._v(" "),n("p",[s._v("Instructions on how to build the panel are also available in the "),n("a",{attrs:{href:"https://github.com/pterodactyl/panel/blob/develop/BUILDING.md",target:"_blank",rel:"noopener noreferrer"}},[s._v("BUILDING.md"),n("OutboundLink")],1),s._v(" file.")]),s._v(" "),n("p",[s._v("The frontend of the Panel is built with React. Any changes to the source files require to recompile it.\nThis also applies to style sheets. The following sections explain how to do so.")]),s._v(" "),n("h2",{attrs:{id:"install-dependencies"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#install-dependencies"}},[s._v("#")]),s._v(" Install Dependencies")]),s._v(" "),n("p",[s._v("The following commands will install the necessary dependencies for building the Panel assets.")]),s._v(" "),n("p",[s._v("The build tools require NodeJS, yarn is used as the package manager.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Ubuntu/Debian")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sL https://deb.nodesource.com/setup_14.x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" -E "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v(" -\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -sL https://rpm.nodesource.com/setup_14.x "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" -E "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v(" -\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS 7")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" dnf "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y nodejs "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CentOS 8")]),s._v("\n")])])]),n("p",[s._v("Install required javascript packages.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i -g "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Install Yarn")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /var/www/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Installs panel build dependencies")]),s._v("\n")])])]),n("h2",{attrs:{id:"build-panel-assets"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#build-panel-assets"}},[s._v("#")]),s._v(" Build Panel Assets")]),s._v(" "),n("p",[s._v("The following command will rebuild the Panel frontend.")]),s._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /var/www/pterodactyl\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yarn")]),s._v(" build:production "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Build panel")]),s._v("\n")])])]),n("p",[s._v("You can use command "),n("code",[s._v("yarn run watch")]),s._v(" to view the progress of your changes in almost real-time for easier development. Once you're satisfied with your changes build the panel using the previously mentioned "),n("code",[s._v("yarn build:production")]),s._v(" command.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/33.88a8819c.js b/assets/js/33.731812d7.js similarity index 97% rename from assets/js/33.88a8819c.js rename to assets/js/33.731812d7.js index f3c718a5..3d17da0f 100644 --- a/assets/js/33.88a8819c.js +++ b/assets/js/33.731812d7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{373:function(t,e,s){"use strict";s.r(e);var a=s(48),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"building-wings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#building-wings"}},[t._v("#")]),t._v(" Building Wings")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("Do "),s("strong",[t._v("not")]),t._v(" run the following steps on your production nodes.")])]),t._v(" "),s("p",[t._v("Wings is written in Go. This makes it very easy to modify and compile it on your own, and distribute your own binaries.\nThis guide will cover the steps necessary to build it yourself.")]),t._v(" "),s("p",[t._v("It will not, however, explain where to look for certain aspects of Wings and which changes are necessary to achieve specific results. Knowledge of the Go language is required if you want to modify it.")]),t._v(" "),s("p",[t._v("Building Go programs is very easy, and the same also applies to Wings. Go is cross-platform, but Wings only supports Linux at the moment. The easiest way to compile it for Linux is to run the commands on a Linux machine.")]),t._v(" "),s("h2",{attrs:{id:"build-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build-requirements"}},[t._v("#")]),t._v(" Build Requirements")]),t._v(" "),s("p",[t._v("An up to date version of Go is required to compile Wings. The minimum version can be found at the top of the "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/go.mod",target:"_blank",rel:"noopener noreferrer"}},[t._v("go.mod"),s("OutboundLink")],1),t._v(" file. See the "),s("a",{attrs:{href:"https://golang.org/doc/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("official instructions"),s("OutboundLink")],1),t._v(" for help with installing Go.")]),t._v(" "),s("h2",{attrs:{id:"building"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#building"}},[t._v("#")]),t._v(" Building")]),t._v(" "),s("p",[t._v("Execute the following command in your local clone of the repository to compile Wings into a binary.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("go build\n")])])]),s("p",[t._v("You should now have a "),s("code",[t._v("wings")]),t._v(" binary file in your wings directory.")]),t._v(" "),s("h2",{attrs:{id:"install-the-new-binary"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-the-new-binary"}},[t._v("#")]),t._v(" Install the new binary")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Root required")]),t._v(" "),s("p",[t._v("Some the following commands require root permissions. Prepend them with "),s("code",[t._v("sudo")]),t._v(" if you are not logged in as root.")])]),t._v(" "),s("ol",[s("li",[t._v("Backup the current installation of wings")])]),t._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 function"}},[t._v("mv")]),t._v(" /usr/local/bin/wings /usr/local/bin/wings-backup\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("Place the new binary in "),s("code",[t._v("/usr/local/bin")])])]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("cp ./wings /usr/local/bin\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("Restart wings")])]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("systemctl restart wings\n")])])]),s("h2",{attrs:{id:"troubleshooting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),s("p",[t._v("If the wings service does not start properly, you can try to start Wings in a console window.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("wings --debug\n")])])]),s("p",[t._v("Remember to stop the system service before, and re-enable it afterwards.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("systemctl stop wings\n\nsystemctl start wings\n")])])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{374:function(t,e,s){"use strict";s.r(e);var a=s(48),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"building-wings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#building-wings"}},[t._v("#")]),t._v(" Building Wings")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("Do "),s("strong",[t._v("not")]),t._v(" run the following steps on your production nodes.")])]),t._v(" "),s("p",[t._v("Wings is written in Go. This makes it very easy to modify and compile it on your own, and distribute your own binaries.\nThis guide will cover the steps necessary to build it yourself.")]),t._v(" "),s("p",[t._v("It will not, however, explain where to look for certain aspects of Wings and which changes are necessary to achieve specific results. Knowledge of the Go language is required if you want to modify it.")]),t._v(" "),s("p",[t._v("Building Go programs is very easy, and the same also applies to Wings. Go is cross-platform, but Wings only supports Linux at the moment. The easiest way to compile it for Linux is to run the commands on a Linux machine.")]),t._v(" "),s("h2",{attrs:{id:"build-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build-requirements"}},[t._v("#")]),t._v(" Build Requirements")]),t._v(" "),s("p",[t._v("An up to date version of Go is required to compile Wings. The minimum version can be found at the top of the "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/go.mod",target:"_blank",rel:"noopener noreferrer"}},[t._v("go.mod"),s("OutboundLink")],1),t._v(" file. See the "),s("a",{attrs:{href:"https://golang.org/doc/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("official instructions"),s("OutboundLink")],1),t._v(" for help with installing Go.")]),t._v(" "),s("h2",{attrs:{id:"building"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#building"}},[t._v("#")]),t._v(" Building")]),t._v(" "),s("p",[t._v("Execute the following command in your local clone of the repository to compile Wings into a binary.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("go build\n")])])]),s("p",[t._v("You should now have a "),s("code",[t._v("wings")]),t._v(" binary file in your wings directory.")]),t._v(" "),s("h2",{attrs:{id:"install-the-new-binary"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-the-new-binary"}},[t._v("#")]),t._v(" Install the new binary")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Root required")]),t._v(" "),s("p",[t._v("Some the following commands require root permissions. Prepend them with "),s("code",[t._v("sudo")]),t._v(" if you are not logged in as root.")])]),t._v(" "),s("ol",[s("li",[t._v("Backup the current installation of wings")])]),t._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 function"}},[t._v("mv")]),t._v(" /usr/local/bin/wings /usr/local/bin/wings-backup\n")])])]),s("ol",{attrs:{start:"2"}},[s("li",[t._v("Place the new binary in "),s("code",[t._v("/usr/local/bin")])])]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("cp ./wings /usr/local/bin\n")])])]),s("ol",{attrs:{start:"3"}},[s("li",[t._v("Restart wings")])]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("systemctl restart wings\n")])])]),s("h2",{attrs:{id:"troubleshooting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),s("p",[t._v("If the wings service does not start properly, you can try to start Wings in a console window.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("wings --debug\n")])])]),s("p",[t._v("Remember to stop the system service before, and re-enable it afterwards.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("systemctl stop wings\n\nsystemctl start wings\n")])])])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/34.0edc39f4.js b/assets/js/34.30f48224.js similarity index 99% rename from assets/js/34.0edc39f4.js rename to assets/js/34.30f48224.js index 459320f4..c8b846de 100644 --- a/assets/js/34.0edc39f4.js +++ b/assets/js/34.30f48224.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{375:function(t,a,e){"use strict";e.r(a);var s=e(48),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"centos-7"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#centos-7"}},[t._v("#")]),t._v(" CentOS 7")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver\nto serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("Install Requirements and Additional Utilities")]),e("ul",[e("li",[e("a",{attrs:{href:"#selinux-tools"}},[t._v("SELinux tools")])]),e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#composer"}},[t._v("Composer")])])])]),e("li",[e("a",{attrs:{href:"#install-utility-packages"}},[t._v("Install Utility Packages")]),e("ul",[e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 7.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements-and-additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("#")]),t._v(" Install Requirements and Additional Utilities")]),t._v(" "),e("p",[t._v("We will install all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies and a few aditional utilities.")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you run "),e("code",[t._v("sestatus")]),t._v(" and it shows "),e("code",[t._v("SELinux status: enabled")]),t._v(" you should install the following packages for later")])]),t._v(" "),e("h3",{attrs:{id:"selinux-tools"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-tools"}},[t._v("#")]),t._v(" SELinux tools")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans\n")])])]),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v("EOF "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /etc/yum.repos.d/mariadb.repo\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# MariaDB 10.5 CentOS repository list - created 2017-07-14 12:40 UTC")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# http://downloads.mariadb.org/mariadb/repositories/")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mariadb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nname "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" MariaDB\nbaseurl "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" http://yum.mariadb.org/10.5/centos7-amd64\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gpgkey")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://yum.mariadb.org/RPM-GPG-KEY-MariaDB\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nEOF\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get yum updates")]),t._v("\nyum update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB 10.5")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y MariaDB-common MariaDB-server\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("p",[t._v("We recommend the remi repo to get the latest php packages.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y epel-release http://rpms.remirepo.net/enterprise/remi-release-7.rpm\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y yum-utils\nyum-config-manager --disable remi-php54\nyum-config-manager --enable remi-php74\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get yum updates")]),t._v("\nyum update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php php-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("common,fpm,cli,json,mysqlnd,mcrypt,gd,mbstring,pdo,zip,bcmath,dom,opcache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("zip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("unzip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Required for Composer")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"install-utility-packages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-utility-packages"}},[t._v("#")]),t._v(" Install Utility Packages")]),t._v(" "),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("http --permanent\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https --permanent \nfirewall-cmd --reload\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y --enablerepo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("remi redis\n\nsystemctl start redis\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis\n")])])]),e("h4",{attrs:{id:"selinux-commands"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-commands"}},[t._v("#")]),t._v(" SELinux commands")]),t._v(" "),e("p",[t._v("The following command will allow nginx to work with redis and")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("setsebool -P httpd_can_network_connect "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_execmem "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_unified "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB"),e("br"),t._v("\ninstallation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("Place the contents below in a file inside the "),e("code",[t._v("/etc/php-fpm.d")]),t._v(" folder. The file can be named anything, but a good standard is "),e("code",[t._v("www-pterodactyl.conf")]),t._v(". This config will match the nginx config later in the guide.")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[pterodactyl]\n\nuser = nginx\ngroup = nginx\n\nlisten = /var/run/php-fpm/pterodactyl.sock\nlisten.owner = nginx\nlisten.group = nginx\nlisten.mode = 0750\n\npm = ondemand\npm.max_children = 9\npm.process_idle_timeout = 10s\npm.max_requests = 200")])])]),e("p",[t._v("Start and enable php-fpm on the system.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php-fpm\nsystemctl start php-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n \n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/var/run/php-fpm/pterodactyl.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{376:function(t,a,e){"use strict";e.r(a);var s=e(48),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"centos-7"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#centos-7"}},[t._v("#")]),t._v(" CentOS 7")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver\nto serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("Install Requirements and Additional Utilities")]),e("ul",[e("li",[e("a",{attrs:{href:"#selinux-tools"}},[t._v("SELinux tools")])]),e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#composer"}},[t._v("Composer")])])])]),e("li",[e("a",{attrs:{href:"#install-utility-packages"}},[t._v("Install Utility Packages")]),e("ul",[e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 7.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements-and-additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("#")]),t._v(" Install Requirements and Additional Utilities")]),t._v(" "),e("p",[t._v("We will install all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies and a few aditional utilities.")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you run "),e("code",[t._v("sestatus")]),t._v(" and it shows "),e("code",[t._v("SELinux status: enabled")]),t._v(" you should install the following packages for later")])]),t._v(" "),e("h3",{attrs:{id:"selinux-tools"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-tools"}},[t._v("#")]),t._v(" SELinux tools")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans\n")])])]),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v("EOF "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /etc/yum.repos.d/mariadb.repo\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# MariaDB 10.5 CentOS repository list - created 2017-07-14 12:40 UTC")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# http://downloads.mariadb.org/mariadb/repositories/")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mariadb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nname "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" MariaDB\nbaseurl "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" http://yum.mariadb.org/10.5/centos7-amd64\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gpgkey")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://yum.mariadb.org/RPM-GPG-KEY-MariaDB\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gpgcheck")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nEOF\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get yum updates")]),t._v("\nyum update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB 10.5")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y MariaDB-common MariaDB-server\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("p",[t._v("We recommend the remi repo to get the latest php packages.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y epel-release http://rpms.remirepo.net/enterprise/remi-release-7.rpm\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y yum-utils\nyum-config-manager --disable remi-php54\nyum-config-manager --enable remi-php74\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get yum updates")]),t._v("\nyum update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\nyum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php php-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("common,fpm,cli,json,mysqlnd,mcrypt,gd,mbstring,pdo,zip,bcmath,dom,opcache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("zip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("unzip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Required for Composer")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"install-utility-packages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-utility-packages"}},[t._v("#")]),t._v(" Install Utility Packages")]),t._v(" "),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("http --permanent\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https --permanent \nfirewall-cmd --reload\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y --enablerepo"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("remi redis\n\nsystemctl start redis\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis\n")])])]),e("h4",{attrs:{id:"selinux-commands"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-commands"}},[t._v("#")]),t._v(" SELinux commands")]),t._v(" "),e("p",[t._v("The following command will allow nginx to work with redis and")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("setsebool -P httpd_can_network_connect "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_execmem "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_unified "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB"),e("br"),t._v("\ninstallation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("Place the contents below in a file inside the "),e("code",[t._v("/etc/php-fpm.d")]),t._v(" folder. The file can be named anything, but a good standard is "),e("code",[t._v("www-pterodactyl.conf")]),t._v(". This config will match the nginx config later in the guide.")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[pterodactyl]\n\nuser = nginx\ngroup = nginx\n\nlisten = /var/run/php-fpm/pterodactyl.sock\nlisten.owner = nginx\nlisten.group = nginx\nlisten.mode = 0750\n\npm = ondemand\npm.max_children = 9\npm.process_idle_timeout = 10s\npm.max_requests = 200")])])]),e("p",[t._v("Start and enable php-fpm on the system.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php-fpm\nsystemctl start php-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n \n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/var/run/php-fpm/pterodactyl.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/35.969d92c8.js b/assets/js/35.39990a3a.js similarity index 99% rename from assets/js/35.969d92c8.js rename to assets/js/35.39990a3a.js index 6dfad281..4e7a3d50 100644 --- a/assets/js/35.969d92c8.js +++ b/assets/js/35.39990a3a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{376:function(t,a,e){"use strict";e.r(a);var s=e(48),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"centos-8"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#centos-8"}},[t._v("#")]),t._v(" CentOS 8")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("Install Requirements and Additional Utilities")]),e("ul",[e("li",[e("a",{attrs:{href:"#selinux-tools"}},[t._v("SELinux tools")])]),e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#composer"}},[t._v("Composer")])])])]),e("li",[e("a",{attrs:{href:"#install-utility-packages"}},[t._v("Install Utility Packages")]),e("ul",[e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/etting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 8.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements-and-additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("#")]),t._v(" Install Requirements and Additional Utilities")]),t._v(" "),e("p",[t._v("We will install all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies and a few aditional utilities.")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you run "),e("code",[t._v("sestatus")]),t._v(" and it shows "),e("code",[t._v("SELinux status: enabled")]),t._v(" you should install the following packages for later")])]),t._v(" "),e("h3",{attrs:{id:"selinux-tools"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-tools"}},[t._v("#")]),t._v(" SELinux tools")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y policycoreutils selinux-policy selinux-policy-targeted setroubleshoot-server setools setools-console mcstrans\n")])])]),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb mariadb-server\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("p",[t._v("We recommend the remi repo to get the latest php packages.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" epel-release\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" https://rpms.remirepo.net/enterprise/remi-release-8.rpm\ndnf module "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php:remi-7.4\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get dnf updates")]),t._v("\ndnf update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php php-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("common,fpm,cli,json,mysqlnd,gd,mbstring,pdo,zip,bcmath,dom,opcache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("zip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("unzip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Required for Composer")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"install-utility-packages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-utility-packages"}},[t._v("#")]),t._v(" Install Utility Packages")]),t._v(" "),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("http --permanent\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https --permanent \nfirewall-cmd --reload\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis\n\nsystemctl start redis\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis\n")])])]),e("h4",{attrs:{id:"selinux-commands"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-commands"}},[t._v("#")]),t._v(" SELinux commands")]),t._v(" "),e("p",[t._v("The following command will allow nginx to work with redis and")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("setsebool -P httpd_can_network_connect "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_execmem "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_unified "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB"),e("br"),t._v("\ninstallation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("Place the contents below in a file inside the "),e("code",[t._v("/etc/php-fpm.d")]),t._v(" folder. The file can be named anything, but a good standard is "),e("code",[t._v("www-pterodactyl.conf")]),t._v(". This config will match the nginx config later in the guide.")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[pterodactyl]\n\nuser = nginx\ngroup = nginx\n\nlisten = /var/run/php-fpm/pterodactyl.sock\nlisten.owner = nginx\nlisten.group = nginx\nlisten.mode = 0750\n\npm = ondemand\npm.max_children = 9\npm.process_idle_timeout = 10s\npm.max_requests = 200")])])]),e("p",[t._v("Start and enable php-fpm on the system.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php-fpm\nsystemctl start php-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n \n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/var/run/php-fpm/pterodactyl.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{377:function(t,a,e){"use strict";e.r(a);var s=e(48),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"centos-8"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#centos-8"}},[t._v("#")]),t._v(" CentOS 8")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("Install Requirements and Additional Utilities")]),e("ul",[e("li",[e("a",{attrs:{href:"#selinux-tools"}},[t._v("SELinux tools")])]),e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#composer"}},[t._v("Composer")])])])]),e("li",[e("a",{attrs:{href:"#install-utility-packages"}},[t._v("Install Utility Packages")]),e("ul",[e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/etting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 8.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements-and-additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements-and-additional-utilities"}},[t._v("#")]),t._v(" Install Requirements and Additional Utilities")]),t._v(" "),e("p",[t._v("We will install all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies and a few aditional utilities.")],1),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you run "),e("code",[t._v("sestatus")]),t._v(" and it shows "),e("code",[t._v("SELinux status: enabled")]),t._v(" you should install the following packages for later")])]),t._v(" "),e("h3",{attrs:{id:"selinux-tools"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-tools"}},[t._v("#")]),t._v(" SELinux tools")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y policycoreutils selinux-policy selinux-policy-targeted setroubleshoot-server setools setools-console mcstrans\n")])])]),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb mariadb-server\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("p",[t._v("We recommend the remi repo to get the latest php packages.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install Repos")]),t._v("\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" epel-release\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" https://rpms.remirepo.net/enterprise/remi-release-8.rpm\ndnf module "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php:remi-7.4\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get dnf updates")]),t._v("\ndnf update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\ndnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php php-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("common,fpm,cli,json,mysqlnd,gd,mbstring,pdo,zip,bcmath,dom,opcache"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("zip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("unzip")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Required for Composer")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"install-utility-packages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-utility-packages"}},[t._v("#")]),t._v(" Install Utility Packages")]),t._v(" "),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("http --permanent\nfirewall-cmd --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https --permanent \nfirewall-cmd --reload\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("dnf "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis\n\nsystemctl start redis\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis\n")])])]),e("h4",{attrs:{id:"selinux-commands"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selinux-commands"}},[t._v("#")]),t._v(" SELinux commands")]),t._v(" "),e("p",[t._v("The following command will allow nginx to work with redis and")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("setsebool -P httpd_can_network_connect "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_execmem "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nsetsebool -P httpd_unified "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB"),e("br"),t._v("\ninstallation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("Place the contents below in a file inside the "),e("code",[t._v("/etc/php-fpm.d")]),t._v(" folder. The file can be named anything, but a good standard is "),e("code",[t._v("www-pterodactyl.conf")]),t._v(". This config will match the nginx config later in the guide.")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("[pterodactyl]\n\nuser = nginx\ngroup = nginx\n\nlisten = /var/run/php-fpm/pterodactyl.sock\nlisten.owner = nginx\nlisten.group = nginx\nlisten.mode = 0750\n\npm = ondemand\npm.max_children = 9\npm.process_idle_timeout = 10s\npm.max_requests = 200")])])]),e("p",[t._v("Start and enable php-fpm on the system.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php-fpm\nsystemctl start php-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n \n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/var/run/php-fpm/pterodactyl.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/36.49b831e2.js b/assets/js/36.8ec9602c.js similarity index 99% rename from assets/js/36.49b831e2.js rename to assets/js/36.8ec9602c.js index fbe85c5f..156c5016 100644 --- a/assets/js/36.49b831e2.js +++ b/assets/js/36.8ec9602c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{377:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"debian-10"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debian-10"}},[t._v("#")]),t._v(" Debian 10")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 10.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start mariadb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,common,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v("\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{378:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"debian-10"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#debian-10"}},[t._v("#")]),t._v(" Debian 10")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 10.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start mariadb")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,common,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v("\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up mariadb is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/37.46d8127b.js b/assets/js/37.81b1b06a.js similarity index 99% rename from assets/js/37.46d8127b.js rename to assets/js/37.81b1b06a.js index 7e3b0407..874284fd 100644 --- a/assets/js/37.46d8127b.js +++ b/assets/js/37.81b1b06a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{378:function(t,a,s){"use strict";s.r(a);var e=s(48),r=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"debian-9"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#debian-9"}},[t._v("#")]),t._v(" Debian 9")]),t._v(" "),s("p",[t._v("In this guide we will install Pterodactyl v1.x — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),s("ul",[s("li",[s("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),s("li",[s("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),s("li",[s("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),s("li",[s("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),s("li",[s("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),s("li",[s("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),s("ul",[s("li",[s("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),s("li",[s("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),s("li",[s("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),s("li",[s("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),s("li",[s("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),s("p"),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This guide is based off the "),s("RouterLink",{attrs:{to:"/panel/1.0/etting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 9.")],1)]),t._v(" "),s("h2",{attrs:{id:"install-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),s("p",[t._v("We will first begin by installing all of Pterodactyl's "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),s("h3",{attrs:{id:"mariadb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y software-properties-common dirmngr\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),s("h3",{attrs:{id:"php-7-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._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"}},[t._v("## Install the PHP 7.4 repo for debian")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y ca-certificates apt-transport-https\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" -q https://packages.sury.org/php/apt.gpg -O- "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb https://packages.sury.org/php/ stretch main"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" /etc/apt/sources.list.d/php.list\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),s("h3",{attrs:{id:"redis"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),s("h3",{attrs:{id:"additional-utilities"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),s("h4",{attrs:{id:"certbot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v("\n")])])]),s("h4",{attrs:{id:"composer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._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 function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),s("h2",{attrs:{id:"server-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),s("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),s("h3",{attrs:{id:"configuring-mariadb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),s("p",[t._v("The fastest way to set up mariadb is to use the "),s("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("mysql_secure_installation\n")])])]),s("p",[t._v("The following are safe defaults.")]),t._v(" "),s("p",[t._v("Change to your own secure password"),s("br"),t._v(" "),s("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Get rid of users that could access the db by default"),s("br"),t._v(" "),s("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Keep root off the external interfaces"),s("br"),t._v(" "),s("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Extra databases that aren't needed"),s("br"),t._v(" "),s("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Clears and sets all the changes made"),s("br"),t._v(" "),s("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),s("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),s("h4",{attrs:{id:"adding-mariadb-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),s("p",[t._v("To add your first user to the database, see our tutorial on "),s("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),s("h3",{attrs:{id:"setup-php"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),s("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),s("h3",{attrs:{id:"nginx-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),s("p",[t._v("Please check our "),s("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),s("h4",{attrs:{id:"ssl-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),s("div",{staticClass:"language-conf extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),s("h3",{attrs:{id:"redis-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),s("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),s("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"installing-the-panel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),s("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{379:function(t,a,s){"use strict";s.r(a);var e=s(48),r=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"debian-9"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#debian-9"}},[t._v("#")]),t._v(" Debian 9")]),t._v(" "),s("p",[t._v("In this guide we will install Pterodactyl v1.x — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),s("ul",[s("li",[s("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),s("li",[s("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),s("li",[s("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),s("li",[s("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),s("li",[s("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),s("li",[s("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),s("ul",[s("li",[s("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),s("li",[s("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),s("li",[s("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),s("li",[s("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),s("li",[s("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),s("p"),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This guide is based off the "),s("RouterLink",{attrs:{to:"/panel/1.0/etting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 9.")],1)]),t._v(" "),s("h2",{attrs:{id:"install-requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),s("p",[t._v("We will first begin by installing all of Pterodactyl's "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),s("h3",{attrs:{id:"mariadb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y software-properties-common dirmngr\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start maraidb")]),t._v("\nsystemctl start mariadb\nsystemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),s("h3",{attrs:{id:"php-7-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._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"}},[t._v("## Install the PHP 7.4 repo for debian")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y ca-certificates apt-transport-https\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" -q https://packages.sury.org/php/apt.gpg -O- "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb https://packages.sury.org/php/ stretch main"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" /etc/apt/sources.list.d/php.list\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),s("h3",{attrs:{id:"redis"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),s("h3",{attrs:{id:"additional-utilities"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),s("h4",{attrs:{id:"certbot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._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 function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v("\n")])])]),s("h4",{attrs:{id:"composer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._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 function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),s("h2",{attrs:{id:"server-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),s("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),s("h3",{attrs:{id:"configuring-mariadb"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),s("p",[t._v("The fastest way to set up mariadb is to use the "),s("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("mysql_secure_installation\n")])])]),s("p",[t._v("The following are safe defaults.")]),t._v(" "),s("p",[t._v("Change to your own secure password"),s("br"),t._v(" "),s("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Get rid of users that could access the db by default"),s("br"),t._v(" "),s("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Keep root off the external interfaces"),s("br"),t._v(" "),s("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Extra databases that aren't needed"),s("br"),t._v(" "),s("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),s("p",[t._v("Clears and sets all the changes made"),s("br"),t._v(" "),s("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),s("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),s("h4",{attrs:{id:"adding-mariadb-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),s("p",[t._v("To add your first user to the database, see our tutorial on "),s("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),s("h3",{attrs:{id:"setup-php"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),s("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),s("h3",{attrs:{id:"nginx-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),s("p",[t._v("Please check our "),s("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),s("h4",{attrs:{id:"ssl-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),s("div",{staticClass:"language-conf extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),s("h3",{attrs:{id:"redis-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),s("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),s("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"installing-the-panel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),s("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/38.9d9c367c.js b/assets/js/38.e1f447b2.js similarity index 99% rename from assets/js/38.9d9c367c.js rename to assets/js/38.e1f447b2.js index b0cee93b..7c3c4e8b 100644 --- a/assets/js/38.9d9c367c.js +++ b/assets/js/38.e1f447b2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{379:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-18-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-18-04"}},[t._v("#")]),t._v(" Ubuntu 18.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 18.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start MariaDB")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up MariaDB is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{380:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-18-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-18-04"}},[t._v("#")]),t._v(" Ubuntu 18.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 18.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start MariaDB")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up MariaDB is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/39.4e9577b6.js b/assets/js/39.d8c67b81.js similarity index 99% rename from assets/js/39.4e9577b6.js rename to assets/js/39.d8c67b81.js index 93bbc35e..0685a95b 100644 --- a/assets/js/39.4e9577b6.js +++ b/assets/js/39.d8c67b81.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{380:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-20-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-20-04"}},[t._v("#")]),t._v(" Ubuntu 20.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 20.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start MariaDB")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up MariaDB is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{381:function(t,a,e){"use strict";e.r(a);var s=e(48),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-20-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-20-04"}},[t._v("#")]),t._v(" Ubuntu 20.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#mariadb"}},[t._v("MariaDB")])]),e("li",[e("a",{attrs:{href:"#php-7-4"}},[t._v("PHP 7.4")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis"}},[t._v("Redis")])]),e("li",[e("a",{attrs:{href:"#additional-utilities"}},[t._v("Additional Utilities")])])])]),e("li",[e("a",{attrs:{href:"#server-configuration"}},[t._v("Server Configuration")]),e("ul",[e("li",[e("a",{attrs:{href:"#configuring-mariadb"}},[t._v("Configuring MariaDB")])]),e("li",[e("a",{attrs:{href:"#setup-php"}},[t._v("Setup PHP")])]),e("li",[e("a",{attrs:{href:"#nginx"}},[t._v("Nginx")])]),e("li",[e("a",{attrs:{href:"#redis-setup"}},[t._v("Redis Setup")])])])]),e("li",[e("a",{attrs:{href:"#installing-the-panel"}},[t._v("Installing the Panel")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 20.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Pterodactyl's "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mariadb"}},[t._v("#")]),t._v(" MariaDB")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install MariaDB")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y mariadb-common mariadb-server mariadb-client\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Start MariaDB")]),t._v("\nsystemctl start mariadb\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" mariadb\n")])])]),e("h3",{attrs:{id:"php-7-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#php-7-4"}},[t._v("#")]),t._v(" PHP 7.4")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Get apt updates")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install PHP 7.4")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" -y "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" php7.4 php7.4-"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y nginx\n")])])]),e("h3",{attrs:{id:"redis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[t._v("#")]),t._v(" Redis")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y redis-server\n\nsystemctl start redis-server\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" redis-server\n")])])]),e("h3",{attrs:{id:"additional-utilities"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-utilities"}},[t._v("#")]),t._v(" Additional Utilities")]),t._v(" "),e("h4",{attrs:{id:"certbot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#certbot"}},[t._v("#")]),t._v(" Certbot")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y certbot\n")])])]),e("h4",{attrs:{id:"composer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#composer"}},[t._v("#")]),t._v(" Composer")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -sS https://getcomposer.org/installer "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" php -- --install-dir"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/bin --filename"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("composer\n")])])]),e("h2",{attrs:{id:"server-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#server-configuration"}},[t._v("#")]),t._v(" Server Configuration")]),t._v(" "),e("p",[t._v("This following section covers the configuration of parts of the server to run the panel.")]),t._v(" "),e("h3",{attrs:{id:"configuring-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-mariadb"}},[t._v("#")]),t._v(" Configuring MariaDB")]),t._v(" "),e("p",[t._v("The fastest way to set up MariaDB is to use the "),e("code",[t._v("mysql_secure_installation")]),t._v(" command and follow prompts")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("mysql_secure_installation\n")])])]),e("p",[t._v("The following are safe defaults.")]),t._v(" "),e("p",[t._v("Change to your own secure password"),e("br"),t._v(" "),e("code",[t._v("Set root password? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Get rid of users that could access the db by default"),e("br"),t._v(" "),e("code",[t._v("Remove anonymous users? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Keep root off the external interfaces"),e("br"),t._v(" "),e("code",[t._v("Disallow root login remotely? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Extra databases that aren't needed"),e("br"),t._v(" "),e("code",[t._v("Remove test database and access to it? [Y/n] Y")])]),t._v(" "),e("p",[t._v("Clears and sets all the changes made"),e("br"),t._v(" "),e("code",[t._v("Reload privilege tables now? [Y/n] Y")])]),t._v(" "),e("p",[t._v("All done! If you've completed all of the above steps, your MariaDB installation should now be secure.")]),t._v(" "),e("h4",{attrs:{id:"adding-mariadb-user"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-mariadb-user"}},[t._v("#")]),t._v(" Adding MariaDB user")]),t._v(" "),e("p",[t._v("To add your first user to the database, see our tutorial on "),e("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[t._v("setting up MySQL")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"setup-php"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setup-php"}},[t._v("#")]),t._v(" Setup PHP")]),t._v(" "),e("p",[t._v("The default php-fpm configuration is fine to use and can be started and then enabled on the system using the\ncommands below.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" php7.4-fpm\nsystemctl start php7.4-fpm\n")])])]),e("h3",{attrs:{id:"nginx-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nginx-2"}},[t._v("#")]),t._v(" Nginx")]),t._v(" "),e("p",[t._v("Please check our "),e("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("tutorial")]),t._v(" on generating SSL certificates for more information.")],1),t._v(" "),e("h4",{attrs:{id:"ssl-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ssl-configuration"}},[t._v("#")]),t._v(" SSL Configuration")]),t._v(" "),e("div",{staticClass:"language-conf extra-class"},[e("div",{staticClass:"highlight-lines"},[e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("div",{staticClass:"highlighted"},[t._v(" ")]),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br"),e("br")]),e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.4-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),e("h3",{attrs:{id:"redis-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#redis-setup"}},[t._v("#")]),t._v(" Redis Setup")]),t._v(" "),e("p",[t._v("The default Redis install is perfectly fine for the panel. If you have Redis already in use you may want to look into\n"),e("a",{attrs:{href:"https://community.pivotal.io/s/article/How-to-setup-and-run-multiple-Redis-server-instances-on-a-Linux-host",target:"_blank",rel:"noopener noreferrer"}},[t._v("running another Redis instance"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"installing-the-panel"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-the-panel"}},[t._v("#")]),t._v(" Installing the Panel")]),t._v(" "),e("p",[t._v("Excellent, we now have all of the required dependencies installed and configured. From here, follow the "),e("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html#download-files"}},[t._v("official Panel installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/4.9dfb277d.js b/assets/js/4.6431cc96.js similarity index 99% rename from assets/js/4.9dfb277d.js rename to assets/js/4.6431cc96.js index 63121294..28687013 100644 --- a/assets/js/4.9dfb277d.js +++ b/assets/js/4.6431cc96.js @@ -1,3 +1,3 @@ (window.webpackJsonp=window.webpackJsonp||[]).push([[4,9,25,26],{315:function(t,e,s){"use strict";s.r(e);s(179),s(71),s(317);var n=s(312),i={props:{item:{required:!0}},computed:{link:function(){return Object(n.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(e){return e===t.link})):"/"===this.link}},methods:{isExternal:n.f,isMailto:n.g,isTel:n.h}},a=s(48),r=Object(a.a)(i,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.isExternal(t.link)?s("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.isMailto(t.link)||t.isTel(t.link)?null:"_blank",rel:t.isMailto(t.link)||t.isTel(t.link)?null:"noopener noreferrer"}},[t._v("\n "+t._s(t.item.text)+"\n "),s("OutboundLink")],1):s("router-link",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact}},[t._v(t._s(t.item.text)+"\n")])}),[],!1,null,null,null);e.default=r.exports},317:function(t,e,s){"use strict";var n=s(0),i=s(318);n({target:"String",proto:!0,forced:s(319)("link")},{link:function(t){return i(this,"a","href",t)}})},318:function(t,e,s){var n=s(25),i=/"/g;t.exports=function(t,e,s,a){var r=String(n(t)),o="<"+e;return""!==s&&(o+=" "+s+'="'+String(a).replace(i,""")+'"'),o+">"+r+""}},319:function(t,e,s){var n=s(2);t.exports=function(t){return n((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},324:function(t,e,s){"use strict";s.r(e);var n=s(315),i=s(321),a={components:{NavLink:n.default,DropdownTransition:i.default},data:function(){return{open:!1}},props:{item:{required:!0}},methods:{toggle:function(){this.open=!this.open}}},r=s(48),o=Object(r.a)(a,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[s("a",{staticClass:"dropdown-title",on:{click:t.toggle}},[s("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),s("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),s("DropdownTransition",[s("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(e,n){return s("li",{key:e.link||n,staticClass:"dropdown-item"},["links"===e.type?s("h4",[t._v(t._s(e.text))]):t._e(),t._v(" "),"links"===e.type?s("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(e.items,(function(t){return s("li",{key:t.link,staticClass:"dropdown-subitem"},[s("NavLink",{attrs:{item:t}})],1)})),0):s("NavLink",{attrs:{item:e}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=o.exports},325:function(t,e,s){"use strict";s.r(e);s(109),s(49),s(179),s(71),s(181),s(50),s(74),s(313),s(70);var n=s(31),i=s(324),a=s(312),r={components:{NavLink:s(315).default,DropdownLink:i.default},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,e=this.$site.locales;if(e&&Object.keys(e).length>1){var s=this.$page.path,i=this.$router.options.routes,a=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",items:Object.keys(e).map((function(n){var r,o=e[n],c=a[n]&&a[n].label||o.lang;return o.lang===t.$lang?r=s:(r=s.replace(t.$localeConfig.path,n),i.some((function(t){return t.path===r}))||(r=n)),{text:c,link:r}}))};return[].concat(Object(n.a)(this.userNav),[r])}return this.userNav},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(a.k)(t),{items:(t.items||[]).map(a.k)})}))},repoLink:function(){var t=this.$site.themeConfig.repo;if(t)return/^https?:/.test(t)?t:"https://github.com/".concat(t)},repoLabel:function(){if(this.repoLink){if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"],s=0;s-1},r=[],o=0;o=n);o++){var c=s[o];if(this.getPageLocalePath(c)===i)if(a(c))r.push(c);else if(c.headers)for(var l=0;l=n);l++){var u=c.headers[l];a(u)&&r.push(Object.assign({},c,{path:c.path+"#"+u.slug,header:u}))}}return r}},alignRight:function(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},methods:{getPageLocalePath:function(t){for(var e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},onUp:function(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown:function(){this.showSuggestions&&(this.focusIndex "+t._s(e.header.title))]):t._e()])])})),0)]):t._e()])}),[],!1,null,null,null);e.default=a.exports},333:function(t,e,s){"use strict";s.r(e);var n=s(48),i=Object(n.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[s("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[s("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);e.default=i.exports},337:function(t,e,s){},338:function(t,e,s){},341:function(t,e,s){"use strict";s.r(e);var n=s(315),i=s(330),a={components:{NavLink:n.default,Slick:i.default},data:function(){return{slickOptions:{slidesToShow:1,centerMode:!0,centerPadding:"0",speed:1e3,autoplay:!0,variableWidth:!0,arrows:!1,dots:!0,pauseOnHover:!1,pauseOnDotsHover:!0}}},computed:{data:function(){return this.$page.frontmatter},actionLink:function(){return{link:this.data.actionLink,text:this.data.actionText}}}},r=s(48),o=Object(r.a)(a,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"home"},[s("div",{staticClass:"header section bg-blue text-grey-lightest less-padding emphasize"},[s("div",{staticClass:"container z-10"},[s("div",{staticClass:"text-center"},[t._m(0),t._v(" "),s("div",{staticClass:"mt-4"},[s("router-link",{staticClass:"btn inline-block",attrs:{to:"/panel/getting_started.html"}},[t._v("Let's Get Started!")])],1)])])]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),s("div",{staticClass:"section bg-white"},[s("div",{staticClass:"text-center"},[s("h1",[t._v("Screenshots")]),t._v(" "),s("div",{staticClass:"screenshots"},[s("slick",{ref:"slick",attrs:{options:t.slickOptions}},[s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-1.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-1.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-2.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-2.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-3.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-3.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-4.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-4.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-5.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-5.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-6.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-6.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-7.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-7.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-8.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-8.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-9.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-9.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-10.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-10.png"}})]),t._v(" "),s("a",{attrs:{href:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-11.png"}},[s("img",{attrs:{src:"https://cdn.pterodactyl.io/site-assets/carousel/screenshot-11.png"}})])])],1)])]),t._v(" "),s("div",{staticClass:"section bg-blue text-grey-lightest"},[s("div",{staticClass:"container text-center"},[s("h1",[t._v("Get Started")]),t._v(" "),s("p",{staticClass:"m-4"},[t._v("Ready to fly on the Pterodactyl?")]),t._v(" "),s("div",{staticClass:"mt-4"},[s("router-link",{staticClass:"btn inline-block",attrs:{to:"/project/introduction.html"}},[t._v("About the project")]),t._v(" "),s("a",{staticClass:"btn inline-block",attrs:{href:"https://discord.gg/pterodactyl"}},[t._v("Discord")])],1)])]),t._v(" "),s("div",{staticClass:"section bg-black text-grey-lighter text-sm less-padding"},[s("div",{staticClass:"container text-center"},[s("div",[s("img",{staticClass:"h-20",attrs:{src:t.$withBase("logos/banner_logo.png"),alt:"pterodactyl banner logo"}})]),t._v(" "),t._m(3),t._v(" "),s("div",{staticClass:"footer"},[t._v("MIT Licensed | Copyright © 2015 - 2021 Dane Everitt & Contributors.")])])])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("div",[e("img",{staticClass:"max-w-xl w-full inline-block",attrs:{src:"https://cdn.pterodactyl.io/logos/new/pterodactyl_logo_transparent.png",alt:"Pterodactyl"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"section bg-white"},[e("div",{staticClass:"container text-center"},[e("h1",{staticClass:"text-blue mb-4"},[this._v("Pterodactyl Panel")]),this._v(" "),e("h3",{staticClass:"border-0 font-normal leading-normal mx-auto",staticStyle:{"max-width":"50rem"}},[this._v("\n Pterodactyl is an open-source game server management panel built with PHP 7, React, and Go.\n Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers\n while exposing a beautiful and intuitive UI to end users.\n ")]),this._v(" "),e("h3",{staticClass:"border-0 leading-normal mx-auto mt-4",staticStyle:{"max-width":"50rem"}},[this._v("\n Stop settling for less. Make game servers a first class citizen on your platform.\n ")]),this._v(" "),e("img",{staticClass:"max-w-lg w-full m-4 inline-block",attrs:{src:"https://cdn.pterodactyl.io/site-assets/mockup-macbook-grey-1.0.png"}})])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"section bg-blue text-grey-lightest"},[s("div",{staticClass:"container text-center"},[s("h1",{staticClass:"mb-4"},[t._v("Why Pterodactyl")]),t._v(" "),s("div",{staticClass:"flex flex-wrap"},[s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-lock"})]),t._v(" "),s("h3",[t._v("Security First")]),t._v(" "),s("p",[t._v("Security is a first-class citizen on this platform with bcrypt hashing, AES-256-CBC encryption, and HTTPS support out of the box.")])]),t._v(" "),s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-beaker"})]),t._v(" "),s("h3",[t._v("Modern Tooling")]),t._v(" "),s("p",[t._v("Built on a modern stack utilizing the best design practices that make it easy to jump in and make modifications.")])]),t._v(" "),s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-anchor"})]),t._v(" "),s("h3",[t._v("Docker to the Core")]),t._v(" "),s("p",[t._v("All servers run in isolated Docker containers that limit attack vectors, provide strict resource limits, and provide environments tailored to each specific game.")])]),t._v(" "),s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-wallet"})]),t._v(" "),s("h3",[t._v("Free & Open Source")]),t._v(" "),s("p",[t._v("Pterodactyl is 100% free and licensed under a MIT license. All of our code is completely open source as well.")])]),t._v(" "),s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-browser"})]),t._v(" "),s("h3",[t._v("User Friendly")]),t._v(" "),s("p",[t._v("Save the furious clicking and screaming for Overwatch. Pterodactyl's interface is designed so well even Hanzo can use it.")])]),t._v(" "),s("div",{staticClass:"feature"},[s("span",[s("i",{staticClass:"icon icon-expand"})]),t._v(" "),s("h3",[t._v("Scalable")]),t._v(" "),s("p",[t._v("Whether you're a hosting company, the next Hyplex, or just some dudes playing video games, we've got you covered.")])])])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"text-left md:flex"},[s("div",{staticClass:"flex-none w-full md:w-1/2 md:pr-12"},[s("p",{staticClass:"my-4"},[t._v("\n Since 2015 Pterodactyl has been delivering robust, performant, and secure software that allows\n individuals, networks, and hosting companies to run game servers at scale; easily. Best of all?\n No exorbitant monthly costs.\n ")]),t._v(" "),s("p",{staticClass:"my-4"},[t._v("\n Take the plunge today and discover why thousands of users trust Pterodactyl to manage their\n game servers.\n ")])]),t._v(" "),s("div",{staticClass:"hidden md:block md:flex-1 md:pr-12"},[s("p",[s("a",{staticClass:"text-grey-lightest",attrs:{href:"https://github.com/pterodactyl"}},[t._v("GitHub")])]),t._v(" "),s("p",[s("a",{staticClass:"text-grey-lightest",attrs:{href:"https://github.com/sponsors/DaneEveritt"}},[t._v("Sponsor")])]),t._v(" "),s("p",[s("a",{staticClass:"text-grey-lightest",attrs:{href:"https://paypal.me/PterodactylSoftware"}},[t._v("Donate")])]),t._v(" "),s("p",[s("a",{staticClass:"text-grey-lightest",attrs:{href:"/panel/troubleshooting.html"}},[t._v("Troubleshooting")])]),t._v(" "),s("p",[s("a",{staticClass:"text-grey-lightest",attrs:{href:"https://github.com/parkervcp/eggs"}},[t._v("Additional Game Configurations")])])]),t._v(" "),s("div",{staticClass:"text-center mt-8 md:flex-1 md:mt-0"},[s("a",{attrs:{href:"https://discord.gg/pterodactyl",target:"_blank",rel:"nofollow noopener"}},[s("img",{staticClass:"w-3/4",attrs:{src:"https://cdn.pterodactyl.io/site-assets/discord.png"}})])])])}],!1,null,null,null);e.default=o.exports},342:function(t,e,s){"use strict";s.r(e);var n=s(333),i=s(331),a=s(325),r={components:{SidebarButton:n.default,NavLinks:a.default,SearchBox:i.default},computed:{}},o=s(48),c=Object(o.a)(r,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("header",{staticClass:"nav"},[s("SidebarButton",{staticClass:"block md:hidden flex-no-shrink",on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),s("div",{staticClass:"logo-container"},[s("router-link",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?s("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo)}}):t._e(),t._v(" "),t.$siteTitle?s("span",{staticClass:"site-name hidden md:inline",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()])],1),t._v(" "),s("div",{staticClass:"w-full"},[s("div",{staticClass:"flex"},[s("SearchBox"),t._v(" "),s("NavLinks",{staticClass:"hidden md:flex"})],1)])],1)}),[],!1,null,null,null);e.default=c.exports},343:function(t,e,s){"use strict";s.r(e);s(51),s(77),s(50),s(70),s(52);var n=s(31),i=s(312);function a(t,e,s){var i=[];e.forEach((function(t){"group"===t.type?i.push.apply(i,Object(n.a)(t.children||[])):i.push(t)}));for(var a=0;a-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(r.e)(this.$route,t.path)}}},c=s(48),l=Object(c.a)(o,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"sidebar"},[s("NavLinks",{staticClass:"block md:hidden"}),t._v(" "),t._t("top"),t._v(" "),t.items.length?s("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(e,n){return s("li",{key:e.path},["group"===e.type?s("SidebarGroup",{attrs:{item:e,first:0===n,open:n===t.openGroupIndex,collapsable:e.collapsable},on:{toggle:function(e){return t.toggleGroup(n)}}}):s("SidebarLink",{attrs:{item:e}})],1)})),0):t._e(),t._v(" "),t._t("bottom")],2)}),[],!1,null,null,null);e.default=l.exports},347:function(t,e,s){var n,i; /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT */void 0===(i="function"==typeof(n=function(){var t,e,s={version:"0.2.0"},n=s.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function i(t,e,s){return ts?s:t}function a(t){return 100*(-1+t)}s.configure=function(t){var e,s;for(e in t)void 0!==(s=t[e])&&t.hasOwnProperty(e)&&(n[e]=s);return this},s.status=null,s.set=function(t){var e=s.isStarted();t=i(t,n.minimum,1),s.status=1===t?null:t;var c=s.render(!e),l=c.querySelector(n.barSelector),u=n.speed,d=n.easing;return c.offsetWidth,r((function(e){""===n.positionUsing&&(n.positionUsing=s.getPositioningCSS()),o(l,function(t,e,s){var i;return(i="translate3d"===n.positionUsing?{transform:"translate3d("+a(t)+"%,0,0)"}:"translate"===n.positionUsing?{transform:"translate("+a(t)+"%,0)"}:{"margin-left":a(t)+"%"}).transition="all "+e+"ms "+s,i}(t,u,d)),1===t?(o(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){o(c,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){s.remove(),e()}),u)}),u)):setTimeout(e,u)})),this},s.isStarted=function(){return"number"==typeof s.status},s.start=function(){s.status||s.set(0);var t=function(){setTimeout((function(){s.status&&(s.trickle(),t())}),n.trickleSpeed)};return n.trickle&&t(),this},s.done=function(t){return t||s.status?s.inc(.3+.5*Math.random()).set(1):this},s.inc=function(t){var e=s.status;return e?("number"!=typeof t&&(t=(1-e)*i(Math.random()*e,.1,.95)),e=i(e+t,0,.994),s.set(e)):s.start()},s.trickle=function(){return s.inc(Math.random()*n.trickleRate)},t=0,e=0,s.promise=function(n){return n&&"resolved"!==n.state()?(0===e&&s.start(),t++,e++,n.always((function(){0==--e?(t=0,s.done()):s.set((t-e)/t)})),this):this},s.render=function(t){if(s.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=n.template;var i,r=e.querySelector(n.barSelector),c=t?"-100":a(s.status||0),u=document.querySelector(n.parent);return o(r,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),n.showSpinner||(i=e.querySelector(n.spinnerSelector))&&h(i),u!=document.body&&l(u,"nprogress-custom-parent"),u.appendChild(e),e},s.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(n.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&h(t)},s.isRendered=function(){return!!document.getElementById("nprogress")},s.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var r=function(){var t=[];function e(){var s=t.shift();s&&s(e)}return function(s){t.push(s),1==t.length&&e()}}(),o=function(){var t=["Webkit","O","Moz","ms"],e={};function s(s){return s=s.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[s]||(e[s]=function(e){var s=document.body.style;if(e in s)return e;for(var n,i=t.length,a=e.charAt(0).toUpperCase()+e.slice(1);i--;)if((n=t[i]+a)in s)return n;return e}(s))}function n(t,e,n){e=s(e),t.style[e]=n}return function(t,e){var s,i,a=arguments;if(2==a.length)for(s in e)void 0!==(i=e[s])&&e.hasOwnProperty(s)&&n(t,s,i);else n(t,a[1],a[2])}}();function c(t,e){return("string"==typeof t?t:d(t)).indexOf(" "+e+" ")>=0}function l(t,e){var s=d(t),n=s+e;c(s,e)||(t.className=n.substring(1))}function u(t,e){var s,n=d(t);c(t,e)&&(s=n.replace(" "+e+" "," "),t.className=s.substring(1,s.length-1))}function d(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function h(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return s})?n.call(e,s,e,t):n)||(t.exports=i)},349:function(t,e,s){"use strict";var n=s(337);s.n(n).a},350:function(t,e,s){"use strict";var n=s(338);s.n(n).a},364:function(t,e,s){"use strict";s.r(e);s(104);var n=s(1),i=s(347),a=s.n(i),r=s(341),o=s(342),c=s(343),l=s(344),u=s(312),d={components:{Home:r.default,Page:c.default,Sidebar:l.default,Navbar:o.default},data:function(){return{isSidebarOpen:!1}},computed:{shouldShowNavbar:function(){var t=this.$site.themeConfig;return!1!==this.$page.frontmatter.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar:function(){var t=this.$page.frontmatter;return!t.layout&&!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems:function(){return Object(u.m)(this.$page,this.$route,this.$site,this.$localePath)},pageClasses:function(){var t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted:function(){var t=this;window.addEventListener("scroll",this.onScroll),a.a.configure({showSpinner:!1}),this.$router.beforeEach((function(t,e,s){t.path===e.path||n.a.component(t.name)||a.a.start(),s()})),this.$router.afterEach((function(){a.a.done(),t.isSidebarOpen=!1}))},methods:{toggleSidebar:function(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen},onTouchStart:function(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd:function(t){var e=t.changedTouches[0].clientX-this.touchStart.x,s=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(s)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},h=(s(349),s(350),s(48)),p=Object(h.a)(d,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?s("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),s("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),s("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar}},[t._t("sidebar-top",null,{slot:"top"}),t._v(" "),t._t("sidebar-bottom",null,{slot:"bottom"})],2),t._v(" "),t.$page.frontmatter.layout?s("div",{staticClass:"custom-layout"},[s(t.$page.frontmatter.layout,{tag:"component"})],1):t.$page.frontmatter.home?s("Home"):s("Page",{attrs:{"sidebar-items":t.sidebarItems}},[t._t("page-top",null,{slot:"top"}),t._v(" "),t._t("page-bottom",null,{slot:"bottom"})],2)],1)}),[],!1,null,null,null);e.default=p.exports}}]); \ No newline at end of file + * @license MIT */void 0===(i="function"==typeof(n=function(){var t,e,s={version:"0.2.0"},n=s.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function i(t,e,s){return ts?s:t}function a(t){return 100*(-1+t)}s.configure=function(t){var e,s;for(e in t)void 0!==(s=t[e])&&t.hasOwnProperty(e)&&(n[e]=s);return this},s.status=null,s.set=function(t){var e=s.isStarted();t=i(t,n.minimum,1),s.status=1===t?null:t;var c=s.render(!e),l=c.querySelector(n.barSelector),u=n.speed,d=n.easing;return c.offsetWidth,r((function(e){""===n.positionUsing&&(n.positionUsing=s.getPositioningCSS()),o(l,function(t,e,s){var i;return(i="translate3d"===n.positionUsing?{transform:"translate3d("+a(t)+"%,0,0)"}:"translate"===n.positionUsing?{transform:"translate("+a(t)+"%,0)"}:{"margin-left":a(t)+"%"}).transition="all "+e+"ms "+s,i}(t,u,d)),1===t?(o(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){o(c,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){s.remove(),e()}),u)}),u)):setTimeout(e,u)})),this},s.isStarted=function(){return"number"==typeof s.status},s.start=function(){s.status||s.set(0);var t=function(){setTimeout((function(){s.status&&(s.trickle(),t())}),n.trickleSpeed)};return n.trickle&&t(),this},s.done=function(t){return t||s.status?s.inc(.3+.5*Math.random()).set(1):this},s.inc=function(t){var e=s.status;return e?("number"!=typeof t&&(t=(1-e)*i(Math.random()*e,.1,.95)),e=i(e+t,0,.994),s.set(e)):s.start()},s.trickle=function(){return s.inc(Math.random()*n.trickleRate)},t=0,e=0,s.promise=function(n){return n&&"resolved"!==n.state()?(0===e&&s.start(),t++,e++,n.always((function(){0==--e?(t=0,s.done()):s.set((t-e)/t)})),this):this},s.render=function(t){if(s.isRendered())return document.getElementById("nprogress");l(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=n.template;var i,r=e.querySelector(n.barSelector),c=t?"-100":a(s.status||0),u=document.querySelector(n.parent);return o(r,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),n.showSpinner||(i=e.querySelector(n.spinnerSelector))&&h(i),u!=document.body&&l(u,"nprogress-custom-parent"),u.appendChild(e),e},s.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(n.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&h(t)},s.isRendered=function(){return!!document.getElementById("nprogress")},s.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var r=function(){var t=[];function e(){var s=t.shift();s&&s(e)}return function(s){t.push(s),1==t.length&&e()}}(),o=function(){var t=["Webkit","O","Moz","ms"],e={};function s(s){return s=s.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[s]||(e[s]=function(e){var s=document.body.style;if(e in s)return e;for(var n,i=t.length,a=e.charAt(0).toUpperCase()+e.slice(1);i--;)if((n=t[i]+a)in s)return n;return e}(s))}function n(t,e,n){e=s(e),t.style[e]=n}return function(t,e){var s,i,a=arguments;if(2==a.length)for(s in e)void 0!==(i=e[s])&&e.hasOwnProperty(s)&&n(t,s,i);else n(t,a[1],a[2])}}();function c(t,e){return("string"==typeof t?t:d(t)).indexOf(" "+e+" ")>=0}function l(t,e){var s=d(t),n=s+e;c(s,e)||(t.className=n.substring(1))}function u(t,e){var s,n=d(t);c(t,e)&&(s=n.replace(" "+e+" "," "),t.className=s.substring(1,s.length-1))}function d(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function h(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return s})?n.call(e,s,e,t):n)||(t.exports=i)},349:function(t,e,s){"use strict";var n=s(337);s.n(n).a},350:function(t,e,s){"use strict";var n=s(338);s.n(n).a},365:function(t,e,s){"use strict";s.r(e);s(104);var n=s(1),i=s(347),a=s.n(i),r=s(341),o=s(342),c=s(343),l=s(344),u=s(312),d={components:{Home:r.default,Page:c.default,Sidebar:l.default,Navbar:o.default},data:function(){return{isSidebarOpen:!1}},computed:{shouldShowNavbar:function(){var t=this.$site.themeConfig;return!1!==this.$page.frontmatter.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar:function(){var t=this.$page.frontmatter;return!t.layout&&!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems:function(){return Object(u.m)(this.$page,this.$route,this.$site,this.$localePath)},pageClasses:function(){var t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted:function(){var t=this;window.addEventListener("scroll",this.onScroll),a.a.configure({showSpinner:!1}),this.$router.beforeEach((function(t,e,s){t.path===e.path||n.a.component(t.name)||a.a.start(),s()})),this.$router.afterEach((function(){a.a.done(),t.isSidebarOpen=!1}))},methods:{toggleSidebar:function(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen},onTouchStart:function(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd:function(t){var e=t.changedTouches[0].clientX-this.touchStart.x,s=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(s)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},h=(s(349),s(350),s(48)),p=Object(h.a)(d,(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?s("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),s("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),s("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar}},[t._t("sidebar-top",null,{slot:"top"}),t._v(" "),t._t("sidebar-bottom",null,{slot:"bottom"})],2),t._v(" "),t.$page.frontmatter.layout?s("div",{staticClass:"custom-layout"},[s(t.$page.frontmatter.layout,{tag:"component"})],1):t.$page.frontmatter.home?s("Home"):s("Page",{attrs:{"sidebar-items":t.sidebarItems}},[t._t("page-top",null,{slot:"top"}),t._v(" "),t._t("page-bottom",null,{slot:"bottom"})],2)],1)}),[],!1,null,null,null);e.default=p.exports}}]); \ No newline at end of file diff --git a/assets/js/40.273f9b41.js b/assets/js/40.f8a8112a.js similarity index 97% rename from assets/js/40.273f9b41.js rename to assets/js/40.f8a8112a.js index fc06b9e4..c6318978 100644 --- a/assets/js/40.273f9b41.js +++ b/assets/js/40.f8a8112a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{381:function(t,e,a){"use strict";a.r(e);var s=a(48),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"centos-7"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#centos-7"}},[t._v("#")]),t._v(" CentOS 7")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])]),a("li",[a("a",{attrs:{href:"#firewalld-changes"}},[t._v("FirewallD Changes")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 7.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## Install yum tools")]),t._v("\nyum "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y yum-utils device-mapper-persistent-data lvm2\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker repo")]),t._v("\nyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\nyum "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce docker-ce-cli\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h3",{attrs:{id:"firewalld-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-changes"}},[t._v("#")]),t._v(" FirewallD Changes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("firewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v("/tcp --permanent\nfirewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v("/tcp --permanent\nfirewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --change-interface"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("docker0\nfirewall-cmd --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --add-masquerade --permanent\nfirewall-cmd --reload\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{382:function(t,e,a){"use strict";a.r(e);var s=a(48),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"centos-7"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#centos-7"}},[t._v("#")]),t._v(" CentOS 7")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])]),a("li",[a("a",{attrs:{href:"#firewalld-changes"}},[t._v("FirewallD Changes")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 7.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## Install yum tools")]),t._v("\nyum "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y yum-utils device-mapper-persistent-data lvm2\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker repo")]),t._v("\nyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\nyum "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce docker-ce-cli\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h3",{attrs:{id:"firewalld-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-changes"}},[t._v("#")]),t._v(" FirewallD Changes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("firewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v("/tcp --permanent\nfirewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v("/tcp --permanent\nfirewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --change-interface"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("docker0\nfirewall-cmd --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --add-masquerade --permanent\nfirewall-cmd --reload\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/41.32790d14.js b/assets/js/41.bdff0171.js similarity index 97% rename from assets/js/41.32790d14.js rename to assets/js/41.bdff0171.js index b0ad017e..6ff7b30c 100644 --- a/assets/js/41.32790d14.js +++ b/assets/js/41.bdff0171.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{382:function(t,e,a){"use strict";a.r(e);var s=a(48),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"centos-8"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#centos-8"}},[t._v("#")]),t._v(" CentOS 8")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])]),a("li",[a("a",{attrs:{href:"#firewalld-changes"}},[t._v("FirewallD Changes")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 8.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of the Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## Install yum tools")]),t._v("\ndnf "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y dnf-utils device-mapper-persistent-data lvm2\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker repo")]),t._v("\ndnf config-manager --add-repo"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://download.docker.com/linux/centos/docker-ce.repo\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\ndnf "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce --nobest\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h3",{attrs:{id:"firewalld-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-changes"}},[t._v("#")]),t._v(" FirewallD Changes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("firewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v("/tcp --permanent\nfirewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v("/tcp --permanent\nfirewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --change-interface"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("pterodactyl0\nfirewall-cmd --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --add-masquerade --permanent\nfirewall-cmd --reload\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{383:function(t,e,a){"use strict";a.r(e);var s=a(48),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"centos-8"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#centos-8"}},[t._v("#")]),t._v(" CentOS 8")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])]),a("li",[a("a",{attrs:{href:"#firewalld-changes"}},[t._v("FirewallD Changes")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for CentOS 8.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of the Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## Install yum tools")]),t._v("\ndnf "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y dnf-utils device-mapper-persistent-data lvm2\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker repo")]),t._v("\ndnf config-manager --add-repo"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://download.docker.com/linux/centos/docker-ce.repo\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\ndnf "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce --nobest\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h3",{attrs:{id:"firewalld-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-changes"}},[t._v("#")]),t._v(" FirewallD Changes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("firewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v("/tcp --permanent\nfirewall-cmd --add-port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v("/tcp --permanent\nfirewall-cmd --permanent --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --change-interface"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("pterodactyl0\nfirewall-cmd --zone"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("trusted --add-masquerade --permanent\nfirewall-cmd --reload\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/42.d9689e6d.js b/assets/js/42.89114514.js similarity index 97% rename from assets/js/42.d9689e6d.js rename to assets/js/42.89114514.js index fac22175..d88ba17b 100644 --- a/assets/js/42.d9689e6d.js +++ b/assets/js/42.89114514.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{383: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:"debian-10"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#debian-10"}},[t._v("#")]),t._v(" Debian 10")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 10.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## install apt tools")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg2 software-properties-common\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Import the docker gpg key")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -fsSL https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker stable repo")]),t._v("\nadd-apt-repository "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch=amd64] https://download.docker.com/linux/debian '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{384: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:"debian-10"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#debian-10"}},[t._v("#")]),t._v(" Debian 10")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 10.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## install apt tools")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg2 software-properties-common\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Import the docker gpg key")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -fsSL https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker stable repo")]),t._v("\nadd-apt-repository "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch=amd64] https://download.docker.com/linux/debian '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/43.9992155a.js b/assets/js/43.40649380.js similarity index 97% rename from assets/js/43.9992155a.js rename to assets/js/43.40649380.js index d8098c06..37ba5c17 100644 --- a/assets/js/43.9992155a.js +++ b/assets/js/43.40649380.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{384: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:"debian-9"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#debian-9"}},[t._v("#")]),t._v(" Debian 9")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 9.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## install apt tools")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg2 software-properties-common\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Import the docker gpg key")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -fsSL https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker stable repo")]),t._v("\nadd-apt-repository "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch=amd64] https://download.docker.com/linux/debian '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-2"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{385: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:"debian-9"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#debian-9"}},[t._v("#")]),t._v(" Debian 9")]),t._v(" "),a("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),a("ul",[a("li",[a("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),a("li",[a("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This guide is based off the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Debian 9.")],1)]),t._v(" "),a("h2",{attrs:{id:"install-requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),a("p",[t._v("We will first begin by installing all of Wings' "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),a("h3",{attrs:{id:"docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._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"}},[t._v("## install apt tools")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg2 software-properties-common\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Import the docker gpg key")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" -fsSL https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" apt-key "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" -\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Add the docker stable repo")]),t._v("\nadd-apt-repository "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch=amd64] https://download.docker.com/linux/debian '),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release -cs"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update -y\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker-ce\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),a("h2",{attrs:{id:"installing-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),a("p",[t._v("Great, now all of the dependencies have been dealt with. From here follow the "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-2"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/44.e7f6dd0e.js b/assets/js/44.ad1ccee8.js similarity index 97% rename from assets/js/44.e7f6dd0e.js rename to assets/js/44.ad1ccee8.js index 6636527f..536c234c 100644 --- a/assets/js/44.e7f6dd0e.js +++ b/assets/js/44.ad1ccee8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{385:function(t,s,e){"use strict";e.r(s);var n=e(48),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-18-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-18-04"}},[t._v("#")]),t._v(" Ubuntu 18.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),e("li",[e("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 18.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Wings' "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker.io\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),e("h2",{attrs:{id:"installing-wings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),e("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{386:function(t,s,e){"use strict";e.r(s);var n=e(48),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-18-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-18-04"}},[t._v("#")]),t._v(" Ubuntu 18.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),e("li",[e("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 18.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Wings' "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker.io\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),e("h2",{attrs:{id:"installing-wings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),e("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#installing-wings-1"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/45.32b9b890.js b/assets/js/45.e976638f.js similarity index 97% rename from assets/js/45.32b9b890.js rename to assets/js/45.e976638f.js index 59265d6c..ed6b0f05 100644 --- a/assets/js/45.32b9b890.js +++ b/assets/js/45.e976638f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{386:function(t,s,e){"use strict";e.r(s);var n=e(48),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-20-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-20-04"}},[t._v("#")]),t._v(" Ubuntu 20.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),e("li",[e("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 20.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Wings' "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker.io\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),e("h2",{attrs:{id:"installing-wings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),e("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),e("RouterLink",{attrs:{to:"/wings/installing.html#installing-wings-2"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{387:function(t,s,e){"use strict";e.r(s);var n=e(48),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"ubuntu-20-04"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu-20-04"}},[t._v("#")]),t._v(" Ubuntu 20.04")]),t._v(" "),e("p",[t._v("In this guide we will install Pterodactyl's Wings v1.X — including all of it's dependencies — and configure it to use a SSL connection.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#install-requirements"}},[t._v("Install Requirements")]),e("ul",[e("li",[e("a",{attrs:{href:"#docker"}},[t._v("Docker")])])])]),e("li",[e("a",{attrs:{href:"#installing-wings"}},[t._v("Installing Wings")])])])]),e("p"),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("This guide is based off the "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("official installation documentation")]),t._v(" but is tailored specifically for Ubuntu 20.04.")],1)]),t._v(" "),e("h2",{attrs:{id:"install-requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-requirements"}},[t._v("#")]),t._v(" Install Requirements")]),t._v(" "),e("p",[t._v("We will first begin by installing all of Wings' "),e("RouterLink",{attrs:{to:"/wings/1.0/installing.html#dependencies"}},[t._v("required")]),t._v(" dependencies.")],1),t._v(" "),e("h3",{attrs:{id:"docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker"}},[t._v("#")]),t._v(" Docker")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Install docker")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y docker.io\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Enable docker service")]),t._v("\nsystemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" docker\nsystemctl start docker\n")])])]),e("h2",{attrs:{id:"installing-wings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installing-wings"}},[t._v("#")]),t._v(" Installing Wings")]),t._v(" "),e("p",[t._v("Great, now all of the dependencies and firewall rules have been dealt with. From here follow the "),e("RouterLink",{attrs:{to:"/wings/installing.html#installing-wings-2"}},[t._v("official Wings installation documentation")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/46.c04b0749.js b/assets/js/46.f2988dba.js similarity index 99% rename from assets/js/46.c04b0749.js rename to assets/js/46.f2988dba.js index 20861579..e0e574a9 100644 --- a/assets/js/46.c04b0749.js +++ b/assets/js/46.f2988dba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{387:function(a,t,s){"use strict";s.r(t);var e=s(48),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"artisan-cli"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#artisan-cli"}},[a._v("#")]),a._v(" Artisan CLI")]),a._v(" "),s("p",[a._v("The Artisan CLI, command line interface, is part of the Laravel framework, which Pterodactyl is built on. The Artisan file is located in "),s("code",[a._v("/var/www/pterodactyl")]),a._v(" if you followed the official guide. This guide goes over some more Pterodactyl specific/related Artisan commands, which are all prefixed with the letter "),s("code",[a._v("p")]),a._v(" (e.g. "),s("code",[a._v("p:user:make")]),a._v("). If you'd like to view all commands, you can do so by running:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan list\n")])])]),s("p",[a._v("To get information regarding a specific command you can do so by running:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("help")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("command"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("To simplify this documentation, in command usage you'll see things like the following:")]),a._v(" "),s("p",[s("code",[a._v("")]),a._v(" - Required argument")]),a._v(" "),s("p",[s("code",[a._v("[hello-world]")]),a._v(" - Optional argument")]),a._v(" "),s("p",[s("code",[a._v("{--hello-world}")]),a._v(" - Option")])]),a._v(" "),s("h2",{attrs:{id:"user-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#user-management"}},[a._v("#")]),a._v(" User Management")]),a._v(" "),s("p",[a._v("When running any of the following commands, you can either use the options or don't pass through anything and use the interactive prompt. You can also do both passing through options and using interactive prompts as well.")]),a._v(" "),s("h3",{attrs:{id:"create-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-user"}},[a._v("#")]),a._v(" Create User")]),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:make "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--email"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("user@example.com"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--username"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("myusername"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--name-first"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("My"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--name-last"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--password"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("supersecret"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--admin"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--no-password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"delete-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#delete-user"}},[a._v("#")]),a._v(" Delete User")]),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:delete "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--user"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("username/email/UUID"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"disable-2fa"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa"}},[a._v("#")]),a._v(" Disable 2FA")]),a._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[a._v("WARNING")]),a._v(" "),s("p",[a._v("Disabling 2-factor authentication should only be used as a last restort for user recovery. "),s("strong",[a._v("Please use this with caution.")])])]),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 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--email"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("user@example.com"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h2",{attrs:{id:"server-node-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-node-management"}},[a._v("#")]),a._v(" Server & Node Management")]),a._v(" "),s("h3",{attrs:{id:"create-location"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-location"}},[a._v("#")]),a._v(" Create Location")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:location:make "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--short"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("us1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--long"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"A description of this location."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"delete-location"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#delete-location"}},[a._v("#")]),a._v(" Delete Location")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:location:delete "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--short"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("us1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"server-bulk-power"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-bulk-power"}},[a._v("#")]),a._v(" Server Bulk Power")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:server:bulk-power "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("start, stop, kill, restart"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--servers"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1,2")]),a._v(",3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--nodes"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1,2")]),a._v(",3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"server-rebuild"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-rebuild"}},[a._v("#")]),a._v(" Server Rebuild")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:server:rebuild "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("server-id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--node"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("This will initiate a rebuild on all servers, all servers on a node, or a specific server depending on the information given.")]),a._v(" "),s("h2",{attrs:{id:"panel-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#panel-management"}},[a._v("#")]),a._v(" Panel Management")]),a._v(" "),s("h3",{attrs:{id:"view-panel-info"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#view-panel-info"}},[a._v("#")]),a._v(" View Panel Info")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:info\n")])])]),s("p",[a._v("Displays a variety of panel information which can be used to check the configuation of this like database and email.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{388:function(a,t,s){"use strict";s.r(t);var e=s(48),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"artisan-cli"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#artisan-cli"}},[a._v("#")]),a._v(" Artisan CLI")]),a._v(" "),s("p",[a._v("The Artisan CLI, command line interface, is part of the Laravel framework, which Pterodactyl is built on. The Artisan file is located in "),s("code",[a._v("/var/www/pterodactyl")]),a._v(" if you followed the official guide. This guide goes over some more Pterodactyl specific/related Artisan commands, which are all prefixed with the letter "),s("code",[a._v("p")]),a._v(" (e.g. "),s("code",[a._v("p:user:make")]),a._v("). If you'd like to view all commands, you can do so by running:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan list\n")])])]),s("p",[a._v("To get information regarding a specific command you can do so by running:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("help")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("command"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("To simplify this documentation, in command usage you'll see things like the following:")]),a._v(" "),s("p",[s("code",[a._v("")]),a._v(" - Required argument")]),a._v(" "),s("p",[s("code",[a._v("[hello-world]")]),a._v(" - Optional argument")]),a._v(" "),s("p",[s("code",[a._v("{--hello-world}")]),a._v(" - Option")])]),a._v(" "),s("h2",{attrs:{id:"user-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#user-management"}},[a._v("#")]),a._v(" User Management")]),a._v(" "),s("p",[a._v("When running any of the following commands, you can either use the options or don't pass through anything and use the interactive prompt. You can also do both passing through options and using interactive prompts as well.")]),a._v(" "),s("h3",{attrs:{id:"create-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-user"}},[a._v("#")]),a._v(" Create User")]),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:make "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--email"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("user@example.com"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--username"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("myusername"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--name-first"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("My"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--name-last"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--password"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("supersecret"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--admin"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--no-password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"delete-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#delete-user"}},[a._v("#")]),a._v(" Delete User")]),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:delete "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--user"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("username/email/UUID"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"disable-2fa"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa"}},[a._v("#")]),a._v(" Disable 2FA")]),a._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[a._v("WARNING")]),a._v(" "),s("p",[a._v("Disabling 2-factor authentication should only be used as a last restort for user recovery. "),s("strong",[a._v("Please use this with caution.")])])]),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 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--email"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("user@example.com"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h2",{attrs:{id:"server-node-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-node-management"}},[a._v("#")]),a._v(" Server & Node Management")]),a._v(" "),s("h3",{attrs:{id:"create-location"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-location"}},[a._v("#")]),a._v(" Create Location")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:location:make "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--short"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("us1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--long"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"A description of this location."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"delete-location"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#delete-location"}},[a._v("#")]),a._v(" Delete Location")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:location:delete "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--short"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("us1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"server-bulk-power"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-bulk-power"}},[a._v("#")]),a._v(" Server Bulk Power")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:server:bulk-power "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("start, stop, kill, restart"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--servers"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1,2")]),a._v(",3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--nodes"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1,2")]),a._v(",3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("h3",{attrs:{id:"server-rebuild"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#server-rebuild"}},[a._v("#")]),a._v(" Server Rebuild")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:server:rebuild "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("server-id"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("--node"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("This will initiate a rebuild on all servers, all servers on a node, or a specific server depending on the information given.")]),a._v(" "),s("h2",{attrs:{id:"panel-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#panel-management"}},[a._v("#")]),a._v(" Panel Management")]),a._v(" "),s("h3",{attrs:{id:"view-panel-info"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#view-panel-info"}},[a._v("#")]),a._v(" View Panel Info")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("php artisan p:info\n")])])]),s("p",[a._v("Displays a variety of panel information which can be used to check the configuation of this like database and email.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/47.8a528b5d.js b/assets/js/47.3dc1dfde.js similarity index 99% rename from assets/js/47.8a528b5d.js rename to assets/js/47.3dc1dfde.js index ab81432d..a8118e93 100644 --- a/assets/js/47.8a528b5d.js +++ b/assets/js/47.3dc1dfde.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{388:function(t,e,a){"use strict";a.r(e);var s=a(48),o=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"additional-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[t._v("#")]),t._v(" Additional Configuration")]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),a("p",[t._v("This documentation is for "),a("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),a("p",[t._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#output-throttles"}},[t._v("Output Throttles")])]),a("li",[a("a",{attrs:{href:"#custom-network-interfaces"}},[t._v("Custom Network Interfaces")])]),a("li",[a("a",{attrs:{href:"#private-registries"}},[t._v("Private Registries")])]),a("li",[a("a",{attrs:{href:"#security-policies"}},[t._v("Security Policies")])]),a("li",[a("a",{attrs:{href:"#container-policy"}},[t._v("Container Policy")]),a("ul",[a("li",[a("a",{attrs:{href:"#default-security-opts-array"}},[t._v("Default Security Opts Array")])]),a("li",[a("a",{attrs:{href:"#default-capabilities-drop-array"}},[t._v("Default Capabilities Drop Array")])])])]),a("li",[a("a",{attrs:{href:"#enabling-cloudflare"}},[t._v("Enabling Cloudflare")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These are advanced configurations for the daemon. You risk breaking your daemon and making containers un-usable if\nyou modify something incorrectly. Proceed at your own risk, and only if you know what each configuration value does.")])]),t._v(" "),a("p",[t._v("The documentation below uses dot-notated JSON to explain where each setting should live. You will need to manually\nexpand this syntax when adding to the "),a("code",[t._v("core.json")]),t._v(" file for the Daemon. For example, something like "),a("code",[t._v("internals.throttle.enabled")]),t._v("\nwould be expanded to the JSON below.")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"internals"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"throttle"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enabled"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"output-throttles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#output-throttles"}},[t._v("#")]),t._v(" Output Throttles")]),t._v(" "),a("p",[t._v("There are a few throttle limits built into the Daemon to keep people from causing issues with data volume and CPU usage.\nUnder normal circumstances users should not encounter these limits. You might see the occasional data throttling\nwarning while starting a server or when there is a sudden spike in data output.")]),t._v(" "),a("p",[t._v("If you're seeing more servers than you expected being killed as a result of the Daemon throttler, you can make\nadjustments to the settings below. Please note the configs below are in JSON dot-notation and should be expanded\nout into a normal JSON object.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("enabled")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Determines if the throttle (and associated values below) should be used.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("kill_at_count")])]),t._v(" "),a("td",[t._v("5")]),t._v(" "),a("td",[t._v("The number of warnings that can accumulate for a particular instance before the server process is killed. The decay time below affects how quickly this value is decreased.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("decay")])]),t._v(" "),a("td",[t._v("10")]),t._v(" "),a("td",[t._v("The number of seconds that a server process must go without triggering a data throttle warning before the throttle count begins decreasing. This loop is processed every 5 seconds and will decrement the throttle count by one when the process goes more than this number of seconds without a data throttle occurring.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("bytes")])]),t._v(" "),a("td",[t._v("30720")]),t._v(" "),a("td",[t._v("⚠️ "),a("em",[t._v("(removed in v0.5.5)")]),t._v(" The maximum number of bytes of data that can be output in the defined interval before a warning occurs.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("lines")])]),t._v(" "),a("td",[t._v("1000")]),t._v(" "),a("td",[t._v("⚠️ "),a("em",[t._v("(added in v0.5.6)")]),t._v(" The number of lines that can be output by the server process in the defined check interval time. By default, 5,000 lines in ~500ms results in a server process kill.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("check_interval_ms")])]),t._v(" "),a("td",[t._v("100")]),t._v(" "),a("td",[t._v("The number of milliseconds between the throttle resetting the used bytes or line count.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("internals.throttle.X")]),t._v(" path. So, "),a("code",[t._v("enabled")]),t._v(" is actually "),a("code",[t._v("internals.throttle.enabled")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"custom-network-interfaces"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-network-interfaces"}},[t._v("#")]),t._v(" Custom Network Interfaces")]),t._v(" "),a("p",[t._v("If for whatever reason you need to modify the network interfaces used for Pterodactyl's local Docker network you\ncan do so by modifying the "),a("code",[t._v("core.json")]),t._v(" file for the daemon. In most cases you'll just be modifying the network\nname to allow your servers to use the host network stack. To do so, just change "),a("code",[t._v("docker.network.name")]),t._v(" to be "),a("code",[t._v("host")]),t._v("\nrather than "),a("code",[t._v("pterodactyl_nw")]),t._v(" as shown below.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("While changing to the host network stack does allow servers running on Pterodactyl to have direct access to local\ninterfaces and bind to specific IP addresses (required for some Steam games), it is not recommended on public\ninstallations of Pterodactyl (where you have other users running servers).")]),t._v(" "),a("p",[t._v("Using the "),a("code",[t._v("host")]),t._v(" stack removes many network specific protections afforded by Docker, and will allow server processes\nto access anything on the host, as well as bind to any IP or Port they wish.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),a("p",[t._v("Any changes to the network after the daemon has been started will require you to remove the docker network and restart the daemon. Any servers on the host need to be stopped before and most likely rebuilt.")]),t._v(" "),a("p",[t._v("The following will stop the daemon, remove the network, and start the daemon again. Run at your own risk."),a("br"),t._v(" "),a("code",[t._v("systemctl stop wings && docker network rm pterodactyl_nw && systemctl start wings")])])]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"docker"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"socket"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/run/docker.sock"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"autoupdate_images"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"network"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pterodactyl_nw"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"interfaces"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"v4"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subnet"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.0/16"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"gateway"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.1"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"interface"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.1"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("h2",{attrs:{id:"private-registries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#private-registries"}},[t._v("#")]),t._v(" Private Registries")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("username")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The username to use when connecting to the registry.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("password")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The password associated with the account.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("images")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("An array of images that are associated with the private registry.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("auth")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("email")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("serveraddress")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The address to the server the registry is located on.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("key")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("A pre-generated base64 encoded authentication string. If provided none of the above options are required.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.registry.X")]),t._v(" path. So, "),a("code",[t._v("username")]),t._v(" is actually "),a("code",[t._v("docker.registry.username")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"security-policies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#security-policies"}},[t._v("#")]),t._v(" Security Policies")]),t._v(" "),a("p",[t._v("This daemon ships with a very strict security configuration designed to limit access to the host system, and mitigate\na large range of potential attack vectors. However, some users might need to tweak these settings, or are running on\na private instance and are willing to decrease some of the security measures.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("ipv6")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disable IPv6 networking on the pterodactyl0 interface.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("internal")])]),t._v(" "),a("td",[t._v("false")]),t._v(" "),a("td",[t._v("Set this to true to prevent any external network access to all containers on the pterodactyl0 interface.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("enable_icc")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disallow containers to access services running on the host system's non-public IP addresses. Setting this to false does make it impossible to connect (from a container) to MySQL/Redis/etc. running on the host system without using the public IP address.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("enable_ip_masquerade")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disable IP Masquerading on the pterodactyl0 interface.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.policy.network.X")]),t._v(" path. So, "),a("code",[t._v("ipv6")]),t._v(" is actually "),a("code",[t._v("docker.policy.network.ipv6")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"container-policy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#container-policy"}},[t._v("#")]),t._v(" Container Policy")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("tmpfs")])]),t._v(" "),a("td",[a("code",[t._v("rw,exec,nosuid,size=50M")])]),t._v(" "),a("td",[t._v("These are the arguments used for mounting a "),a("code",[t._v("tmpfs")]),t._v(" directory into containers to allow certain programs to run.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_driver")])]),t._v(" "),a("td",[t._v("none")]),t._v(" "),a("td",[t._v("⚠️ This option was "),a("strong",[t._v("removed")]),t._v(" in "),a("code",[t._v("v0.6")]),t._v(" and is forcibly set to "),a("code",[t._v("json-file")]),t._v(". The log driver to use for containers. We default to "),a("code",[t._v("none")]),t._v(" to mitigate a potential DoS attack vector if a server were to spam log output.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts.max_size")])]),t._v(" "),a("td",[a("code",[t._v("5m")])]),t._v(" "),a("td",[t._v("The maximum size of the server output log file created by Docker.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts.max_files")])]),t._v(" "),a("td",[a("code",[t._v("1")])]),t._v(" "),a("td",[t._v("The maximum number of files that Docker will create with output from the server.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("readonly_root")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Determines if the root filesystem of the container should be readonly.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("securityopts")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td",[t._v("An array of security options to apply to a container. The default array is provided below.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("cap_drop")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td",[t._v("An array of linux capabilities to drop from the container (in addition to ones "),a("a",{attrs:{href:"https://docs.docker.com/engine/security/security/#linux-kernel-capabilities",target:"_blank",rel:"noopener noreferrer"}},[t._v("dropped by docker already"),a("OutboundLink")],1),t._v(". A listing of the default array is below.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.policy.container.X")]),t._v(" path. So, "),a("code",[t._v("tmpfs")]),t._v(" is actually "),a("code",[t._v("docker.policy.container.tmpfs")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"default-security-opts-array"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#default-security-opts-array"}},[t._v("#")]),t._v(" Default Security Opts Array")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n 'no-new-privileges'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h3",{attrs:{id:"default-capabilities-drop-array"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#default-capabilities-drop-array"}},[t._v("#")]),t._v(" Default Capabilities Drop Array")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Starting with "),a("code",[t._v("v0.6")]),t._v(" of the Daemon, the following previously "),a("em",[t._v("dropped")]),t._v(" capabilities are available in containers: "),a("code",[t._v("chown")]),t._v(", "),a("code",[t._v("kill")]),t._v(", "),a("code",[t._v("setgid")]),t._v(", and "),a("code",[t._v("setuid")]),t._v(".")])]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n 'setpcap'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'mknod'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'audit_write'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'net_raw'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'dac_override'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'fowner'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'fsetid'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'net_bind_service'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'sys_chroot'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'setfcap'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"enabling-cloudflare"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-cloudflare"}},[t._v("#")]),t._v(" Enabling Cloudflare")]),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("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.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{389:function(t,e,a){"use strict";a.r(e);var s=a(48),o=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"additional-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[t._v("#")]),t._v(" Additional Configuration")]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),a("p",[t._v("This documentation is for "),a("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),a("p",[t._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#output-throttles"}},[t._v("Output Throttles")])]),a("li",[a("a",{attrs:{href:"#custom-network-interfaces"}},[t._v("Custom Network Interfaces")])]),a("li",[a("a",{attrs:{href:"#private-registries"}},[t._v("Private Registries")])]),a("li",[a("a",{attrs:{href:"#security-policies"}},[t._v("Security Policies")])]),a("li",[a("a",{attrs:{href:"#container-policy"}},[t._v("Container Policy")]),a("ul",[a("li",[a("a",{attrs:{href:"#default-security-opts-array"}},[t._v("Default Security Opts Array")])]),a("li",[a("a",{attrs:{href:"#default-capabilities-drop-array"}},[t._v("Default Capabilities Drop Array")])])])]),a("li",[a("a",{attrs:{href:"#enabling-cloudflare"}},[t._v("Enabling Cloudflare")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These are advanced configurations for the daemon. You risk breaking your daemon and making containers un-usable if\nyou modify something incorrectly. Proceed at your own risk, and only if you know what each configuration value does.")])]),t._v(" "),a("p",[t._v("The documentation below uses dot-notated JSON to explain where each setting should live. You will need to manually\nexpand this syntax when adding to the "),a("code",[t._v("core.json")]),t._v(" file for the Daemon. For example, something like "),a("code",[t._v("internals.throttle.enabled")]),t._v("\nwould be expanded to the JSON below.")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"internals"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"throttle"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enabled"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"output-throttles"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#output-throttles"}},[t._v("#")]),t._v(" Output Throttles")]),t._v(" "),a("p",[t._v("There are a few throttle limits built into the Daemon to keep people from causing issues with data volume and CPU usage.\nUnder normal circumstances users should not encounter these limits. You might see the occasional data throttling\nwarning while starting a server or when there is a sudden spike in data output.")]),t._v(" "),a("p",[t._v("If you're seeing more servers than you expected being killed as a result of the Daemon throttler, you can make\nadjustments to the settings below. Please note the configs below are in JSON dot-notation and should be expanded\nout into a normal JSON object.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("enabled")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Determines if the throttle (and associated values below) should be used.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("kill_at_count")])]),t._v(" "),a("td",[t._v("5")]),t._v(" "),a("td",[t._v("The number of warnings that can accumulate for a particular instance before the server process is killed. The decay time below affects how quickly this value is decreased.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("decay")])]),t._v(" "),a("td",[t._v("10")]),t._v(" "),a("td",[t._v("The number of seconds that a server process must go without triggering a data throttle warning before the throttle count begins decreasing. This loop is processed every 5 seconds and will decrement the throttle count by one when the process goes more than this number of seconds without a data throttle occurring.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("bytes")])]),t._v(" "),a("td",[t._v("30720")]),t._v(" "),a("td",[t._v("⚠️ "),a("em",[t._v("(removed in v0.5.5)")]),t._v(" The maximum number of bytes of data that can be output in the defined interval before a warning occurs.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("lines")])]),t._v(" "),a("td",[t._v("1000")]),t._v(" "),a("td",[t._v("⚠️ "),a("em",[t._v("(added in v0.5.6)")]),t._v(" The number of lines that can be output by the server process in the defined check interval time. By default, 5,000 lines in ~500ms results in a server process kill.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("check_interval_ms")])]),t._v(" "),a("td",[t._v("100")]),t._v(" "),a("td",[t._v("The number of milliseconds between the throttle resetting the used bytes or line count.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("internals.throttle.X")]),t._v(" path. So, "),a("code",[t._v("enabled")]),t._v(" is actually "),a("code",[t._v("internals.throttle.enabled")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"custom-network-interfaces"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-network-interfaces"}},[t._v("#")]),t._v(" Custom Network Interfaces")]),t._v(" "),a("p",[t._v("If for whatever reason you need to modify the network interfaces used for Pterodactyl's local Docker network you\ncan do so by modifying the "),a("code",[t._v("core.json")]),t._v(" file for the daemon. In most cases you'll just be modifying the network\nname to allow your servers to use the host network stack. To do so, just change "),a("code",[t._v("docker.network.name")]),t._v(" to be "),a("code",[t._v("host")]),t._v("\nrather than "),a("code",[t._v("pterodactyl_nw")]),t._v(" as shown below.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("While changing to the host network stack does allow servers running on Pterodactyl to have direct access to local\ninterfaces and bind to specific IP addresses (required for some Steam games), it is not recommended on public\ninstallations of Pterodactyl (where you have other users running servers).")]),t._v(" "),a("p",[t._v("Using the "),a("code",[t._v("host")]),t._v(" stack removes many network specific protections afforded by Docker, and will allow server processes\nto access anything on the host, as well as bind to any IP or Port they wish.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),a("p",[t._v("Any changes to the network after the daemon has been started will require you to remove the docker network and restart the daemon. Any servers on the host need to be stopped before and most likely rebuilt.")]),t._v(" "),a("p",[t._v("The following will stop the daemon, remove the network, and start the daemon again. Run at your own risk."),a("br"),t._v(" "),a("code",[t._v("systemctl stop wings && docker network rm pterodactyl_nw && systemctl start wings")])])]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("div",{staticClass:"highlight-lines"},[a("br"),a("br"),a("br"),a("br"),a("div",{staticClass:"highlighted"},[t._v(" ")]),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br"),a("br")]),a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"docker"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"socket"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/run/docker.sock"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"autoupdate_images"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"network"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pterodactyl_nw"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"interfaces"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"v4"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subnet"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.0/16"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"gateway"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.1"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"interface"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"172.18.0.1"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("h2",{attrs:{id:"private-registries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#private-registries"}},[t._v("#")]),t._v(" Private Registries")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("username")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The username to use when connecting to the registry.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("password")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The password associated with the account.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("images")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("An array of images that are associated with the private registry.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("auth")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("email")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("serveraddress")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("The address to the server the registry is located on.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("key")])]),t._v(" "),a("td",[a("em",[t._v("none")])]),t._v(" "),a("td",[t._v("A pre-generated base64 encoded authentication string. If provided none of the above options are required.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.registry.X")]),t._v(" path. So, "),a("code",[t._v("username")]),t._v(" is actually "),a("code",[t._v("docker.registry.username")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"security-policies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#security-policies"}},[t._v("#")]),t._v(" Security Policies")]),t._v(" "),a("p",[t._v("This daemon ships with a very strict security configuration designed to limit access to the host system, and mitigate\na large range of potential attack vectors. However, some users might need to tweak these settings, or are running on\na private instance and are willing to decrease some of the security measures.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("ipv6")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disable IPv6 networking on the pterodactyl0 interface.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("internal")])]),t._v(" "),a("td",[t._v("false")]),t._v(" "),a("td",[t._v("Set this to true to prevent any external network access to all containers on the pterodactyl0 interface.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("enable_icc")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disallow containers to access services running on the host system's non-public IP addresses. Setting this to false does make it impossible to connect (from a container) to MySQL/Redis/etc. running on the host system without using the public IP address.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("enable_ip_masquerade")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Set this to false to disable IP Masquerading on the pterodactyl0 interface.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.policy.network.X")]),t._v(" path. So, "),a("code",[t._v("ipv6")]),t._v(" is actually "),a("code",[t._v("docker.policy.network.ipv6")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"container-policy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#container-policy"}},[t._v("#")]),t._v(" Container Policy")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Path")]),t._v(" "),a("th",[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[a("code",[t._v("tmpfs")])]),t._v(" "),a("td",[a("code",[t._v("rw,exec,nosuid,size=50M")])]),t._v(" "),a("td",[t._v("These are the arguments used for mounting a "),a("code",[t._v("tmpfs")]),t._v(" directory into containers to allow certain programs to run.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_driver")])]),t._v(" "),a("td",[t._v("none")]),t._v(" "),a("td",[t._v("⚠️ This option was "),a("strong",[t._v("removed")]),t._v(" in "),a("code",[t._v("v0.6")]),t._v(" and is forcibly set to "),a("code",[t._v("json-file")]),t._v(". The log driver to use for containers. We default to "),a("code",[t._v("none")]),t._v(" to mitigate a potential DoS attack vector if a server were to spam log output.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts.max_size")])]),t._v(" "),a("td",[a("code",[t._v("5m")])]),t._v(" "),a("td",[t._v("The maximum size of the server output log file created by Docker.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("log_opts.max_files")])]),t._v(" "),a("td",[a("code",[t._v("1")])]),t._v(" "),a("td",[t._v("The maximum number of files that Docker will create with output from the server.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("readonly_root")])]),t._v(" "),a("td",[t._v("true")]),t._v(" "),a("td",[t._v("Determines if the root filesystem of the container should be readonly.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("securityopts")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td",[t._v("An array of security options to apply to a container. The default array is provided below.")])]),t._v(" "),a("tr",[a("td",[a("code",[t._v("cap_drop")])]),t._v(" "),a("td",[t._v("array")]),t._v(" "),a("td",[t._v("An array of linux capabilities to drop from the container (in addition to ones "),a("a",{attrs:{href:"https://docs.docker.com/engine/security/security/#linux-kernel-capabilities",target:"_blank",rel:"noopener noreferrer"}},[t._v("dropped by docker already"),a("OutboundLink")],1),t._v(". A listing of the default array is below.")])])])]),t._v(" "),a("p",[t._v("Please note that all of the settings above are in the "),a("code",[t._v("docker.policy.container.X")]),t._v(" path. So, "),a("code",[t._v("tmpfs")]),t._v(" is actually "),a("code",[t._v("docker.policy.container.tmpfs")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"default-security-opts-array"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#default-security-opts-array"}},[t._v("#")]),t._v(" Default Security Opts Array")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n 'no-new-privileges'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h3",{attrs:{id:"default-capabilities-drop-array"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#default-capabilities-drop-array"}},[t._v("#")]),t._v(" Default Capabilities Drop Array")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Starting with "),a("code",[t._v("v0.6")]),t._v(" of the Daemon, the following previously "),a("em",[t._v("dropped")]),t._v(" capabilities are available in containers: "),a("code",[t._v("chown")]),t._v(", "),a("code",[t._v("kill")]),t._v(", "),a("code",[t._v("setgid")]),t._v(", and "),a("code",[t._v("setuid")]),t._v(".")])]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n 'setpcap'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'mknod'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'audit_write'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'net_raw'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'dac_override'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'fowner'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'fsetid'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'net_bind_service'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'sys_chroot'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n 'setfcap'"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"enabling-cloudflare"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-cloudflare"}},[t._v("#")]),t._v(" Enabling Cloudflare")]),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("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.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/48.0bb564a9.js b/assets/js/48.c14d7ed1.js similarity index 98% rename from assets/js/48.0bb564a9.js rename to assets/js/48.c14d7ed1.js index efe3ae30..0854f589 100644 --- a/assets/js/48.0bb564a9.js +++ b/assets/js/48.c14d7ed1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{389:function(e,t,a){"use strict";a.r(t);var s=a(48),o=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:"docker-on-debian-8"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker-on-debian-8"}},[e._v("#")]),e._v(" Docker on Debian 8")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-docker"}},[e._v("Install Docker")])]),a("li",[a("a",{attrs:{href:"#update-grub-startup"}},[e._v("Update GRUB Startup")])]),a("li",[a("a",{attrs:{href:"#add-backports-repo"}},[e._v("Add Backports Repo")])]),a("li",[a("a",{attrs:{href:"#update-software-setup-docker"}},[e._v("Update Software & Setup Docker")])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("There is a potential for broken software after this upgrade as we are moving to a non-stable kernel (in regards\nto mainline Debian). Please take backups and only proceed if you are comfortable with this process.")])]),e._v(" "),a("h2",{attrs:{id:"install-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-docker"}},[e._v("#")]),e._v(" Install Docker")]),e._v(" "),a("p",[e._v("To begin with, we're going to install docker just like we would for any other OS by following Docker's\n"),a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("official documentation for Debian"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("Once you've done that, if you run "),a("code",[e._v("docker info")]),e._v(" you'll notice some missing features at the bottom, something\nlike the output below.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("WARNING: No memory limit support\nWARNING: No swap limit support\nWARNING: No kernel memory limit support\nWARNING: No oom kill disable support\nWARNING: No cpu cfs quota support\nWARNING: No cpu cfs period support\n")])])]),a("h2",{attrs:{id:"update-grub-startup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-grub-startup"}},[e._v("#")]),e._v(" Update GRUB Startup")]),e._v(" "),a("p",[e._v("To fix the memory limit support issues, we just need to add two arguments to our default grub startup. Start by\nopening "),a("code",[e._v("/etc/default/grub")]),e._v(" and adding the following arguments to "),a("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("swapaccount=1 cgroup_enable=memory\n")])])]),a("p",[e._v("The line should then look like the one below — assuming nothing else was in the quote to begin with.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1 cgroup_enable=memory"\n')])])]),a("p",[e._v("After doing that, run "),a("code",[e._v("sudo update-grub")]),e._v(" to update our grub configuration.")]),e._v(" "),a("h2",{attrs:{id:"add-backports-repo"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#add-backports-repo"}},[e._v("#")]),e._v(" Add Backports Repo")]),e._v(" "),a("p",[e._v("We then need to enable the "),a("code",[e._v("jessie-backports")]),e._v(" apt repository to install a newer kernel. To do this, run the commands below.")]),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("echo")]),e._v(" deb http://http.debian.net/debian jessie-backports main "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" /etc/apt/sources.list.d/jessie-backports.list\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" deb http://http.debian.net/debian jessie-backports main contrib non-free "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" /etc/apt/sources.list.d/jessie-backports.list\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n")])])]),a("p",[e._v("To find the most recent kernels, run "),a("code",[e._v("apt-cache search linux-image")]),e._v(" which will list all of the ones available. In this\ncase, we'll install the "),a("code",[e._v("4.9.0")]),e._v(" kernel using the command below. Once we've done that, it is time to reboot the server\nto start using this kernel.")]),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("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -t jessie-backports linux-image-4.9.0-0.bpo.3-amd64\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),a("h2",{attrs:{id:"update-software-setup-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-software-setup-docker"}},[e._v("#")]),e._v(" Update Software & Setup Docker")]),e._v(" "),a("p",[e._v("Now that we're on the new kernel you probably need to update some software to take advantage of it. To do this,\nsimply run the command below.")]),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("apt")]),e._v(" update "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" upgrade\n")])])]),a("p",[e._v("Once that is done, we need to make an adjustment to docker to use "),a("code",[e._v("overlay2")]),e._v(" rather than "),a("code",[e._v("aufs")]),e._v(" since "),a("code",[e._v("aufs")]),e._v(" is not\nsupported on this kernel currently. Run the command below to do so.")]),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("sed")]),e._v(" -i "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s,/usr/bin/dockerd,/usr/bin/dockerd --storage-driver=overlay2,g'")]),e._v(" /lib/systemd/system/docker.service\n")])])]),a("p",[e._v("Finally, update "),a("code",[e._v("systemd")]),e._v(" and start docker using the following commands.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl daemon-reload\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("service")]),e._v(" docker start\n")])])]),a("p",[e._v("Docker should now be running and reporting no errors if you run "),a("code",[e._v("docker info")]),e._v("!")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{390:function(e,t,a){"use strict";a.r(t);var s=a(48),o=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:"docker-on-debian-8"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker-on-debian-8"}},[e._v("#")]),e._v(" Docker on Debian 8")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install-docker"}},[e._v("Install Docker")])]),a("li",[a("a",{attrs:{href:"#update-grub-startup"}},[e._v("Update GRUB Startup")])]),a("li",[a("a",{attrs:{href:"#add-backports-repo"}},[e._v("Add Backports Repo")])]),a("li",[a("a",{attrs:{href:"#update-software-setup-docker"}},[e._v("Update Software & Setup Docker")])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("There is a potential for broken software after this upgrade as we are moving to a non-stable kernel (in regards\nto mainline Debian). Please take backups and only proceed if you are comfortable with this process.")])]),e._v(" "),a("h2",{attrs:{id:"install-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-docker"}},[e._v("#")]),e._v(" Install Docker")]),e._v(" "),a("p",[e._v("To begin with, we're going to install docker just like we would for any other OS by following Docker's\n"),a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("official documentation for Debian"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("Once you've done that, if you run "),a("code",[e._v("docker info")]),e._v(" you'll notice some missing features at the bottom, something\nlike the output below.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("WARNING: No memory limit support\nWARNING: No swap limit support\nWARNING: No kernel memory limit support\nWARNING: No oom kill disable support\nWARNING: No cpu cfs quota support\nWARNING: No cpu cfs period support\n")])])]),a("h2",{attrs:{id:"update-grub-startup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-grub-startup"}},[e._v("#")]),e._v(" Update GRUB Startup")]),e._v(" "),a("p",[e._v("To fix the memory limit support issues, we just need to add two arguments to our default grub startup. Start by\nopening "),a("code",[e._v("/etc/default/grub")]),e._v(" and adding the following arguments to "),a("code",[e._v("GRUB_CMDLINE_LINUX_DEFAULT")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("swapaccount=1 cgroup_enable=memory\n")])])]),a("p",[e._v("The line should then look like the one below — assuming nothing else was in the quote to begin with.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1 cgroup_enable=memory"\n')])])]),a("p",[e._v("After doing that, run "),a("code",[e._v("sudo update-grub")]),e._v(" to update our grub configuration.")]),e._v(" "),a("h2",{attrs:{id:"add-backports-repo"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#add-backports-repo"}},[e._v("#")]),e._v(" Add Backports Repo")]),e._v(" "),a("p",[e._v("We then need to enable the "),a("code",[e._v("jessie-backports")]),e._v(" apt repository to install a newer kernel. To do this, run the commands below.")]),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("echo")]),e._v(" deb http://http.debian.net/debian jessie-backports main "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" /etc/apt/sources.list.d/jessie-backports.list\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" deb http://http.debian.net/debian jessie-backports main contrib non-free "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" /etc/apt/sources.list.d/jessie-backports.list\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n")])])]),a("p",[e._v("To find the most recent kernels, run "),a("code",[e._v("apt-cache search linux-image")]),e._v(" which will list all of the ones available. In this\ncase, we'll install the "),a("code",[e._v("4.9.0")]),e._v(" kernel using the command below. Once we've done that, it is time to reboot the server\nto start using this kernel.")]),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("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -t jessie-backports linux-image-4.9.0-0.bpo.3-amd64\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),a("h2",{attrs:{id:"update-software-setup-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-software-setup-docker"}},[e._v("#")]),e._v(" Update Software & Setup Docker")]),e._v(" "),a("p",[e._v("Now that we're on the new kernel you probably need to update some software to take advantage of it. To do this,\nsimply run the command below.")]),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("apt")]),e._v(" update "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" upgrade\n")])])]),a("p",[e._v("Once that is done, we need to make an adjustment to docker to use "),a("code",[e._v("overlay2")]),e._v(" rather than "),a("code",[e._v("aufs")]),e._v(" since "),a("code",[e._v("aufs")]),e._v(" is not\nsupported on this kernel currently. Run the command below to do so.")]),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("sed")]),e._v(" -i "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s,/usr/bin/dockerd,/usr/bin/dockerd --storage-driver=overlay2,g'")]),e._v(" /lib/systemd/system/docker.service\n")])])]),a("p",[e._v("Finally, update "),a("code",[e._v("systemd")]),e._v(" and start docker using the following commands.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl daemon-reload\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("service")]),e._v(" docker start\n")])])]),a("p",[e._v("Docker should now be running and reporting no errors if you run "),a("code",[e._v("docker info")]),e._v("!")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/49.70313a9d.js b/assets/js/49.fc33633a.js similarity index 98% rename from assets/js/49.70313a9d.js rename to assets/js/49.fc33633a.js index 3c6af51a..13861d54 100644 --- a/assets/js/49.70313a9d.js +++ b/assets/js/49.fc33633a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{391:function(e,t,n){"use strict";n.r(t);var s=n(48),a=Object(s.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"kernel-modifications"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#kernel-modifications"}},[e._v("#")]),e._v(" Kernel Modifications")]),e._v(" "),n("p"),n("div",{staticClass:"table-of-contents"},[n("ul",[n("li",[n("a",{attrs:{href:"#update-kernel"}},[e._v("Update Kernel")])]),n("li",[n("a",{attrs:{href:"#confirm-kernel"}},[e._v("Confirm Kernel")])]),n("li",[n("a",{attrs:{href:"#set-default-boot"}},[e._v("Set Default Boot")])]),n("li",[n("a",{attrs:{href:"#boot-from-hard-disk"}},[e._v("Boot from hard disk")])])])]),n("p"),e._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("p",[e._v("In most cases, only users with a server provided by OVH will need to make any modifications to their kernel.")])]),e._v(" "),n("h2",{attrs:{id:"update-kernel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#update-kernel"}},[e._v("#")]),e._v(" Update Kernel")]),e._v(" "),n("p",[e._v("Install the new kernels using apt-get. In this case we are installing the latest version of the kernel,\nbut feel free to browse using apt-cache search linux-image-extra to find all possible image versions you can\ninstall. You'll want to install the latest.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt-get")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" linux-image-generic linux-image-extra-virtual\n")])])]),n("p",[e._v("After you've installed the new kernel you'll need to update the grub loader using the command below. After that, a\nserver reboot is in order.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" /etc/grub.d/06_OVHkernel /etc/grub.d/96_OVHkernel\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("update-grub")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),n("h2",{attrs:{id:"confirm-kernel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#confirm-kernel"}},[e._v("#")]),e._v(" Confirm Kernel")]),e._v(" "),n("p",[e._v("Once you've rebooted, check that the latest kernel is installed using "),n("code",[e._v("uname -r")]),e._v(", it should output "),n("code",[e._v("4.4.0-131-generic")]),e._v("\n(in this case) or similar.")]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("If it still includes "),n("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or similar, it didn't work and you should move on top the steps below.")])]),e._v(" "),n("h2",{attrs:{id:"set-default-boot"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#set-default-boot"}},[e._v("#")]),e._v(" Set Default Boot")]),e._v(" "),n("p",[e._v("Ok, so unfortunately the easiest way didn't work, but don't worry, we can still fix this. Firstly, lets run a quick\ncommand to list potential kernels, just look at the output and make sure you see your newly installed kernel listed.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[e._v('"menuentry \'"')]),e._v(" /boot/grub/grub.cfg\n")])])]),n("p",[e._v("After running that you should see output similar to the example below.")]),e._v(" "),n("div",{staticClass:"language-text extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-131-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-131-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-131-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-131-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-127-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-127-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-127-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-127-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-116-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-116-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-116-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-116-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n")])])]),n("p",[e._v("As you can see, we have "),n("code",[e._v("Ubuntu, with Linux 4.4.0-131-generic")]),e._v(" listed as the first indented option. To boot using this\nspecific kernel, we will need to modify our grub file.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("nano")]),e._v(" /etc/default/grub\n")])])]),n("p",[e._v("Find "),n("code",[e._v("GRUB_DEFAULT")]),e._v(", it is most likely set to "),n("code",[e._v("GRUB_DEFAULT=0")]),e._v(". We're going to modify it a bit to boot our new kernel.")]),e._v(" "),n("div",{staticClass:"language-text extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-131-generic'\n")])])]),n("p",[e._v("The only part of the code above that you might need to change is the "),n("code",[e._v("4.4.0-131-generic")]),e._v(", which you can find based on\nthe kernel version you install. You might also notice that it matches the first indented entry from the grep menuentry\ncommand and also the version of the kernel that we installed above. Once you've done that, run the commands below to\nupdate grub and reboot, and you should be set.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("update-grub")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),n("h2",{attrs:{id:"boot-from-hard-disk"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#boot-from-hard-disk"}},[e._v("#")]),e._v(" Boot from hard disk")]),e._v(" "),n("p",[e._v("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.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{392:function(e,t,n){"use strict";n.r(t);var s=n(48),a=Object(s.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"kernel-modifications"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#kernel-modifications"}},[e._v("#")]),e._v(" Kernel Modifications")]),e._v(" "),n("p"),n("div",{staticClass:"table-of-contents"},[n("ul",[n("li",[n("a",{attrs:{href:"#update-kernel"}},[e._v("Update Kernel")])]),n("li",[n("a",{attrs:{href:"#confirm-kernel"}},[e._v("Confirm Kernel")])]),n("li",[n("a",{attrs:{href:"#set-default-boot"}},[e._v("Set Default Boot")])]),n("li",[n("a",{attrs:{href:"#boot-from-hard-disk"}},[e._v("Boot from hard disk")])])])]),n("p"),e._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("p",[e._v("In most cases, only users with a server provided by OVH will need to make any modifications to their kernel.")])]),e._v(" "),n("h2",{attrs:{id:"update-kernel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#update-kernel"}},[e._v("#")]),e._v(" Update Kernel")]),e._v(" "),n("p",[e._v("Install the new kernels using apt-get. In this case we are installing the latest version of the kernel,\nbut feel free to browse using apt-cache search linux-image-extra to find all possible image versions you can\ninstall. You'll want to install the latest.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt-get")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" linux-image-generic linux-image-extra-virtual\n")])])]),n("p",[e._v("After you've installed the new kernel you'll need to update the grub loader using the command below. After that, a\nserver reboot is in order.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" /etc/grub.d/06_OVHkernel /etc/grub.d/96_OVHkernel\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("update-grub")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),n("h2",{attrs:{id:"confirm-kernel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#confirm-kernel"}},[e._v("#")]),e._v(" Confirm Kernel")]),e._v(" "),n("p",[e._v("Once you've rebooted, check that the latest kernel is installed using "),n("code",[e._v("uname -r")]),e._v(", it should output "),n("code",[e._v("4.4.0-131-generic")]),e._v("\n(in this case) or similar.")]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("If it still includes "),n("code",[e._v("-xxxx-grs-ipv6-64")]),e._v(" or similar, it didn't work and you should move on top the steps below.")])]),e._v(" "),n("h2",{attrs:{id:"set-default-boot"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#set-default-boot"}},[e._v("#")]),e._v(" Set Default Boot")]),e._v(" "),n("p",[e._v("Ok, so unfortunately the easiest way didn't work, but don't worry, we can still fix this. Firstly, lets run a quick\ncommand to list potential kernels, just look at the output and make sure you see your newly installed kernel listed.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[e._v('"menuentry \'"')]),e._v(" /boot/grub/grub.cfg\n")])])]),n("p",[e._v("After running that you should see output similar to the example below.")]),e._v(" "),n("div",{staticClass:"language-text extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-131-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-131-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-131-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-131-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-127-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-127-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-127-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-127-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-116-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-116-generic-advanced-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n menuentry 'Ubuntu, with Linux 4.4.0-116-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-116-generic-recovery-ad1a8550-963c-4a9f-b922-85827cf44fbe' {\n")])])]),n("p",[e._v("As you can see, we have "),n("code",[e._v("Ubuntu, with Linux 4.4.0-131-generic")]),e._v(" listed as the first indented option. To boot using this\nspecific kernel, we will need to modify our grub file.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("nano")]),e._v(" /etc/default/grub\n")])])]),n("p",[e._v("Find "),n("code",[e._v("GRUB_DEFAULT")]),e._v(", it is most likely set to "),n("code",[e._v("GRUB_DEFAULT=0")]),e._v(". We're going to modify it a bit to boot our new kernel.")]),e._v(" "),n("div",{staticClass:"language-text extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-131-generic'\n")])])]),n("p",[e._v("The only part of the code above that you might need to change is the "),n("code",[e._v("4.4.0-131-generic")]),e._v(", which you can find based on\nthe kernel version you install. You might also notice that it matches the first indented entry from the grep menuentry\ncommand and also the version of the kernel that we installed above. Once you've done that, run the commands below to\nupdate grub and reboot, and you should be set.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("update-grub")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("reboot")]),e._v("\n")])])]),n("h2",{attrs:{id:"boot-from-hard-disk"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#boot-from-hard-disk"}},[e._v("#")]),e._v(" Boot from hard disk")]),e._v(" "),n("p",[e._v("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.")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/50.6b4f4718.js b/assets/js/50.fb19455f.js similarity index 98% rename from assets/js/50.6b4f4718.js rename to assets/js/50.fb19455f.js index c9a47786..1ddefdee 100644 --- a/assets/js/50.6b4f4718.js +++ b/assets/js/50.fb19455f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{392:function(e,t,s){"use strict";s.r(t);var a=s(48),r=Object(a.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:"standalone-sftp-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#standalone-sftp-server"}},[e._v("#")]),e._v(" Standalone SFTP Server")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Standalone SFTP support was introduced in "),s("code",[e._v("Panel@v0.7.11")]),e._v(" and "),s("code",[e._v("Daemon@v0.6.8")]),e._v(" and will not work with prior versions.")])]),e._v(" "),s("p",[e._v("Pterodactyl now ships with the option to use a "),s("a",{attrs:{href:"https://github.com/pterodactyl/sftp-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("standalone SFTP server"),s("OutboundLink")],1),e._v("\nrather than using the one that was built into the Daemon. This provides better compatibility with SFTP clients, improved\ntransfer speeds, and a more native approach to file handling and server operation.")]),e._v(" "),s("p",[e._v("Because this functionality is new, we've decided to make it an opt-in process, rather than an opt-out process. This page\nwill cover how to setup your standalone SFTP server.")]),e._v(" "),s("h2",{attrs:{id:"disable-daemon-s-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-daemon-s-server"}},[e._v("#")]),e._v(" Disable Daemon's Server")]),e._v(" "),s("p",[e._v("To disable the Daemon SFTP server, you only need to add "),s("code",[e._v("sftp.enabled=false")]),e._v(" to your Daemon's "),s("code",[e._v("core.json")]),e._v(" file.")]),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 ...\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sftp"')]),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 ...\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"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('"enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("2022")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("Once you've done that, restarting the Daemon will apply the change and not boot the built-in server.")]),e._v(" "),s("h2",{attrs:{id:"run-the-standalone-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#run-the-standalone-server"}},[e._v("#")]),e._v(" Run the Standalone Server")]),e._v(" "),s("p",[e._v("To download the standalone server, execute the command below in your Daemon's base directory (generally "),s("code",[e._v("/srv/daemon")]),e._v(").")]),e._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo sftp-server https://github.com/pterodactyl/sftp-server/releases/download/v1.0.5/sftp-server\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" +x sftp-server\n")])])]),s("p",[e._v("Excellent, now you've got the server binary. Because we've written this server using "),s("a",{attrs:{href:"https://golang.org",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("go")]),s("OutboundLink")],1),e._v(" there\nare no additional dependencies you need to install.")]),e._v(" "),s("h3",{attrs:{id:"start-the-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-server"}},[e._v("#")]),e._v(" Start the Server")]),e._v(" "),s("p",[e._v("Finally, start the SFTP server so that you can then use it to access your files.")]),e._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[e._v("./sftp-server\n")])])]),s("p",[e._v("By default, this will start the SFTP server on the old port of "),s("code",[e._v("2022")]),e._v(". If you want to use a different port it can be\nspecified by passing the "),s("code",[e._v("--port")]),e._v(" flag. For more advanced usage, please refer to the "),s("a",{attrs:{href:"https://github.com/pterodactyl/sftp-server/tree/release/v1.0.4#running",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub README"),s("OutboundLink")],1),e._v("\nwhich includes all of the flags and their default values.")]),e._v(" "),s("h2",{attrs:{id:"daemonize-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#daemonize-server"}},[e._v("#")]),e._v(" Daemonize Server")]),e._v(" "),s("p",[e._v("Chances are you'll want to daemonize the SFTP server using something like "),s("code",[e._v("systemd")]),e._v(" so that it will run in the\nbackground. Place the contents below in a file called "),s("code",[e._v("pterosftp.service")]),e._v(" in the "),s("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("[Unit]\nDescription=Pterodactyl Standalone SFTP Server\nAfter=wings.service\n\n[Service]\nUser=root\nWorkingDirectory=/srv/daemon\nLimitNOFILE=4096\nPIDFile=/var/run/wings/sftp.pid\nExecStart=/srv/daemon/sftp-server\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[e._v("Then, run the command below to enable it in systemd and start the SFTP server.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pterosftp\n")])])]),s("h3",{attrs:{id:"customizing-startup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customizing-startup"}},[e._v("#")]),e._v(" Customizing Startup")]),e._v(" "),s("p",[e._v("If you're trying to pass additional arguments to the server when starting it using SystemD you'll want to modify\nthe "),s("code",[e._v("ExecStart")]),e._v(" line. Something like "),s("code",[e._v("ExecStart=/srv/daemon/sftp-server --port 2022")]),e._v(" for example.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{393:function(e,t,s){"use strict";s.r(t);var a=s(48),r=Object(a.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:"standalone-sftp-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#standalone-sftp-server"}},[e._v("#")]),e._v(" Standalone SFTP Server")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Standalone SFTP support was introduced in "),s("code",[e._v("Panel@v0.7.11")]),e._v(" and "),s("code",[e._v("Daemon@v0.6.8")]),e._v(" and will not work with prior versions.")])]),e._v(" "),s("p",[e._v("Pterodactyl now ships with the option to use a "),s("a",{attrs:{href:"https://github.com/pterodactyl/sftp-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("standalone SFTP server"),s("OutboundLink")],1),e._v("\nrather than using the one that was built into the Daemon. This provides better compatibility with SFTP clients, improved\ntransfer speeds, and a more native approach to file handling and server operation.")]),e._v(" "),s("p",[e._v("Because this functionality is new, we've decided to make it an opt-in process, rather than an opt-out process. This page\nwill cover how to setup your standalone SFTP server.")]),e._v(" "),s("h2",{attrs:{id:"disable-daemon-s-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-daemon-s-server"}},[e._v("#")]),e._v(" Disable Daemon's Server")]),e._v(" "),s("p",[e._v("To disable the Daemon SFTP server, you only need to add "),s("code",[e._v("sftp.enabled=false")]),e._v(" to your Daemon's "),s("code",[e._v("core.json")]),e._v(" file.")]),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 ...\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sftp"')]),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 ...\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"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('"enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("2022")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n ...\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("Once you've done that, restarting the Daemon will apply the change and not boot the built-in server.")]),e._v(" "),s("h2",{attrs:{id:"run-the-standalone-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#run-the-standalone-server"}},[e._v("#")]),e._v(" Run the Standalone Server")]),e._v(" "),s("p",[e._v("To download the standalone server, execute the command below in your Daemon's base directory (generally "),s("code",[e._v("/srv/daemon")]),e._v(").")]),e._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo sftp-server https://github.com/pterodactyl/sftp-server/releases/download/v1.0.5/sftp-server\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" +x sftp-server\n")])])]),s("p",[e._v("Excellent, now you've got the server binary. Because we've written this server using "),s("a",{attrs:{href:"https://golang.org",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("go")]),s("OutboundLink")],1),e._v(" there\nare no additional dependencies you need to install.")]),e._v(" "),s("h3",{attrs:{id:"start-the-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-the-server"}},[e._v("#")]),e._v(" Start the Server")]),e._v(" "),s("p",[e._v("Finally, start the SFTP server so that you can then use it to access your files.")]),e._v(" "),s("div",{staticClass:"language-sh extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sh"}},[s("code",[e._v("./sftp-server\n")])])]),s("p",[e._v("By default, this will start the SFTP server on the old port of "),s("code",[e._v("2022")]),e._v(". If you want to use a different port it can be\nspecified by passing the "),s("code",[e._v("--port")]),e._v(" flag. For more advanced usage, please refer to the "),s("a",{attrs:{href:"https://github.com/pterodactyl/sftp-server/tree/release/v1.0.4#running",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub README"),s("OutboundLink")],1),e._v("\nwhich includes all of the flags and their default values.")]),e._v(" "),s("h2",{attrs:{id:"daemonize-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#daemonize-server"}},[e._v("#")]),e._v(" Daemonize Server")]),e._v(" "),s("p",[e._v("Chances are you'll want to daemonize the SFTP server using something like "),s("code",[e._v("systemd")]),e._v(" so that it will run in the\nbackground. Place the contents below in a file called "),s("code",[e._v("pterosftp.service")]),e._v(" in the "),s("code",[e._v("/etc/systemd/system")]),e._v(" directory.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("[Unit]\nDescription=Pterodactyl Standalone SFTP Server\nAfter=wings.service\n\n[Service]\nUser=root\nWorkingDirectory=/srv/daemon\nLimitNOFILE=4096\nPIDFile=/var/run/wings/sftp.pid\nExecStart=/srv/daemon/sftp-server\nRestart=on-failure\nStartLimitInterval=600\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[e._v("Then, run the command below to enable it in systemd and start the SFTP server.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pterosftp\n")])])]),s("h3",{attrs:{id:"customizing-startup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customizing-startup"}},[e._v("#")]),e._v(" Customizing Startup")]),e._v(" "),s("p",[e._v("If you're trying to pass additional arguments to the server when starting it using SystemD you'll want to modify\nthe "),s("code",[e._v("ExecStart")]),e._v(" line. Something like "),s("code",[e._v("ExecStart=/srv/daemon/sftp-server --port 2022")]),e._v(" for example.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/51.75e9c6d8.js b/assets/js/51.786f6418.js similarity index 98% rename from assets/js/51.75e9c6d8.js rename to assets/js/51.786f6418.js index 41a8ed46..2935a50e 100644 --- a/assets/js/51.75e9c6d8.js +++ b/assets/js/51.786f6418.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{393:function(e,t,a){"use strict";a.r(t);var o=a(48),n=Object(o.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:"upgrading-0-4-x-to-0-5-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-4-x-to-0-5-x"}},[e._v("#")]),e._v(" Upgrading 0.4.X to 0.5.X")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#docker-adjustments"}},[e._v("Docker Adjustments")])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),a("li",[a("a",{attrs:{href:"#sftp-cleanup"}},[e._v("SFTP Cleanup")])]),a("li",[a("a",{attrs:{href:"#file-migration"}},[e._v("File Migration")]),a("ul",[a("li",[a("a",{attrs:{href:"#rebuild-containers"}},[e._v("Rebuild Containers")])])])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("This upgrade process will require that "),a("strong",[e._v("all")]),e._v(" servers running through the Daemon be offline for a short period\nof time while data is reorganized and server containers are rebuilt. Please plan accordingly for this.")]),e._v(" "),a("p",[e._v("You will need to update your Panel to the 0.7.X series in order to complete this process as well.")])]),e._v(" "),a("h2",{attrs:{id:"docker-adjustments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker-adjustments"}},[e._v("#")]),e._v(" Docker Adjustments")]),e._v(" "),a("p",[e._v("Previously we provided a quick Docker installation script in our installation instructions. We made the regrettable\nmistake of not reading deeper into it and realizing it enabled edge release channels for Docker. You'll want to take\na look at the official documentation for Docker and change your channel to be a stable release channel.")]),e._v(" "),a("p",[e._v("Please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),a("OutboundLink")],1)])]),e._v(" "),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("To upgrade from v0.4.X first switch the directory where you installed your Daemon. If you followed the installation\nguide your Daemon is most likely located in "),a("code",[e._v("/srv/daemon")]),e._v(". Then, download and unpack the archive using the\ncommand below.")]),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/daemon/releases/download/v0.5.7/daemon.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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),a("p",[e._v("Then, update the core dependencies for the Daemon with 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("npm")]),e._v(" update --only"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production\n")])])]),a("h2",{attrs:{id:"sftp-cleanup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sftp-cleanup"}},[e._v("#")]),e._v(" SFTP Cleanup")]),e._v(" "),a("p",[e._v("This version of the Daemon ships with an internal SFTP subsystem, no more need for a special Docker container or\nconfusing file permissions. For the most part the Daemon can handle all of the internal changes that make this possible,\nyou'll just need to remove the old Docker container for SFTP.")]),e._v(" "),a("p",[e._v("To do so, simply run the following commands, changing "),a("code",[e._v("2022")]),e._v(" if you are using a different port.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("docker rmi -f quay.io/pterodactyl/scrappy\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("kill")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[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("lsof")]),e._v(" -i:2022 -t "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n")])])]),a("p",[e._v("Once you have completed that step, you will need to boot the Daemon in order to have the new system user created\nautomatically. This can be done by running "),a("code",[e._v("sudo npm start")]),e._v(" in the Daemon directory. You'll want to run it in the\nforeground in order to monitor progress and make sure it executes without issues. Once it has finished running and\nthe Daemon is up and running, stop it again using "),a("code",[e._v("CTRL+C")]),e._v(".")]),e._v(" "),a("p",[e._v("If for whatever reason you need your user to be named something other than "),a("code",[e._v("pterodactyl")]),e._v(" you can change that in the\n"),a("code",[e._v("core.json")]),e._v(" before booting the Daemon by setting the "),a("code",[e._v("docker.container.username")]),e._v(" key. 99.9% of users will not need\nto change the username.")]),e._v(" "),a("h2",{attrs:{id:"file-migration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#file-migration"}},[e._v("#")]),e._v(" File Migration")]),e._v(" "),a("p",[e._v("Now for the longest part of the upgrade: data migration. You only need to migrate data once when updating from v0.4.X.")]),e._v(" "),a("p",[e._v("You'll need all of your servers to be stopped for this part of the migration. All of their containers will also need\nto be rebuilt, but this will be completed on the Panel with a console command since we also need to update their\nconfigurations with some new data. We will run that command after we migrate all of the data.")]),e._v(" "),a("p",[e._v("To perform this migration, simply run the command below in the Daemon directory and follow its prompts. Be aware it\nmight take a few minutes to run, especially with large volumes of data.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run migrate\ndocker system prune\n")])])]),a("h3",{attrs:{id:"rebuild-containers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rebuild-containers"}},[e._v("#")]),e._v(" Rebuild Containers")]),e._v(" "),a("p",[e._v("After migrating your data, you'll also need to run a command on the Panel in order to update all of the configurations\nfor these servers. First, be sure to boot the Daemon in foreground mode ("),a("code",[e._v("sudo npm start")]),e._v("). You'll then want to run the\nfollowing command in the Panel directory, "),a("strong",[e._v("not the Daemon directory")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:rebuild --node"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])]),a("p",[e._v("Replace "),a("code",[e._v("###")]),e._v(" above with the ID of your node that is being updated. This will toggle all servers for a rebuild, as\nwell as push the latest information to their configurations. Once this is done, stop the Daemon, run the command below,\nand then boot it. If you have all daemons running and wish to update them all at once, remove the "),a("code",[e._v("--node")]),e._v(" flag.")]),e._v(" "),a("p",[e._v("Boot the Daemon one last time in the foreground, make sure it completes without errors, and then you can stop it and\nrestart it using your service: "),a("code",[e._v("sudo systemctl start wings")]),e._v(".")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Thanks!")]),e._v(" "),a("p",[e._v("You're all finished! Thanks for bearing with us, this update addresses a lot of flaws in the previous implementations\nof the software, and also prepares your data for the eventual migration to our new daemon — which is still in the works.")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{394:function(e,t,a){"use strict";a.r(t);var o=a(48),n=Object(o.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:"upgrading-0-4-x-to-0-5-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-4-x-to-0-5-x"}},[e._v("#")]),e._v(" Upgrading 0.4.X to 0.5.X")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#docker-adjustments"}},[e._v("Docker Adjustments")])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),a("li",[a("a",{attrs:{href:"#sftp-cleanup"}},[e._v("SFTP Cleanup")])]),a("li",[a("a",{attrs:{href:"#file-migration"}},[e._v("File Migration")]),a("ul",[a("li",[a("a",{attrs:{href:"#rebuild-containers"}},[e._v("Rebuild Containers")])])])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("This upgrade process will require that "),a("strong",[e._v("all")]),e._v(" servers running through the Daemon be offline for a short period\nof time while data is reorganized and server containers are rebuilt. Please plan accordingly for this.")]),e._v(" "),a("p",[e._v("You will need to update your Panel to the 0.7.X series in order to complete this process as well.")])]),e._v(" "),a("h2",{attrs:{id:"docker-adjustments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#docker-adjustments"}},[e._v("#")]),e._v(" Docker Adjustments")]),e._v(" "),a("p",[e._v("Previously we provided a quick Docker installation script in our installation instructions. We made the regrettable\nmistake of not reading deeper into it and realizing it enabled edge release channels for Docker. You'll want to take\na look at the official documentation for Docker and change your channel to be a stable release channel.")]),e._v(" "),a("p",[e._v("Please reference the official Docker documentation for how to install Docker CE on your server. Some quick links\nare listed below for commonly supported systems.")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ubuntu"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("CentOS"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Debian"),a("OutboundLink")],1)])]),e._v(" "),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("To upgrade from v0.4.X first switch the directory where you installed your Daemon. If you followed the installation\nguide your Daemon is most likely located in "),a("code",[e._v("/srv/daemon")]),e._v(". Then, download and unpack the archive using the\ncommand below.")]),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/daemon/releases/download/v0.5.7/daemon.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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),a("p",[e._v("Then, update the core dependencies for the Daemon with 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("npm")]),e._v(" update --only"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production\n")])])]),a("h2",{attrs:{id:"sftp-cleanup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sftp-cleanup"}},[e._v("#")]),e._v(" SFTP Cleanup")]),e._v(" "),a("p",[e._v("This version of the Daemon ships with an internal SFTP subsystem, no more need for a special Docker container or\nconfusing file permissions. For the most part the Daemon can handle all of the internal changes that make this possible,\nyou'll just need to remove the old Docker container for SFTP.")]),e._v(" "),a("p",[e._v("To do so, simply run the following commands, changing "),a("code",[e._v("2022")]),e._v(" if you are using a different port.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("docker rmi -f quay.io/pterodactyl/scrappy\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("kill")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[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("lsof")]),e._v(" -i:2022 -t "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n")])])]),a("p",[e._v("Once you have completed that step, you will need to boot the Daemon in order to have the new system user created\nautomatically. This can be done by running "),a("code",[e._v("sudo npm start")]),e._v(" in the Daemon directory. You'll want to run it in the\nforeground in order to monitor progress and make sure it executes without issues. Once it has finished running and\nthe Daemon is up and running, stop it again using "),a("code",[e._v("CTRL+C")]),e._v(".")]),e._v(" "),a("p",[e._v("If for whatever reason you need your user to be named something other than "),a("code",[e._v("pterodactyl")]),e._v(" you can change that in the\n"),a("code",[e._v("core.json")]),e._v(" before booting the Daemon by setting the "),a("code",[e._v("docker.container.username")]),e._v(" key. 99.9% of users will not need\nto change the username.")]),e._v(" "),a("h2",{attrs:{id:"file-migration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#file-migration"}},[e._v("#")]),e._v(" File Migration")]),e._v(" "),a("p",[e._v("Now for the longest part of the upgrade: data migration. You only need to migrate data once when updating from v0.4.X.")]),e._v(" "),a("p",[e._v("You'll need all of your servers to be stopped for this part of the migration. All of their containers will also need\nto be rebuilt, but this will be completed on the Panel with a console command since we also need to update their\nconfigurations with some new data. We will run that command after we migrate all of the data.")]),e._v(" "),a("p",[e._v("To perform this migration, simply run the command below in the Daemon directory and follow its prompts. Be aware it\nmight take a few minutes to run, especially with large volumes of data.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run migrate\ndocker system prune\n")])])]),a("h3",{attrs:{id:"rebuild-containers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rebuild-containers"}},[e._v("#")]),e._v(" Rebuild Containers")]),e._v(" "),a("p",[e._v("After migrating your data, you'll also need to run a command on the Panel in order to update all of the configurations\nfor these servers. First, be sure to boot the Daemon in foreground mode ("),a("code",[e._v("sudo npm start")]),e._v("). You'll then want to run the\nfollowing command in the Panel directory, "),a("strong",[e._v("not the Daemon directory")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:rebuild --node"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])]),a("p",[e._v("Replace "),a("code",[e._v("###")]),e._v(" above with the ID of your node that is being updated. This will toggle all servers for a rebuild, as\nwell as push the latest information to their configurations. Once this is done, stop the Daemon, run the command below,\nand then boot it. If you have all daemons running and wish to update them all at once, remove the "),a("code",[e._v("--node")]),e._v(" flag.")]),e._v(" "),a("p",[e._v("Boot the Daemon one last time in the foreground, make sure it completes without errors, and then you can stop it and\nrestart it using your service: "),a("code",[e._v("sudo systemctl start wings")]),e._v(".")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("Thanks!")]),e._v(" "),a("p",[e._v("You're all finished! Thanks for bearing with us, this update addresses a lot of flaws in the previous implementations\nof the software, and also prepares your data for the eventual migration to our new daemon — which is still in the works.")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/52.5803bd20.js b/assets/js/52.24fbb394.js similarity index 97% rename from assets/js/52.5803bd20.js rename to assets/js/52.24fbb394.js index d25fbe5f..17c56924 100644 --- a/assets/js/52.5803bd20.js +++ b/assets/js/52.24fbb394.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{394:function(t,e,s){"use strict";s.r(e);var a=s(48),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"upgrading-0-5-series"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-5-series"}},[t._v("#")]),t._v(" Upgrading 0.5 Series")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),s("p",[t._v("This documentation is for "),s("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),s("p",[t._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection\nto the Daemon from the Panel, but only during the restart phase.")])]),t._v(" "),s("h2",{attrs:{id:"download-newest-release"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-newest-release"}},[t._v("#")]),t._v(" Download Newest Release")]),t._v(" "),s("p",[t._v("First, ensure you're in the Daemon directory, "),s("code",[t._v("/srv/daemon")]),t._v(", before continuing through this process. After you've done\nthat, run the command below to pull down the latest files and unpack them in the daemon directory.")]),t._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 function"}},[t._v("curl")]),t._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.5.7/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -xzv\n")])])]),s("h2",{attrs:{id:"update-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-components"}},[t._v("#")]),t._v(" Update Components")]),t._v(" "),s("p",[t._v("After you've pulled down the latest files the last thing you need to do is run the commands below to update the\ncomponents and then restart the daemon.")]),t._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 function"}},[t._v("npm")]),t._v(" update --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("production\nsystemctl restart wings\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{395:function(t,e,s){"use strict";s.r(e);var a=s(48),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"upgrading-0-5-series"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-5-series"}},[t._v("#")]),t._v(" Upgrading 0.5 Series")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),s("p",[t._v("This documentation is for "),s("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),s("p",[t._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection\nto the Daemon from the Panel, but only during the restart phase.")])]),t._v(" "),s("h2",{attrs:{id:"download-newest-release"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-newest-release"}},[t._v("#")]),t._v(" Download Newest Release")]),t._v(" "),s("p",[t._v("First, ensure you're in the Daemon directory, "),s("code",[t._v("/srv/daemon")]),t._v(", before continuing through this process. After you've done\nthat, run the command below to pull down the latest files and unpack them in the daemon directory.")]),t._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 function"}},[t._v("curl")]),t._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.5.7/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -xzv\n")])])]),s("h2",{attrs:{id:"update-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-components"}},[t._v("#")]),t._v(" Update Components")]),t._v(" "),s("p",[t._v("After you've pulled down the latest files the last thing you need to do is run the commands below to update the\ncomponents and then restart the daemon.")]),t._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 function"}},[t._v("npm")]),t._v(" update --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("production\nsystemctl restart wings\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/53.c0284790.js b/assets/js/53.c517ee4e.js similarity index 98% rename from assets/js/53.c0284790.js rename to assets/js/53.c517ee4e.js index 769e07fa..d6a2b822 100644 --- a/assets/js/53.c0284790.js +++ b/assets/js/53.c517ee4e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{395: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:"upgrading-0-5-x-to-0-6-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-5-x-to-0-6-x"}},[e._v("#")]),e._v(" Upgrading 0.5.X to 0.6.X")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#breaking-changes"}},[e._v("Breaking Changes")])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")]),a("ul",[a("li",[a("a",{attrs:{href:"#start-the-daemon"}},[e._v("Start the Daemon")])])])]),a("li",[a("a",{attrs:{href:"#rebuild-containers"}},[e._v("Rebuild Containers")])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Server Restart Required")]),e._v(" "),a("p",[e._v("Your servers will need to be restarted after upgrading the daemon in order to see the expected log output in the Panel.")])]),e._v(" "),a("h2",{attrs:{id:"breaking-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#breaking-changes"}},[e._v("#")]),e._v(" Breaking Changes")]),e._v(" "),a("p",[e._v("This release introduces a few breaking changes to how the Daemon operates, but maintains compatibility with "),a("code",[e._v("v0.7.X")]),e._v(" of\nthe Panel, so you don't need to worry about updating the Panel.")]),e._v(" "),a("p",[e._v("Of notable change in this release is that we've switched from using custom logging functionality to using Docker logging\nfunctionality. This allows us to better output events that happen before we can attach to the container, centralizes logic,\nand allows Docker to manage the logs (which it does very well). Now, when your server refuses to boot, instead of seeing\nan unhelpful \"Server has crashed\" message with nothing before it, you'll see "),a("em",[e._v("everything")]),e._v(" that happened in the container\nleading up to that point, assuming things were output.")]),e._v(" "),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("To upgrade from v0.5.X first switch the directory where you installed your Daemon. If you followed the installation\nguide your Daemon is most likely located in "),a("code",[e._v("/srv/daemon")]),e._v(". Then, download and unpack the archive using the\ncommand below.")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Stop your Daemon process before continuing in order to avoid any issues and ensure everything updates as expected.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl stop wings\n")])])])]),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/daemon/releases/download/v0.6.13/daemon.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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),a("p",[e._v("Then, update the core dependencies for the Daemon with 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("npm")]),e._v(" update --only"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production\n")])])]),a("h3",{attrs:{id:"start-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-the-daemon"}},[e._v("#")]),e._v(" Start the Daemon")]),e._v(" "),a("p",[e._v("Finally, start your daemon up, most likely with the command below.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl start wings\n")])])]),a("h2",{attrs:{id:"rebuild-containers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rebuild-containers"}},[e._v("#")]),e._v(" Rebuild Containers")]),e._v(" "),a("p",[e._v("Because of some changes we made behind the scenes when it comes to displaying server output you'll need to rebuild and\nrestart all of your servers. The rebuild step is required, the restart step is optional, but highly recommended otherwise\nyou will not be able to see any console output.")]),e._v(" "),a("p",[e._v("Run the following commands "),a("em",[e._v("from the Panel server")]),e._v(" in order to perform a mass rebuild and restart. Replace "),a("code",[e._v("###")]),e._v(" with the\nID of the node you just upgraded, or remove the "),a("code",[e._v("--node")]),e._v(" flag entirely to rebuild on all nodes.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:rebuild --node"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])]),a("p",[e._v("Then, restart all of the servers using the following command, or by manually restarting them one at a time in the Panel.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:bulk-power restart --nodes"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{396: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:"upgrading-0-5-x-to-0-6-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-5-x-to-0-6-x"}},[e._v("#")]),e._v(" Upgrading 0.5.X to 0.6.X")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Software is Abandoned")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("abandoned software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[e._v("Wings")]),e._v(" in production environments with\n"),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(".")],1)]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#breaking-changes"}},[e._v("Breaking Changes")])]),a("li",[a("a",{attrs:{href:"#download-files"}},[e._v("Download Files")]),a("ul",[a("li",[a("a",{attrs:{href:"#start-the-daemon"}},[e._v("Start the Daemon")])])])]),a("li",[a("a",{attrs:{href:"#rebuild-containers"}},[e._v("Rebuild Containers")])])])]),a("p"),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Server Restart Required")]),e._v(" "),a("p",[e._v("Your servers will need to be restarted after upgrading the daemon in order to see the expected log output in the Panel.")])]),e._v(" "),a("h2",{attrs:{id:"breaking-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#breaking-changes"}},[e._v("#")]),e._v(" Breaking Changes")]),e._v(" "),a("p",[e._v("This release introduces a few breaking changes to how the Daemon operates, but maintains compatibility with "),a("code",[e._v("v0.7.X")]),e._v(" of\nthe Panel, so you don't need to worry about updating the Panel.")]),e._v(" "),a("p",[e._v("Of notable change in this release is that we've switched from using custom logging functionality to using Docker logging\nfunctionality. This allows us to better output events that happen before we can attach to the container, centralizes logic,\nand allows Docker to manage the logs (which it does very well). Now, when your server refuses to boot, instead of seeing\nan unhelpful \"Server has crashed\" message with nothing before it, you'll see "),a("em",[e._v("everything")]),e._v(" that happened in the container\nleading up to that point, assuming things were output.")]),e._v(" "),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("To upgrade from v0.5.X first switch the directory where you installed your Daemon. If you followed the installation\nguide your Daemon is most likely located in "),a("code",[e._v("/srv/daemon")]),e._v(". Then, download and unpack the archive using the\ncommand below.")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Stop your Daemon process before continuing in order to avoid any issues and ensure everything updates as expected.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl stop wings\n")])])])]),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/daemon/releases/download/v0.6.13/daemon.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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),a("p",[e._v("Then, update the core dependencies for the Daemon with 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("npm")]),e._v(" update --only"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("production\n")])])]),a("h3",{attrs:{id:"start-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#start-the-daemon"}},[e._v("#")]),e._v(" Start the Daemon")]),e._v(" "),a("p",[e._v("Finally, start your daemon up, most likely with the command below.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl start wings\n")])])]),a("h2",{attrs:{id:"rebuild-containers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rebuild-containers"}},[e._v("#")]),e._v(" Rebuild Containers")]),e._v(" "),a("p",[e._v("Because of some changes we made behind the scenes when it comes to displaying server output you'll need to rebuild and\nrestart all of your servers. The rebuild step is required, the restart step is optional, but highly recommended otherwise\nyou will not be able to see any console output.")]),e._v(" "),a("p",[e._v("Run the following commands "),a("em",[e._v("from the Panel server")]),e._v(" in order to perform a mass rebuild and restart. Replace "),a("code",[e._v("###")]),e._v(" with the\nID of the node you just upgraded, or remove the "),a("code",[e._v("--node")]),e._v(" flag entirely to rebuild on all nodes.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:rebuild --node"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])]),a("p",[e._v("Then, restart all of the servers using the following command, or by manually restarting them one at a time in the Panel.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan p:server:bulk-power restart --nodes"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("###")]),e._v("\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/54.14aa3f16.js b/assets/js/54.11009636.js similarity index 97% rename from assets/js/54.14aa3f16.js rename to assets/js/54.11009636.js index 03b0d837..dbb47d97 100644 --- a/assets/js/54.14aa3f16.js +++ b/assets/js/54.11009636.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{396:function(t,e,s){"use strict";s.r(e);var o=s(48),a=Object(o.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"upgrading-0-6-series"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-6-series"}},[t._v("#")]),t._v(" Upgrading 0.6 Series")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),s("p",[t._v("This documentation is for "),s("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),s("p",[t._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Minor Versions Only")]),t._v(" "),s("p",[s("strong",[t._v("DO NOT")]),t._v(" use this guide to upgrade from "),s("code",[t._v("0.5.X")]),t._v(" to "),s("code",[t._v("0.6.X")]),t._v(", it will not work and you will encounter errors afterwards. Please check the "),s("RouterLink",{attrs:{to:"/daemon/upgrade/0.5_to_0.6.html"}},[t._v("0.5 to 0.6")]),t._v(" upgrade documentation to perform that update.")],1)]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection\nto the Daemon from the Panel, but only during the restart phase.")])]),t._v(" "),s("h2",{attrs:{id:"download-newest-release"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-newest-release"}},[t._v("#")]),t._v(" Download Newest Release")]),t._v(" "),s("p",[t._v("First, ensure you're in the Daemon directory, "),s("code",[t._v("/srv/daemon")]),t._v(", before continuing through this process. After you've done\nthat, run the command below to pull down the latest files and unpack them in the daemon directory.")]),t._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 function"}},[t._v("curl")]),t._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.6.13/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -xzv\n")])])]),s("h2",{attrs:{id:"update-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-components"}},[t._v("#")]),t._v(" Update Components")]),t._v(" "),s("p",[t._v("After you've pulled down the latest files the last thing you need to do is run the commands below to update the\ncomponents and then restart the daemon.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Nodejs 10 Required")]),t._v(" "),s("p",[t._v("Version "),s("code",[t._v("0.6.13")]),t._v(" requires Nodejs v10 or higher in order to compile the "),s("code",[t._v("mmmagic")]),t._v(" dependency. Please ensure\nyou are running at least version 10. You can run "),s("code",[t._v("node -v")]),t._v(" to check, upgrade if it is "),s("code",[t._v("v6")]),t._v(" or "),s("code",[t._v("v8")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Audit Results")]),t._v(" "),s("p",[t._v('You may see output along the lines of "found 14 vulnerabilities (6 low, 3 moderate, 5 high) in 927 scanned packages".\nYou can safely ignore this output. Do not run the audit fix command, you '),s("em",[t._v("will")]),t._v(" break your Daemon.")])]),t._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 function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("production --no-audit --unsafe-perm\nsystemctl restart wings\n")])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{397:function(t,e,s){"use strict";s.r(e);var o=s(48),a=Object(o.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"upgrading-0-6-series"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-6-series"}},[t._v("#")]),t._v(" Upgrading 0.6 Series")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),s("p",[t._v("This documentation is for "),s("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),s("p",[t._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Minor Versions Only")]),t._v(" "),s("p",[s("strong",[t._v("DO NOT")]),t._v(" use this guide to upgrade from "),s("code",[t._v("0.5.X")]),t._v(" to "),s("code",[t._v("0.6.X")]),t._v(", it will not work and you will encounter errors afterwards. Please check the "),s("RouterLink",{attrs:{to:"/daemon/upgrade/0.5_to_0.6.html"}},[t._v("0.5 to 0.6")]),t._v(" upgrade documentation to perform that update.")],1)]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection\nto the Daemon from the Panel, but only during the restart phase.")])]),t._v(" "),s("h2",{attrs:{id:"download-newest-release"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-newest-release"}},[t._v("#")]),t._v(" Download Newest Release")]),t._v(" "),s("p",[t._v("First, ensure you're in the Daemon directory, "),s("code",[t._v("/srv/daemon")]),t._v(", before continuing through this process. After you've done\nthat, run the command below to pull down the latest files and unpack them in the daemon directory.")]),t._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 function"}},[t._v("curl")]),t._v(" -L https://github.com/pterodactyl/daemon/releases/download/v0.6.13/daemon.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -xzv\n")])])]),s("h2",{attrs:{id:"update-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-components"}},[t._v("#")]),t._v(" Update Components")]),t._v(" "),s("p",[t._v("After you've pulled down the latest files the last thing you need to do is run the commands below to update the\ncomponents and then restart the daemon.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Nodejs 10 Required")]),t._v(" "),s("p",[t._v("Version "),s("code",[t._v("0.6.13")]),t._v(" requires Nodejs v10 or higher in order to compile the "),s("code",[t._v("mmmagic")]),t._v(" dependency. Please ensure\nyou are running at least version 10. You can run "),s("code",[t._v("node -v")]),t._v(" to check, upgrade if it is "),s("code",[t._v("v6")]),t._v(" or "),s("code",[t._v("v8")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("Audit Results")]),t._v(" "),s("p",[t._v('You may see output along the lines of "found 14 vulnerabilities (6 low, 3 moderate, 5 high) in 927 scanned packages".\nYou can safely ignore this output. Do not run the audit fix command, you '),s("em",[t._v("will")]),t._v(" break your Daemon.")])]),t._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 function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" --only"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("production --no-audit --unsafe-perm\nsystemctl restart wings\n")])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/55.4e7ca13f.js b/assets/js/55.dac5f93e.js similarity index 95% rename from assets/js/55.4e7ca13f.js rename to assets/js/55.dac5f93e.js index 318ee733..b2455ea9 100644 --- a/assets/js/55.4e7ca13f.js +++ b/assets/js/55.dac5f93e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{397:function(t,e,i){"use strict";i.r(e);var s=i(48),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h1",{attrs:{id:"upgrading"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#upgrading"}},[t._v("#")]),t._v(" Upgrading")]),t._v(" "),i("div",{staticClass:"custom-block danger"},[i("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),i("p",[t._v("This documentation is for "),i("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),i("p",[t._v("You should be installing and using "),i("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),i("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),i("h2",{attrs:{id:"version-specific-guides"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#version-specific-guides"}},[t._v("#")]),t._v(" Version Specific Guides")]),t._v(" "),i("ul",[i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.4_to_0.5.html"}},[t._v("0.4.X to 0.5.X")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.5.html"}},[t._v("0.5.X series")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.5_to_0.6.html"}},[t._v("0.5.X to 0.6.X")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.6.html"}},[t._v("0.6.X series")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/wings/1.0/migrating.html"}},[t._v("0.6.X to 1.X.X")]),t._v(" "),i("Badge",{attrs:{text:"current",vertical:"middle"}})],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/wings/1.0/upgrading.html"}},[t._v("1.X.X series")]),t._v(" "),i("Badge",{attrs:{text:"current",vertical:"middle"}})],1)])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{398:function(t,e,i){"use strict";i.r(e);var s=i(48),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h1",{attrs:{id:"upgrading"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#upgrading"}},[t._v("#")]),t._v(" Upgrading")]),t._v(" "),i("div",{staticClass:"custom-block danger"},[i("p",{staticClass:"custom-block-title"},[t._v("This Software is Abandoned")]),t._v(" "),i("p",[t._v("This documentation is for "),i("strong",[t._v("abandoned software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),i("p",[t._v("You should be installing and using "),i("RouterLink",{attrs:{to:"/wings/1.0/installing.html"}},[t._v("Wings")]),t._v(" in production environments with\n"),i("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(".")],1)]),t._v(" "),i("h2",{attrs:{id:"version-specific-guides"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#version-specific-guides"}},[t._v("#")]),t._v(" Version Specific Guides")]),t._v(" "),i("ul",[i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.4_to_0.5.html"}},[t._v("0.4.X to 0.5.X")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.5.html"}},[t._v("0.5.X series")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.5_to_0.6.html"}},[t._v("0.5.X to 0.6.X")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/daemon/0.6/upgrade/0.6.html"}},[t._v("0.6.X series")])],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/wings/1.0/migrating.html"}},[t._v("0.6.X to 1.X.X")]),t._v(" "),i("Badge",{attrs:{text:"current",vertical:"middle"}})],1),t._v(" "),i("li",[i("RouterLink",{attrs:{to:"/wings/1.0/upgrading.html"}},[t._v("1.X.X series")]),t._v(" "),i("Badge",{attrs:{text:"current",vertical:"middle"}})],1)])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/56.cbbea30d.js b/assets/js/56.f286a8ea.js similarity index 97% rename from assets/js/56.cbbea30d.js rename to assets/js/56.f286a8ea.js index 33d71844..75a7b8e4 100644 --- a/assets/js/56.cbbea30d.js +++ b/assets/js/56.f286a8ea.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{398:function(t,e,n){"use strict";n.r(e);var o=n(48),s=Object(o.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h1",{attrs:{id:"using-mounts"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#using-mounts"}},[t._v("#")]),t._v(" Using Mounts")]),t._v(" "),n("p",[t._v("Mounts can be used to make directories on a node available to servers running on it.")]),t._v(" "),n("h2",{attrs:{id:"wings-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#wings-configuration"}},[t._v("#")]),t._v(" Wings Configuration")]),t._v(" "),n("p",[t._v("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.")]),t._v(" "),n("p",[t._v("In the Wings configuration file ("),n("code",[t._v("/etc/pterodactyl/config.yml")]),t._v(") the "),n("code",[t._v("allowed_mounts")]),t._v(" field is used to list mountable directories. The listed directories and all their subdirectories can be mounted.")]),t._v(" "),n("div",{staticClass:"language-yml extra-class"},[n("pre",{pre:!0,attrs:{class:"language-yml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("allowed_mounts")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" /example\n")])])]),n("h2",{attrs:{id:"panel-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#panel-configuration"}},[t._v("#")]),t._v(" Panel Configuration")]),t._v(" "),n("p",[t._v("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.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Path in the container")]),t._v(" "),n("p",[t._v("Mounts can not be mounted at "),n("code",[t._v("/home/container")]),t._v(" or any subdirectory of it, as mounts cannot overlap and the server specific files are mounted at that location.")])]),t._v(" "),n("h3",{attrs:{id:"creating-a-mount"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-mount"}},[t._v("#")]),t._v(" Creating a Mount")]),t._v(" "),n("ol",[n("li",[t._v("In the admin panel go to "),n("strong",[t._v("Mounts")]),t._v(".")]),t._v(" "),n("li",[t._v("Create a new mount.")]),t._v(" "),n("li",[t._v("Fill in the details as required.\n"),n("ul",[n("li",[n("strong",[t._v("Name")]),t._v(": Name for your mount.")]),t._v(" "),n("li",[n("strong",[t._v("Description")]),t._v(": Description for your mount.")]),t._v(" "),n("li",[n("strong",[t._v("Source")]),t._v(": The directory where files are stored on the node.")]),t._v(" "),n("li",[n("strong",[t._v("Target")]),t._v(": The directory where the mount will be placed inside of your server, can "),n("strong",[t._v("not")]),t._v(" be "),n("code",[t._v("/home/container")]),t._v(".")]),t._v(" "),n("li",[n("strong",[t._v("Read Only")]),t._v(": Whether the mount will be read-only for the servers using it.")]),t._v(" "),n("li",[n("strong",[t._v("User Mountable")]),t._v(": Whether to allow users to self mount this mount.")])])]),t._v(" "),n("li",[t._v("After creating the mount you are required to add "),n("strong",[t._v("Eggs")]),t._v(" and "),n("strong",[t._v("Nodes")]),t._v(" that this mount may be used on.")])]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Mounts used by multiple servers")]),t._v(" "),n("p",[t._v("All servers using the same mounts will "),n("strong",[t._v("only")]),t._v(" share its contents when they are on the same node. Mounts are not synchronized between servers.")])]),t._v(" "),n("h3",{attrs:{id:"assigning-a-mount-to-a-server"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#assigning-a-mount-to-a-server"}},[t._v("#")]),t._v(" Assigning a Mount to a Server")]),t._v(" "),n("ol",[n("li",[t._v("In the admin panel navigate to the server you would like to use a mount with")]),t._v(" "),n("li",[t._v("Go to the mounts page")]),t._v(" "),n("li",[t._v("Click the "),n("strong",[t._v("+")]),t._v(" button")]),t._v(" "),n("li",[t._v("Restart the server")])]),t._v(" "),n("p",[t._v("The files of the mount should become available in the target path in the container.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Mounts cannot be Accessed")]),t._v(" "),n("p",[t._v("Mounts do not appear in the Panel's file manager, nor are they accessible via SFTP.")])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{399:function(t,e,n){"use strict";n.r(e);var o=n(48),s=Object(o.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h1",{attrs:{id:"using-mounts"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#using-mounts"}},[t._v("#")]),t._v(" Using Mounts")]),t._v(" "),n("p",[t._v("Mounts can be used to make directories on a node available to servers running on it.")]),t._v(" "),n("h2",{attrs:{id:"wings-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#wings-configuration"}},[t._v("#")]),t._v(" Wings Configuration")]),t._v(" "),n("p",[t._v("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.")]),t._v(" "),n("p",[t._v("In the Wings configuration file ("),n("code",[t._v("/etc/pterodactyl/config.yml")]),t._v(") the "),n("code",[t._v("allowed_mounts")]),t._v(" field is used to list mountable directories. The listed directories and all their subdirectories can be mounted.")]),t._v(" "),n("div",{staticClass:"language-yml extra-class"},[n("pre",{pre:!0,attrs:{class:"language-yml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("allowed_mounts")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" /example\n")])])]),n("h2",{attrs:{id:"panel-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#panel-configuration"}},[t._v("#")]),t._v(" Panel Configuration")]),t._v(" "),n("p",[t._v("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.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Path in the container")]),t._v(" "),n("p",[t._v("Mounts can not be mounted at "),n("code",[t._v("/home/container")]),t._v(" or any subdirectory of it, as mounts cannot overlap and the server specific files are mounted at that location.")])]),t._v(" "),n("h3",{attrs:{id:"creating-a-mount"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-mount"}},[t._v("#")]),t._v(" Creating a Mount")]),t._v(" "),n("ol",[n("li",[t._v("In the admin panel go to "),n("strong",[t._v("Mounts")]),t._v(".")]),t._v(" "),n("li",[t._v("Create a new mount.")]),t._v(" "),n("li",[t._v("Fill in the details as required.\n"),n("ul",[n("li",[n("strong",[t._v("Name")]),t._v(": Name for your mount.")]),t._v(" "),n("li",[n("strong",[t._v("Description")]),t._v(": Description for your mount.")]),t._v(" "),n("li",[n("strong",[t._v("Source")]),t._v(": The directory where files are stored on the node.")]),t._v(" "),n("li",[n("strong",[t._v("Target")]),t._v(": The directory where the mount will be placed inside of your server, can "),n("strong",[t._v("not")]),t._v(" be "),n("code",[t._v("/home/container")]),t._v(".")]),t._v(" "),n("li",[n("strong",[t._v("Read Only")]),t._v(": Whether the mount will be read-only for the servers using it.")]),t._v(" "),n("li",[n("strong",[t._v("User Mountable")]),t._v(": Whether to allow users to self mount this mount.")])])]),t._v(" "),n("li",[t._v("After creating the mount you are required to add "),n("strong",[t._v("Eggs")]),t._v(" and "),n("strong",[t._v("Nodes")]),t._v(" that this mount may be used on.")])]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Mounts used by multiple servers")]),t._v(" "),n("p",[t._v("All servers using the same mounts will "),n("strong",[t._v("only")]),t._v(" share its contents when they are on the same node. Mounts are not synchronized between servers.")])]),t._v(" "),n("h3",{attrs:{id:"assigning-a-mount-to-a-server"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#assigning-a-mount-to-a-server"}},[t._v("#")]),t._v(" Assigning a Mount to a Server")]),t._v(" "),n("ol",[n("li",[t._v("In the admin panel navigate to the server you would like to use a mount with")]),t._v(" "),n("li",[t._v("Go to the mounts page")]),t._v(" "),n("li",[t._v("Click the "),n("strong",[t._v("+")]),t._v(" button")]),t._v(" "),n("li",[t._v("Restart the server")])]),t._v(" "),n("p",[t._v("The files of the mount should become available in the target path in the container.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("Mounts cannot be Accessed")]),t._v(" "),n("p",[t._v("Mounts do not appear in the Panel's file manager, nor are they accessible via SFTP.")])])])}),[],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/57.b9237770.js b/assets/js/57.4f76cdaf.js similarity index 98% rename from assets/js/57.b9237770.js rename to assets/js/57.4f76cdaf.js index 64c964d5..c0dceaca 100644 --- a/assets/js/57.b9237770.js +++ b/assets/js/57.4f76cdaf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{399: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:"upgrading-php"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-php"}},[e._v("#")]),e._v(" Upgrading PHP")]),e._v(" "),a("p",[e._v("This documentation includes instructions for upgrading your system to the latest version of PHP. Please reference the\ntable below to check what version you need for your version of Pterodactyl.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Panel Version")]),e._v(" "),a("th",[e._v("PHP Version")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1.0.0 - 1.2.0")]),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.3.0+")]),e._v(" "),a("td",[e._v("7.4, 8.0")])])])]),e._v(" "),a("h2",{attrs:{id:"install-php"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-php"}},[e._v("#")]),e._v(" Install PHP")]),e._v(" "),a("p",[e._v("In order to install PHP 8.0, you will need to run the following command. Please keep in mind different operating systems\nmay have slightly different requirements for how this command is formatted.")]),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 additional repository for PHP")]),e._v("\nadd-apt-repository -y ppa:ondrej/php\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y update\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.0 php8.0-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("h2",{attrs:{id:"update-composer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-composer"}},[e._v("#")]),e._v(" Update Composer")]),e._v(" "),a("p",[e._v("As of "),a("code",[e._v("Panel@1.3.0")]),e._v(" we require "),a("code",[e._v("composer")]),e._v(" v2. To update composer you will need to run the following command which will\nperform the composer self-update process and move you over to version 2.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("composer self-update --2\n")])])]),a("h2",{attrs:{id:"webserver-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[e._v("#")]),e._v(" Webserver Configuration")]),e._v(" "),a("tabs",[a("tab",{attrs:{name:"NGINX"}},[a("p",[e._v("After upgrading to PHP 8.0, you will most likely need to update your NGINX configuration. Your configuration file\nis most likely called "),a("code",[e._v("pterodactyl.conf")]),e._v(" and located in the "),a("code",[e._v("/etc/nginx/sites-available/")]),e._v(" directory, or if on CentOS,\n"),a("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),a("p",[e._v("Make sure to update the path in the command below to reflect the actual location of your configuration 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 function"}},[e._v("sed")]),e._v(" -i -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/php7.[0-4]-fpm.sock/php8.0-fpm.sock/'")]),e._v(" /etc/nginx/sites-available/pterodactyl.conf\n")])])]),a("p",[e._v("Once you have edited the file run the command below to reload nginx and apply your changes.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl reload nginx\n")])])])]),e._v(" "),a("tab",{attrs:{name:"Apache"}},[a("p",[e._v("Run the commands below to disable PHP 7.4 and enable PHP 8.0 when serving requests. If you are upgrading from\nPHP 7.4 change the value in the command below to reflect that.")]),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("# Hint: a2enmod = a2_enable_module 🤯")]),e._v("\na2enmod php8.0\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Hint: a2dismod = a2_disable_module 🤯")]),e._v("\na2dismod php7.3\n")])])])])],1),e._v(" "),a("h4",{attrs:{id:"return-to-the-1-x-x-upgrade-guide"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#return-to-the-1-x-x-upgrade-guide"}},[e._v("#")]),e._v(" "),a("RouterLink",{attrs:{to:"/panel/1.0/upgrade/1.0.html#fetch-updated-files"}},[e._v("Return to the 1.X.X Upgrade Guide")])],1)],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{400: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:"upgrading-php"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-php"}},[e._v("#")]),e._v(" Upgrading PHP")]),e._v(" "),a("p",[e._v("This documentation includes instructions for upgrading your system to the latest version of PHP. Please reference the\ntable below to check what version you need for your version of Pterodactyl.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Panel Version")]),e._v(" "),a("th",[e._v("PHP Version")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("1.0.0 - 1.2.0")]),e._v(" "),a("td",[e._v("7.3, 7.4")])]),e._v(" "),a("tr",[a("td",[e._v("1.3.0+")]),e._v(" "),a("td",[e._v("7.4, 8.0")])])])]),e._v(" "),a("h2",{attrs:{id:"install-php"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-php"}},[e._v("#")]),e._v(" Install PHP")]),e._v(" "),a("p",[e._v("In order to install PHP 8.0, you will need to run the following command. Please keep in mind different operating systems\nmay have slightly different requirements for how this command is formatted.")]),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 additional repository for PHP")]),e._v("\nadd-apt-repository -y ppa:ondrej/php\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y update\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.0 php8.0-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("h2",{attrs:{id:"update-composer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-composer"}},[e._v("#")]),e._v(" Update Composer")]),e._v(" "),a("p",[e._v("As of "),a("code",[e._v("Panel@1.3.0")]),e._v(" we require "),a("code",[e._v("composer")]),e._v(" v2. To update composer you will need to run the following command which will\nperform the composer self-update process and move you over to version 2.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("composer self-update --2\n")])])]),a("h2",{attrs:{id:"webserver-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[e._v("#")]),e._v(" Webserver Configuration")]),e._v(" "),a("tabs",[a("tab",{attrs:{name:"NGINX"}},[a("p",[e._v("After upgrading to PHP 8.0, you will most likely need to update your NGINX configuration. Your configuration file\nis most likely called "),a("code",[e._v("pterodactyl.conf")]),e._v(" and located in the "),a("code",[e._v("/etc/nginx/sites-available/")]),e._v(" directory, or if on CentOS,\n"),a("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),a("p",[e._v("Make sure to update the path in the command below to reflect the actual location of your configuration 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 function"}},[e._v("sed")]),e._v(" -i -e "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v("'s/php7.[0-4]-fpm.sock/php8.0-fpm.sock/'")]),e._v(" /etc/nginx/sites-available/pterodactyl.conf\n")])])]),a("p",[e._v("Once you have edited the file run the command below to reload nginx and apply your changes.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl reload nginx\n")])])])]),e._v(" "),a("tab",{attrs:{name:"Apache"}},[a("p",[e._v("Run the commands below to disable PHP 7.4 and enable PHP 8.0 when serving requests. If you are upgrading from\nPHP 7.4 change the value in the command below to reflect that.")]),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("# Hint: a2enmod = a2_enable_module 🤯")]),e._v("\na2enmod php8.0\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Hint: a2dismod = a2_disable_module 🤯")]),e._v("\na2dismod php7.3\n")])])])])],1),e._v(" "),a("h4",{attrs:{id:"return-to-the-1-x-x-upgrade-guide"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#return-to-the-1-x-x-upgrade-guide"}},[e._v("#")]),e._v(" "),a("RouterLink",{attrs:{to:"/panel/1.0/upgrade/1.0.html#fetch-updated-files"}},[e._v("Return to the 1.X.X Upgrade Guide")])],1)],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/58.df220808.js b/assets/js/58.78f0d59d.js similarity index 99% rename from assets/js/58.df220808.js rename to assets/js/58.78f0d59d.js index 1607a1a0..0e9e7359 100644 --- a/assets/js/58.df220808.js +++ b/assets/js/58.78f0d59d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{400:function(e,a,t){"use strict";t.r(a);var s=t(48),n=Object(s.a)({},(function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"publishing-a-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#publishing-a-release"}},[e._v("#")]),e._v(" Publishing a Release")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("This documentation is specific to the core project team and serves to document how we create, deploy, and announce\nreleases of this software. It might be an interesting read, but you'll likely never use anything out of this on a\nday-to-day basis.")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#pick-a-codename"}},[e._v("Pick a Codename")])]),t("li",[t("a",{attrs:{href:"#create-the-release-branch"}},[e._v("Create the Release Branch")])]),t("li",[t("a",{attrs:{href:"#tag-a-release"}},[e._v("Tag a Release")]),t("ul",[t("li",[t("a",{attrs:{href:"#update-the-release-on-github"}},[e._v("Update the Release on GitHub")])])])]),t("li",[t("a",{attrs:{href:"#generate-signatures-hashes"}},[e._v("Generate Signatures & Hashes")]),t("ul",[t("li",[t("a",{attrs:{href:"#create-checksum"}},[e._v("Create Checksum")])]),t("li",[t("a",{attrs:{href:"#gpg-sign-release"}},[e._v("GPG Sign Release")])]),t("li",[t("a",{attrs:{href:"#attach-to-release"}},[e._v("Attach to Release")])])])]),t("li",[t("a",{attrs:{href:"#update-documentation"}},[e._v("Update Documentation")])]),t("li",[t("a",{attrs:{href:"#update-cdn"}},[e._v("Update CDN")])]),t("li",[t("a",{attrs:{href:"#make-discord-announcement"}},[e._v("Make Discord Announcement")])]),t("li",[t("a",{attrs:{href:"#example-process"}},[e._v("Example Process")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"pick-a-codename"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pick-a-codename"}},[e._v("#")]),e._v(" Pick a Codename")]),e._v(" "),t("p",[e._v("If this is going to be a major version release "),t("code",[e._v("0.X")]),e._v(" or "),t("code",[e._v("1.X")]),e._v(" (not "),t("code",[e._v("0.0.X")]),e._v("), you will need to have a codename picked\nout for the release. This should be some type of rhyme or otherwise creative name, ideally using some type of Pterodactyl\nrelated species name.")]),e._v(" "),t("h2",{attrs:{id:"create-the-release-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-the-release-branch"}},[e._v("#")]),e._v(" Create the Release Branch")]),e._v(" "),t("p",[e._v("Releases should be created as their own branch on GitHub, following the GitFlow model. This means you'll need to create\na "),t("code",[e._v("release/vX.X.X")]),e._v(" branch. Once the branch is created you need to update the version number for the software. For the Panel\nthis requires editing "),t("code",[e._v("config/app.php")]),e._v(" and setting the specific "),t("code",[e._v("APP_VERSION")]),e._v(" "),t("em",[e._v("without")]),e._v(" a preceding "),t("code",[e._v("v")]),e._v(". For the Daemon,\nyou need to edit "),t("code",[e._v("package.json")]),e._v(" and set the "),t("code",[e._v("version")]),e._v(" field, again "),t("em",[e._v("without")]),e._v(" a preceding "),t("code",[e._v("v")]),e._v(".")]),e._v(" "),t("p",[e._v("Once you've created the branch and update the relevant file publish the branch to GitHub to begin the next steps.")]),e._v(" "),t("h2",{attrs:{id:"tag-a-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tag-a-release"}},[e._v("#")]),e._v(" Tag a Release")]),e._v(" "),t("p",[e._v("Once the branch is pushed up you need to tag a release and then configure it on GitHub. To do so, run the command below\nsetting the version correctly. This will create a tag for "),t("code",[e._v("v0.6.0")]),e._v(" on the "),t("code",[e._v("release/v0.6.0")]),e._v(" branch and sign it using your\nGPG key.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Sign Your Releases")]),e._v(" "),t("p",[e._v("All releases must be made with a GPG signed tag. Do not create a tag without signing it.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" tag -asm "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"v0.6.0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin v0.6.0\n")])])]),t("h3",{attrs:{id:"update-the-release-on-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-the-release-on-github"}},[e._v("#")]),e._v(" Update the Release on GitHub")]),e._v(" "),t("p",[e._v("Once you've created and pushed up the tag you need to then go to the GitHub releases, find the most recent tag, and create\na nice release from it. The title should be "),t("code",[e._v("v1.2.3 (Codename)")]),e._v(", and the content should be from the Changelog for that release.\nAll minor version releases should use the same codename as the major release version.")]),e._v(" "),t("h2",{attrs:{id:"generate-signatures-hashes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-signatures-hashes"}},[e._v("#")]),e._v(" Generate Signatures & Hashes")]),e._v(" "),t("p",[e._v("Once you've created the release on GitHub, view it and select the option to download the "),t("code",[e._v(".tar.gz")]),e._v(" archive of the release.\nOnce downloaded, rename it to "),t("code",[e._v("panel.tar.gz")]),e._v(" or "),t("code",[e._v("daemon.tar.gz")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" panel-v1.2.3.tar.gz panel.tar.gz\n")])])]),t("h3",{attrs:{id:"create-checksum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-checksum"}},[e._v("#")]),e._v(" Create Checksum")]),e._v(" "),t("p",[e._v("Then, create the SHA 256 checksum and write it to a file which will be uploaded to the release on GitHub.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("shasum -a "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" checksum.txt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Dump the output for easy pasting into the release")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" checksum.txt\n")])])]),t("h3",{attrs:{id:"gpg-sign-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gpg-sign-release"}},[e._v("#")]),e._v(" GPG Sign Release")]),e._v(" "),t("p",[e._v("Finally, create a GPG-signed file to verify the integrity of the release. This must be created using Pterodactyl's key,\nso chances are that only Dane will be doing this part.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("gpg --detach-sig --output panel.asc panel.tar.gz\n")])])]),t("h3",{attrs:{id:"attach-to-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#attach-to-release"}},[e._v("#")]),e._v(" Attach to Release")]),e._v(" "),t("p",[e._v("Finally, upload "),t("code",[e._v("panel.tar.gz")]),e._v(", "),t("code",[e._v("checksum.txt")]),e._v(", and "),t("code",[e._v("panel.asc")]),e._v(" to the release as attachments. This will allow all of our\ndefined links to continue working. In addition, add a section to the release titled "),t("code",[e._v("#### SHA256 Checksum")]),e._v(" with the content\nof the checksum for people to verify with.")]),e._v(" "),t("h2",{attrs:{id:"update-documentation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-documentation"}},[e._v("#")]),e._v(" Update Documentation")]),e._v(" "),t("p",[e._v("After the release is created and ready to go, update the relevant documentation to ensure it will be the version people\ninstall or upgrade to. You should also make sure all of the documentation for installing or upgrading is squared away and\nready to go.")]),e._v(" "),t("h2",{attrs:{id:"update-cdn"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-cdn"}},[e._v("#")]),e._v(" Update CDN")]),e._v(" "),t("p",[e._v("Dane will need to update the CDN "),t("code",[e._v("releases.json")]),e._v(" file to point to the most recent version of the Panel and Daemon so that\nnotifications show up on the Daemon and Panel encouraging people to update.")]),e._v(" "),t("h2",{attrs:{id:"make-discord-announcement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#make-discord-announcement"}},[e._v("#")]),e._v(" Make Discord Announcement")]),e._v(" "),t("p",[e._v("The last step is to make an announcement on Discord letting "),t("code",[e._v("@everyone")]),e._v(' know that a new release is available, and encouraging\nthem to update. Include relevant links to stem off the inevitable flood of "how 2 update" questions that will follow.')]),e._v(" "),t("h2",{attrs:{id:"example-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-process"}},[e._v("#")]),e._v(" Example Process")]),e._v(" "),t("p",[e._v("The entire process, command wise, will probably look something like below:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout -b release/v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# make file edits")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push -u origin release/v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" tag -as v1.2.3 -m "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"v1.2.3"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# edit release on GitHub, download files")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" panel-1.2.3.tar.gz panel.tar.gz\nshasum -a "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" checksum.txt\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" checksum.txt\n\ngpg --detach-sig --output panel.asc panel.tar.gz\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# attach to release")]),e._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{401:function(e,a,t){"use strict";t.r(a);var s=t(48),n=Object(s.a)({},(function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"publishing-a-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#publishing-a-release"}},[e._v("#")]),e._v(" Publishing a Release")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("This documentation is specific to the core project team and serves to document how we create, deploy, and announce\nreleases of this software. It might be an interesting read, but you'll likely never use anything out of this on a\nday-to-day basis.")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#pick-a-codename"}},[e._v("Pick a Codename")])]),t("li",[t("a",{attrs:{href:"#create-the-release-branch"}},[e._v("Create the Release Branch")])]),t("li",[t("a",{attrs:{href:"#tag-a-release"}},[e._v("Tag a Release")]),t("ul",[t("li",[t("a",{attrs:{href:"#update-the-release-on-github"}},[e._v("Update the Release on GitHub")])])])]),t("li",[t("a",{attrs:{href:"#generate-signatures-hashes"}},[e._v("Generate Signatures & Hashes")]),t("ul",[t("li",[t("a",{attrs:{href:"#create-checksum"}},[e._v("Create Checksum")])]),t("li",[t("a",{attrs:{href:"#gpg-sign-release"}},[e._v("GPG Sign Release")])]),t("li",[t("a",{attrs:{href:"#attach-to-release"}},[e._v("Attach to Release")])])])]),t("li",[t("a",{attrs:{href:"#update-documentation"}},[e._v("Update Documentation")])]),t("li",[t("a",{attrs:{href:"#update-cdn"}},[e._v("Update CDN")])]),t("li",[t("a",{attrs:{href:"#make-discord-announcement"}},[e._v("Make Discord Announcement")])]),t("li",[t("a",{attrs:{href:"#example-process"}},[e._v("Example Process")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"pick-a-codename"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pick-a-codename"}},[e._v("#")]),e._v(" Pick a Codename")]),e._v(" "),t("p",[e._v("If this is going to be a major version release "),t("code",[e._v("0.X")]),e._v(" or "),t("code",[e._v("1.X")]),e._v(" (not "),t("code",[e._v("0.0.X")]),e._v("), you will need to have a codename picked\nout for the release. This should be some type of rhyme or otherwise creative name, ideally using some type of Pterodactyl\nrelated species name.")]),e._v(" "),t("h2",{attrs:{id:"create-the-release-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-the-release-branch"}},[e._v("#")]),e._v(" Create the Release Branch")]),e._v(" "),t("p",[e._v("Releases should be created as their own branch on GitHub, following the GitFlow model. This means you'll need to create\na "),t("code",[e._v("release/vX.X.X")]),e._v(" branch. Once the branch is created you need to update the version number for the software. For the Panel\nthis requires editing "),t("code",[e._v("config/app.php")]),e._v(" and setting the specific "),t("code",[e._v("APP_VERSION")]),e._v(" "),t("em",[e._v("without")]),e._v(" a preceding "),t("code",[e._v("v")]),e._v(". For the Daemon,\nyou need to edit "),t("code",[e._v("package.json")]),e._v(" and set the "),t("code",[e._v("version")]),e._v(" field, again "),t("em",[e._v("without")]),e._v(" a preceding "),t("code",[e._v("v")]),e._v(".")]),e._v(" "),t("p",[e._v("Once you've created the branch and update the relevant file publish the branch to GitHub to begin the next steps.")]),e._v(" "),t("h2",{attrs:{id:"tag-a-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tag-a-release"}},[e._v("#")]),e._v(" Tag a Release")]),e._v(" "),t("p",[e._v("Once the branch is pushed up you need to tag a release and then configure it on GitHub. To do so, run the command below\nsetting the version correctly. This will create a tag for "),t("code",[e._v("v0.6.0")]),e._v(" on the "),t("code",[e._v("release/v0.6.0")]),e._v(" branch and sign it using your\nGPG key.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Sign Your Releases")]),e._v(" "),t("p",[e._v("All releases must be made with a GPG signed tag. Do not create a tag without signing it.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" tag -asm "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"v0.6.0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin v0.6.0\n")])])]),t("h3",{attrs:{id:"update-the-release-on-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-the-release-on-github"}},[e._v("#")]),e._v(" Update the Release on GitHub")]),e._v(" "),t("p",[e._v("Once you've created and pushed up the tag you need to then go to the GitHub releases, find the most recent tag, and create\na nice release from it. The title should be "),t("code",[e._v("v1.2.3 (Codename)")]),e._v(", and the content should be from the Changelog for that release.\nAll minor version releases should use the same codename as the major release version.")]),e._v(" "),t("h2",{attrs:{id:"generate-signatures-hashes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-signatures-hashes"}},[e._v("#")]),e._v(" Generate Signatures & Hashes")]),e._v(" "),t("p",[e._v("Once you've created the release on GitHub, view it and select the option to download the "),t("code",[e._v(".tar.gz")]),e._v(" archive of the release.\nOnce downloaded, rename it to "),t("code",[e._v("panel.tar.gz")]),e._v(" or "),t("code",[e._v("daemon.tar.gz")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" panel-v1.2.3.tar.gz panel.tar.gz\n")])])]),t("h3",{attrs:{id:"create-checksum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-checksum"}},[e._v("#")]),e._v(" Create Checksum")]),e._v(" "),t("p",[e._v("Then, create the SHA 256 checksum and write it to a file which will be uploaded to the release on GitHub.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("shasum -a "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" checksum.txt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Dump the output for easy pasting into the release")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" checksum.txt\n")])])]),t("h3",{attrs:{id:"gpg-sign-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gpg-sign-release"}},[e._v("#")]),e._v(" GPG Sign Release")]),e._v(" "),t("p",[e._v("Finally, create a GPG-signed file to verify the integrity of the release. This must be created using Pterodactyl's key,\nso chances are that only Dane will be doing this part.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("gpg --detach-sig --output panel.asc panel.tar.gz\n")])])]),t("h3",{attrs:{id:"attach-to-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#attach-to-release"}},[e._v("#")]),e._v(" Attach to Release")]),e._v(" "),t("p",[e._v("Finally, upload "),t("code",[e._v("panel.tar.gz")]),e._v(", "),t("code",[e._v("checksum.txt")]),e._v(", and "),t("code",[e._v("panel.asc")]),e._v(" to the release as attachments. This will allow all of our\ndefined links to continue working. In addition, add a section to the release titled "),t("code",[e._v("#### SHA256 Checksum")]),e._v(" with the content\nof the checksum for people to verify with.")]),e._v(" "),t("h2",{attrs:{id:"update-documentation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-documentation"}},[e._v("#")]),e._v(" Update Documentation")]),e._v(" "),t("p",[e._v("After the release is created and ready to go, update the relevant documentation to ensure it will be the version people\ninstall or upgrade to. You should also make sure all of the documentation for installing or upgrading is squared away and\nready to go.")]),e._v(" "),t("h2",{attrs:{id:"update-cdn"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-cdn"}},[e._v("#")]),e._v(" Update CDN")]),e._v(" "),t("p",[e._v("Dane will need to update the CDN "),t("code",[e._v("releases.json")]),e._v(" file to point to the most recent version of the Panel and Daemon so that\nnotifications show up on the Daemon and Panel encouraging people to update.")]),e._v(" "),t("h2",{attrs:{id:"make-discord-announcement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#make-discord-announcement"}},[e._v("#")]),e._v(" Make Discord Announcement")]),e._v(" "),t("p",[e._v("The last step is to make an announcement on Discord letting "),t("code",[e._v("@everyone")]),e._v(' know that a new release is available, and encouraging\nthem to update. Include relevant links to stem off the inevitable flood of "how 2 update" questions that will follow.')]),e._v(" "),t("h2",{attrs:{id:"example-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-process"}},[e._v("#")]),e._v(" Example Process")]),e._v(" "),t("p",[e._v("The entire process, command wise, will probably look something like below:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout -b release/v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# make file edits")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push -u origin release/v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" tag -as v1.2.3 -m "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"v1.2.3"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin v1.2.3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# edit release on GitHub, download files")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mv")]),e._v(" panel-1.2.3.tar.gz panel.tar.gz\nshasum -a "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" checksum.txt\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" checksum.txt\n\ngpg --detach-sig --output panel.asc panel.tar.gz\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# attach to release")]),e._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/59.06f08aee.js b/assets/js/59.7681f6ba.js similarity index 98% rename from assets/js/59.06f08aee.js rename to assets/js/59.7681f6ba.js index 287ace4c..40fae523 100644 --- a/assets/js/59.06f08aee.js +++ b/assets/js/59.7681f6ba.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{401:function(e,t,a){"use strict";a.r(t);var o=a(48),n=Object(o.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:"environment-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#reporting-all-exceptions"}},[e._v("Reporting All Exceptions")])]),a("li",[a("a",{attrs:{href:"#client-databases"}},[e._v("Client Databases")])]),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:"#increasing-the-editable-file-size"}},[e._v("Increasing the Editable File Size")])]),a("li",[a("a",{attrs:{href:"#disable-or-modify-recaptcha"}},[e._v("Disable or Modify ReCaptcha")]),a("ul",[a("li",[a("a",{attrs:{href:"#using-your-own-keys"}},[e._v("Using Your Own Keys")])])])])])]),a("p"),e._v(" "),a("p",[e._v("Pterodactyl's environment settings are configured and stored in an environment file — "),a("code",[e._v(".env")]),e._v(" — located in the\ninstallation root directory — generally "),a("code",[e._v("/var/www/pterodactyl")]),e._v(". Some of these settings are also stored in the database\nand will override settings found in the environment file.")]),e._v(" "),a("p",[e._v("To change this behavior you can edit the "),a("code",[e._v(".env")]),e._v(" file and change the setting "),a("code",[e._v("APP_ENVIRONMENT_ONLY=false")]),e._v(" to\n"),a("code",[e._v("APP_ENVIRONMENT_ONLY=true")]),e._v(" which will take effect the next time you refresh a page on the Panel. Generally you will\nonly need to do this if you severly corrupt a setting in the Panel or are deep in development with the software.")]),e._v(" "),a("h2",{attrs:{id:"reporting-all-exceptions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reporting-all-exceptions"}},[e._v("#")]),e._v(" Reporting All Exceptions")]),e._v(" "),a("p",[e._v("By default Pterodactyl only logs and reports exceptions that are, well, exceptional by nature. There are some exceptions\nthat we expect to occur such as authentication failures or validation issues. However, in rare instances when developing,\nor even on production servers, you might need to have all exceptions logged to detect inconsistent behavior.")]),e._v(" "),a("p",[e._v("To do this, simply set "),a("code",[e._v("APP_REPORT_ALL_EXCEPTIONS=true")]),e._v(" in your "),a("code",[e._v(".env")]),e._v(" file. You'll want to turn this off once you've\ncompleted whatever it is you're needing the exceptions for, otherwise your logs will become very large, very quickly.")]),e._v(" "),a("h2",{attrs:{id:"client-databases"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-databases"}},[e._v("#")]),e._v(" Client Databases")]),e._v(" "),a("p",[e._v("By default Pterodactyl ships with the ability for clients to have their own per-server databases. If you wish to disable\nthis ability, set "),a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ENABLED")]),e._v(" to be "),a("code",[e._v("false")]),e._v(". Pterodactyl also attempts to create databases\non a database host assigned to the current server's node but will use any host if one can't be found. If you would like\nto force a database to be created only on a host belonging to that server's node, set "),a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ALLOW_RANDOM")]),e._v("\nto be "),a("code",[e._v("false")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ENABLED=true\nPTERODACTYL_CLIENT_DATABASES_ALLOW_RANDOM=true\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("If you are planning on running Pterodactyl behind a reverse proxy, either using NGINX or because you are using\n"),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(",\nyou will need to make a quick modification to the Panel to ensure things continue to work as expected. By default when\nyou are using these reverse proxies your Panel will not understand how to properly handle requests and you'll most likely\nbe unable to login, or will see security warnings in your browser console as it attempts to load insecure assets. This\nis because the internal logic the Panel is using to determine how links should be generated thinks it is running over\nHTTP, 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\nhighly suggest providing a specific IP address (or comma separated list of IPs) rather than allowing "),a("code",[e._v("*")]),e._v(". For example,\nif your proxy is running on the same machine as the server, chances are that something like "),a("code",[e._v("TRUSTED_PROXIES=127.0.0.1")]),e._v("\nwill 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- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("proxy_set_header X-Real-IP $remote_addr;\nproxy_set_header Host $host;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $scheme;\nproxy_redirect off;\nproxy_buffering off;\nproxy_request_buffering off;\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- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("TRUSTED_PROXIES=103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,104.16.0.0/12,108.162.192.0/18,131.0.72.0/22,141.101.64.0/18,162.158.0.0/15,172.64.0.0/13,173.245.48.0/20,188.114.96.0/20,190.93.240.0/20,197.234.240.0/22,198.41.128.0/17\n")])])]),a("h2",{attrs:{id:"increasing-the-editable-file-size"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#increasing-the-editable-file-size"}},[e._v("#")]),e._v(" Increasing the Editable File Size")]),e._v(" "),a("p",[e._v("By default the Panel attempts to set a reasonable limit for editing files through the web based file manager. However,\nsome users find it too restrictive and wish to increase the size. This is controlled by a configuration value that can\nalso be set using the "),a("code",[e._v(".env")]),e._v(" file. The default value is "),a("code",[e._v("50,000")]),e._v(" bytes but this can be increased as you see fit.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_FILES_MAX_EDIT_SIZE=50000\n")])])]),a("h2",{attrs:{id:"disable-or-modify-recaptcha"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disable-or-modify-recaptcha"}},[e._v("#")]),e._v(" Disable or Modify ReCaptcha")]),e._v(" "),a("p",[e._v("To disable reCAPTCHA on login or password reset, simply set "),a("code",[e._v("RECAPTCHA_ENABLED=false")]),e._v(" in the environment file. This\nchange will take effect immediately.")]),e._v(" "),a("h3",{attrs:{id:"using-your-own-keys"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-your-own-keys"}},[e._v("#")]),e._v(" Using Your Own Keys")]),e._v(" "),a("p",[e._v("Pterodactyl comes preconfigured using a public set of reCAPTCHA keys but you may wish to use your own site\nspecific keys. To do so, follow the instructions below.")]),e._v(" "),a("ol",[a("li",[e._v("Visit "),a("a",{attrs:{href:"https://www.google.com/recaptcha/admin#list",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google's reCAPTCHA Admin Console"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("li",[e._v('Click "Register New Site" and fill in a name for your keys.')]),e._v(" "),a("li",[e._v("Choose "),a("code",[e._v("reCAPTCHA v2")]),e._v(" and ensure that the option for "),a("code",[e._v("Invisible")]),e._v(" is selected.")]),e._v(" "),a("li",[e._v("Include the domain that your panel is located on.")]),e._v(" "),a("li",[e._v('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.')])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Disabling Domain Verification")]),e._v(" "),a("p",[e._v('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.')])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{402:function(e,t,a){"use strict";a.r(t);var o=a(48),n=Object(o.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:"environment-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#reporting-all-exceptions"}},[e._v("Reporting All Exceptions")])]),a("li",[a("a",{attrs:{href:"#client-databases"}},[e._v("Client Databases")])]),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:"#increasing-the-editable-file-size"}},[e._v("Increasing the Editable File Size")])]),a("li",[a("a",{attrs:{href:"#disable-or-modify-recaptcha"}},[e._v("Disable or Modify ReCaptcha")]),a("ul",[a("li",[a("a",{attrs:{href:"#using-your-own-keys"}},[e._v("Using Your Own Keys")])])])])])]),a("p"),e._v(" "),a("p",[e._v("Pterodactyl's environment settings are configured and stored in an environment file — "),a("code",[e._v(".env")]),e._v(" — located in the\ninstallation root directory — generally "),a("code",[e._v("/var/www/pterodactyl")]),e._v(". Some of these settings are also stored in the database\nand will override settings found in the environment file.")]),e._v(" "),a("p",[e._v("To change this behavior you can edit the "),a("code",[e._v(".env")]),e._v(" file and change the setting "),a("code",[e._v("APP_ENVIRONMENT_ONLY=false")]),e._v(" to\n"),a("code",[e._v("APP_ENVIRONMENT_ONLY=true")]),e._v(" which will take effect the next time you refresh a page on the Panel. Generally you will\nonly need to do this if you severly corrupt a setting in the Panel or are deep in development with the software.")]),e._v(" "),a("h2",{attrs:{id:"reporting-all-exceptions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reporting-all-exceptions"}},[e._v("#")]),e._v(" Reporting All Exceptions")]),e._v(" "),a("p",[e._v("By default Pterodactyl only logs and reports exceptions that are, well, exceptional by nature. There are some exceptions\nthat we expect to occur such as authentication failures or validation issues. However, in rare instances when developing,\nor even on production servers, you might need to have all exceptions logged to detect inconsistent behavior.")]),e._v(" "),a("p",[e._v("To do this, simply set "),a("code",[e._v("APP_REPORT_ALL_EXCEPTIONS=true")]),e._v(" in your "),a("code",[e._v(".env")]),e._v(" file. You'll want to turn this off once you've\ncompleted whatever it is you're needing the exceptions for, otherwise your logs will become very large, very quickly.")]),e._v(" "),a("h2",{attrs:{id:"client-databases"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-databases"}},[e._v("#")]),e._v(" Client Databases")]),e._v(" "),a("p",[e._v("By default Pterodactyl ships with the ability for clients to have their own per-server databases. If you wish to disable\nthis ability, set "),a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ENABLED")]),e._v(" to be "),a("code",[e._v("false")]),e._v(". Pterodactyl also attempts to create databases\non a database host assigned to the current server's node but will use any host if one can't be found. If you would like\nto force a database to be created only on a host belonging to that server's node, set "),a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ALLOW_RANDOM")]),e._v("\nto be "),a("code",[e._v("false")]),e._v(".")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_CLIENT_DATABASES_ENABLED=true\nPTERODACTYL_CLIENT_DATABASES_ALLOW_RANDOM=true\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("If you are planning on running Pterodactyl behind a reverse proxy, either using NGINX or because you are using\n"),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(",\nyou will need to make a quick modification to the Panel to ensure things continue to work as expected. By default when\nyou are using these reverse proxies your Panel will not understand how to properly handle requests and you'll most likely\nbe unable to login, or will see security warnings in your browser console as it attempts to load insecure assets. This\nis because the internal logic the Panel is using to determine how links should be generated thinks it is running over\nHTTP, 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\nhighly suggest providing a specific IP address (or comma separated list of IPs) rather than allowing "),a("code",[e._v("*")]),e._v(". For example,\nif your proxy is running on the same machine as the server, chances are that something like "),a("code",[e._v("TRUSTED_PROXIES=127.0.0.1")]),e._v("\nwill 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- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("proxy_set_header X-Real-IP $remote_addr;\nproxy_set_header Host $host;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $scheme;\nproxy_redirect off;\nproxy_buffering off;\nproxy_request_buffering off;\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- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("TRUSTED_PROXIES=103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,104.16.0.0/12,108.162.192.0/18,131.0.72.0/22,141.101.64.0/18,162.158.0.0/15,172.64.0.0/13,173.245.48.0/20,188.114.96.0/20,190.93.240.0/20,197.234.240.0/22,198.41.128.0/17\n")])])]),a("h2",{attrs:{id:"increasing-the-editable-file-size"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#increasing-the-editable-file-size"}},[e._v("#")]),e._v(" Increasing the Editable File Size")]),e._v(" "),a("p",[e._v("By default the Panel attempts to set a reasonable limit for editing files through the web based file manager. However,\nsome users find it too restrictive and wish to increase the size. This is controlled by a configuration value that can\nalso be set using the "),a("code",[e._v(".env")]),e._v(" file. The default value is "),a("code",[e._v("50,000")]),e._v(" bytes but this can be increased as you see fit.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("PTERODACTYL_FILES_MAX_EDIT_SIZE=50000\n")])])]),a("h2",{attrs:{id:"disable-or-modify-recaptcha"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#disable-or-modify-recaptcha"}},[e._v("#")]),e._v(" Disable or Modify ReCaptcha")]),e._v(" "),a("p",[e._v("To disable reCAPTCHA on login or password reset, simply set "),a("code",[e._v("RECAPTCHA_ENABLED=false")]),e._v(" in the environment file. This\nchange will take effect immediately.")]),e._v(" "),a("h3",{attrs:{id:"using-your-own-keys"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-your-own-keys"}},[e._v("#")]),e._v(" Using Your Own Keys")]),e._v(" "),a("p",[e._v("Pterodactyl comes preconfigured using a public set of reCAPTCHA keys but you may wish to use your own site\nspecific keys. To do so, follow the instructions below.")]),e._v(" "),a("ol",[a("li",[e._v("Visit "),a("a",{attrs:{href:"https://www.google.com/recaptcha/admin#list",target:"_blank",rel:"noopener noreferrer"}},[e._v("Google's reCAPTCHA Admin Console"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("li",[e._v('Click "Register New Site" and fill in a name for your keys.')]),e._v(" "),a("li",[e._v("Choose "),a("code",[e._v("reCAPTCHA v2")]),e._v(" and ensure that the option for "),a("code",[e._v("Invisible")]),e._v(" is selected.")]),e._v(" "),a("li",[e._v("Include the domain that your panel is located on.")]),e._v(" "),a("li",[e._v('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.')])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Disabling Domain Verification")]),e._v(" "),a("p",[e._v('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.')])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/60.a3853cbe.js b/assets/js/60.cdccfa2a.js similarity index 99% rename from assets/js/60.a3853cbe.js rename to assets/js/60.cdccfa2a.js index f1f2a782..1ecc6ce1 100644 --- a/assets/js/60.a3853cbe.js +++ b/assets/js/60.cdccfa2a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{402:function(e,t,s){"use strict";s.r(t);var a=s(48),n=Object(a.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:"getting-started"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),s("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\nto run and use this panel.")]),e._v(" "),s("p",[e._v("This panel does not exist as a drag-and-drop service to run your servers. It is a highly complex system\nrequiring multiple dependencies and administrators willing to spend some time learning how to use it. If you expect\nto be able to install this with no understanding of basic Linux system administration you should stop and turn\naround now.")]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#picking-a-server-os"}},[e._v("Picking a Server OS")])]),s("li",[s("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),s("ul",[s("li",[s("a",{attrs:{href:"#example-dependency-installation"}},[e._v("Example Dependency Installation")])]),s("li",[s("a",{attrs:{href:"#installing-composer"}},[e._v("Installing Composer")])])])]),s("li",[s("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),s("li",[s("a",{attrs:{href:"#installation"}},[e._v("Installation")]),s("ul",[s("li",[s("a",{attrs:{href:"#environment-configuration"}},[e._v("Environment Configuration")])]),s("li",[s("a",{attrs:{href:"#database-setup"}},[e._v("Database Setup")])]),s("li",[s("a",{attrs:{href:"#add-the-first-user"}},[e._v("Add The First User")])]),s("li",[s("a",{attrs:{href:"#set-permissions"}},[e._v("Set Permissions")])])])]),s("li",[s("a",{attrs:{href:"#queue-listeners"}},[e._v("Queue Listeners")]),s("ul",[s("li",[s("a",{attrs:{href:"#crontab-configuration"}},[e._v("Crontab Configuration")])]),s("li",[s("a",{attrs:{href:"#create-queue-worker"}},[e._v("Create Queue Worker")])])])])])]),s("p"),e._v(" "),s("h2",{attrs:{id:"picking-a-server-os"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#picking-a-server-os"}},[e._v("#")]),e._v(" Picking a Server OS")]),e._v(" "),s("p",[e._v("Pterodactyl runs on a wide range of operating systems, so pick whichever you are most comfortable using.")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Pterodactyl does not support most OpenVZ systems due to incompatabilities with Docker. If you are planning on running\nthis software on an OpenVZ based system you will — most likely — not be successful.")])]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Operating System")]),e._v(" "),s("th",[e._v("Version")]),e._v(" "),s("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),s("th",[e._v("Notes")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("Ubuntu")])]),e._v(" "),s("td",[e._v("18.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/ubuntu2004.html"}},[e._v("20.04")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("CentOS")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/centos7.html"}},[e._v("7")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Extra repos are required.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/centos8.html"}},[e._v("8")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("All required packages are part of the base repos.")])]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("Debian")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/debian9.html"}},[e._v("9")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Extra repos are required.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/debian10.html"}},[e._v("10")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("All required packages are part of the base repos.")])])])]),e._v(" "),s("h2",{attrs:{id:"dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),s("ul",[s("li",[e._v("PHP "),s("code",[e._v("7.2")]),e._v(" with the following extensions: "),s("code",[e._v("cli")]),e._v(", "),s("code",[e._v("openssl")]),e._v(", "),s("code",[e._v("gd")]),e._v(", "),s("code",[e._v("mysql")]),e._v(", "),s("code",[e._v("PDO")]),e._v(", "),s("code",[e._v("mbstring")]),e._v(", "),s("code",[e._v("tokenizer")]),e._v(", "),s("code",[e._v("bcmath")]),e._v(", "),s("code",[e._v("xml")]),e._v(" or "),s("code",[e._v("dom")]),e._v(", "),s("code",[e._v("curl")]),e._v(", "),s("code",[e._v("zip")]),e._v(", and "),s("code",[e._v("fpm")]),e._v(" if you are planning to use nginx")]),e._v(" "),s("li",[e._v("MySQL "),s("code",[e._v("5.7")]),e._v(" "),s("strong",[e._v("or")]),e._v(" MariaDB "),s("code",[e._v("10.1.3")]),e._v(" or higher")]),e._v(" "),s("li",[e._v("Redis ("),s("code",[e._v("redis-server")]),e._v(")")]),e._v(" "),s("li",[e._v("A webserver (Apache, NGINX, Caddy, etc.)")]),e._v(" "),s("li",[s("code",[e._v("curl")])]),e._v(" "),s("li",[s("code",[e._v("tar")])]),e._v(" "),s("li",[s("code",[e._v("unzip")])]),e._v(" "),s("li",[s("code",[e._v("git")])]),e._v(" "),s("li",[s("code",[e._v("composer")])])]),e._v(" "),s("h3",{attrs:{id:"example-dependency-installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-dependency-installation"}},[e._v("#")]),e._v(" Example Dependency Installation")]),e._v(" "),s("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(" "),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"}},[e._v('# Add "add-apt-repository" command')]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" software-properties-common "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add additional repositories for PHP, Redis, and MariaDB")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("LC_ALL")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("C.UTF-8 add-apt-repository -y ppa:ondrej/php\nadd-apt-repository -y ppa:chris-lea/redis-server\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Update repositories list")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n\n"),s("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"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Install Dependencies")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" php7.2 php7.2-cli php7.2-gd php7.2-mysql php7.2-pdo php7.2-mbstring php7.2-tokenizer php7.2-bcmath php7.2-xml php7.2-fpm php7.2-curl php7.2-zip mariadb-server nginx "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("unzip")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" redis-server\n")])])]),s("h3",{attrs:{id:"installing-composer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-composer"}},[e._v("#")]),e._v(" Installing Composer")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://getcomposer.org/installer "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" php -- --install-dir"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/usr/local/bin --filename"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("composer --1\n")])])]),s("h2",{attrs:{id:"download-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-files"}},[e._v("#")]),e._v(" Download Files")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /var/www/pterodactyl\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n")])])]),s("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 "),s("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 "),s("code",[e._v("storage/")]),e._v(" and "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/download/v0.7.19/panel.tar.gz\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzvf panel.tar.gz\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache/\n")])])]),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),s("p",[e._v("Now that all of the files have been downloaded we need to configure some core aspects of the Panel.")]),e._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Database Configuration")]),e._v(" "),s("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 quickly create a user and database for your Pterodactyl panel, if you are unsure how to do this or want more information, please have a look at "),s("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("$ mysql -u root -p\n\nmysql> CREATE USER 'pterodactyl'@'localhost' IDENTIFIED WITH mysql_native_password BY 'A secure password';\nmysql> CREATE DATABASE panel;\nmysql> GRANT ALL ON panel.* TO 'pterodactyl'@'localhost' WITH GRANT OPTION;\nmysql> FLUSH PRIVILEGES;\n\n")])])])]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("cp")]),e._v(" .env.example .env\ncomposer "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Only run the command below if you are installing this Panel for")]),e._v("\n"),s("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")])])]),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),s("p",[e._v("Back up your encryption key (APP_KEY in the "),s("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 useless and can't be restored, even if you have database backups.")])]),e._v(" "),s("h3",{attrs:{id:"environment-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:database\n\n"),s("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"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# custom SMTP server, select "smtp".')]),e._v("\nphp artisan p:environment:mail\n")])])]),s("h3",{attrs:{id:"database-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database-setup"}},[e._v("#")]),e._v(" Database Setup")]),e._v(" "),s("p",[e._v("Now we need to setup all of the base data for the Panel in the database you created earlier. "),s("strong",[e._v("The command below\nmay take some time to run depending on your machine. Please "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan migrate --seed\n")])])]),s("h3",{attrs:{id:"add-the-first-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-the-first-user"}},[e._v("#")]),e._v(" Add The First User")]),e._v(" "),s("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 "),s("strong",[e._v("must")]),e._v(" meet the following requirements: 8 characters, mixed case, at least one number.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan p:user:make\n")])])]),s("h3",{attrs:{id:"set-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),s("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(" "),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"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data * \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx *\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache *\n")])])]),s("h2",{attrs:{id:"queue-listeners"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#queue-listeners"}},[e._v("#")]),e._v(" Queue Listeners")]),e._v(" "),s("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(" "),s("h3",{attrs:{id:"crontab-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#crontab-configuration"}},[e._v("#")]),e._v(" Crontab Configuration")]),e._v(" "),s("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 "),s("code",[e._v("sudo crontab -e")]),e._v(" and\nthen paste the line below.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("* * * * * php /var/www/pterodactyl/artisan schedule:run "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /dev/null "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("2")]),e._v(">")]),s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("&1")]),e._v("\n")])])]),s("h3",{attrs:{id:"create-queue-worker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-queue-worker"}},[e._v("#")]),e._v(" Create Queue Worker")]),e._v(" "),s("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(" "),s("p",[e._v("Create a file called "),s("code",[e._v("pteroq.service")]),e._v(" in "),s("code",[e._v("/etc/systemd/system")]),e._v(" with the contents below.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("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\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Redis on CentOS")]),e._v(" "),s("p",[e._v("If you are using CentOS, you will need to replace "),s("code",[e._v("redis-server.service")]),e._v(" with "),s("code",[e._v("redis.service")]),e._v(" at the "),s("code",[e._v("After=")]),e._v(" line in order to ensure "),s("code",[e._v("redis")]),e._v(" starts before the queue worker.")])]),e._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),s("p",[e._v("If you are not using "),s("code",[e._v("redis")]),e._v(" for anything you should remove the "),s("code",[e._v("After=")]),e._v(" line, otherwise you will encounter errors\nwhen the service starts.")])]),e._v(" "),s("p",[e._v("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:")]),e._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 function"}},[e._v("sudo")]),e._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now redis-server\n")])])]),s("p",[e._v("Finally, enable the service and set it to boot on machine start.")]),e._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 function"}},[e._v("sudo")]),e._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pteroq.service\n")])])]),s("h4",{attrs:{id:"next-step-webserver-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#next-step-webserver-configuration"}},[e._v("#")]),e._v(" Next Step: "),s("a",{attrs:{href:"./webserver_configuration"}},[e._v("Webserver Configuration")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{403:function(e,t,s){"use strict";s.r(t);var a=s(48),n=Object(a.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:"getting-started"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),s("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\nto run and use this panel.")]),e._v(" "),s("p",[e._v("This panel does not exist as a drag-and-drop service to run your servers. It is a highly complex system\nrequiring multiple dependencies and administrators willing to spend some time learning how to use it. If you expect\nto be able to install this with no understanding of basic Linux system administration you should stop and turn\naround now.")]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#picking-a-server-os"}},[e._v("Picking a Server OS")])]),s("li",[s("a",{attrs:{href:"#dependencies"}},[e._v("Dependencies")]),s("ul",[s("li",[s("a",{attrs:{href:"#example-dependency-installation"}},[e._v("Example Dependency Installation")])]),s("li",[s("a",{attrs:{href:"#installing-composer"}},[e._v("Installing Composer")])])])]),s("li",[s("a",{attrs:{href:"#download-files"}},[e._v("Download Files")])]),s("li",[s("a",{attrs:{href:"#installation"}},[e._v("Installation")]),s("ul",[s("li",[s("a",{attrs:{href:"#environment-configuration"}},[e._v("Environment Configuration")])]),s("li",[s("a",{attrs:{href:"#database-setup"}},[e._v("Database Setup")])]),s("li",[s("a",{attrs:{href:"#add-the-first-user"}},[e._v("Add The First User")])]),s("li",[s("a",{attrs:{href:"#set-permissions"}},[e._v("Set Permissions")])])])]),s("li",[s("a",{attrs:{href:"#queue-listeners"}},[e._v("Queue Listeners")]),s("ul",[s("li",[s("a",{attrs:{href:"#crontab-configuration"}},[e._v("Crontab Configuration")])]),s("li",[s("a",{attrs:{href:"#create-queue-worker"}},[e._v("Create Queue Worker")])])])])])]),s("p"),e._v(" "),s("h2",{attrs:{id:"picking-a-server-os"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#picking-a-server-os"}},[e._v("#")]),e._v(" Picking a Server OS")]),e._v(" "),s("p",[e._v("Pterodactyl runs on a wide range of operating systems, so pick whichever you are most comfortable using.")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Pterodactyl does not support most OpenVZ systems due to incompatabilities with Docker. If you are planning on running\nthis software on an OpenVZ based system you will — most likely — not be successful.")])]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Operating System")]),e._v(" "),s("th",[e._v("Version")]),e._v(" "),s("th",{staticStyle:{"text-align":"center"}},[e._v("Supported")]),e._v(" "),s("th",[e._v("Notes")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("Ubuntu")])]),e._v(" "),s("td",[e._v("18.04")]),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Documentation written assuming Ubuntu 18.04 as the base OS.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/ubuntu2004.html"}},[e._v("20.04")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td")]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("CentOS")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/centos7.html"}},[e._v("7")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Extra repos are required.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/centos8.html"}},[e._v("8")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("All required packages are part of the base repos.")])]),e._v(" "),s("tr",[s("td",[s("strong",[e._v("Debian")])]),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/debian9.html"}},[e._v("9")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("Extra repos are required.")])]),e._v(" "),s("tr",[s("td"),e._v(" "),s("td",[s("RouterLink",{attrs:{to:"/community/installation-guides/panel/debian10.html"}},[e._v("10")])],1),e._v(" "),s("td",{staticStyle:{"text-align":"center"}},[e._v("✅")]),e._v(" "),s("td",[e._v("All required packages are part of the base repos.")])])])]),e._v(" "),s("h2",{attrs:{id:"dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),s("ul",[s("li",[e._v("PHP "),s("code",[e._v("7.2")]),e._v(" with the following extensions: "),s("code",[e._v("cli")]),e._v(", "),s("code",[e._v("openssl")]),e._v(", "),s("code",[e._v("gd")]),e._v(", "),s("code",[e._v("mysql")]),e._v(", "),s("code",[e._v("PDO")]),e._v(", "),s("code",[e._v("mbstring")]),e._v(", "),s("code",[e._v("tokenizer")]),e._v(", "),s("code",[e._v("bcmath")]),e._v(", "),s("code",[e._v("xml")]),e._v(" or "),s("code",[e._v("dom")]),e._v(", "),s("code",[e._v("curl")]),e._v(", "),s("code",[e._v("zip")]),e._v(", and "),s("code",[e._v("fpm")]),e._v(" if you are planning to use nginx")]),e._v(" "),s("li",[e._v("MySQL "),s("code",[e._v("5.7")]),e._v(" "),s("strong",[e._v("or")]),e._v(" MariaDB "),s("code",[e._v("10.1.3")]),e._v(" or higher")]),e._v(" "),s("li",[e._v("Redis ("),s("code",[e._v("redis-server")]),e._v(")")]),e._v(" "),s("li",[e._v("A webserver (Apache, NGINX, Caddy, etc.)")]),e._v(" "),s("li",[s("code",[e._v("curl")])]),e._v(" "),s("li",[s("code",[e._v("tar")])]),e._v(" "),s("li",[s("code",[e._v("unzip")])]),e._v(" "),s("li",[s("code",[e._v("git")])]),e._v(" "),s("li",[s("code",[e._v("composer")])])]),e._v(" "),s("h3",{attrs:{id:"example-dependency-installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-dependency-installation"}},[e._v("#")]),e._v(" Example Dependency Installation")]),e._v(" "),s("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(" "),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"}},[e._v('# Add "add-apt-repository" command')]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" software-properties-common "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Add additional repositories for PHP, Redis, and MariaDB")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("LC_ALL")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("C.UTF-8 add-apt-repository -y ppa:ondrej/php\nadd-apt-repository -y ppa:chris-lea/redis-server\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("bash")]),e._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Update repositories list")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n\n"),s("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"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Install Dependencies")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" -y "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" php7.2 php7.2-cli php7.2-gd php7.2-mysql php7.2-pdo php7.2-mbstring php7.2-tokenizer php7.2-bcmath php7.2-xml php7.2-fpm php7.2-curl php7.2-zip mariadb-server nginx "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("unzip")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" redis-server\n")])])]),s("h3",{attrs:{id:"installing-composer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installing-composer"}},[e._v("#")]),e._v(" Installing Composer")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -sS https://getcomposer.org/installer "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" php -- --install-dir"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("/usr/local/bin --filename"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("composer --1\n")])])]),s("h2",{attrs:{id:"download-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-files"}},[e._v("#")]),e._v(" Download Files")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" -p /var/www/pterodactyl\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" /var/www/pterodactyl\n")])])]),s("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 "),s("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 "),s("code",[e._v("storage/")]),e._v(" and "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/download/v0.7.19/panel.tar.gz\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzvf panel.tar.gz\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),s("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache/\n")])])]),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),s("p",[e._v("This documentation is for "),s("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),s("p",[e._v("You should be installing and using "),s("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),s("p",[e._v("Now that all of the files have been downloaded we need to configure some core aspects of the Panel.")]),e._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Database Configuration")]),e._v(" "),s("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 quickly create a user and database for your Pterodactyl panel, if you are unsure how to do this or want more information, please have a look at "),s("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("$ mysql -u root -p\n\nmysql> CREATE USER 'pterodactyl'@'localhost' IDENTIFIED WITH mysql_native_password BY 'A secure password';\nmysql> CREATE DATABASE panel;\nmysql> GRANT ALL ON panel.* TO 'pterodactyl'@'localhost' WITH GRANT OPTION;\nmysql> FLUSH PRIVILEGES;\n\n")])])])]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[e._v("cp")]),e._v(" .env.example .env\ncomposer "),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Only run the command below if you are installing this Panel for")]),e._v("\n"),s("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")])])]),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),s("p",[e._v("Back up your encryption key (APP_KEY in the "),s("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 useless and can't be restored, even if you have database backups.")])]),e._v(" "),s("h3",{attrs:{id:"environment-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#environment-configuration"}},[e._v("#")]),e._v(" Environment Configuration")]),e._v(" "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:database\n\n"),s("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"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v('# custom SMTP server, select "smtp".')]),e._v("\nphp artisan p:environment:mail\n")])])]),s("h3",{attrs:{id:"database-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database-setup"}},[e._v("#")]),e._v(" Database Setup")]),e._v(" "),s("p",[e._v("Now we need to setup all of the base data for the Panel in the database you created earlier. "),s("strong",[e._v("The command below\nmay take some time to run depending on your machine. Please "),s("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(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan migrate --seed\n")])])]),s("h3",{attrs:{id:"add-the-first-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-the-first-user"}},[e._v("#")]),e._v(" Add The First User")]),e._v(" "),s("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 "),s("strong",[e._v("must")]),e._v(" meet the following requirements: 8 characters, mixed case, at least one number.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("php artisan p:user:make\n")])])]),s("h3",{attrs:{id:"set-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),s("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(" "),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"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data * \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx *\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache *\n")])])]),s("h2",{attrs:{id:"queue-listeners"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#queue-listeners"}},[e._v("#")]),e._v(" Queue Listeners")]),e._v(" "),s("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(" "),s("h3",{attrs:{id:"crontab-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#crontab-configuration"}},[e._v("#")]),e._v(" Crontab Configuration")]),e._v(" "),s("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 "),s("code",[e._v("sudo crontab -e")]),e._v(" and\nthen paste the line below.")]),e._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[e._v("* * * * * php /var/www/pterodactyl/artisan schedule:run "),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /dev/null "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("2")]),e._v(">")]),s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[e._v("&1")]),e._v("\n")])])]),s("h3",{attrs:{id:"create-queue-worker"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-queue-worker"}},[e._v("#")]),e._v(" Create Queue Worker")]),e._v(" "),s("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(" "),s("p",[e._v("Create a file called "),s("code",[e._v("pteroq.service")]),e._v(" in "),s("code",[e._v("/etc/systemd/system")]),e._v(" with the contents below.")]),e._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("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\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("Redis on CentOS")]),e._v(" "),s("p",[e._v("If you are using CentOS, you will need to replace "),s("code",[e._v("redis-server.service")]),e._v(" with "),s("code",[e._v("redis.service")]),e._v(" at the "),s("code",[e._v("After=")]),e._v(" line in order to ensure "),s("code",[e._v("redis")]),e._v(" starts before the queue worker.")])]),e._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),s("p",[e._v("If you are not using "),s("code",[e._v("redis")]),e._v(" for anything you should remove the "),s("code",[e._v("After=")]),e._v(" line, otherwise you will encounter errors\nwhen the service starts.")])]),e._v(" "),s("p",[e._v("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:")]),e._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 function"}},[e._v("sudo")]),e._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now redis-server\n")])])]),s("p",[e._v("Finally, enable the service and set it to boot on machine start.")]),e._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 function"}},[e._v("sudo")]),e._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("enable")]),e._v(" --now pteroq.service\n")])])]),s("h4",{attrs:{id:"next-step-webserver-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#next-step-webserver-configuration"}},[e._v("#")]),e._v(" Next Step: "),s("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/61.360ebc59.js b/assets/js/61.bca7dd5a.js similarity index 99% rename from assets/js/61.360ebc59.js rename to assets/js/61.bca7dd5a.js index 70b36776..cbf7bc3a 100644 --- a/assets/js/61.360ebc59.js +++ b/assets/js/61.bca7dd5a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{403:function(e,t,r){"use strict";r.r(t);var a=r(48),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"troubleshooting"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#reading-error-logs"}},[e._v("Reading Error Logs")]),r("ul",[r("li",[r("a",{attrs:{href:"#parsing-the-error"}},[e._v("Parsing the Error")])]),r("li",[r("a",{attrs:{href:"#understanding-the-error"}},[e._v("Understanding the Error")])]),r("li",[r("a",{attrs:{href:"#utilizing-grep"}},[e._v("Utilizing GREP")])])])]),r("li",[r("a",{attrs:{href:"#transfer-exceptions-xhr-poll-error"}},[e._v("Transfer Exceptions / XHR Poll Error")]),r("ul",[r("li",[r("a",{attrs:{href:"#example-errors"}},[e._v("Example Errors")])]),r("li",[r("a",{attrs:{href:"#basic-debugging-steps"}},[e._v("Basic Debugging Steps")])]),r("li",[r("a",{attrs:{href:"#more-advanced-debugging-steps"}},[e._v("More Advanced Debugging Steps")])])])]),r("li",[r("a",{attrs:{href:"#invalid-mac-exception"}},[e._v("Invalid MAC Exception")])]),r("li",[r("a",{attrs:{href:"#selinux-issues"}},[e._v("SELinux Issues")]),r("ul",[r("li",[r("a",{attrs:{href:"#redis-permissions-errors"}},[e._v("Redis Permissions Errors")])]),r("li",[r("a",{attrs:{href:"#in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[e._v("In case there is any weirdness with parts of the panel")])]),r("li",[r("a",{attrs:{href:"#daemon-connection-errors"}},[e._v("Daemon Connection Errors")])])])]),r("li",[r("a",{attrs:{href:"#firewalld-issues"}},[e._v("FirewallD issues")])]),r("li",[r("a",{attrs:{href:"#database-errors"}},[e._v("Database Errors")]),r("ul",[r("li",[r("a",{attrs:{href:"#databasecontroller-php-142"}},[e._v("DatabaseController.php:142")])])])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"reading-error-logs"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#reading-error-logs"}},[e._v("#")]),e._v(" Reading Error Logs")]),e._v(" "),r("p",[e._v("If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs.\nTo retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log\n")])])]),r("h3",{attrs:{id:"parsing-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#parsing-the-error"}},[e._v("#")]),e._v(" Parsing the Error")]),e._v(" "),r("p",[e._v("When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not,\nthis is simply a stacktrace leading to the cause of the error, and you can actually ignore almost all of it when\nlooking for the cause of the error. Lets take a look at some example output below, which has been truncated to\nmake this easier to follow with.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("#70 /srv/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))\n#71 /srv/www/public/index.php(53): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))\n#72 {main}\n[2018-07-19 00:50:24] local.ERROR: ErrorException: file_put_contents(/srv/www/storage/framework/views/c9c05d1357df1ce4ec8fc5df78c16c493b0d4f48.php): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\nStack trace:\n#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/srv/www/vendor...', 122, Array)\n#1 /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(122): file_put_contents('/srv/www/storag...', 's...', 0)\n#2 /srv/www/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(122): Illuminate\\Filesystem\\Filesystem->put('/srv/www/storag...', 's...')\n#3 /srv/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(51): Illuminate\\View\\Compilers\\BladeCompiler->compile('/srv/www/resour...')\n#4 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(142): Illuminate\\View\\Engines\\CompilerEngine->get('/srv/www/resour...', Array)\n#5 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(125): Illuminate\\View\\View->getContents()\n")])])]),r("p",[e._v("The first thing you'll want to do is follow the chain of numbers "),r("em",[e._v("up")]),e._v(" until you find "),r("code",[e._v("#0")]),e._v(", this will be the function that\ntriggered the exception. Right above line 0 you will see a line that has the date and time in brackets, "),r("code",[e._v("[2018-07-19 00:50:24]")]),e._v("\nabove for example. This line will be the human readable exception that you can use to understand what went wrong.")]),e._v(" "),r("h3",{attrs:{id:"understanding-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-error"}},[e._v("#")]),e._v(" Understanding the Error")]),e._v(" "),r("p",[e._v("In the example above we can see that the actual error was:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("local.ERROR: ErrorException: file_put_contents(...): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\n")])])]),r("p",[e._v("From this error we can determine that there was an error performing a "),r("a",{attrs:{href:"http://php.net/manual/en/function.file-put-contents.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("file_put_contents()"),r("OutboundLink")],1),e._v(" call, and the error was\nthat we couldn't open the file because permissions were denied. Its okay if you don't understand the error at all, but\nit does help you get faster support if you're able to provide these logs, and at least find the source of the error.\nSometimes the errors are pretty straightforward and will tell you exactly what went wrong, such as a "),r("code",[e._v("ConnectionException")]),e._v("\nbeing thrown when the Panel can't connect to the Daemon.")]),e._v(" "),r("h3",{attrs:{id:"utilizing-grep"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#utilizing-grep"}},[e._v("#")]),e._v(" Utilizing GREP")]),e._v(" "),r("p",[e._v("If you're trying to go through a bunch of errors quickly, you can use the command below which will limit the results returned to only\nbe the actual error lines, without all of the stack traces.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("1000")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log "),r("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"\\['),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%Y"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),e._v("\n")])])]),r("h2",{attrs:{id:"transfer-exceptions-xhr-poll-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#transfer-exceptions-xhr-poll-error"}},[e._v("#")]),e._v(" Transfer Exceptions / XHR Poll Error")]),e._v(" "),r("p",[e._v("If you are seeing errors similar to the examples below, chances are there is some networking related issue, or you\njust don't have a required service running.")]),e._v(" "),r("h3",{attrs:{id:"example-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#example-errors"}},[e._v("#")]),e._v(" Example Errors")]),e._v(" "),r("ul",[r("li",[r("p",[e._v('"We were unable to connect to the main Socket.IO server, there may be network issues currently. The panel may not work as expected."')])]),e._v(" "),r("li",[r("p",[e._v('"A TransferException was encountered while trying to contact the daemon, please ensure it\'s online and accessible. This error has been logged."')])])]),e._v(" "),r("h3",{attrs:{id:"basic-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#basic-debugging-steps"}},[e._v("#")]),e._v(" Basic Debugging Steps")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("Ensure you have AdBlock disabled or whitelisted for your Panel and Daemon domains.")])]),e._v(" "),r("li",[r("p",[e._v("Check your browser's console by pressing "),r("code",[e._v("Ctrl + Shift + J")]),e._v(" (in Chrome) or "),r("code",[e._v("Cmd + Alt + I")]),e._v(" (in Safari). If there is\na red error in it, chances are that it will narrow down the potential problem.")])]),e._v(" "),r("li",[r("p",[e._v("Make sure if the daemon is properly installed and the active configuration matches the configuration shown under\n"),r("code",[e._v("Admin -> Node -> Configuration")]),e._v(" in the Panel.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Daemon is running, and not reporting errors. Use "),r("code",[e._v("service wings status")]),e._v(" to check the current status of the process.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Daemon ports are open on your firewall. The Daemon uses ports "),r("code",[e._v("8080")]),e._v(" or "),r("code",[e._v("8443")]),e._v(" for HTTP traffic,\nand "),r("code",[e._v("2022")]),e._v(" for SFTP traffic.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Panel can reach the Daemon using the domain that is configured on the Panel. Run "),r("code",[e._v("curl https://domain.com:8080")]),e._v(" on the Panel server and ensure that it can connect to the Daemon.")])]),e._v(" "),r("li",[r("p",[e._v("Ensure that you are using the correct HTTP scheme for your Panel and Daemon. If the Panel is running over HTTPS\nthe Daemon will also need to be running on HTTPS.")])])]),e._v(" "),r("h3",{attrs:{id:"more-advanced-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#more-advanced-debugging-steps"}},[e._v("#")]),e._v(" More Advanced Debugging Steps")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("Stop the Daemon and run "),r("code",[e._v("cd /srv/daemon; sudo npm start")]),e._v(" to see if there are any errors being output by the Daemon.\nIf so, try resolving them manually, or contact us on Discord for more assistance.")])]),e._v(" "),r("li",[r("p",[e._v("Check your DNS and ensure that the response you receive is the one you expect using a tool such as "),r("code",[e._v("nslookup")]),e._v(" or "),r("code",[e._v("dig")]),e._v(".")])]),e._v(" "),r("li",[r("p",[e._v("If you use CloudFlare make sure that the yellow cloud is disabled for your Daemon or Panel "),r("code",[e._v("A")]),e._v(" records.")])]),e._v(" "),r("li",[r("p",[e._v("Make sure when using the daemon behind a firewall — pfSense, OpenSwitch, etc — that the correct NAT settings to access\nthe Daemon's ports from the outside network are setup.")])]),e._v(" "),r("li",[r("p",[e._v("If nothing is working so far, check your own DNS settings and consider switching DNS servers.")])]),e._v(" "),r("li",[r("p",[e._v("When running the Panel and Daemon on one server it can sometimes help if to add an entry in "),r("code",[e._v("/etc/hosts")]),e._v(" that directs\nthe public IP back to the server. Sometimes the reverse path is also needed, so you may need to add an entry to your\nservers "),r("code",[e._v("/etc/hosts")]),e._v(" file that points the Panel's domain to the correct IP.")])]),e._v(" "),r("li",[r("p",[e._v("When running the Daemon and Panel on separate VM's using the same adapter make sure the VM's can connect to each\nother. Promiscuous mode might be needed.")])])]),e._v(" "),r("h2",{attrs:{id:"invalid-mac-exception"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#invalid-mac-exception"}},[e._v("#")]),e._v(" Invalid MAC Exception")]),e._v(" "),r("div",{staticClass:"custom-block warning"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("This error should never happen if you correctly follow our installation and upgrade guides. The only time we have\never seen this error occur is when you blindly restore the Panel database from a backup and try to use a fresh\ninstallation of the Panel.")]),e._v(" "),r("p",[e._v("When restoring backups you should "),r("em",[e._v("always")]),e._v(" restore the "),r("code",[e._v(".env")]),e._v(" file!")])]),e._v(" "),r("p",[e._v("Sometimes when using the Panel you'll unexpectedly encounter a broken page, and upon checking the logs you'll see\nan exception mentioning an invalid MAC when decrypting. This error is caused by mismatched "),r("code",[e._v("APP_KEY")]),e._v("s in your "),r("code",[e._v(".env")]),e._v(" file\nwhen the data was encrypted versus decrypted.")]),e._v(" "),r("p",[e._v("If you are seeing this error the only solution is to restore the "),r("code",[e._v("APP_KEY")]),e._v(" from your "),r("code",[e._v(".env")]),e._v(" file. If you have lost that\noriginal key there is no way to recover the lost data.")]),e._v(" "),r("h2",{attrs:{id:"selinux-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#selinux-issues"}},[e._v("#")]),e._v(" SELinux Issues")]),e._v(" "),r("p",[e._v("On systems with SELinux installed you might encounter unexpected errors when running redis or attempting to connect\nto the daemon to perform actions. These issues can generally be resolved by executing the commands below to allow\nthese programs to work with SELinux.")]),e._v(" "),r("h3",{attrs:{id:"redis-permissions-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#redis-permissions-errors"}},[e._v("#")]),e._v(" Redis Permissions Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M redis_t\nsemodule -i redis_t.pp\n")])])]),r("h3",{attrs:{id:"in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[e._v("#")]),e._v(" In case there is any weirdness with parts of the panel")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("restorecon -R /var/www/pterodactyl/\n")])])]),r("h3",{attrs:{id:"daemon-connection-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#daemon-connection-errors"}},[e._v("#")]),e._v(" Daemon Connection Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M http_port_t\nsemodule -i http_port_t.pp\n")])])]),r("h2",{attrs:{id:"firewalld-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-issues"}},[e._v("#")]),e._v(" FirewallD issues")]),e._v(" "),r("p",[e._v("If you are on a RHEL/CentOS server with firewalld installed you may have broken DNS.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0\nfirewall-cmd --reload\n")])])]),r("p",[e._v("restart docker and wings after running these to be sure the rules are applied.")]),e._v(" "),r("h2",{attrs:{id:"database-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#database-errors"}},[e._v("#")]),e._v(" Database Errors")]),e._v(" "),r("h3",{attrs:{id:"databasecontroller-php-142"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#databasecontroller-php-142"}},[e._v("#")]),e._v(" DatabaseController.php:142")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("production.ERROR: ErrorException: Undefined variable: host in /var/www/pterodactyl/app/Http/Controllers/Admin/DatabaseController.php:142\n")])])]),r("p",[e._v("The database user you are trying to use doesn't have appropriate grants/has used incorrect password.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{404:function(e,t,r){"use strict";r.r(t);var a=r(48),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"troubleshooting"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#reading-error-logs"}},[e._v("Reading Error Logs")]),r("ul",[r("li",[r("a",{attrs:{href:"#parsing-the-error"}},[e._v("Parsing the Error")])]),r("li",[r("a",{attrs:{href:"#understanding-the-error"}},[e._v("Understanding the Error")])]),r("li",[r("a",{attrs:{href:"#utilizing-grep"}},[e._v("Utilizing GREP")])])])]),r("li",[r("a",{attrs:{href:"#transfer-exceptions-xhr-poll-error"}},[e._v("Transfer Exceptions / XHR Poll Error")]),r("ul",[r("li",[r("a",{attrs:{href:"#example-errors"}},[e._v("Example Errors")])]),r("li",[r("a",{attrs:{href:"#basic-debugging-steps"}},[e._v("Basic Debugging Steps")])]),r("li",[r("a",{attrs:{href:"#more-advanced-debugging-steps"}},[e._v("More Advanced Debugging Steps")])])])]),r("li",[r("a",{attrs:{href:"#invalid-mac-exception"}},[e._v("Invalid MAC Exception")])]),r("li",[r("a",{attrs:{href:"#selinux-issues"}},[e._v("SELinux Issues")]),r("ul",[r("li",[r("a",{attrs:{href:"#redis-permissions-errors"}},[e._v("Redis Permissions Errors")])]),r("li",[r("a",{attrs:{href:"#in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[e._v("In case there is any weirdness with parts of the panel")])]),r("li",[r("a",{attrs:{href:"#daemon-connection-errors"}},[e._v("Daemon Connection Errors")])])])]),r("li",[r("a",{attrs:{href:"#firewalld-issues"}},[e._v("FirewallD issues")])]),r("li",[r("a",{attrs:{href:"#database-errors"}},[e._v("Database Errors")]),r("ul",[r("li",[r("a",{attrs:{href:"#databasecontroller-php-142"}},[e._v("DatabaseController.php:142")])])])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"reading-error-logs"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#reading-error-logs"}},[e._v("#")]),e._v(" Reading Error Logs")]),e._v(" "),r("p",[e._v("If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs.\nTo retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log\n")])])]),r("h3",{attrs:{id:"parsing-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#parsing-the-error"}},[e._v("#")]),e._v(" Parsing the Error")]),e._v(" "),r("p",[e._v("When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not,\nthis is simply a stacktrace leading to the cause of the error, and you can actually ignore almost all of it when\nlooking for the cause of the error. Lets take a look at some example output below, which has been truncated to\nmake this easier to follow with.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("#70 /srv/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))\n#71 /srv/www/public/index.php(53): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))\n#72 {main}\n[2018-07-19 00:50:24] local.ERROR: ErrorException: file_put_contents(/srv/www/storage/framework/views/c9c05d1357df1ce4ec8fc5df78c16c493b0d4f48.php): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\nStack trace:\n#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/srv/www/vendor...', 122, Array)\n#1 /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(122): file_put_contents('/srv/www/storag...', 's...', 0)\n#2 /srv/www/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(122): Illuminate\\Filesystem\\Filesystem->put('/srv/www/storag...', 's...')\n#3 /srv/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(51): Illuminate\\View\\Compilers\\BladeCompiler->compile('/srv/www/resour...')\n#4 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(142): Illuminate\\View\\Engines\\CompilerEngine->get('/srv/www/resour...', Array)\n#5 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(125): Illuminate\\View\\View->getContents()\n")])])]),r("p",[e._v("The first thing you'll want to do is follow the chain of numbers "),r("em",[e._v("up")]),e._v(" until you find "),r("code",[e._v("#0")]),e._v(", this will be the function that\ntriggered the exception. Right above line 0 you will see a line that has the date and time in brackets, "),r("code",[e._v("[2018-07-19 00:50:24]")]),e._v("\nabove for example. This line will be the human readable exception that you can use to understand what went wrong.")]),e._v(" "),r("h3",{attrs:{id:"understanding-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-error"}},[e._v("#")]),e._v(" Understanding the Error")]),e._v(" "),r("p",[e._v("In the example above we can see that the actual error was:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("local.ERROR: ErrorException: file_put_contents(...): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\n")])])]),r("p",[e._v("From this error we can determine that there was an error performing a "),r("a",{attrs:{href:"http://php.net/manual/en/function.file-put-contents.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("file_put_contents()"),r("OutboundLink")],1),e._v(" call, and the error was\nthat we couldn't open the file because permissions were denied. Its okay if you don't understand the error at all, but\nit does help you get faster support if you're able to provide these logs, and at least find the source of the error.\nSometimes the errors are pretty straightforward and will tell you exactly what went wrong, such as a "),r("code",[e._v("ConnectionException")]),e._v("\nbeing thrown when the Panel can't connect to the Daemon.")]),e._v(" "),r("h3",{attrs:{id:"utilizing-grep"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#utilizing-grep"}},[e._v("#")]),e._v(" Utilizing GREP")]),e._v(" "),r("p",[e._v("If you're trying to go through a bunch of errors quickly, you can use the command below which will limit the results returned to only\nbe the actual error lines, without all of the stack traces.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("1000")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log "),r("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"\\['),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%Y"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),e._v("\n")])])]),r("h2",{attrs:{id:"transfer-exceptions-xhr-poll-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#transfer-exceptions-xhr-poll-error"}},[e._v("#")]),e._v(" Transfer Exceptions / XHR Poll Error")]),e._v(" "),r("p",[e._v("If you are seeing errors similar to the examples below, chances are there is some networking related issue, or you\njust don't have a required service running.")]),e._v(" "),r("h3",{attrs:{id:"example-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#example-errors"}},[e._v("#")]),e._v(" Example Errors")]),e._v(" "),r("ul",[r("li",[r("p",[e._v('"We were unable to connect to the main Socket.IO server, there may be network issues currently. The panel may not work as expected."')])]),e._v(" "),r("li",[r("p",[e._v('"A TransferException was encountered while trying to contact the daemon, please ensure it\'s online and accessible. This error has been logged."')])])]),e._v(" "),r("h3",{attrs:{id:"basic-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#basic-debugging-steps"}},[e._v("#")]),e._v(" Basic Debugging Steps")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("Ensure you have AdBlock disabled or whitelisted for your Panel and Daemon domains.")])]),e._v(" "),r("li",[r("p",[e._v("Check your browser's console by pressing "),r("code",[e._v("Ctrl + Shift + J")]),e._v(" (in Chrome) or "),r("code",[e._v("Cmd + Alt + I")]),e._v(" (in Safari). If there is\na red error in it, chances are that it will narrow down the potential problem.")])]),e._v(" "),r("li",[r("p",[e._v("Make sure if the daemon is properly installed and the active configuration matches the configuration shown under\n"),r("code",[e._v("Admin -> Node -> Configuration")]),e._v(" in the Panel.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Daemon is running, and not reporting errors. Use "),r("code",[e._v("service wings status")]),e._v(" to check the current status of the process.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Daemon ports are open on your firewall. The Daemon uses ports "),r("code",[e._v("8080")]),e._v(" or "),r("code",[e._v("8443")]),e._v(" for HTTP traffic,\nand "),r("code",[e._v("2022")]),e._v(" for SFTP traffic.")])]),e._v(" "),r("li",[r("p",[e._v("Check that the Panel can reach the Daemon using the domain that is configured on the Panel. Run "),r("code",[e._v("curl https://domain.com:8080")]),e._v(" on the Panel server and ensure that it can connect to the Daemon.")])]),e._v(" "),r("li",[r("p",[e._v("Ensure that you are using the correct HTTP scheme for your Panel and Daemon. If the Panel is running over HTTPS\nthe Daemon will also need to be running on HTTPS.")])])]),e._v(" "),r("h3",{attrs:{id:"more-advanced-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#more-advanced-debugging-steps"}},[e._v("#")]),e._v(" More Advanced Debugging Steps")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("Stop the Daemon and run "),r("code",[e._v("cd /srv/daemon; sudo npm start")]),e._v(" to see if there are any errors being output by the Daemon.\nIf so, try resolving them manually, or contact us on Discord for more assistance.")])]),e._v(" "),r("li",[r("p",[e._v("Check your DNS and ensure that the response you receive is the one you expect using a tool such as "),r("code",[e._v("nslookup")]),e._v(" or "),r("code",[e._v("dig")]),e._v(".")])]),e._v(" "),r("li",[r("p",[e._v("If you use CloudFlare make sure that the yellow cloud is disabled for your Daemon or Panel "),r("code",[e._v("A")]),e._v(" records.")])]),e._v(" "),r("li",[r("p",[e._v("Make sure when using the daemon behind a firewall — pfSense, OpenSwitch, etc — that the correct NAT settings to access\nthe Daemon's ports from the outside network are setup.")])]),e._v(" "),r("li",[r("p",[e._v("If nothing is working so far, check your own DNS settings and consider switching DNS servers.")])]),e._v(" "),r("li",[r("p",[e._v("When running the Panel and Daemon on one server it can sometimes help if to add an entry in "),r("code",[e._v("/etc/hosts")]),e._v(" that directs\nthe public IP back to the server. Sometimes the reverse path is also needed, so you may need to add an entry to your\nservers "),r("code",[e._v("/etc/hosts")]),e._v(" file that points the Panel's domain to the correct IP.")])]),e._v(" "),r("li",[r("p",[e._v("When running the Daemon and Panel on separate VM's using the same adapter make sure the VM's can connect to each\nother. Promiscuous mode might be needed.")])])]),e._v(" "),r("h2",{attrs:{id:"invalid-mac-exception"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#invalid-mac-exception"}},[e._v("#")]),e._v(" Invalid MAC Exception")]),e._v(" "),r("div",{staticClass:"custom-block warning"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("This error should never happen if you correctly follow our installation and upgrade guides. The only time we have\never seen this error occur is when you blindly restore the Panel database from a backup and try to use a fresh\ninstallation of the Panel.")]),e._v(" "),r("p",[e._v("When restoring backups you should "),r("em",[e._v("always")]),e._v(" restore the "),r("code",[e._v(".env")]),e._v(" file!")])]),e._v(" "),r("p",[e._v("Sometimes when using the Panel you'll unexpectedly encounter a broken page, and upon checking the logs you'll see\nan exception mentioning an invalid MAC when decrypting. This error is caused by mismatched "),r("code",[e._v("APP_KEY")]),e._v("s in your "),r("code",[e._v(".env")]),e._v(" file\nwhen the data was encrypted versus decrypted.")]),e._v(" "),r("p",[e._v("If you are seeing this error the only solution is to restore the "),r("code",[e._v("APP_KEY")]),e._v(" from your "),r("code",[e._v(".env")]),e._v(" file. If you have lost that\noriginal key there is no way to recover the lost data.")]),e._v(" "),r("h2",{attrs:{id:"selinux-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#selinux-issues"}},[e._v("#")]),e._v(" SELinux Issues")]),e._v(" "),r("p",[e._v("On systems with SELinux installed you might encounter unexpected errors when running redis or attempting to connect\nto the daemon to perform actions. These issues can generally be resolved by executing the commands below to allow\nthese programs to work with SELinux.")]),e._v(" "),r("h3",{attrs:{id:"redis-permissions-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#redis-permissions-errors"}},[e._v("#")]),e._v(" Redis Permissions Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M redis_t\nsemodule -i redis_t.pp\n")])])]),r("h3",{attrs:{id:"in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#in-case-there-is-any-weirdness-with-parts-of-the-panel"}},[e._v("#")]),e._v(" In case there is any weirdness with parts of the panel")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("restorecon -R /var/www/pterodactyl/\n")])])]),r("h3",{attrs:{id:"daemon-connection-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#daemon-connection-errors"}},[e._v("#")]),e._v(" Daemon Connection Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M http_port_t\nsemodule -i http_port_t.pp\n")])])]),r("h2",{attrs:{id:"firewalld-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-issues"}},[e._v("#")]),e._v(" FirewallD issues")]),e._v(" "),r("p",[e._v("If you are on a RHEL/CentOS server with firewalld installed you may have broken DNS.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0\nfirewall-cmd --reload\n")])])]),r("p",[e._v("restart docker and wings after running these to be sure the rules are applied.")]),e._v(" "),r("h2",{attrs:{id:"database-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#database-errors"}},[e._v("#")]),e._v(" Database Errors")]),e._v(" "),r("h3",{attrs:{id:"databasecontroller-php-142"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#databasecontroller-php-142"}},[e._v("#")]),e._v(" DatabaseController.php:142")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("production.ERROR: ErrorException: Undefined variable: host in /var/www/pterodactyl/app/Http/Controllers/Admin/DatabaseController.php:142\n")])])]),r("p",[e._v("The database user you are trying to use doesn't have appropriate grants/has used incorrect password.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/62.db0d6812.js b/assets/js/62.0d6c7a24.js similarity index 98% rename from assets/js/62.db0d6812.js rename to assets/js/62.0d6c7a24.js index c8f1efbe..4fff9ae8 100644 --- a/assets/js/62.db0d6812.js +++ b/assets/js/62.0d6c7a24.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{404:function(e,a,t){"use strict";t.r(a);var s=t(48),n=Object(s.a)({},(function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"upgrading-0-6-to-0-7"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-6-to-0-7"}},[e._v("#")]),e._v(" Upgrading 0.6 to 0.7")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),t("p",[e._v("This documentation is for "),t("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),t("p",[e._v("You should be installing and using "),t("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),t("h2",{attrs:{id:"fetch-updated-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),e._v(" "),t("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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),t("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack in whatever\ndirectory you are currently in.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/panel/releases/download/v0.7.19/panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),t("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(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache\n")])])]),t("h2",{attrs:{id:"clear-compiled-assets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clear-compiled-assets"}},[e._v("#")]),e._v(" Clear Compiled Assets")]),e._v(" "),t("p",[e._v("Previous versions of Pterodactyl attempted to cache your configuration file for speed and performance enhancements. This\nended up just causing more headaches with minimal improvements in performance, so we decided to stop doing that. Running\nthe command below will clear the cached files for you so we can continue with upgrading.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("You probably only need to run this command once when upgrading from "),t("code",[e._v("0.6.X")]),e._v(". Once you're upgraded we don't cache the configuration\nfile so there is no reason to remove anything.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" -rf bootstrap/cache/*\n")])])]),t("p",[e._v("Once the configuration cache is removed, you'll need to clear the template cache to ensure users get the most recent\ntemplates.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan view:clear\n")])])]),t("h2",{attrs:{id:"update-dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),t("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(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("composer "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n")])])]),t("h2",{attrs:{id:"update-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-environment"}},[e._v("#")]),e._v(" Update Environment")]),e._v(" "),t("p",[e._v("These scripts will display your current values in brackets. To keep the current values simply press enter and it will\ncontinue without making any modifications.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("We've changed our recommended cache driver to be Redis, rather than Memcached. If you're using Memcached you can\ncontinue doing so with no problems, however moving forward our installation documentation will only mention Redis.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:mail\nphp artisan p:environment:database\n")])])]),t("h2",{attrs:{id:"database-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#database-updates"}},[e._v("#")]),e._v(" Database Updates")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Backup your databases")]),e._v(" "),t("p",[e._v("The upgrade from "),t("code",[e._v("0.6")]),e._v(" to "),t("code",[e._v("v0.7")]),e._v(" includes some rather significant database changes. While the migration utility is\nable to handle everything for you, we still suggest taking a backup of your database before proceeding — just incase.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Running "),t("code",[e._v("db:seed")]),e._v(" below will overwrite any changes you made to core Pterodactyl Nests, Eggs, or Egg Variables! This is\nunavoidable, and this seeder must be run. To avoid this in the future, please create custom nests, or create custom\neggs for game variations.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan migrate --force\nphp artisan db:seed --force\n")])])]),t("h2",{attrs:{id:"cleanup-api-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cleanup-api-keys"}},[e._v("#")]),e._v(" Cleanup API Keys")]),e._v(" "),t("p",[e._v("A significant change is introduced in 0.7.0 that changes how API keys are used, stored, and validated. Due to this\nchange, all previously created keys will no longer function. In order to keep things cleaned up you'll want to remove\nthese orphaned keys. To do so, run the command below.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan p:migration:clean-orphaned-keys\n")])])]),t("p",[e._v("Don't forget to create new keys for yourself, as well as let all of your users know they'll need to do so as well.")]),e._v(" "),t("h2",{attrs:{id:"set-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),t("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 "),t("code",[e._v("www-data")]),e._v(" but can vary from system to system — sometimes being "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("apache")]),e._v(", or even "),t("code",[e._v("nobody")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data * \n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx *\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache *\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{405:function(e,a,t){"use strict";t.r(a);var s=t(48),n=Object(s.a)({},(function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"upgrading-0-6-to-0-7"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-6-to-0-7"}},[e._v("#")]),e._v(" Upgrading 0.6 to 0.7")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),t("p",[e._v("This documentation is for "),t("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),t("p",[e._v("You should be installing and using "),t("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),t("h2",{attrs:{id:"fetch-updated-files"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),e._v(" "),t("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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),t("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack in whatever\ndirectory you are currently in.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L https://github.com/pterodactyl/panel/releases/download/v0.7.19/panel.tar.gz "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" --strip-components"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(" -xzv\n")])])]),t("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(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" -R "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("755")]),e._v(" storage/* bootstrap/cache\n")])])]),t("h2",{attrs:{id:"clear-compiled-assets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clear-compiled-assets"}},[e._v("#")]),e._v(" Clear Compiled Assets")]),e._v(" "),t("p",[e._v("Previous versions of Pterodactyl attempted to cache your configuration file for speed and performance enhancements. This\nended up just causing more headaches with minimal improvements in performance, so we decided to stop doing that. Running\nthe command below will clear the cached files for you so we can continue with upgrading.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("You probably only need to run this command once when upgrading from "),t("code",[e._v("0.6.X")]),e._v(". Once you're upgraded we don't cache the configuration\nfile so there is no reason to remove anything.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" -rf bootstrap/cache/*\n")])])]),t("p",[e._v("Once the configuration cache is removed, you'll need to clear the template cache to ensure users get the most recent\ntemplates.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan view:clear\n")])])]),t("h2",{attrs:{id:"update-dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),t("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(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("composer "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" --no-dev --optimize-autoloader\n")])])]),t("h2",{attrs:{id:"update-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-environment"}},[e._v("#")]),e._v(" Update Environment")]),e._v(" "),t("p",[e._v("These scripts will display your current values in brackets. To keep the current values simply press enter and it will\ncontinue without making any modifications.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("We've changed our recommended cache driver to be Redis, rather than Memcached. If you're using Memcached you can\ncontinue doing so with no problems, however moving forward our installation documentation will only mention Redis.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan p:environment:setup\nphp artisan p:environment:mail\nphp artisan p:environment:database\n")])])]),t("h2",{attrs:{id:"database-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#database-updates"}},[e._v("#")]),e._v(" Database Updates")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Backup your databases")]),e._v(" "),t("p",[e._v("The upgrade from "),t("code",[e._v("0.6")]),e._v(" to "),t("code",[e._v("v0.7")]),e._v(" includes some rather significant database changes. While the migration utility is\nable to handle everything for you, we still suggest taking a backup of your database before proceeding — just incase.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Running "),t("code",[e._v("db:seed")]),e._v(" below will overwrite any changes you made to core Pterodactyl Nests, Eggs, or Egg Variables! This is\nunavoidable, and this seeder must be run. To avoid this in the future, please create custom nests, or create custom\neggs for game variations.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan migrate --force\nphp artisan db:seed --force\n")])])]),t("h2",{attrs:{id:"cleanup-api-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cleanup-api-keys"}},[e._v("#")]),e._v(" Cleanup API Keys")]),e._v(" "),t("p",[e._v("A significant change is introduced in 0.7.0 that changes how API keys are used, stored, and validated. Due to this\nchange, all previously created keys will no longer function. In order to keep things cleaned up you'll want to remove\nthese orphaned keys. To do so, run the command below.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("php artisan p:migration:clean-orphaned-keys\n")])])]),t("p",[e._v("Don't forget to create new keys for yourself, as well as let all of your users know they'll need to do so as well.")]),e._v(" "),t("h2",{attrs:{id:"set-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-permissions"}},[e._v("#")]),e._v(" Set Permissions")]),e._v(" "),t("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 "),t("code",[e._v("www-data")]),e._v(" but can vary from system to system — sometimes being "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("apache")]),e._v(", or even "),t("code",[e._v("nobody")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX or Apache (not on CentOS):")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R www-data:www-data * \n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using NGINX on CentOS:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R nginx:nginx *\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# If using Apache on CentOS")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("chown")]),e._v(" -R apache:apache *\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/63.8a89fed0.js b/assets/js/63.318bb69c.js similarity index 98% rename from assets/js/63.8a89fed0.js rename to assets/js/63.318bb69c.js index 75eeb3ad..5810f043 100644 --- a/assets/js/63.8a89fed0.js +++ b/assets/js/63.318bb69c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{405: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:"upgrading-0-7-series"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-7-series"}},[e._v("#")]),e._v(" Upgrading 0.7 Series")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),a("p",[e._v("This documentation covers the process for upgrading within the "),a("code",[e._v("0.7.X")]),e._v(" series of releases. This means upgrading from\n— for example — "),a("code",[e._v("0.7.3")]),e._v(" to "),a("code",[e._v("0.7.11")]),e._v(". "),a("strong",[e._v("Do not use this guide for upgrading from "),a("code",[e._v("0.6")]),e._v(" or upgrading to "),a("code",[e._v("1.0")]),e._v(".")])]),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 are using a custom theme please be aware that upgrading will remove those files. You will need to re-upload\nyour theme once the upgrade is complete or you will end up with server errors.")])]),e._v(" "),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack the archive\ninto 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/download/v0.7.19/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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),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("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[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("h2",{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("h2",{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 two commands 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 --force\nphp artisan db:seed --force\n")])])]),a("h2",{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("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 * \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 *\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 *\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{406: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:"upgrading-0-7-series"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-0-7-series"}},[e._v("#")]),e._v(" Upgrading 0.7 Series")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),a("p",[e._v("This documentation covers the process for upgrading within the "),a("code",[e._v("0.7.X")]),e._v(" series of releases. This means upgrading from\n— for example — "),a("code",[e._v("0.7.3")]),e._v(" to "),a("code",[e._v("0.7.11")]),e._v(". "),a("strong",[e._v("Do not use this guide for upgrading from "),a("code",[e._v("0.6")]),e._v(" or upgrading to "),a("code",[e._v("1.0")]),e._v(".")])]),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 are using a custom theme please be aware that upgrading will remove those files. You will need to re-upload\nyour theme once the upgrade is complete or you will end up with server errors.")])]),e._v(" "),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack the archive\ninto 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/download/v0.7.19/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(" --strip-components"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),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("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[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("h2",{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("h2",{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 two commands 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 --force\nphp artisan db:seed --force\n")])])]),a("h2",{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("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 * \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 *\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 *\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/64.8fe43c5c.js b/assets/js/64.b0806748.js similarity index 97% rename from assets/js/64.8fe43c5c.js rename to assets/js/64.b0806748.js index 38ccf985..7f0dde36 100644 --- a/assets/js/64.8fe43c5c.js +++ b/assets/js/64.b0806748.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{406: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:"upgrading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading"}},[e._v("#")]),e._v(" Upgrading")]),e._v(" "),a("p",[e._v("Upgrading the Panel is a relatively simple process. Below you will find a list of articles that will walk you through\nthe upgrade process for each version of the software.")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),a("h2",{attrs:{id:"maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-mode"}},[e._v("#")]),e._v(" Maintenance Mode")]),e._v(" "),a("p",[e._v('Whenever you are performing an upgrade, you should be sure to place your Panel into "maintenance mode". This will prevent\nusers from encountering unexpected errors, and ensure everything can be upgraded before users encounter potentially 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 comment"}},[e._v("# Put the Panel into maintenance mode and deny user access")]),e._v("\nphp artisan down\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Bring the Panel back up to receive connections.")]),e._v("\nphp artisan up\n")])])]),a("h2",{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 being 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("h2",{attrs:{id:"version-specific-guides"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#version-specific-guides"}},[e._v("#")]),e._v(" Version Specific Guides")]),e._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/panel/0.7/upgrade/0.6_to_0.7.html"}},[e._v("0.6.X to 0.7.19")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/panel/0.7/upgrade/0.7.html"}},[e._v("0.7.X series")])],1),e._v(" "),a("li",[a("a",{attrs:{href:"/panel/1.0/upgrade/0.7_to_1.0"}},[e._v("0.7.19 to 1.X.X")]),e._v(" "),a("Badge",{attrs:{text:"current",vertical:"middle"}})],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{407: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:"upgrading"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading"}},[e._v("#")]),e._v(" Upgrading")]),e._v(" "),a("p",[e._v("Upgrading the Panel is a relatively simple process. Below you will find a list of articles that will walk you through\nthe upgrade process for each version of the software.")]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("This Version is End-of-Life")]),e._v(" "),a("p",[e._v("This documentation is for "),a("strong",[e._v("end-of-life software")]),e._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),e._v(" "),a("p",[e._v("You should be installing and using "),a("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[e._v("Pterodactyl Panel 1.0")]),e._v(" in production environments.")],1)]),e._v(" "),a("h2",{attrs:{id:"maintenance-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maintenance-mode"}},[e._v("#")]),e._v(" Maintenance Mode")]),e._v(" "),a("p",[e._v('Whenever you are performing an upgrade, you should be sure to place your Panel into "maintenance mode". This will prevent\nusers from encountering unexpected errors, and ensure everything can be upgraded before users encounter potentially 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 comment"}},[e._v("# Put the Panel into maintenance mode and deny user access")]),e._v("\nphp artisan down\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Bring the Panel back up to receive connections.")]),e._v("\nphp artisan up\n")])])]),a("h2",{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 being 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("h2",{attrs:{id:"version-specific-guides"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#version-specific-guides"}},[e._v("#")]),e._v(" Version Specific Guides")]),e._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/panel/0.7/upgrade/0.6_to_0.7.html"}},[e._v("0.6.X to 0.7.19")])],1),e._v(" "),a("li",[a("RouterLink",{attrs:{to:"/panel/0.7/upgrade/0.7.html"}},[e._v("0.7.X series")])],1),e._v(" "),a("li",[a("a",{attrs:{href:"/panel/1.0/upgrade/0.7_to_1.0"}},[e._v("0.7.19 to 1.X.X")]),e._v(" "),a("Badge",{attrs:{text:"current",vertical:"middle"}})],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/65.d4df1bb2.js b/assets/js/65.3ca34732.js similarity index 99% rename from assets/js/65.d4df1bb2.js rename to assets/js/65.3ca34732.js index 00fc808d..f28edf5d 100644 --- a/assets/js/65.d4df1bb2.js +++ b/assets/js/65.3ca34732.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{407:function(t,e,n){"use strict";n.r(e);var a=n(48),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h1",{attrs:{id:"webserver-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[t._v("#")]),t._v(" Webserver Configuration")]),t._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[t._v("This Version is End-of-Life")]),t._v(" "),n("p",[t._v("This documentation is for "),n("strong",[t._v("end-of-life software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),n("p",[t._v("You should be installing and using "),n("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(" in production environments.")],1)]),t._v(" "),n("p"),n("div",{staticClass:"table-of-contents"},[n("ul",[n("li",[n("a",{attrs:{href:"#nginx"}},[t._v("NGINX")]),n("ul",[n("li",[n("a",{attrs:{href:"#nginx-with-ssl"}},[t._v("NGINX With SSL")])]),n("li",[n("a",{attrs:{href:"#nginx-without-ssl"}},[t._v("NGINX Without SSL")])]),n("li",[n("a",{attrs:{href:"#enabling-configuration"}},[t._v("Enabling Configuration")])])])]),n("li",[n("a",{attrs:{href:"#apache"}},[t._v("Apache")]),n("ul",[n("li",[n("a",{attrs:{href:"#apache-with-ssl"}},[t._v("Apache With SSL")])]),n("li",[n("a",{attrs:{href:"#apache-without-ssl"}},[t._v("Apache Without SSL")])]),n("li",[n("a",{attrs:{href:"#enabling-configuration"}},[t._v("Enabling Configuration")])])])])])]),n("p"),t._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),n("p",[t._v("You should remove the default Apache or NGINX configuration as it will expose application secrets to malicious\nusers by default.")])]),t._v(" "),n("h2",{attrs:{id:"nginx"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" NGINX")]),t._v(" "),n("p",[t._v("You should paste the contents of the file below, replacing "),n("code",[t._v("")]),t._v(" with your domain name being used in a file called\n"),n("code",[t._v("pterodactyl.conf")]),t._v(" and place it in "),n("code",[t._v("/etc/nginx/sites-available/")]),t._v(", or — if on CentOS, "),n("code",[t._v("/etc/nginx/conf.d/")]),t._v(".")]),t._v(" "),n("h3",{attrs:{id:"nginx-with-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx-with-ssl"}},[t._v("#")]),t._v(" NGINX With SSL")]),t._v(" "),n("p",[t._v("This configuration assumes that you will be using SSL on both the Panel and Daemons for significantly improved communication\nsecurity between users and the Panel. You will need to get a valid SSL certificate which can be done for free by using\nLet's Encrypt.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("When using the SSL configuration you MUST create SSL certificates, otherwise your NGINX will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("Creating SSL Certificates")]),t._v(" documentation page for how to create these certificates before continuing.")],1)]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.2-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("p",[t._v("Continue reading to the bottom of this section for the final steps with NGINX!")]),t._v(" "),n("h3",{attrs:{id:"nginx-without-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx-without-ssl"}},[t._v("#")]),t._v(" NGINX Without SSL")]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('server {\n listen 80;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.html index.htm index.php;\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n access_log off;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.2-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration"}},[t._v("#")]),t._v(" Enabling Configuration")]),t._v(" "),n("p",[t._v("The final step is to enable your NGINX configuration and restart it.")]),t._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You do not need to symlink this file if you are using CentOS.")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You need to restart nginx regardless of OS.")]),t._v("\nsystemctl restart nginx\n")])])]),n("h2",{attrs:{id:"apache"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache"}},[t._v("#")]),t._v(" Apache")]),t._v(" "),n("p",[t._v("You should paste the contents of the file below, replacing "),n("code",[t._v("")]),t._v(" with your domain name being used in a file called\n"),n("code",[t._v("pterodactyl.conf")]),t._v(" and place it in "),n("code",[t._v("/etc/apache2/sites-available")]),t._v(", or — if on CentOS, "),n("code",[t._v("/etc/httpd/conf.d/")]),t._v(".")]),t._v(" "),n("p",[t._v("Note: When using Apache, make sure you have the "),n("code",[t._v("libapache2-mod-php")]),t._v(" package installed or else PHP will not display on your webserver.")]),t._v(" "),n("h3",{attrs:{id:"apache-with-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache-with-ssl"}},[t._v("#")]),t._v(" Apache With SSL")]),t._v(" "),n("p",[t._v("Like the nginx configuration, this assumes you will be using SSL on both the Panel and Daemons for improved security.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("When using the SSL configuration you MUST create SSL certificates, otherwise your Apache will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("Creating SSL Certificates")]),t._v(" documentation page for how to create these certificates before continuing.")],1)]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('\n ServerName \n RewriteEngine On\n RewriteCond %{HTTPS} !=on\n RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] \n\n\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n SSLEngine on\n SSLCertificateFile /etc/letsencrypt/live//fullchain.pem\n SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem\n \n')])])]),n("h3",{attrs:{id:"apache-without-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache-without-ssl"}},[t._v("#")]),t._v(" Apache Without SSL")]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n\n')])])]),n("h3",{attrs:{id:"enabling-configuration-2"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-2"}},[t._v("#")]),t._v(" Enabling Configuration")]),t._v(" "),n("p",[t._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[t._v("you do not need to run the commands\nbelow!")]),t._v(" You only need to run "),n("code",[t._v("systemctl restart httpd")]),t._v(".")]),t._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You do not need to run any of these commands on CentOS")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{408:function(t,e,n){"use strict";n.r(e);var a=n(48),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h1",{attrs:{id:"webserver-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[t._v("#")]),t._v(" Webserver Configuration")]),t._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[t._v("This Version is End-of-Life")]),t._v(" "),n("p",[t._v("This documentation is for "),n("strong",[t._v("end-of-life software")]),t._v(" which does not recieve any security updates or support\nfrom the community. This documentation has been left accessible for historial reasons.")]),t._v(" "),n("p",[t._v("You should be installing and using "),n("RouterLink",{attrs:{to:"/panel/1.0/getting_started.html"}},[t._v("Pterodactyl Panel 1.0")]),t._v(" in production environments.")],1)]),t._v(" "),n("p"),n("div",{staticClass:"table-of-contents"},[n("ul",[n("li",[n("a",{attrs:{href:"#nginx"}},[t._v("NGINX")]),n("ul",[n("li",[n("a",{attrs:{href:"#nginx-with-ssl"}},[t._v("NGINX With SSL")])]),n("li",[n("a",{attrs:{href:"#nginx-without-ssl"}},[t._v("NGINX Without SSL")])]),n("li",[n("a",{attrs:{href:"#enabling-configuration"}},[t._v("Enabling Configuration")])])])]),n("li",[n("a",{attrs:{href:"#apache"}},[t._v("Apache")]),n("ul",[n("li",[n("a",{attrs:{href:"#apache-with-ssl"}},[t._v("Apache With SSL")])]),n("li",[n("a",{attrs:{href:"#apache-without-ssl"}},[t._v("Apache Without SSL")])]),n("li",[n("a",{attrs:{href:"#enabling-configuration"}},[t._v("Enabling Configuration")])])])])])]),n("p"),t._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),n("p",[t._v("You should remove the default Apache or NGINX configuration as it will expose application secrets to malicious\nusers by default.")])]),t._v(" "),n("h2",{attrs:{id:"nginx"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[t._v("#")]),t._v(" NGINX")]),t._v(" "),n("p",[t._v("You should paste the contents of the file below, replacing "),n("code",[t._v("")]),t._v(" with your domain name being used in a file called\n"),n("code",[t._v("pterodactyl.conf")]),t._v(" and place it in "),n("code",[t._v("/etc/nginx/sites-available/")]),t._v(", or — if on CentOS, "),n("code",[t._v("/etc/nginx/conf.d/")]),t._v(".")]),t._v(" "),n("h3",{attrs:{id:"nginx-with-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx-with-ssl"}},[t._v("#")]),t._v(" NGINX With SSL")]),t._v(" "),n("p",[t._v("This configuration assumes that you will be using SSL on both the Panel and Daemons for significantly improved communication\nsecurity between users and the Panel. You will need to get a valid SSL certificate which can be done for free by using\nLet's Encrypt.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("When using the SSL configuration you MUST create SSL certificates, otherwise your NGINX will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("Creating SSL Certificates")]),t._v(" documentation page for how to create these certificates before continuing.")],1)]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.2-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("p",[t._v("Continue reading to the bottom of this section for the final steps with NGINX!")]),t._v(" "),n("h3",{attrs:{id:"nginx-without-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#nginx-without-ssl"}},[t._v("#")]),t._v(" NGINX Without SSL")]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('server {\n listen 80;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.html index.htm index.php;\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n access_log off;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php7.2-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration"}},[t._v("#")]),t._v(" Enabling Configuration")]),t._v(" "),n("p",[t._v("The final step is to enable your NGINX configuration and restart it.")]),t._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You do not need to symlink this file if you are using CentOS.")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You need to restart nginx regardless of OS.")]),t._v("\nsystemctl restart nginx\n")])])]),n("h2",{attrs:{id:"apache"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache"}},[t._v("#")]),t._v(" Apache")]),t._v(" "),n("p",[t._v("You should paste the contents of the file below, replacing "),n("code",[t._v("")]),t._v(" with your domain name being used in a file called\n"),n("code",[t._v("pterodactyl.conf")]),t._v(" and place it in "),n("code",[t._v("/etc/apache2/sites-available")]),t._v(", or — if on CentOS, "),n("code",[t._v("/etc/httpd/conf.d/")]),t._v(".")]),t._v(" "),n("p",[t._v("Note: When using Apache, make sure you have the "),n("code",[t._v("libapache2-mod-php")]),t._v(" package installed or else PHP will not display on your webserver.")]),t._v(" "),n("h3",{attrs:{id:"apache-with-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache-with-ssl"}},[t._v("#")]),t._v(" Apache With SSL")]),t._v(" "),n("p",[t._v("Like the nginx configuration, this assumes you will be using SSL on both the Panel and Daemons for improved security.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("When using the SSL configuration you MUST create SSL certificates, otherwise your Apache will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[t._v("Creating SSL Certificates")]),t._v(" documentation page for how to create these certificates before continuing.")],1)]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('\n ServerName \n RewriteEngine On\n RewriteCond %{HTTPS} !=on\n RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] \n\n\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n SSLEngine on\n SSLCertificateFile /etc/letsencrypt/live//fullchain.pem\n SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem\n \n')])])]),n("h3",{attrs:{id:"apache-without-ssl"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#apache-without-ssl"}},[t._v("#")]),t._v(" Apache Without SSL")]),t._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[t._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v('\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n\n')])])]),n("h3",{attrs:{id:"enabling-configuration-2"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-2"}},[t._v("#")]),t._v(" Enabling Configuration")]),t._v(" "),n("p",[t._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[t._v("you do not need to run the commands\nbelow!")]),t._v(" You only need to run "),n("code",[t._v("systemctl restart httpd")]),t._v(".")]),t._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# You do not need to run any of these commands on CentOS")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/66.6cb57e40.js b/assets/js/66.ef6f7035.js similarity index 98% rename from assets/js/66.6cb57e40.js rename to assets/js/66.ef6f7035.js index ab5a9af7..25a7e596 100644 --- a/assets/js/66.6cb57e40.js +++ b/assets/js/66.ef6f7035.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{408:function(a,s,t){"use strict";t.r(s);var e=t(48),r=Object(e.a)({},(function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[a._v("#")]),a._v(" Additional Configuration")]),a._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#backups"}},[a._v("Backups")]),t("ul",[t("li",[t("a",{attrs:{href:"#using-s3-backups"}},[a._v("Using S3 Backups")])])])]),t("li",[t("a",{attrs:{href:"#recaptcha"}},[a._v("reCAPTCHA")]),t("ul",[t("li",[t("a",{attrs:{href:"#configuring-recaptcha"}},[a._v("Configuring reCAPTCHA")])]),t("li",[t("a",{attrs:{href:"#disabling-recaptcha"}},[a._v("Disabling reCAPTCHA")])])])]),t("li",[t("a",{attrs:{href:"#_2fa"}},[a._v("2FA")]),t("ul",[t("li",[t("a",{attrs:{href:"#disable-2fa-requirement"}},[a._v("Disable 2FA requirement")])]),t("li",[t("a",{attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("Disable 2FA for a specific user")])])])])])]),t("p"),a._v(" "),t("h2",{attrs:{id:"backups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backups"}},[a._v("#")]),a._v(" Backups")]),a._v(" "),t("p",[a._v("Pterodactyl Panel allows users to create backups of their servers. In order to create remote backups, a backup storage has to be configured.")]),a._v(" "),t("h3",{attrs:{id:"using-s3-backups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-s3-backups"}},[a._v("#")]),a._v(" Using S3 Backups")]),a._v(" "),t("p",[a._v("AWS S3 (or compatible storage) can be used to store backups. The following configuration options have to be set in the "),t("code",[a._v(".env")]),a._v(" file in order to enable it.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Sets your panel to use s3 for backups")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("APP_BACKUP_DRIVER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Info to actually use s3")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_DEFAULT_REGION")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ACCESS_KEY_ID")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_SECRET_ACCESS_KEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_BACKUPS_BUCKET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ENDPOINT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n")])])]),t("h2",{attrs:{id:"recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recaptcha"}},[a._v("#")]),a._v(" reCAPTCHA")]),a._v(" "),t("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(" "),t("h3",{attrs:{id:"configuring-recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-recaptcha"}},[a._v("#")]),a._v(" Configuring reCAPTCHA")]),a._v(" "),t("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(" "),t("p",[a._v("You can generate your own keys in the "),t("a",{attrs:{href:"https://www.google.com/recaptcha/admin",target:"_blank",rel:"noopener noreferrer"}},[a._v("reCAPTCHA Admin Console"),t("OutboundLink")],1),a._v(".")]),a._v(" "),t("p",[a._v("The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the "),t("strong",[a._v("Advanced")])]),a._v(" "),t("h3",{attrs:{id:"disabling-recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disabling-recaptcha"}},[a._v("#")]),a._v(" Disabling reCAPTCHA")]),a._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[a._v("SECURITY WARNING")]),a._v(" "),t("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(" "),t("p",[a._v("If users have trouble logging in, or your Panel isn't exposed to the internet, in can make sense to disable reCAPTCHA.")]),a._v(" "),t("p",[a._v("reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the "),t("strong",[a._v("Advanced")]),a._v(" tab and set the "),t("strong",[a._v("Status")]),a._v(" of reCAPTCHA to "),t("strong",[a._v("disabled")]),a._v(".")]),a._v(" "),t("h4",{attrs:{id:"editing-your-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-your-database"}},[a._v("#")]),a._v(" Editing your database")]),a._v(" "),t("p",[a._v("If you cannot access your panel, you can modify the database directly using the following commands.")]),a._v(" "),t("div",{staticClass:"language-sql extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sql"}},[t("code",[a._v("mysql "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'false'")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::recaptcha:enabled'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),t("h2",{attrs:{id:"_2fa"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2fa"}},[a._v("#")]),a._v(" 2FA")]),a._v(" "),t("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(" "),t("h3",{attrs:{id:"disable-2fa-requirement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-requirement"}},[a._v("#")]),a._v(" Disable 2FA requirement")]),a._v(" "),t("div",{staticClass:"language-sql extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sql"}},[t("code",[a._v("mysql "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::pterodactyl:auth:2fa_required'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),t("h3",{attrs:{id:"disable-2fa-for-a-specific-user"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("#")]),a._v(" Disable 2FA for a specific user")]),a._v(" "),t("p",[a._v("Run the following command in your "),t("code",[a._v("/var/www/pterodactyl")]),a._v(" directory.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("php artisan p:user:disable2fa\n")])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{409:function(a,s,t){"use strict";t.r(s);var e=t(48),r=Object(e.a)({},(function(){var a=this,s=a.$createElement,t=a._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[a._v("#")]),a._v(" Additional Configuration")]),a._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#backups"}},[a._v("Backups")]),t("ul",[t("li",[t("a",{attrs:{href:"#using-s3-backups"}},[a._v("Using S3 Backups")])])])]),t("li",[t("a",{attrs:{href:"#recaptcha"}},[a._v("reCAPTCHA")]),t("ul",[t("li",[t("a",{attrs:{href:"#configuring-recaptcha"}},[a._v("Configuring reCAPTCHA")])]),t("li",[t("a",{attrs:{href:"#disabling-recaptcha"}},[a._v("Disabling reCAPTCHA")])])])]),t("li",[t("a",{attrs:{href:"#_2fa"}},[a._v("2FA")]),t("ul",[t("li",[t("a",{attrs:{href:"#disable-2fa-requirement"}},[a._v("Disable 2FA requirement")])]),t("li",[t("a",{attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("Disable 2FA for a specific user")])])])])])]),t("p"),a._v(" "),t("h2",{attrs:{id:"backups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backups"}},[a._v("#")]),a._v(" Backups")]),a._v(" "),t("p",[a._v("Pterodactyl Panel allows users to create backups of their servers. In order to create remote backups, a backup storage has to be configured.")]),a._v(" "),t("h3",{attrs:{id:"using-s3-backups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-s3-backups"}},[a._v("#")]),a._v(" Using S3 Backups")]),a._v(" "),t("p",[a._v("AWS S3 (or compatible storage) can be used to store backups. The following configuration options have to be set in the "),t("code",[a._v(".env")]),a._v(" file in order to enable it.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Sets your panel to use s3 for backups")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("APP_BACKUP_DRIVER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Info to actually use s3")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_DEFAULT_REGION")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ACCESS_KEY_ID")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_SECRET_ACCESS_KEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_BACKUPS_BUCKET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AWS_ENDPOINT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("\n")])])]),t("h2",{attrs:{id:"recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recaptcha"}},[a._v("#")]),a._v(" reCAPTCHA")]),a._v(" "),t("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(" "),t("h3",{attrs:{id:"configuring-recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-recaptcha"}},[a._v("#")]),a._v(" Configuring reCAPTCHA")]),a._v(" "),t("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(" "),t("p",[a._v("You can generate your own keys in the "),t("a",{attrs:{href:"https://www.google.com/recaptcha/admin",target:"_blank",rel:"noopener noreferrer"}},[a._v("reCAPTCHA Admin Console"),t("OutboundLink")],1),a._v(".")]),a._v(" "),t("p",[a._v("The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the "),t("strong",[a._v("Advanced")])]),a._v(" "),t("h3",{attrs:{id:"disabling-recaptcha"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disabling-recaptcha"}},[a._v("#")]),a._v(" Disabling reCAPTCHA")]),a._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[a._v("SECURITY WARNING")]),a._v(" "),t("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(" "),t("p",[a._v("If users have trouble logging in, or your Panel isn't exposed to the internet, in can make sense to disable reCAPTCHA.")]),a._v(" "),t("p",[a._v("reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the "),t("strong",[a._v("Advanced")]),a._v(" tab and set the "),t("strong",[a._v("Status")]),a._v(" of reCAPTCHA to "),t("strong",[a._v("disabled")]),a._v(".")]),a._v(" "),t("h4",{attrs:{id:"editing-your-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editing-your-database"}},[a._v("#")]),a._v(" Editing your database")]),a._v(" "),t("p",[a._v("If you cannot access your panel, you can modify the database directly using the following commands.")]),a._v(" "),t("div",{staticClass:"language-sql extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sql"}},[t("code",[a._v("mysql "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'false'")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::recaptcha:enabled'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),t("h2",{attrs:{id:"_2fa"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2fa"}},[a._v("#")]),a._v(" 2FA")]),a._v(" "),t("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(" "),t("h3",{attrs:{id:"disable-2fa-requirement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-requirement"}},[a._v("#")]),a._v(" Disable 2FA requirement")]),a._v(" "),t("div",{staticClass:"language-sql extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sql"}},[t("code",[a._v("mysql "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("u root "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("p\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("UPDATE")]),a._v(" panel"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("settings "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("SET")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("value")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WHERE")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("key")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("`")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("'settings::pterodactyl:auth:2fa_required'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),t("h3",{attrs:{id:"disable-2fa-for-a-specific-user"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disable-2fa-for-a-specific-user"}},[a._v("#")]),a._v(" Disable 2FA for a specific user")]),a._v(" "),t("p",[a._v("Run the following command in your "),t("code",[a._v("/var/www/pterodactyl")]),a._v(" directory.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("php artisan p:user:disable2fa\n")])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/67.cc039676.js b/assets/js/67.38d5b57b.js similarity index 99% rename from assets/js/67.cc039676.js rename to assets/js/67.38d5b57b.js index fe12e5a8..5e36c16c 100644 --- a/assets/js/67.cc039676.js +++ b/assets/js/67.38d5b57b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{409: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 incompatabilities 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",[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(" "),a("tr",[a("td",[a("strong",[e._v("Debian")])]),e._v(" "),a("td",[e._v("9")]),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("10")]),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(" or "),a("code",[e._v("8.0")]),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(" or 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(" or 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\nadd-apt-repository -y ppa:chris-lea/redis-server\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.0 php8.0-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("cli,gd,mysql,pdo,mbstring,tokenizer,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. If you are unsure how to do this, please have a look at "),a("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1)]),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\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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{410: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 incompatabilities 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",[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(" "),a("tr",[a("td",[a("strong",[e._v("Debian")])]),e._v(" "),a("td",[e._v("9")]),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("10")]),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(" or "),a("code",[e._v("8.0")]),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(" or 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(" or 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\nadd-apt-repository -y ppa:chris-lea/redis-server\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.0 php8.0-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("cli,gd,mysql,pdo,mbstring,tokenizer,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. If you are unsure how to do this, please have a look at "),a("RouterLink",{attrs:{to:"/tutorials/mysql_setup.html"}},[e._v("Setting up MySQL")]),e._v(".")],1)]),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\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/68.0031d838.js b/assets/js/68.321dd68b.js similarity index 99% rename from assets/js/68.0031d838.js rename to assets/js/68.321dd68b.js index 66e3d5e3..22224a07 100644 --- a/assets/js/68.0031d838.js +++ b/assets/js/68.321dd68b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{410: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:"legacy-upgrades"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#legacy-upgrades"}},[e._v("#")]),e._v(" Legacy Upgrades")]),e._v(" "),a("p",[e._v("This upgrade guide is for "),a("strong",[e._v("upgrading from 0.7.X to 1.3.x")]),e._v(". If you are trying to do an upgrade on a 1.X Panel\nplease "),a("RouterLink",{attrs:{to:"/panel/1.0/updating.html"}},[e._v("use this guide instead")]),e._v(". During this upgrade process you will have some periods\nof Panel unavailability, however none of the underlying game server instances will be stopped.")],1),e._v(" "),a("h2",{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("You'll want to put your Panel into maintenance mode by running the "),a("code",[e._v("down")]),e._v(" command below before starting. This\nwill prevent users from accessing the Panel during a period where things will be broken or not working correctly. Make sure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory when executing the 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 comment"}},[e._v("# Put the Panel into maintenance mode and deny user access")]),e._v("\nphp artisan down\n")])])]),a("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("p",[e._v("You'll need to make sure your system dependencies are up to date before performing this upgrade. Please\nreference the list below to ensure you have all of the required versions.")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(" or "),a("code",[e._v("8.0")]),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(",\n"),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. See our guide\nfor "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("Upgrading PHP")]),e._v(" for details.")],1),e._v(" "),a("li",[e._v("Composer v2 ("),a("code",[e._v("composer self-update --2")]),e._v(")")])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Nginx")]),e._v(" "),a("p",[e._v("If you upgrade your PHP version and are using nginx as your webserver, you will have to update the\n"),a("code",[e._v("fastcgi_pass")]),e._v(" value in your nginx's "),a("code",[e._v("pterodactyl.conf")]),e._v(" configuration to use the correct "),a("code",[e._v("php-fpm")]),e._v(" socket.")])]),e._v(" "),a("ul",[a("li",[e._v("MySQL "),a("code",[e._v("5.7.22")]),e._v(" or 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(" or higher.")])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Seriously, Double Check your Database Version")]),e._v(" "),a("p",[e._v("Please make sure you are running the correct version of MariaDB or MySQL listed above! Failure to do so "),a("em",[e._v("will")]),e._v("\nresult in an error when you attempt to run the migrations.")]),e._v(" "),a("p",[e._v("Previous documentation (and just the age of this software) likely had you installing MariaDB 10.1 which "),a("em",[e._v("will not\nwork")]),e._v(" with this version of Pterodactyl.")])]),e._v(" "),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack the archive\ninto your current folder.")]),e._v(" "),a("p",[e._v("We will also be deleting the "),a("code",[e._v("app/")]),e._v(" directory. Because of the way we handle installations and upgrades deleted files\nare not always detected properly, so simply uppacking over this location will result in some confusing behavior.")]),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("# Delete the app directory to ensure we start with a clean slate here. This will not affect any")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# of your settings or servers.")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o 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("rm")]),e._v(" -rf "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("find")]),e._v(" app public resources -depth "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("head")]),e._v(" -n -1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" -Fv "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -tf panel.tar.gz"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Download the updated files and delete the archive file.")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzvf 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("rm")]),e._v(" -f panel.tar.gz\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("h2",{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("h2",{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("h2",{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 two commands 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:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("If you used a custom plugin that allowed for server transfers on "),a("code",[e._v("0.7")]),e._v(" you "),a("strong",[e._v("MUST")]),e._v(" delete or rename the "),a("code",[e._v("server_transfers")]),e._v(" table\nbefore continuing.")])]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --force\nphp artisan db:seed --force\n")])])]),a("h2",{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("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 *\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 *\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 *\n")])])]),a("h2",{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("h2",{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 the upgrade is complete, exit maintenance mode and your Panel will now be available.")]),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("# Bring the Panel back up to receive connections.")]),e._v("\nphp artisan up\n")])])]),a("h2",{attrs:{id:"switch-to-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#switch-to-wings"}},[e._v("#")]),e._v(" Switch to Wings")]),e._v(" "),a("p",[e._v("We've deprecated the old Node.js daemon in favor of "),a("a",{attrs:{href:"https://github.com/pterodactyl/wings",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wings"),a("OutboundLink")],1),e._v(", our new server\ncontrol plane written in Go. This new system is significantly faster, easier to install, and much smaller. All you\nneed to do is install a single binary on your system and configure it to run on boot. "),a("strong",[e._v("You cannot use the old Node.js\nDaemon to run servers with Pterodactyl Panel 1.0.")])]),e._v(" "),a("p",[e._v("Please see "),a("RouterLink",{attrs:{to:"/wings/1.0/migrating.html"}},[e._v("Migrating to Wings")]),e._v(" for instructions.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{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:"legacy-upgrades"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#legacy-upgrades"}},[e._v("#")]),e._v(" Legacy Upgrades")]),e._v(" "),a("p",[e._v("This upgrade guide is for "),a("strong",[e._v("upgrading from 0.7.X to 1.3.x")]),e._v(". If you are trying to do an upgrade on a 1.X Panel\nplease "),a("RouterLink",{attrs:{to:"/panel/1.0/updating.html"}},[e._v("use this guide instead")]),e._v(". During this upgrade process you will have some periods\nof Panel unavailability, however none of the underlying game server instances will be stopped.")],1),e._v(" "),a("h2",{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("You'll want to put your Panel into maintenance mode by running the "),a("code",[e._v("down")]),e._v(" command below before starting. This\nwill prevent users from accessing the Panel during a period where things will be broken or not working correctly. Make sure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory when executing the 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 comment"}},[e._v("# Put the Panel into maintenance mode and deny user access")]),e._v("\nphp artisan down\n")])])]),a("h2",{attrs:{id:"update-dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#update-dependencies"}},[e._v("#")]),e._v(" Update Dependencies")]),e._v(" "),a("p",[e._v("You'll need to make sure your system dependencies are up to date before performing this upgrade. Please\nreference the list below to ensure you have all of the required versions.")]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(" or "),a("code",[e._v("8.0")]),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(",\n"),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. See our guide\nfor "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("Upgrading PHP")]),e._v(" for details.")],1),e._v(" "),a("li",[e._v("Composer v2 ("),a("code",[e._v("composer self-update --2")]),e._v(")")])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Nginx")]),e._v(" "),a("p",[e._v("If you upgrade your PHP version and are using nginx as your webserver, you will have to update the\n"),a("code",[e._v("fastcgi_pass")]),e._v(" value in your nginx's "),a("code",[e._v("pterodactyl.conf")]),e._v(" configuration to use the correct "),a("code",[e._v("php-fpm")]),e._v(" socket.")])]),e._v(" "),a("ul",[a("li",[e._v("MySQL "),a("code",[e._v("5.7.22")]),e._v(" or 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(" or higher.")])]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Seriously, Double Check your Database Version")]),e._v(" "),a("p",[e._v("Please make sure you are running the correct version of MariaDB or MySQL listed above! Failure to do so "),a("em",[e._v("will")]),e._v("\nresult in an error when you attempt to run the migrations.")]),e._v(" "),a("p",[e._v("Previous documentation (and just the age of this software) likely had you installing MariaDB 10.1 which "),a("em",[e._v("will not\nwork")]),e._v(" with this version of Pterodactyl.")])]),e._v(" "),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),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 and save it in the current directory. Now is a good time\nto ensure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory as the command below will automatically unpack the archive\ninto your current folder.")]),e._v(" "),a("p",[e._v("We will also be deleting the "),a("code",[e._v("app/")]),e._v(" directory. Because of the way we handle installations and upgrades deleted files\nare not always detected properly, so simply uppacking over this location will result in some confusing behavior.")]),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("# Delete the app directory to ensure we start with a clean slate here. This will not affect any")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# of your settings or servers.")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" -L -o 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("rm")]),e._v(" -rf "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("find")]),e._v(" app public resources -depth "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("head")]),e._v(" -n -1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" -Fv "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -tf panel.tar.gz"),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Download the updated files and delete the archive file.")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("tar")]),e._v(" -xzvf 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("rm")]),e._v(" -f panel.tar.gz\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("h2",{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("h2",{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("h2",{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 two commands 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:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("If you used a custom plugin that allowed for server transfers on "),a("code",[e._v("0.7")]),e._v(" you "),a("strong",[e._v("MUST")]),e._v(" delete or rename the "),a("code",[e._v("server_transfers")]),e._v(" table\nbefore continuing.")])]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("php artisan migrate --force\nphp artisan db:seed --force\n")])])]),a("h2",{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("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 *\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 *\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 *\n")])])]),a("h2",{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("h2",{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 the upgrade is complete, exit maintenance mode and your Panel will now be available.")]),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("# Bring the Panel back up to receive connections.")]),e._v("\nphp artisan up\n")])])]),a("h2",{attrs:{id:"switch-to-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#switch-to-wings"}},[e._v("#")]),e._v(" Switch to Wings")]),e._v(" "),a("p",[e._v("We've deprecated the old Node.js daemon in favor of "),a("a",{attrs:{href:"https://github.com/pterodactyl/wings",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wings"),a("OutboundLink")],1),e._v(", our new server\ncontrol plane written in Go. This new system is significantly faster, easier to install, and much smaller. All you\nneed to do is install a single binary on your system and configure it to run on boot. "),a("strong",[e._v("You cannot use the old Node.js\nDaemon to run servers with Pterodactyl Panel 1.0.")])]),e._v(" "),a("p",[e._v("Please see "),a("RouterLink",{attrs:{to:"/wings/1.0/migrating.html"}},[e._v("Migrating to Wings")]),e._v(" for instructions.")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/69.74d5f183.js b/assets/js/69.0a4d59ac.js similarity index 99% rename from assets/js/69.74d5f183.js rename to assets/js/69.0a4d59ac.js index 27f916f9..3c70196a 100644 --- a/assets/js/69.74d5f183.js +++ b/assets/js/69.0a4d59ac.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{411:function(e,t,r){"use strict";r.r(t);var a=r(48),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"troubleshooting"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#reading-error-logs"}},[e._v("Reading Error Logs")]),r("ul",[r("li",[r("a",{attrs:{href:"#parsing-the-error"}},[e._v("Parsing the Error")])]),r("li",[r("a",{attrs:{href:"#understanding-the-error"}},[e._v("Understanding the Error")])]),r("li",[r("a",{attrs:{href:"#utilizing-grep"}},[e._v("Utilizing GREP")])])])]),r("li",[r("a",{attrs:{href:"#cannot-connect-to-server-errors"}},[e._v("Cannot Connect to Server Errors")]),r("ul",[r("li",[r("a",{attrs:{href:"#basic-debugging-steps"}},[e._v("Basic Debugging Steps")])]),r("li",[r("a",{attrs:{href:"#more-advanced-debugging-steps"}},[e._v("More Advanced Debugging Steps")])])])]),r("li",[r("a",{attrs:{href:"#invalid-mac-exception"}},[e._v("Invalid MAC Exception")])]),r("li",[r("a",{attrs:{href:"#selinux-issues"}},[e._v("SELinux Issues")]),r("ul",[r("li",[r("a",{attrs:{href:"#redis-permissions-errors"}},[e._v("Redis Permissions Errors")])]),r("li",[r("a",{attrs:{href:"#wings-connection-errors"}},[e._v("Wings Connection Errors")])])])]),r("li",[r("a",{attrs:{href:"#firewalld-issues"}},[e._v("FirewallD issues")])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"reading-error-logs"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#reading-error-logs"}},[e._v("#")]),e._v(" Reading Error Logs")]),e._v(" "),r("p",[e._v("If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs.\nTo retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log\n")])])]),r("h3",{attrs:{id:"parsing-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#parsing-the-error"}},[e._v("#")]),e._v(" Parsing the Error")]),e._v(" "),r("p",[e._v("When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not,\nthis is simply a stacktrace leading to the cause of the error, and you can actually ignore almost all of it when\nlooking for the cause of the error. Lets take a look at some example output below, which has been truncated to\nmake this easier to follow with.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("#70 /srv/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))\n#71 /srv/www/public/index.php(53): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))\n#72 {main}\n[2018-07-19 00:50:24] local.ERROR: ErrorException: file_put_contents(/srv/www/storage/framework/views/c9c05d1357df1ce4ec8fc5df78c16c493b0d4f48.php): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\nStack trace:\n#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/srv/www/vendor...', 122, Array)\n#1 /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(122): file_put_contents('/srv/www/storag...', 's...', 0)\n#2 /srv/www/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(122): Illuminate\\Filesystem\\Filesystem->put('/srv/www/storag...', 's...')\n#3 /srv/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(51): Illuminate\\View\\Compilers\\BladeCompiler->compile('/srv/www/resour...')\n#4 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(142): Illuminate\\View\\Engines\\CompilerEngine->get('/srv/www/resour...', Array)\n#5 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(125): Illuminate\\View\\View->getContents()\n")])])]),r("p",[e._v("The first thing you'll want to do is follow the chain of numbers "),r("em",[e._v("up")]),e._v(" until you find "),r("code",[e._v("#0")]),e._v(", this will be the function that\ntriggered the exception. Right above line 0 you will see a line that has the date and time in brackets, "),r("code",[e._v("[2018-07-19 00:50:24]")]),e._v("\nabove for example. This line will be the human readable exception that you can use to understand what went wrong.")]),e._v(" "),r("h3",{attrs:{id:"understanding-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-error"}},[e._v("#")]),e._v(" Understanding the Error")]),e._v(" "),r("p",[e._v("In the example above we can see that the actual error was:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("local.ERROR: ErrorException: file_put_contents(...): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\n")])])]),r("p",[e._v("From this error we can determine that there was an error performing a "),r("a",{attrs:{href:"http://php.net/manual/en/function.file-put-contents.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("file_put_contents()"),r("OutboundLink")],1),e._v(" call, and the error was\nthat we couldn't open the file because permissions were denied. Its okay if you don't understand the error at all, but\nit does help you get faster support if you're able to provide these logs, and at least find the source of the error.\nSometimes the errors are pretty straightforward and will tell you exactly what went wrong, such as a "),r("code",[e._v("ConnectionException")]),e._v("\nbeing thrown when the Panel can't connect to the Daemon.")]),e._v(" "),r("h3",{attrs:{id:"utilizing-grep"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#utilizing-grep"}},[e._v("#")]),e._v(" Utilizing GREP")]),e._v(" "),r("p",[e._v("If you're trying to go through a bunch of errors quickly, you can use the command below which will limit the results returned to only\nbe the actual error lines, without all of the stack traces.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("1000")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log "),r("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"\\['),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%Y"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),e._v("\n")])])]),r("h2",{attrs:{id:"cannot-connect-to-server-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#cannot-connect-to-server-errors"}},[e._v("#")]),e._v(" Cannot Connect to Server Errors")]),e._v(" "),r("h3",{attrs:{id:"basic-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#basic-debugging-steps"}},[e._v("#")]),e._v(" Basic Debugging Steps")]),e._v(" "),r("ul",[r("li",[e._v("Check that Wings is running, and not reporting errors. Use "),r("code",[e._v("systemctl status wings")]),e._v(" to check the current status of\nthe process.")]),e._v(" "),r("li",[e._v("Check your browser's console by pressing "),r("code",[e._v("Ctrl + Shift + J")]),e._v(" (in Chrome) or "),r("code",[e._v("Cmd + Alt + I")]),e._v(" (in Safari). If there is\na red error in it, chances are that it will narrow down the potential problem.")]),e._v(" "),r("li",[e._v("Make sure Wings is properly installed and the active configuration matches the configuration shown under\n"),r("code",[e._v("Admin -> Node -> Configuration")]),e._v(" in the Panel.")]),e._v(" "),r("li",[e._v("Check that the Wings ports are open on your firewall. Wings uses ports "),r("code",[e._v("8080")]),e._v(" or "),r("code",[e._v("8443")]),e._v(" for HTTP(s) traffic,\nand "),r("code",[e._v("2022")]),e._v(" for SFTP traffic.")]),e._v(" "),r("li",[e._v("Ensure you have AdBlock disabled or whitelisted for your Panel and Wings domains.")]),e._v(" "),r("li",[e._v("Check that the Panel can reach Wings using the domain that is configured on the Panel. Run "),r("code",[e._v("curl https://domain.com:8080")]),e._v(" on the Panel server and ensure that it can successfully connect to Wings.")]),e._v(" "),r("li",[e._v("Ensure that you are using the correct HTTP scheme for your Panel and Wings. If the Panel is running over HTTPS\nWings will also need to be running on HTTPS.")])]),e._v(" "),r("h3",{attrs:{id:"more-advanced-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#more-advanced-debugging-steps"}},[e._v("#")]),e._v(" More Advanced Debugging Steps")]),e._v(" "),r("ul",[r("li",[e._v("Stop Wings and run "),r("code",[e._v("wings --debug")]),e._v(" to see if there are any errors being output. If so, try resolving them manually,\nor reach out on "),r("a",{attrs:{href:"https://discord.gg/pterodactyl",target:"_blank",rel:"noopener noreferrer"}},[e._v("Discord"),r("OutboundLink")],1),e._v(" for more assistance.")]),e._v(" "),r("li",[e._v("Check your DNS and ensure that the response you receive is the one you expect using a tool such as "),r("code",[e._v("nslookup")]),e._v(" or "),r("code",[e._v("dig")]),e._v(".")]),e._v(" "),r("li",[e._v("If you use CloudFlare make sure that the orange cloud is disabled for your Wings or Panel "),r("code",[e._v("A")]),e._v(" records.")]),e._v(" "),r("li",[e._v("Make sure when using Wings behind a firewall — pfSense, OpenSwitch, etc. — that the correct NAT settings to access\nthe Wing's ports from the outside network are setup.")]),e._v(" "),r("li",[e._v("If nothing is working so far, check your own DNS settings and consider switching DNS servers.")]),e._v(" "),r("li",[e._v("When running the Panel and Wings on one server it can sometimes help if to add an entry in "),r("code",[e._v("/etc/hosts")]),e._v(" that directs\nthe public IP back to the server. Sometimes the reverse path is also needed, so you may need to add an entry to your\nservers "),r("code",[e._v("/etc/hosts")]),e._v(" file that points the Panel's domain to the correct IP.")]),e._v(" "),r("li",[e._v("When running Wings and the Panel on separate VM's using the same adapter make sure the VM's can connect to each\nother. Promiscuous mode might be needed.")])]),e._v(" "),r("h2",{attrs:{id:"invalid-mac-exception"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#invalid-mac-exception"}},[e._v("#")]),e._v(" Invalid MAC Exception")]),e._v(" "),r("div",{staticClass:"custom-block warning"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("This error should never happen if you correctly follow our installation and upgrade guides. The only time we have\never seen this error occur is when you blindly restore the Panel database from a backup and try to use a fresh\ninstallation of the Panel.")]),e._v(" "),r("p",[e._v("When restoring backups you should "),r("em",[e._v("always")]),e._v(" restore the "),r("code",[e._v(".env")]),e._v(" file!")])]),e._v(" "),r("p",[e._v("Sometimes when using the Panel you'll unexpectedly encounter a broken page, and upon checking the logs you'll see\nan exception mentioning an invalid MAC when decrypting. This error is caused by mismatched "),r("code",[e._v("APP_KEY")]),e._v("s in your "),r("code",[e._v(".env")]),e._v(" file\nwhen the data was encrypted versus decrypted.")]),e._v(" "),r("p",[e._v("If you are seeing this error the only solution is to restore the "),r("code",[e._v("APP_KEY")]),e._v(" from your "),r("code",[e._v(".env")]),e._v(" file. If you have lost that\noriginal key there is no way to recover the lost data.")]),e._v(" "),r("h2",{attrs:{id:"selinux-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#selinux-issues"}},[e._v("#")]),e._v(" SELinux Issues")]),e._v(" "),r("p",[e._v("On systems with SELinux installed you might encounter unexpected errors when running redis or attempting to connect\nto the daemon to perform actions. These issues can generally be resolved by executing the commands below to allow\nthese programs to work with SELinux.")]),e._v(" "),r("h3",{attrs:{id:"redis-permissions-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#redis-permissions-errors"}},[e._v("#")]),e._v(" Redis Permissions Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M redis_t\nsemodule -i redis_t.pp\n")])])]),r("h3",{attrs:{id:"wings-connection-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#wings-connection-errors"}},[e._v("#")]),e._v(" Wings Connection Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M http_port_t\nsemodule -i http_port_t.pp\n")])])]),r("h2",{attrs:{id:"firewalld-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-issues"}},[e._v("#")]),e._v(" FirewallD issues")]),e._v(" "),r("p",[e._v("If you are on a RHEL/CentOS server with "),r("code",[e._v("firewalld")]),e._v(" installed you may have broken DNS.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0\nfirewall-cmd --reload\n")])])]),r("p",[e._v("Restart "),r("code",[e._v("docker")]),e._v(" and "),r("code",[e._v("wings")]),e._v(" after running these to be sure the rules are applied.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{412:function(e,t,r){"use strict";r.r(t);var a=r(48),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"troubleshooting"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#reading-error-logs"}},[e._v("Reading Error Logs")]),r("ul",[r("li",[r("a",{attrs:{href:"#parsing-the-error"}},[e._v("Parsing the Error")])]),r("li",[r("a",{attrs:{href:"#understanding-the-error"}},[e._v("Understanding the Error")])]),r("li",[r("a",{attrs:{href:"#utilizing-grep"}},[e._v("Utilizing GREP")])])])]),r("li",[r("a",{attrs:{href:"#cannot-connect-to-server-errors"}},[e._v("Cannot Connect to Server Errors")]),r("ul",[r("li",[r("a",{attrs:{href:"#basic-debugging-steps"}},[e._v("Basic Debugging Steps")])]),r("li",[r("a",{attrs:{href:"#more-advanced-debugging-steps"}},[e._v("More Advanced Debugging Steps")])])])]),r("li",[r("a",{attrs:{href:"#invalid-mac-exception"}},[e._v("Invalid MAC Exception")])]),r("li",[r("a",{attrs:{href:"#selinux-issues"}},[e._v("SELinux Issues")]),r("ul",[r("li",[r("a",{attrs:{href:"#redis-permissions-errors"}},[e._v("Redis Permissions Errors")])]),r("li",[r("a",{attrs:{href:"#wings-connection-errors"}},[e._v("Wings Connection Errors")])])])]),r("li",[r("a",{attrs:{href:"#firewalld-issues"}},[e._v("FirewallD issues")])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"reading-error-logs"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#reading-error-logs"}},[e._v("#")]),e._v(" Reading Error Logs")]),e._v(" "),r("p",[e._v("If you ever encounter an unexpected error with the Panel the first thing you will likely be asked for is the logs.\nTo retrieve these, simply execute the command below which will output the last 100 lines of the Panel's log file.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log\n")])])]),r("h3",{attrs:{id:"parsing-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#parsing-the-error"}},[e._v("#")]),e._v(" Parsing the Error")]),e._v(" "),r("p",[e._v("When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not,\nthis is simply a stacktrace leading to the cause of the error, and you can actually ignore almost all of it when\nlooking for the cause of the error. Lets take a look at some example output below, which has been truncated to\nmake this easier to follow with.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("#70 /srv/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))\n#71 /srv/www/public/index.php(53): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))\n#72 {main}\n[2018-07-19 00:50:24] local.ERROR: ErrorException: file_put_contents(/srv/www/storage/framework/views/c9c05d1357df1ce4ec8fc5df78c16c493b0d4f48.php): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\nStack trace:\n#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/srv/www/vendor...', 122, Array)\n#1 /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(122): file_put_contents('/srv/www/storag...', 's...', 0)\n#2 /srv/www/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(122): Illuminate\\Filesystem\\Filesystem->put('/srv/www/storag...', 's...')\n#3 /srv/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(51): Illuminate\\View\\Compilers\\BladeCompiler->compile('/srv/www/resour...')\n#4 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(142): Illuminate\\View\\Engines\\CompilerEngine->get('/srv/www/resour...', Array)\n#5 /srv/www/vendor/laravel/framework/src/Illuminate/View/View.php(125): Illuminate\\View\\View->getContents()\n")])])]),r("p",[e._v("The first thing you'll want to do is follow the chain of numbers "),r("em",[e._v("up")]),e._v(" until you find "),r("code",[e._v("#0")]),e._v(", this will be the function that\ntriggered the exception. Right above line 0 you will see a line that has the date and time in brackets, "),r("code",[e._v("[2018-07-19 00:50:24]")]),e._v("\nabove for example. This line will be the human readable exception that you can use to understand what went wrong.")]),e._v(" "),r("h3",{attrs:{id:"understanding-the-error"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#understanding-the-error"}},[e._v("#")]),e._v(" Understanding the Error")]),e._v(" "),r("p",[e._v("In the example above we can see that the actual error was:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("local.ERROR: ErrorException: file_put_contents(...): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122\n")])])]),r("p",[e._v("From this error we can determine that there was an error performing a "),r("a",{attrs:{href:"http://php.net/manual/en/function.file-put-contents.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("file_put_contents()"),r("OutboundLink")],1),e._v(" call, and the error was\nthat we couldn't open the file because permissions were denied. Its okay if you don't understand the error at all, but\nit does help you get faster support if you're able to provide these logs, and at least find the source of the error.\nSometimes the errors are pretty straightforward and will tell you exactly what went wrong, such as a "),r("code",[e._v("ConnectionException")]),e._v("\nbeing thrown when the Panel can't connect to the Daemon.")]),e._v(" "),r("h3",{attrs:{id:"utilizing-grep"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#utilizing-grep"}},[e._v("#")]),e._v(" Utilizing GREP")]),e._v(" "),r("p",[e._v("If you're trying to go through a bunch of errors quickly, you can use the command below which will limit the results returned to only\nbe the actual error lines, without all of the stack traces.")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("tail")]),e._v(" -n "),r("span",{pre:!0,attrs:{class:"token number"}},[e._v("1000")]),e._v(" /var/www/pterodactyl/storage/logs/laravel-"),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%F"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(".log "),r("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"\\['),r("span",{pre:!0,attrs:{class:"token variable"}},[r("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("date")]),e._v(" +%Y"),r("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"')]),e._v("\n")])])]),r("h2",{attrs:{id:"cannot-connect-to-server-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#cannot-connect-to-server-errors"}},[e._v("#")]),e._v(" Cannot Connect to Server Errors")]),e._v(" "),r("h3",{attrs:{id:"basic-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#basic-debugging-steps"}},[e._v("#")]),e._v(" Basic Debugging Steps")]),e._v(" "),r("ul",[r("li",[e._v("Check that Wings is running, and not reporting errors. Use "),r("code",[e._v("systemctl status wings")]),e._v(" to check the current status of\nthe process.")]),e._v(" "),r("li",[e._v("Check your browser's console by pressing "),r("code",[e._v("Ctrl + Shift + J")]),e._v(" (in Chrome) or "),r("code",[e._v("Cmd + Alt + I")]),e._v(" (in Safari). If there is\na red error in it, chances are that it will narrow down the potential problem.")]),e._v(" "),r("li",[e._v("Make sure Wings is properly installed and the active configuration matches the configuration shown under\n"),r("code",[e._v("Admin -> Node -> Configuration")]),e._v(" in the Panel.")]),e._v(" "),r("li",[e._v("Check that the Wings ports are open on your firewall. Wings uses ports "),r("code",[e._v("8080")]),e._v(" or "),r("code",[e._v("8443")]),e._v(" for HTTP(s) traffic,\nand "),r("code",[e._v("2022")]),e._v(" for SFTP traffic.")]),e._v(" "),r("li",[e._v("Ensure you have AdBlock disabled or whitelisted for your Panel and Wings domains.")]),e._v(" "),r("li",[e._v("Check that the Panel can reach Wings using the domain that is configured on the Panel. Run "),r("code",[e._v("curl https://domain.com:8080")]),e._v(" on the Panel server and ensure that it can successfully connect to Wings.")]),e._v(" "),r("li",[e._v("Ensure that you are using the correct HTTP scheme for your Panel and Wings. If the Panel is running over HTTPS\nWings will also need to be running on HTTPS.")])]),e._v(" "),r("h3",{attrs:{id:"more-advanced-debugging-steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#more-advanced-debugging-steps"}},[e._v("#")]),e._v(" More Advanced Debugging Steps")]),e._v(" "),r("ul",[r("li",[e._v("Stop Wings and run "),r("code",[e._v("wings --debug")]),e._v(" to see if there are any errors being output. If so, try resolving them manually,\nor reach out on "),r("a",{attrs:{href:"https://discord.gg/pterodactyl",target:"_blank",rel:"noopener noreferrer"}},[e._v("Discord"),r("OutboundLink")],1),e._v(" for more assistance.")]),e._v(" "),r("li",[e._v("Check your DNS and ensure that the response you receive is the one you expect using a tool such as "),r("code",[e._v("nslookup")]),e._v(" or "),r("code",[e._v("dig")]),e._v(".")]),e._v(" "),r("li",[e._v("If you use CloudFlare make sure that the orange cloud is disabled for your Wings or Panel "),r("code",[e._v("A")]),e._v(" records.")]),e._v(" "),r("li",[e._v("Make sure when using Wings behind a firewall — pfSense, OpenSwitch, etc. — that the correct NAT settings to access\nthe Wing's ports from the outside network are setup.")]),e._v(" "),r("li",[e._v("If nothing is working so far, check your own DNS settings and consider switching DNS servers.")]),e._v(" "),r("li",[e._v("When running the Panel and Wings on one server it can sometimes help if to add an entry in "),r("code",[e._v("/etc/hosts")]),e._v(" that directs\nthe public IP back to the server. Sometimes the reverse path is also needed, so you may need to add an entry to your\nservers "),r("code",[e._v("/etc/hosts")]),e._v(" file that points the Panel's domain to the correct IP.")]),e._v(" "),r("li",[e._v("When running Wings and the Panel on separate VM's using the same adapter make sure the VM's can connect to each\nother. Promiscuous mode might be needed.")])]),e._v(" "),r("h2",{attrs:{id:"invalid-mac-exception"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#invalid-mac-exception"}},[e._v("#")]),e._v(" Invalid MAC Exception")]),e._v(" "),r("div",{staticClass:"custom-block warning"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("This error should never happen if you correctly follow our installation and upgrade guides. The only time we have\never seen this error occur is when you blindly restore the Panel database from a backup and try to use a fresh\ninstallation of the Panel.")]),e._v(" "),r("p",[e._v("When restoring backups you should "),r("em",[e._v("always")]),e._v(" restore the "),r("code",[e._v(".env")]),e._v(" file!")])]),e._v(" "),r("p",[e._v("Sometimes when using the Panel you'll unexpectedly encounter a broken page, and upon checking the logs you'll see\nan exception mentioning an invalid MAC when decrypting. This error is caused by mismatched "),r("code",[e._v("APP_KEY")]),e._v("s in your "),r("code",[e._v(".env")]),e._v(" file\nwhen the data was encrypted versus decrypted.")]),e._v(" "),r("p",[e._v("If you are seeing this error the only solution is to restore the "),r("code",[e._v("APP_KEY")]),e._v(" from your "),r("code",[e._v(".env")]),e._v(" file. If you have lost that\noriginal key there is no way to recover the lost data.")]),e._v(" "),r("h2",{attrs:{id:"selinux-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#selinux-issues"}},[e._v("#")]),e._v(" SELinux Issues")]),e._v(" "),r("p",[e._v("On systems with SELinux installed you might encounter unexpected errors when running redis or attempting to connect\nto the daemon to perform actions. These issues can generally be resolved by executing the commands below to allow\nthese programs to work with SELinux.")]),e._v(" "),r("h3",{attrs:{id:"redis-permissions-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#redis-permissions-errors"}},[e._v("#")]),e._v(" Redis Permissions Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M redis_t\nsemodule -i redis_t.pp\n")])])]),r("h3",{attrs:{id:"wings-connection-errors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#wings-connection-errors"}},[e._v("#")]),e._v(" Wings Connection Errors")]),e._v(" "),r("div",{staticClass:"language-bash extra-class"},[r("pre",{pre:!0,attrs:{class:"language-bash"}},[r("code",[e._v("audit2allow -a -M http_port_t\nsemodule -i http_port_t.pp\n")])])]),r("h2",{attrs:{id:"firewalld-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firewalld-issues"}},[e._v("#")]),e._v(" FirewallD issues")]),e._v(" "),r("p",[e._v("If you are on a RHEL/CentOS server with "),r("code",[e._v("firewalld")]),e._v(" installed you may have broken DNS.")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0\nfirewall-cmd --reload\n")])])]),r("p",[e._v("Restart "),r("code",[e._v("docker")]),e._v(" and "),r("code",[e._v("wings")]),e._v(" after running these to be sure the rules are applied.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/70.2c6f25e4.js b/assets/js/70.e5c87b26.js similarity index 99% rename from assets/js/70.2c6f25e4.js rename to assets/js/70.e5c87b26.js index e3ff6464..c1c74676 100644 --- a/assets/js/70.2c6f25e4.js +++ b/assets/js/70.e5c87b26.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{412: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.2.2")]),e._v(" to "),a("code",[e._v("1.3.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("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("tr",[a("td",[e._v("1.1.x")]),e._v(" "),a("td",[e._v("1.1.x")]),e._v(" "),a("td")]),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("tr",[a("td",[e._v("1.3.x")]),e._v(" "),a("td",[e._v("1.3.x")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("1.4.x")])]),e._v(" "),a("td",[a("strong",[e._v("1.4.x")])]),e._v(" "),a("td",[e._v("✅")])])])]),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("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Minimum PHP Version Changed")]),e._v(" "),a("p",[e._v("The latest versions of Pterodactyl Panel — including the "),a("code",[e._v("1.3")]),e._v(" release — require a "),a("strong",[e._v("minimum version of PHP 7.4")]),e._v(" and\nComposer v2.")])]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(" or "),a("code",[e._v("8.0")]),e._v(" (recommended)")]),e._v(" "),a("li",[e._v("Composer "),a("code",[e._v("2.X")])])]),e._v(" "),a("p",[e._v("Previous versions of Pterodactyl allowed for you to be running PHP 7.3. However, due to dependency updates and\nthe fact that 7.3 is now EOL we have bumped the minimum acceptable PHP version to 7.4 — PHP 8 is recommended. You\nwill also need to be using Composer v2.")]),e._v(" "),a("p",[a("strong",[e._v("Before continuing")]),e._v(", please ensure that your system has been upgraded to at least PHP 7.4 by running "),a("code",[e._v("php -v")]),e._v(". You\nshould see output similar to the output below. If you do not see at least PHP 7.4 you will need to upgrade by following\nour "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("PHP Upgrade Guide")]),e._v(" and then return to this documentation.")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("vagrant@pterodactyl:~/app$ php -v\nPHP "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.0")]),e._v(".1 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("cli"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("built: Jan "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("13")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2021")]),e._v(" 08:22:35"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v(" NTS "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" The PHP Group\nZend Engine v4.0.1, Copyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" Zend Technologies\n with Zend OPcache v8.0.1, Copyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(", by Zend Technologies\nvagrant@pterodactyl:~/app$ composer --version\nComposer version "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2.0")]),e._v(".8 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2020")]),e._v("-12-03 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("17")]),e._v(":20:38\n")])])]),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),e._v(" "),a("p",[e._v("Before you proceed, make sure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory.")]),e._v(" "),a("p",[e._v("Instead of manually updating, you can use the self-upgrade artisan command "),a("code",[e._v("php artisan p:upgrade")]),e._v(". You must be on a panel version that is 1.3.2 or newer.")]),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",[e._v("php 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("h2",{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("h2",{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("h2",{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("h2",{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("h2",{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("h4",{attrs:{id:"final-step-upgrade-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#final-step-upgrade-wings"}},[e._v("#")]),e._v(" "),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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{413: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.2.2")]),e._v(" to "),a("code",[e._v("1.3.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("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("tr",[a("td",[e._v("1.1.x")]),e._v(" "),a("td",[e._v("1.1.x")]),e._v(" "),a("td")]),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("tr",[a("td",[e._v("1.3.x")]),e._v(" "),a("td",[e._v("1.3.x")]),e._v(" "),a("td")]),e._v(" "),a("tr",[a("td",[a("strong",[e._v("1.4.x")])]),e._v(" "),a("td",[a("strong",[e._v("1.4.x")])]),e._v(" "),a("td",[e._v("✅")])])])]),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("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("Minimum PHP Version Changed")]),e._v(" "),a("p",[e._v("The latest versions of Pterodactyl Panel — including the "),a("code",[e._v("1.3")]),e._v(" release — require a "),a("strong",[e._v("minimum version of PHP 7.4")]),e._v(" and\nComposer v2.")])]),e._v(" "),a("ul",[a("li",[e._v("PHP "),a("code",[e._v("7.4")]),e._v(" or "),a("code",[e._v("8.0")]),e._v(" (recommended)")]),e._v(" "),a("li",[e._v("Composer "),a("code",[e._v("2.X")])])]),e._v(" "),a("p",[e._v("Previous versions of Pterodactyl allowed for you to be running PHP 7.3. However, due to dependency updates and\nthe fact that 7.3 is now EOL we have bumped the minimum acceptable PHP version to 7.4 — PHP 8 is recommended. You\nwill also need to be using Composer v2.")]),e._v(" "),a("p",[a("strong",[e._v("Before continuing")]),e._v(", please ensure that your system has been upgraded to at least PHP 7.4 by running "),a("code",[e._v("php -v")]),e._v(". You\nshould see output similar to the output below. If you do not see at least PHP 7.4 you will need to upgrade by following\nour "),a("RouterLink",{attrs:{to:"/guides/php_upgrade.html"}},[e._v("PHP Upgrade Guide")]),e._v(" and then return to this documentation.")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("vagrant@pterodactyl:~/app$ php -v\nPHP "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("8.0")]),e._v(".1 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("cli"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("built: Jan "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("13")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2021")]),e._v(" 08:22:35"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v(" NTS "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nCopyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" The PHP Group\nZend Engine v4.0.1, Copyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" Zend Technologies\n with Zend OPcache v8.0.1, Copyright "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(", by Zend Technologies\nvagrant@pterodactyl:~/app$ composer --version\nComposer version "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2.0")]),e._v(".8 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2020")]),e._v("-12-03 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("17")]),e._v(":20:38\n")])])]),a("h2",{attrs:{id:"fetch-updated-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fetch-updated-files"}},[e._v("#")]),e._v(" Fetch Updated Files")]),e._v(" "),a("p",[e._v("Before you proceed, make sure that you're in the "),a("code",[e._v("/var/www/pterodactyl")]),e._v(" directory.")]),e._v(" "),a("p",[e._v("Instead of manually updating, you can use the self-upgrade artisan command "),a("code",[e._v("php artisan p:upgrade")]),e._v(". You must be on a panel version that is 1.3.2 or newer.")]),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",[e._v("php 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("h2",{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("h2",{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("h2",{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("h2",{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("h2",{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("h4",{attrs:{id:"final-step-upgrade-wings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#final-step-upgrade-wings"}},[e._v("#")]),e._v(" "),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/71.f94f8363.js b/assets/js/71.cd5fcd07.js similarity index 99% rename from assets/js/71.f94f8363.js rename to assets/js/71.cd5fcd07.js index 8ef6b1d7..dc89ab6f 100644 --- a/assets/js/71.f94f8363.js +++ b/assets/js/71.cd5fcd07.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{413:function(e,t,n){"use strict";n.r(t);var a=n(48),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"webserver-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[e._v("#")]),e._v(" Webserver Configuration")]),e._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),n("p",[e._v("You should remove the default Apache or NGINX configuration as it will expose application secrets to malicious users by default.")])]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("When using the SSL configuration you MUST create SSL certificates, otherwise your webserver will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[e._v("Creating SSL Certificates")]),e._v(" documentation page for how to create these certificates before continuing.")],1)]),e._v(" "),n("tabs",[n("tab",{attrs:{name:"Nginx With SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/nginx/sites-available/")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php8.0-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("The final step is to enable your NGINX configuration and restart it.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to symlink this file if you are using CentOS.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You need to restart nginx regardless of OS.")]),e._v("\nsystemctl restart nginx\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Nginx Without SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/nginx/sites-available/")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('server {\n listen 80;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.html index.htm index.php;\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n access_log off;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php8.0-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration-2"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-2"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("The final step is to enable your NGINX configuration and restart it.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to symlink this file if you are using CentOS.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You need to restart nginx regardless of OS.")]),e._v("\nsystemctl restart nginx\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Apache With SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/apache2/sites-available")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/httpd/conf.d/")]),e._v(".")]),e._v(" "),n("p",[e._v("Note: When using Apache, make sure you have the "),n("code",[e._v("libapache2-mod-php")]),e._v(" package installed or else PHP will not display on your webserver.")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('\n ServerName \n RewriteEngine On\n RewriteCond %{HTTPS} !=on\n RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] \n\n\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n SSLEngine on\n SSLCertificateFile /etc/letsencrypt/live//fullchain.pem\n SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem\n \n')])])]),n("h3",{attrs:{id:"enabling-configuration-3"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-3"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[e._v("you do not need to run the commands\nbelow!")]),e._v(" You only need to run "),n("code",[e._v("systemctl restart httpd")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to run any of these commands on CentOS")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Apache Without SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/apache2/sites-available")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/httpd/conf.d/")]),e._v(".")]),e._v(" "),n("p",[e._v("Note: When using Apache, make sure you have the "),n("code",[e._v("libapache2-mod-php")]),e._v(" package installed or else PHP will not display on your webserver.")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n\n')])])]),n("h3",{attrs:{id:"enabling-configuration-4"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-4"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[e._v("you do not need to run the commands\nbelow!")]),e._v(" You only need to run "),n("code",[e._v("systemctl restart httpd")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to run any of these commands on CentOS")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])])],1),e._v(" "),n("h4",{attrs:{id:"next-step-wings-installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#next-step-wings-installation"}},[e._v("#")]),e._v(" Next Step: "),n("RouterLink",{attrs:{to:"/wings/installing.html"}},[e._v("Wings Installation")])],1)],1)}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{414:function(e,t,n){"use strict";n.r(t);var a=n(48),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"webserver-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#webserver-configuration"}},[e._v("#")]),e._v(" Webserver Configuration")]),e._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),n("p",[e._v("You should remove the default Apache or NGINX configuration as it will expose application secrets to malicious users by default.")])]),e._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("When using the SSL configuration you MUST create SSL certificates, otherwise your webserver will fail to start. See "),n("RouterLink",{attrs:{to:"/tutorials/creating_ssl_certificates.html"}},[e._v("Creating SSL Certificates")]),e._v(" documentation page for how to create these certificates before continuing.")],1)]),e._v(" "),n("tabs",[n("tab",{attrs:{name:"Nginx With SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/nginx/sites-available/")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('server_tokens off;\n\nserver {\n listen 80;\n server_name ;\n return 301 https://$server_name$request_uri;\n}\n\nserver {\n listen 443 ssl http2;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.php;\n\n access_log /var/log/nginx/pterodactyl.app-access.log;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n # SSL Configuration\n ssl_certificate /etc/letsencrypt/live//fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live//privkey.pem;\n ssl_session_cache shared:SSL:10m;\n ssl_protocols TLSv1.2 TLSv1.3;\n ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";\n ssl_prefer_server_ciphers on;\n\n # See https://hstspreload.org/ before uncommenting the line below.\n # add_header Strict-Transport-Security "max-age=15768000; preload;";\n add_header X-Content-Type-Options nosniff;\n add_header X-XSS-Protection "1; mode=block";\n add_header X-Robots-Tag none;\n add_header Content-Security-Policy "frame-ancestors \'self\'";\n add_header X-Frame-Options DENY;\n add_header Referrer-Policy same-origin;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php8.0-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n include /etc/nginx/fastcgi_params;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("The final step is to enable your NGINX configuration and restart it.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to symlink this file if you are using CentOS.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You need to restart nginx regardless of OS.")]),e._v("\nsystemctl restart nginx\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Nginx Without SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/nginx/sites-available/")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/nginx/conf.d/")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('server {\n listen 80;\n server_name ;\n\n root /var/www/pterodactyl/public;\n index index.html index.htm index.php;\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n access_log off;\n error_log /var/log/nginx/pterodactyl.app-error.log error;\n\n # allow larger file uploads and longer script runtimes\n client_max_body_size 100m;\n client_body_timeout 120s;\n\n sendfile off;\n\n location ~ \\.php$ {\n fastcgi_split_path_info ^(.+\\.php)(/.+)$;\n fastcgi_pass unix:/run/php/php8.0-fpm.sock;\n fastcgi_index index.php;\n include fastcgi_params;\n fastcgi_param PHP_VALUE "upload_max_filesize = 100M \\n post_max_size=100M";\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n fastcgi_param HTTP_PROXY "";\n fastcgi_intercept_errors off;\n fastcgi_buffer_size 16k;\n fastcgi_buffers 4 16k;\n fastcgi_connect_timeout 300;\n fastcgi_send_timeout 300;\n fastcgi_read_timeout 300;\n }\n\n location ~ /\\.ht {\n deny all;\n }\n}\n')])])]),n("h3",{attrs:{id:"enabling-configuration-2"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-2"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("The final step is to enable your NGINX configuration and restart it.")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to symlink this file if you are using CentOS.")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You need to restart nginx regardless of OS.")]),e._v("\nsystemctl restart nginx\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Apache With SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/apache2/sites-available")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/httpd/conf.d/")]),e._v(".")]),e._v(" "),n("p",[e._v("Note: When using Apache, make sure you have the "),n("code",[e._v("libapache2-mod-php")]),e._v(" package installed or else PHP will not display on your webserver.")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('\n ServerName \n RewriteEngine On\n RewriteCond %{HTTPS} !=on\n RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] \n\n\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n SSLEngine on\n SSLCertificateFile /etc/letsencrypt/live//fullchain.pem\n SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem\n \n')])])]),n("h3",{attrs:{id:"enabling-configuration-3"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-3"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[e._v("you do not need to run the commands\nbelow!")]),e._v(" You only need to run "),n("code",[e._v("systemctl restart httpd")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to run any of these commands on CentOS")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])]),e._v(" "),n("tab",{attrs:{name:"Apache Without SSL"}},[n("p",[e._v("You should paste the contents of the file below, replacing "),n("code",[e._v("")]),e._v(" with your domain name being used in a file called\n"),n("code",[e._v("pterodactyl.conf")]),e._v(" and place it in "),n("code",[e._v("/etc/apache2/sites-available")]),e._v(", or — if on CentOS, "),n("code",[e._v("/etc/httpd/conf.d/")]),e._v(".")]),e._v(" "),n("p",[e._v("Note: When using Apache, make sure you have the "),n("code",[e._v("libapache2-mod-php")]),e._v(" package installed or else PHP will not display on your webserver.")]),e._v(" "),n("div",{staticClass:"language-conf extra-class"},[n("div",{staticClass:"highlight-lines"},[n("br"),n("div",{staticClass:"highlighted"},[e._v(" ")]),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br"),n("br")]),n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('\n ServerName \n DocumentRoot "/var/www/pterodactyl/public"\n AllowEncodedSlashes On\n php_value upload_max_filesize 100M\n php_value post_max_size 100M\n \n AllowOverride all\n \n\n')])])]),n("h3",{attrs:{id:"enabling-configuration-4"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#enabling-configuration-4"}},[e._v("#")]),e._v(" Enabling Configuration")]),e._v(" "),n("p",[e._v("Once you've created the file above, simply run the commands below. If you are on CentOS "),n("em",[e._v("you do not need to run the commands\nbelow!")]),e._v(" You only need to run "),n("code",[e._v("systemctl restart httpd")]),e._v(".")]),e._v(" "),n("div",{staticClass:"language-bash extra-class"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# You do not need to run any of these commands on CentOS")]),e._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("ln")]),e._v(" -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" a2enmod rewrite\nsystemctl restart apache2\n")])])])])],1),e._v(" "),n("h4",{attrs:{id:"next-step-wings-installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#next-step-wings-installation"}},[e._v("#")]),e._v(" Next Step: "),n("RouterLink",{attrs:{to:"/wings/installing.html"}},[e._v("Wings Installation")])],1)],1)}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/72.be219eed.js b/assets/js/72.c1a0015d.js similarity index 99% rename from assets/js/72.be219eed.js rename to assets/js/72.c1a0015d.js index c530dec2..5c690895 100644 --- a/assets/js/72.be219eed.js +++ b/assets/js/72.c1a0015d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{414:function(e,t,r){"use strict";r.r(t);var n=r(48),o=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"about"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#about"}},[e._v("#")]),e._v(" About")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#core-project-team"}},[e._v("Core Project Team")])]),r("li",[r("a",{attrs:{href:"#community-team"}},[e._v("Community Team")])]),r("li",[r("a",{attrs:{href:"#sponsors"}},[e._v("Sponsors")])]),r("li",[r("a",{attrs:{href:"#license"}},[e._v("License")])]),r("li",[r("a",{attrs:{href:"#gpg-signature"}},[e._v("GPG Signature")])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"core-project-team"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#core-project-team"}},[e._v("#")]),e._v(" Core Project Team")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Name")]),e._v(" "),r("th",[e._v("Discord Name")]),e._v(" "),r("th",[e._v("Primary Role")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("a",{attrs:{href:"https://daneeveritt.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dane Everitt"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("Tactical Fish#8008")])]),e._v(" "),r("td",[e._v("Project Maintainer")])]),e._v(" "),r("tr",[r("td",[e._v("Stepan Fedotov")]),e._v(" "),r("td",[r("code",[e._v("Trixter#0001")])]),e._v(" "),r("td",[e._v("WISP & WHMCS Module Maintainer")])]),e._v(" "),r("tr",[r("td",[e._v("Michael Parker")]),e._v(" "),r("td",[r("code",[e._v("parkervcp#6789")])]),e._v(" "),r("td",[e._v("Egg Developer, Docker Integration")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://anand.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Anand Capur"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("Arcdigital#1337")])]),e._v(" "),r("td",[e._v("Mobile/Cloud Project Lead")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://schrej.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Jakob Schrettenbrunner"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("schrej#1337")])]),e._v(" "),r("td",[e._v("Developer")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://lancepioch.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lance Pioch"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("ShadowLancer#5209")])]),e._v(" "),r("td",[e._v("Developer")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://matthewp.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matthew Penner"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("matthewp#0001")])]),e._v(" "),r("td",[e._v("Developer")])])])]),e._v(" "),r("p",[e._v("Members of the project team have a red username in our Discord server.")]),e._v(" "),r("h2",{attrs:{id:"community-team"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#community-team"}},[e._v("#")]),e._v(" Community Team")]),e._v(" "),r("p",[e._v("Pterodactyl would not be as successful as it is today without the help of our fantastic community support team. These\nmembers can be found in our Discord server and are distinguished with a yellow username.")]),e._v(" "),r("h2",{attrs:{id:"sponsors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sponsors"}},[e._v("#")]),e._v(" Sponsors")]),e._v(" "),r("p",[e._v("The following companies help to fund Pterodactyl's developement. "),r("a",{attrs:{href:"https://github.com/sponsors/DaneEveritt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Interested in becoming a sponsor?"),r("OutboundLink")],1)]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Company")]),e._v(" "),r("th",[e._v("About")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("a",{attrs:{href:"https://wisp.gg",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("WISP")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Extra features.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://bloom.host",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Bloom.host")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Bloom.host offers dedicated core VPS and Minecraft hosting with Ryzen 9 processors. With owned-hardware, we offer truly unbeatable prices on high-performance hosting.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://minestrator.com/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("MineStrator")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Looking for a French highend hosting company for you minecraft server? More than 14,000 members on our discord, trust us.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://dedicatedmc.io/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("DedicatedMC")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("DedicatedMC provides Raw Power hosting at affordable pricing, making sure to never compromise on your performance and giving you the best performance money can buy.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://www.skynode.pro/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Skynode")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("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!")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://xcore-server.de/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("XCORE")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("XCORE offers High-End Servers for hosting and gaming since 2012. Fast, excellent and well-known for eSports Gaming.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://royalehosting.net/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("RoyaleHosting")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Build your dreams and deploy them with RoyaleHosting’s reliable servers and network. Easy to use, provisioned in a couple of minutes.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://spillhosting.no/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Spill Hosting")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Spill Hosting is a Norwegian hosting service, which aims for inexpensive services on quality servers. Premium i9-9900K processors will run your game like a dream.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://deinserverhost.de/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("DeinServerHost")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("DeinServerHost offers Dedicated, vps and Gameservers for many popular Games like Minecraft and Rust in Germany since 2013.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://hostbend.com/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("HostBend")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("HostBend offers a variety of solutions for developers, students, and others who have a tight budget but don't want to compromise quality and support.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://capitolsolutions.cloud/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Capitol Hosting Solutions")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("CHS is "),r("em",[e._v("the")]),e._v(" budget friendly hosting company for Australian and American gamers, offering a variety of plans from Web Hosting to Game Servers; Custom Solutions too!")])])])]),e._v(" "),r("h2",{attrs:{id:"license"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),r("div",{staticClass:"language-text extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('Copyright (c) 2015 - 2021 Dane Everitt .\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n')])])]),r("h2",{attrs:{id:"gpg-signature"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#gpg-signature"}},[e._v("#")]),e._v(" GPG Signature")]),e._v(" "),r("p",[e._v("Starting with Panel "),r("code",[e._v("v0.4.0")]),e._v(" all releases are signed with the GPG key below. All releases include a detached key as\nwell to verify your download against.")]),e._v(" "),r("p",[e._v("Releases also include a SHA256 checksum.")]),e._v(" "),r("div",{staticClass:"language-txt extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("-----BEGIN PGP PUBLIC KEY BLOCK-----\n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\ngkSI5o2kam0QGYUhqg==\n=rDb0\n-----END PGP PUBLIC KEY BLOCK-----\n")])])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{415:function(e,t,r){"use strict";r.r(t);var n=r(48),o=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"about"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#about"}},[e._v("#")]),e._v(" About")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#core-project-team"}},[e._v("Core Project Team")])]),r("li",[r("a",{attrs:{href:"#community-team"}},[e._v("Community Team")])]),r("li",[r("a",{attrs:{href:"#sponsors"}},[e._v("Sponsors")])]),r("li",[r("a",{attrs:{href:"#license"}},[e._v("License")])]),r("li",[r("a",{attrs:{href:"#gpg-signature"}},[e._v("GPG Signature")])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"core-project-team"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#core-project-team"}},[e._v("#")]),e._v(" Core Project Team")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Name")]),e._v(" "),r("th",[e._v("Discord Name")]),e._v(" "),r("th",[e._v("Primary Role")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("a",{attrs:{href:"https://daneeveritt.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dane Everitt"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("Tactical Fish#8008")])]),e._v(" "),r("td",[e._v("Project Maintainer")])]),e._v(" "),r("tr",[r("td",[e._v("Stepan Fedotov")]),e._v(" "),r("td",[r("code",[e._v("Trixter#0001")])]),e._v(" "),r("td",[e._v("WISP & WHMCS Module Maintainer")])]),e._v(" "),r("tr",[r("td",[e._v("Michael Parker")]),e._v(" "),r("td",[r("code",[e._v("parkervcp#6789")])]),e._v(" "),r("td",[e._v("Egg Developer, Docker Integration")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://anand.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Anand Capur"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("Arcdigital#1337")])]),e._v(" "),r("td",[e._v("Mobile/Cloud Project Lead")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://schrej.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Jakob Schrettenbrunner"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("schrej#1337")])]),e._v(" "),r("td",[e._v("Developer")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://lancepioch.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lance Pioch"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("ShadowLancer#5209")])]),e._v(" "),r("td",[e._v("Developer")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://matthewp.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matthew Penner"),r("OutboundLink")],1)]),e._v(" "),r("td",[r("code",[e._v("matthewp#0001")])]),e._v(" "),r("td",[e._v("Developer")])])])]),e._v(" "),r("p",[e._v("Members of the project team have a red username in our Discord server.")]),e._v(" "),r("h2",{attrs:{id:"community-team"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#community-team"}},[e._v("#")]),e._v(" Community Team")]),e._v(" "),r("p",[e._v("Pterodactyl would not be as successful as it is today without the help of our fantastic community support team. These\nmembers can be found in our Discord server and are distinguished with a yellow username.")]),e._v(" "),r("h2",{attrs:{id:"sponsors"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sponsors"}},[e._v("#")]),e._v(" Sponsors")]),e._v(" "),r("p",[e._v("The following companies help to fund Pterodactyl's developement. "),r("a",{attrs:{href:"https://github.com/sponsors/DaneEveritt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Interested in becoming a sponsor?"),r("OutboundLink")],1)]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Company")]),e._v(" "),r("th",[e._v("About")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[r("a",{attrs:{href:"https://wisp.gg",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("WISP")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Extra features.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://bloom.host",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Bloom.host")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Bloom.host offers dedicated core VPS and Minecraft hosting with Ryzen 9 processors. With owned-hardware, we offer truly unbeatable prices on high-performance hosting.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://minestrator.com/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("MineStrator")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Looking for a French highend hosting company for you minecraft server? More than 14,000 members on our discord, trust us.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://dedicatedmc.io/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("DedicatedMC")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("DedicatedMC provides Raw Power hosting at affordable pricing, making sure to never compromise on your performance and giving you the best performance money can buy.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://www.skynode.pro/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Skynode")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("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!")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://xcore-server.de/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("XCORE")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("XCORE offers High-End Servers for hosting and gaming since 2012. Fast, excellent and well-known for eSports Gaming.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://royalehosting.net/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("RoyaleHosting")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Build your dreams and deploy them with RoyaleHosting’s reliable servers and network. Easy to use, provisioned in a couple of minutes.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://spillhosting.no/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Spill Hosting")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("Spill Hosting is a Norwegian hosting service, which aims for inexpensive services on quality servers. Premium i9-9900K processors will run your game like a dream.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://deinserverhost.de/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("DeinServerHost")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("DeinServerHost offers Dedicated, vps and Gameservers for many popular Games like Minecraft and Rust in Germany since 2013.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://hostbend.com/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("HostBend")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("HostBend offers a variety of solutions for developers, students, and others who have a tight budget but don't want to compromise quality and support.")])]),e._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://capitolsolutions.cloud/",target:"_blank",rel:"noopener noreferrer"}},[r("strong",[e._v("Capitol Hosting Solutions")]),r("OutboundLink")],1)]),e._v(" "),r("td",[e._v("CHS is "),r("em",[e._v("the")]),e._v(" budget friendly hosting company for Australian and American gamers, offering a variety of plans from Web Hosting to Game Servers; Custom Solutions too!")])])])]),e._v(" "),r("h2",{attrs:{id:"license"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),r("div",{staticClass:"language-text extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('Copyright (c) 2015 - 2021 Dane Everitt .\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n')])])]),r("h2",{attrs:{id:"gpg-signature"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#gpg-signature"}},[e._v("#")]),e._v(" GPG Signature")]),e._v(" "),r("p",[e._v("Starting with Panel "),r("code",[e._v("v0.4.0")]),e._v(" all releases are signed with the GPG key below. All releases include a detached key as\nwell to verify your download against.")]),e._v(" "),r("p",[e._v("Releases also include a SHA256 checksum.")]),e._v(" "),r("div",{staticClass:"language-txt extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("-----BEGIN PGP PUBLIC KEY BLOCK-----\n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\ngkSI5o2kam0QGYUhqg==\n=rDb0\n-----END PGP PUBLIC KEY BLOCK-----\n")])])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/73.11b803e4.js b/assets/js/73.0f242c47.js similarity index 98% rename from assets/js/73.11b803e4.js rename to assets/js/73.0f242c47.js index ddd28b16..4799099f 100644 --- a/assets/js/73.11b803e4.js +++ b/assets/js/73.0f242c47.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{415:function(e,t,i){"use strict";i.r(t);var o=i(48),n=Object(o.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("h1",{attrs:{id:"community-standards"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#community-standards"}},[e._v("#")]),e._v(" Community Standards")]),e._v(" "),i("p",[e._v("Pterodactyl has grown from a community of tens in 2015 to a community of thousands in 2020. During that time\nthere have been countless growing pains and community has changed in an innumerable number of ways. At our heart\nhowever, Pterodactyl continues to exist for one purpose: to be "),i("em",[e._v("the")]),e._v(" platform for running your game servers.")]),e._v(" "),i("p",[e._v("In order to keep true to that goal, and continue to foster one of the largest open-source game panel communities\nout there, we've adopted a simple set of guidelines for participating in this community. The goal of these guidelines\nis to foster an inclusive, welcoming environment for new users, and provide a space for the thousands of existing\nusers, administrators, network owners, and hosting companies to co-exist.")]),e._v(" "),i("p",[e._v("These rules and guidelines extend to all facets of the Pterodactyl Community, including but not limited to our\nDiscord Server and all activities within the GitHub Organization.")]),e._v(" "),i("h2",{attrs:{id:"community-guidelines"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#community-guidelines"}},[e._v("#")]),e._v(" Community Guidelines")]),e._v(" "),i("p",[e._v("At the most basic level, these guidelines can be distilled down to:")]),e._v(" "),i("ol",[i("li",[e._v("Be a decent human.")]),e._v(" "),i("li",[e._v("Patience is a virtue.")])]),e._v(" "),i("h3",{attrs:{id:"be-mature"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#be-mature"}},[e._v("#")]),e._v(" Be Mature")]),e._v(" "),i("p",[e._v('You are expected to be mature and control your behavior in a manner that adheres to basic human decency. If you are\nunable to do this you will be removed from the community. Personal attacks, spam (in any form), "doxxing", or otherwise\nacting out is not allowed.')]),e._v(" "),i("p",[e._v("This community is fairly lax in regards to moderating language. However, the following are some examples of\nbehavior that is absolutely "),i("em",[e._v("not")]),e._v(" tolerated and for which you will be removed from the community.")]),e._v(" "),i("ul",[i("li",[e._v("Racist, sexist, homophobic, transphobic, or otherwise deregatory speech, images, insinuations, or any language whose\nsole purpose is to denigrate any individual, organization, or class of individual.")]),e._v(" "),i("li",[e._v('Threats of violence against any person, group, or organization including "doxxing" of these entities.')]),e._v(" "),i("li",[e._v("Pornographic or excessively violent content.")])]),e._v(" "),i("h3",{attrs:{id:"limit-the-drama"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#limit-the-drama"}},[e._v("#")]),e._v(" Limit the Drama")]),e._v(" "),i("p",[e._v("Discussion, including linking to or discussing sites or software, that exists to cast a negative image of other\ncompanies or users is not allowed. This includes calling out hosts using nulled software, attempting to elicit negative\nreactions towards services or websites, or otherwise stirring up drama.")]),e._v(" "),i("div",{staticClass:"custom-block tip"},[i("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),i("p",[e._v("Assume someone is acting in good faith when responding to them. You don't have to agree with everyone, and you\ndon't need to respond to everything.")])]),e._v(" "),i("h3",{attrs:{id:"be-patient"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#be-patient"}},[e._v("#")]),e._v(" Be Patient")]),e._v(" "),i("p",[e._v("This is an open-source project. No members of the development team are paid in an official capacity to write,\nmaintain, nor support this software. The following actions are discouraged in this community.")]),e._v(" "),i("ul",[i("li",[e._v("Repeatedly asking identical questions within the same channel (or across channels) within short periods of time.\n"),i("ul",[i("li",[e._v("It is expected that some questions will be missed. If it has been a reasonable amount of time and your question\nremains unanswered, you're welcome to re-post it.")])])]),e._v(" "),i("li",[e._v("Keep all support questions within the realm of the support channels.")]),e._v(" "),i("li",[e._v("Do not interrupt conversations in non-support channels solely to request that someone look in a support channel\nand help you.")])]),e._v(" "),i("h3",{attrs:{id:"no-commercial-services"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#no-commercial-services"}},[e._v("#")]),e._v(" No Commercial Services")]),e._v(" "),i("p",[e._v("Discussion of paid installation/upgrade services, modifications, or any other commercial offerings is strictly\nprohibited unless otherwise noted. This also includes reaching out to individuals via Direct Message and offering\nyour services without provocation.")]),e._v(" "),i("div",{staticClass:"custom-block warning"},[i("p",{staticClass:"custom-block-title"},[e._v("Check your Username")]),e._v(" "),i("p",[e._v("Advertising commercial services within your username or display name on Discord is forbidden.")])]),e._v(" "),i("p",[i("RouterLink",{attrs:{to:"/project/about.html#sponsors"}},[e._v("Sponsors")]),e._v(" at the silver tier and higher are exempt from this rule.")],1),e._v(" "),i("h3",{attrs:{id:"no-mention-or-ping-spam"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#no-mention-or-ping-spam"}},[e._v("#")]),e._v(" No Mention or Ping Spam")]),e._v(" "),i("p",[e._v("Please, do not direct message any administrative, development, or notable community members without first\nchecking with them. Keep all support queries within the public support channels unless you have been directly\nasked to move it elsewhere.")]),e._v(" "),i("p",[i("em",[e._v("But what if I am trying to respond back to someone?")]),e._v(" That is fine! We only ask that you not mention people\ndirectly if they're not already involved in a discussion with you.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{416:function(e,t,i){"use strict";i.r(t);var o=i(48),n=Object(o.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("h1",{attrs:{id:"community-standards"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#community-standards"}},[e._v("#")]),e._v(" Community Standards")]),e._v(" "),i("p",[e._v("Pterodactyl has grown from a community of tens in 2015 to a community of thousands in 2020. During that time\nthere have been countless growing pains and community has changed in an innumerable number of ways. At our heart\nhowever, Pterodactyl continues to exist for one purpose: to be "),i("em",[e._v("the")]),e._v(" platform for running your game servers.")]),e._v(" "),i("p",[e._v("In order to keep true to that goal, and continue to foster one of the largest open-source game panel communities\nout there, we've adopted a simple set of guidelines for participating in this community. The goal of these guidelines\nis to foster an inclusive, welcoming environment for new users, and provide a space for the thousands of existing\nusers, administrators, network owners, and hosting companies to co-exist.")]),e._v(" "),i("p",[e._v("These rules and guidelines extend to all facets of the Pterodactyl Community, including but not limited to our\nDiscord Server and all activities within the GitHub Organization.")]),e._v(" "),i("h2",{attrs:{id:"community-guidelines"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#community-guidelines"}},[e._v("#")]),e._v(" Community Guidelines")]),e._v(" "),i("p",[e._v("At the most basic level, these guidelines can be distilled down to:")]),e._v(" "),i("ol",[i("li",[e._v("Be a decent human.")]),e._v(" "),i("li",[e._v("Patience is a virtue.")])]),e._v(" "),i("h3",{attrs:{id:"be-mature"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#be-mature"}},[e._v("#")]),e._v(" Be Mature")]),e._v(" "),i("p",[e._v('You are expected to be mature and control your behavior in a manner that adheres to basic human decency. If you are\nunable to do this you will be removed from the community. Personal attacks, spam (in any form), "doxxing", or otherwise\nacting out is not allowed.')]),e._v(" "),i("p",[e._v("This community is fairly lax in regards to moderating language. However, the following are some examples of\nbehavior that is absolutely "),i("em",[e._v("not")]),e._v(" tolerated and for which you will be removed from the community.")]),e._v(" "),i("ul",[i("li",[e._v("Racist, sexist, homophobic, transphobic, or otherwise deregatory speech, images, insinuations, or any language whose\nsole purpose is to denigrate any individual, organization, or class of individual.")]),e._v(" "),i("li",[e._v('Threats of violence against any person, group, or organization including "doxxing" of these entities.')]),e._v(" "),i("li",[e._v("Pornographic or excessively violent content.")])]),e._v(" "),i("h3",{attrs:{id:"limit-the-drama"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#limit-the-drama"}},[e._v("#")]),e._v(" Limit the Drama")]),e._v(" "),i("p",[e._v("Discussion, including linking to or discussing sites or software, that exists to cast a negative image of other\ncompanies or users is not allowed. This includes calling out hosts using nulled software, attempting to elicit negative\nreactions towards services or websites, or otherwise stirring up drama.")]),e._v(" "),i("div",{staticClass:"custom-block tip"},[i("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),i("p",[e._v("Assume someone is acting in good faith when responding to them. You don't have to agree with everyone, and you\ndon't need to respond to everything.")])]),e._v(" "),i("h3",{attrs:{id:"be-patient"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#be-patient"}},[e._v("#")]),e._v(" Be Patient")]),e._v(" "),i("p",[e._v("This is an open-source project. No members of the development team are paid in an official capacity to write,\nmaintain, nor support this software. The following actions are discouraged in this community.")]),e._v(" "),i("ul",[i("li",[e._v("Repeatedly asking identical questions within the same channel (or across channels) within short periods of time.\n"),i("ul",[i("li",[e._v("It is expected that some questions will be missed. If it has been a reasonable amount of time and your question\nremains unanswered, you're welcome to re-post it.")])])]),e._v(" "),i("li",[e._v("Keep all support questions within the realm of the support channels.")]),e._v(" "),i("li",[e._v("Do not interrupt conversations in non-support channels solely to request that someone look in a support channel\nand help you.")])]),e._v(" "),i("h3",{attrs:{id:"no-commercial-services"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#no-commercial-services"}},[e._v("#")]),e._v(" No Commercial Services")]),e._v(" "),i("p",[e._v("Discussion of paid installation/upgrade services, modifications, or any other commercial offerings is strictly\nprohibited unless otherwise noted. This also includes reaching out to individuals via Direct Message and offering\nyour services without provocation.")]),e._v(" "),i("div",{staticClass:"custom-block warning"},[i("p",{staticClass:"custom-block-title"},[e._v("Check your Username")]),e._v(" "),i("p",[e._v("Advertising commercial services within your username or display name on Discord is forbidden.")])]),e._v(" "),i("p",[i("RouterLink",{attrs:{to:"/project/about.html#sponsors"}},[e._v("Sponsors")]),e._v(" at the silver tier and higher are exempt from this rule.")],1),e._v(" "),i("h3",{attrs:{id:"no-mention-or-ping-spam"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#no-mention-or-ping-spam"}},[e._v("#")]),e._v(" No Mention or Ping Spam")]),e._v(" "),i("p",[e._v("Please, do not direct message any administrative, development, or notable community members without first\nchecking with them. Keep all support queries within the public support channels unless you have been directly\nasked to move it elsewhere.")]),e._v(" "),i("p",[i("em",[e._v("But what if I am trying to respond back to someone?")]),e._v(" That is fine! We only ask that you not mention people\ndirectly if they're not already involved in a discussion with you.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/74.282a4100.js b/assets/js/74.3dbad093.js similarity index 97% rename from assets/js/74.282a4100.js rename to assets/js/74.3dbad093.js index 971fedad..f9a73ad2 100644 --- a/assets/js/74.282a4100.js +++ b/assets/js/74.3dbad093.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{416:function(e,t,o){"use strict";o.r(t);var a=o(48),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"introduction"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),o("p",[e._v("Pterodactyl is the open-source game server management panel built with PHP7, Nodejs, and Go. Designed with\nsecurity in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful\nand intuitive UI to administrators and users. What more are you waiting for? Make game servers a first-class\ncitizen on your platform today.")]),e._v(" "),o("h2",{attrs:{id:"supported-games"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#supported-games"}},[e._v("#")]),e._v(" Supported Games")]),e._v(" "),o("p",[e._v("We support a huge variety of games by utilizing Docker containers to isolate each instance, giving you the power\nto host your games across the world without having to bloat each physical machine with additional dependencies.")]),e._v(" "),o("p",[e._v("Some of our core supported games include:")]),e._v(" "),o("ul",[o("li",[e._v("Minecraft — including Spigot, Sponge, Bungeecord, Waterfall, and more")]),e._v(" "),o("li",[e._v("Rust")]),e._v(" "),o("li",[e._v("Terraria")]),e._v(" "),o("li",[e._v("Teamspeak")]),e._v(" "),o("li",[e._v("Mumble")]),e._v(" "),o("li",[e._v("Team Fortress 2")]),e._v(" "),o("li",[e._v("Counter Strike: Global Offensive")]),e._v(" "),o("li",[e._v("Garry's Mod")]),e._v(" "),o("li",[e._v("ARK: Survival Evolved")])]),e._v(" "),o("p",[e._v("In addition to our standard nest of supported games, our community is constantly pushing the limits of this software\nand there are plenty more games available provided by the community. Some of these games include:")]),e._v(" "),o("ul",[o("li",[e._v("Factorio")]),e._v(" "),o("li",[e._v("San Andreas: MP")]),e._v(" "),o("li",[e._v("Pocketmine MP")]),e._v(" "),o("li",[e._v("Squad")]),e._v(" "),o("li",[e._v("FiveM")]),e._v(" "),o("li",[e._v("Xonotic")]),e._v(" "),o("li",[e._v("Discord ATLBot")]),e._v(" "),o("li",[o("a",{attrs:{href:"https://github.com/parkervcp/eggs",target:"_blank",rel:"noopener noreferrer"}},[e._v("and many more..."),o("OutboundLink")],1)])]),e._v(" "),o("h2",{attrs:{id:"responsible-disclosure"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#responsible-disclosure"}},[e._v("#")]),e._v(" Responsible Disclosure")]),e._v(" "),o("p",[e._v("Pterodactyl is completely open-source, and as such completely open to independent users and auditors to browse our\ncode base and hunt for security issues. If you come across anything that raises red flags for you, please do not\nhesitate to reach out directly to "),o("code",[e._v("support@pterodactyl.io")]),e._v(". We ask that you please be responsible when disclosing\nany security concerns and "),o("em",[e._v("do not")]),e._v(" report them on our public facing bug tracker.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{417:function(e,t,o){"use strict";o.r(t);var a=o(48),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("h1",{attrs:{id:"introduction"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),o("p",[e._v("Pterodactyl is the open-source game server management panel built with PHP7, Nodejs, and Go. Designed with\nsecurity in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful\nand intuitive UI to administrators and users. What more are you waiting for? Make game servers a first-class\ncitizen on your platform today.")]),e._v(" "),o("h2",{attrs:{id:"supported-games"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#supported-games"}},[e._v("#")]),e._v(" Supported Games")]),e._v(" "),o("p",[e._v("We support a huge variety of games by utilizing Docker containers to isolate each instance, giving you the power\nto host your games across the world without having to bloat each physical machine with additional dependencies.")]),e._v(" "),o("p",[e._v("Some of our core supported games include:")]),e._v(" "),o("ul",[o("li",[e._v("Minecraft — including Spigot, Sponge, Bungeecord, Waterfall, and more")]),e._v(" "),o("li",[e._v("Rust")]),e._v(" "),o("li",[e._v("Terraria")]),e._v(" "),o("li",[e._v("Teamspeak")]),e._v(" "),o("li",[e._v("Mumble")]),e._v(" "),o("li",[e._v("Team Fortress 2")]),e._v(" "),o("li",[e._v("Counter Strike: Global Offensive")]),e._v(" "),o("li",[e._v("Garry's Mod")]),e._v(" "),o("li",[e._v("ARK: Survival Evolved")])]),e._v(" "),o("p",[e._v("In addition to our standard nest of supported games, our community is constantly pushing the limits of this software\nand there are plenty more games available provided by the community. Some of these games include:")]),e._v(" "),o("ul",[o("li",[e._v("Factorio")]),e._v(" "),o("li",[e._v("San Andreas: MP")]),e._v(" "),o("li",[e._v("Pocketmine MP")]),e._v(" "),o("li",[e._v("Squad")]),e._v(" "),o("li",[e._v("FiveM")]),e._v(" "),o("li",[e._v("Xonotic")]),e._v(" "),o("li",[e._v("Discord ATLBot")]),e._v(" "),o("li",[o("a",{attrs:{href:"https://github.com/parkervcp/eggs",target:"_blank",rel:"noopener noreferrer"}},[e._v("and many more..."),o("OutboundLink")],1)])]),e._v(" "),o("h2",{attrs:{id:"responsible-disclosure"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#responsible-disclosure"}},[e._v("#")]),e._v(" Responsible Disclosure")]),e._v(" "),o("p",[e._v("Pterodactyl is completely open-source, and as such completely open to independent users and auditors to browse our\ncode base and hunt for security issues. If you come across anything that raises red flags for you, please do not\nhesitate to reach out directly to "),o("code",[e._v("support@pterodactyl.io")]),e._v(". We ask that you please be responsible when disclosing\nany security concerns and "),o("em",[e._v("do not")]),e._v(" report them on our public facing bug tracker.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/75.7fd29139.js b/assets/js/75.b2e7a917.js similarity index 99% rename from assets/js/75.7fd29139.js rename to assets/js/75.b2e7a917.js index 05741dc5..e69d9515 100644 --- a/assets/js/75.7fd29139.js +++ b/assets/js/75.b2e7a917.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{418: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:"creating-ssl-certificates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-ssl-certificates"}},[e._v("#")]),e._v(" Creating SSL Certificates")]),e._v(" "),a("p",[e._v("This tutorial briefly covers creating new SSL certificates for your panel and daemon.")]),e._v(" "),a("tabs",[a("tab",{attrs:{name:"Method 1: Certbot"}},[a("p",[e._v("To begin, we will be installing certbot, a simple script that will automatically renew our certificates and allow much\ncleaner creation of them. The command below is for Ubuntu distributions, but you can always check "),a("a",{attrs:{href:"https://certbot.eff.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Certbot's official\nsite"),a("OutboundLink")],1),e._v(" for installation instructions. We have also included a command below to install certbot's\nNGINX/Apache plugin so you won't have to stop your webserver.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y certbot\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run this if you use Nginx")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y python3-certbot-nginx\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run this if you use Apache")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y python3-certbot-apache\n")])])]),a("h3",{attrs:{id:"creating-a-certificate"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-certificate"}},[e._v("#")]),e._v(" Creating a Certificate")]),e._v(" "),a("p",[e._v("After installing certbot, we need to then generate a certificate. There are a couple ways to do that, but the easiest\nis to use the webserver-specific certbot plugin you just installed.")]),e._v(" "),a("p",[e._v("Then, in the command below, you should replace "),a("code",[e._v("example.com")]),e._v(" with the domain you would like to generate a certificate\nfor. If you have multiple domains you would like certificates for, simply add more "),a("code",[e._v("-d anotherdomain.com")]),e._v(" flags to the\ncommand. You can also look into generating a wildcard certificate but that is not covered in this tutorial.")]),e._v(" "),a("p",[e._v("Since we are using certbot's NGINX/Apache plugin, you won't need to restart your webserver to have the certificate\napplied (assuming that you've already configured the webservers to use SSL).")]),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("# Nginx")]),e._v("\ncertbot certonly --nginx -d example.com\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Apache")]),e._v("\ncertbot certonly --apache -d example.com\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Standalone - Use this if neither works. Make sure to stop your webserver first when using this method.")]),e._v("\ncertbot certonly --standalone -d example.com\n")])])]),a("h3",{attrs:{id:"auto-renewal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-renewal"}},[e._v("#")]),e._v(" Auto Renewal")]),e._v(" "),a("p",[e._v("You'll also probably want to configure automatic renewal by adding the command below to a cronjob that runs daily.\nYou can add the command below to that crontab. For advanced users, we suggest installing and using "),a("a",{attrs:{href:"https://acme.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("acme.sh"),a("OutboundLink")],1),e._v("\nwhich provides more options (see below), and is much more powerful than certbot.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("certbot renew\n")])])]),a("h3",{attrs:{id:"troubleshooting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),a("p",[e._v("If you get an "),a("code",[e._v("Insecure Connection")]),e._v(" or related error when trying to access your panel, it is likely that the SSL certificate has expired.\nThis can be easily fixed by renewing the SSL certificate, although using the command "),a("code",[e._v("certbot renew")]),e._v(" won't do the job. As it'll give a error like: "),a("code",[e._v("Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error")]),e._v(".\nThis will happen especially if you're running NGINX instead of Apache. The solution for this is to stop NGINX, then renew the certificate, finally restart NGINX.")]),e._v(" "),a("p",[e._v("Stop NGINX:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl stop nginx\n")])])]),a("p",[e._v("Renew the certificate:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("certbot renew\n")])])]),a("p",[e._v("Once the process has complete, you can restart the NGINX service:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl start nginx\n")])])])]),e._v(" "),a("tab",{attrs:{name:"Method 2: acme.sh (Cloudflare)"}},[a("p",[e._v("This is for advanced users, of which their server systems do not have access to port 80. The command below is for Ubuntu distributions and CloudFlare API (you may google for other APIs for other DNS providers), but you can always check "),a("a",{attrs:{href:"https://github.com/Neilpang/acme.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("acme.sh's official site"),a("OutboundLink")],1),e._v(" for installation instructions.")]),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(" https://get.acme.sh "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sh")]),e._v("\n")])])]),a("h3",{attrs:{id:"obtaining-cloudflare-api-key"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#obtaining-cloudflare-api-key"}},[e._v("#")]),e._v(" Obtaining CloudFlare API Key")]),e._v(" "),a("p",[e._v('After installing acme.sh, we need to fetch a CloudFlare API key. Please make sure that a DNS record (A or CNAME record) is pointing to your target node, and set the cloud to grey (bypassing CloudFlare proxy). Then go to My Profile > API keys and on Global API Key subtab, click on "view", enter your CloudFlare password, and copy the API key to clipboard.')]),e._v(" "),a("h3",{attrs:{id:"creating-a-certificate-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-certificate-2"}},[e._v("#")]),e._v(" Creating a Certificate")]),e._v(" "),a("p",[e._v("Since the configuration file is based on Certbot, we need to create the folder manually.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" /etc/letsencrypt/live/example.com\n")])])]),a("p",[e._v("After installing certbot and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials.")]),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("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CF_Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Your_CloudFlare_API_Key"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CF_Email")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Your_CloudFlare_Account@example.com"')]),e._v("\n")])])]),a("p",[e._v("Then create the certificate.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("acme.sh --issue --standalone -d "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"example.com"')]),e._v(" --dns dns_cf "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n--key-file /etc/letsencrypt/live/example.com/privkey.pem "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n--fullchain-file /etc/letsencrypt/live/example.com/fullchain.pem \n")])])]),a("h3",{attrs:{id:"auto-renewal-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-renewal-2"}},[e._v("#")]),e._v(" Auto Renewal")]),e._v(" "),a("p",[e._v("After running the script for the first time, it will be added to the crontab automatically. You may edit the auto renewal interval by editing the crontab.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("crontab")]),e._v(" -e\n")])])])])],1)],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{419: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:"creating-ssl-certificates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-ssl-certificates"}},[e._v("#")]),e._v(" Creating SSL Certificates")]),e._v(" "),a("p",[e._v("This tutorial briefly covers creating new SSL certificates for your panel and daemon.")]),e._v(" "),a("tabs",[a("tab",{attrs:{name:"Method 1: Certbot"}},[a("p",[e._v("To begin, we will be installing certbot, a simple script that will automatically renew our certificates and allow much\ncleaner creation of them. The command below is for Ubuntu distributions, but you can always check "),a("a",{attrs:{href:"https://certbot.eff.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Certbot's official\nsite"),a("OutboundLink")],1),e._v(" for installation instructions. We have also included a command below to install certbot's\nNGINX/Apache plugin so you won't have to stop your webserver.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" update\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y certbot\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run this if you use Nginx")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y python3-certbot-nginx\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run this if you use Apache")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" -y python3-certbot-apache\n")])])]),a("h3",{attrs:{id:"creating-a-certificate"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-certificate"}},[e._v("#")]),e._v(" Creating a Certificate")]),e._v(" "),a("p",[e._v("After installing certbot, we need to then generate a certificate. There are a couple ways to do that, but the easiest\nis to use the webserver-specific certbot plugin you just installed.")]),e._v(" "),a("p",[e._v("Then, in the command below, you should replace "),a("code",[e._v("example.com")]),e._v(" with the domain you would like to generate a certificate\nfor. If you have multiple domains you would like certificates for, simply add more "),a("code",[e._v("-d anotherdomain.com")]),e._v(" flags to the\ncommand. You can also look into generating a wildcard certificate but that is not covered in this tutorial.")]),e._v(" "),a("p",[e._v("Since we are using certbot's NGINX/Apache plugin, you won't need to restart your webserver to have the certificate\napplied (assuming that you've already configured the webservers to use SSL).")]),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("# Nginx")]),e._v("\ncertbot certonly --nginx -d example.com\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Apache")]),e._v("\ncertbot certonly --apache -d example.com\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Standalone - Use this if neither works. Make sure to stop your webserver first when using this method.")]),e._v("\ncertbot certonly --standalone -d example.com\n")])])]),a("h3",{attrs:{id:"auto-renewal"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-renewal"}},[e._v("#")]),e._v(" Auto Renewal")]),e._v(" "),a("p",[e._v("You'll also probably want to configure automatic renewal by adding the command below to a cronjob that runs daily.\nYou can add the command below to that crontab. For advanced users, we suggest installing and using "),a("a",{attrs:{href:"https://acme.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("acme.sh"),a("OutboundLink")],1),e._v("\nwhich provides more options (see below), and is much more powerful than certbot.")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("certbot renew\n")])])]),a("h3",{attrs:{id:"troubleshooting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),a("p",[e._v("If you get an "),a("code",[e._v("Insecure Connection")]),e._v(" or related error when trying to access your panel, it is likely that the SSL certificate has expired.\nThis can be easily fixed by renewing the SSL certificate, although using the command "),a("code",[e._v("certbot renew")]),e._v(" won't do the job. As it'll give a error like: "),a("code",[e._v("Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error")]),e._v(".\nThis will happen especially if you're running NGINX instead of Apache. The solution for this is to stop NGINX, then renew the certificate, finally restart NGINX.")]),e._v(" "),a("p",[e._v("Stop NGINX:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl stop nginx\n")])])]),a("p",[e._v("Renew the certificate:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("certbot renew\n")])])]),a("p",[e._v("Once the process has complete, you can restart the NGINX service:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("systemctl start nginx\n")])])])]),e._v(" "),a("tab",{attrs:{name:"Method 2: acme.sh (Cloudflare)"}},[a("p",[e._v("This is for advanced users, of which their server systems do not have access to port 80. The command below is for Ubuntu distributions and CloudFlare API (you may google for other APIs for other DNS providers), but you can always check "),a("a",{attrs:{href:"https://github.com/Neilpang/acme.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("acme.sh's official site"),a("OutboundLink")],1),e._v(" for installation instructions.")]),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(" https://get.acme.sh "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sh")]),e._v("\n")])])]),a("h3",{attrs:{id:"obtaining-cloudflare-api-key"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#obtaining-cloudflare-api-key"}},[e._v("#")]),e._v(" Obtaining CloudFlare API Key")]),e._v(" "),a("p",[e._v('After installing acme.sh, we need to fetch a CloudFlare API key. Please make sure that a DNS record (A or CNAME record) is pointing to your target node, and set the cloud to grey (bypassing CloudFlare proxy). Then go to My Profile > API keys and on Global API Key subtab, click on "view", enter your CloudFlare password, and copy the API key to clipboard.')]),e._v(" "),a("h3",{attrs:{id:"creating-a-certificate-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-certificate-2"}},[e._v("#")]),e._v(" Creating a Certificate")]),e._v(" "),a("p",[e._v("Since the configuration file is based on Certbot, we need to create the folder manually.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" /etc/letsencrypt/live/example.com\n")])])]),a("p",[e._v("After installing certbot and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials.")]),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("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CF_Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Your_CloudFlare_API_Key"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CF_Email")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Your_CloudFlare_Account@example.com"')]),e._v("\n")])])]),a("p",[e._v("Then create the certificate.")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("acme.sh --issue --standalone -d "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"example.com"')]),e._v(" --dns dns_cf "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n--key-file /etc/letsencrypt/live/example.com/privkey.pem "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n--fullchain-file /etc/letsencrypt/live/example.com/fullchain.pem \n")])])]),a("h3",{attrs:{id:"auto-renewal-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-renewal-2"}},[e._v("#")]),e._v(" Auto Renewal")]),e._v(" "),a("p",[e._v("After running the script for the first time, it will be added to the crontab automatically. You may edit the auto renewal interval by editing the crontab.")]),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(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("crontab")]),e._v(" -e\n")])])])])],1)],1)}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/76.52a50904.js b/assets/js/76.408e20f8.js similarity index 99% rename from assets/js/76.52a50904.js rename to assets/js/76.408e20f8.js index 1f779756..e907f055 100644 --- a/assets/js/76.52a50904.js +++ b/assets/js/76.408e20f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{419:function(a,e,s){"use strict";s.r(e);var t=s(48),n=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:"setting-up-mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-mysql"}},[a._v("#")]),a._v(" Setting up MySQL")]),a._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#creating-a-database-for-pterodactyl"}},[a._v("Creating a database for Pterodactyl")]),s("ul",[s("li",[s("a",{attrs:{href:"#logging-in"}},[a._v("Logging In")])]),s("li",[s("a",{attrs:{href:"#creating-a-user"}},[a._v("Creating a user")])]),s("li",[s("a",{attrs:{href:"#create-a-database"}},[a._v("Create a database")])]),s("li",[s("a",{attrs:{href:"#assigning-permissions"}},[a._v("Assigning permissions")])])])]),s("li",[s("a",{attrs:{href:"#creating-a-database-host-for-nodes"}},[a._v("Creating a Database Host for Nodes")]),s("ul",[s("li",[s("a",{attrs:{href:"#creating-a-user"}},[a._v("Creating a user")])]),s("li",[s("a",{attrs:{href:"#assigning-permissions"}},[a._v("Assigning permissions")])]),s("li",[s("a",{attrs:{href:"#allowing-external-database-access"}},[a._v("Allowing external database access")])])])])])]),s("p"),a._v(" "),s("h2",{attrs:{id:"creating-a-database-for-pterodactyl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-database-for-pterodactyl"}},[a._v("#")]),a._v(" Creating a database for Pterodactyl")]),a._v(" "),s("p",[a._v("MySQL is a core component of Pterodactyl Panel but it can be confusing to setup and use if you've never done so before.\nThis is a very basic tutorial that skims just enough of the surface to set MySQL up and running with the panel.\nIf you're interested in learning more, there are some great tutorials available on the Internet.")]),a._v(" "),s("h3",{attrs:{id:"logging-in"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#logging-in"}},[a._v("#")]),a._v(" Logging In")]),a._v(" "),s("p",[a._v("The first step in this process is to login to the MySQL command line where we will be executing some statements to get\nthings setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when\ninstalling MySQL. If you do not remember doing this, chances are you can just hit enter as no password is set.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("mysql -u root -p\n")])])]),s("h3",{attrs:{id:"creating-a-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user"}},[a._v("#")]),a._v(" Creating a user")]),a._v(" "),s("p",[a._v("For security sake, and due to changes in MySQL 5.7, you'll need to create a new user for the panel. To do so, we want\nto first tell MySQL to use the mysql database, which stores such information.")]),a._v(" "),s("p",[a._v("Next, we will create a user called "),s("code",[a._v("pterodactyl")]),a._v(" and allow logins from localhost which prevents any external connections\nto our database. You can also use "),s("code",[a._v("%")]),a._v(" as a wildcard or enter a numeric IP. We will also set the account password\nto "),s("code",[a._v("somePassword")]),a._v(".")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USE")]),a._v(" mysql"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Remember to change 'somePassword' below to be a unique password specific to this account.")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USER")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyl'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" IDENTIFIED "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("BY")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'somePassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-database"}},[a._v("#")]),a._v(" Create a database")]),a._v(" "),s("p",[a._v("Next, we need to create a database for the panel. In this tutorial we will be naming the database "),s("code",[a._v("panel")]),a._v(", but you can\nsubstitute that for whatever name you wish.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("DATABASE")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"assigning-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assigning-permissions"}},[a._v("#")]),a._v(" Assigning permissions")]),a._v(" "),s("p",[a._v("Finally, we need to tell MySQL that our pterodactyl user should have access to the panel database. To do this, simply\nrun the command below. If you plan on also using this MySQL instance as a database host on the Panel you'll want to\ninclude the "),s("code",[a._v("WITH GRANT OPTION")]),a._v(" (which we are doing here). If you won't be using this user as part of the host setup\nyou can remove that.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ALL")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ON")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("TO")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyl'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WITH")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("OPTION")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\nFLUSH "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h2",{attrs:{id:"creating-a-database-host-for-nodes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-database-host-for-nodes"}},[a._v("#")]),a._v(" Creating a Database Host for Nodes")]),a._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("This section covers creating a MySQL user that has permission to create and modify users. This allows the Panel to create per-server databases on the given host.")])]),a._v(" "),s("h3",{attrs:{id:"creating-a-user-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-2"}},[a._v("#")]),a._v(" Creating a user")]),a._v(" "),s("p",[a._v("If your database is on a different host than the one where your Panel or Daemon is installed make sure to use the IP address of the machine the Panel is running on. If you use "),s("code",[a._v("127.0.0.1")]),a._v(" and try to connect externally, you will receive a connection refused error.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USE")]),a._v(" mysql"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# You should change the username and password below to something unique.")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USER")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyluser'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" IDENTIFIED "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("BY")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'somepassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"assigning-permissions-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assigning-permissions-2"}},[a._v("#")]),a._v(" Assigning permissions")]),a._v(" "),s("p",[a._v("The command below will give your newly created user the ability to create additional users, as well as create and destroy databases. As above, ensure "),s("code",[a._v("127.0.0.1")]),a._v(" matches the IP address you used in the previous command.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ALL")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ON")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("TO")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyluser'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WITH")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("OPTION")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\nFLUSH "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"allowing-external-database-access"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#allowing-external-database-access"}},[a._v("#")]),a._v(" Allowing external database access")]),a._v(" "),s("p",[a._v("Chances are you'll need to allow external access to this MySQL instance in order to allow servers to connect to it. To do this, open "),s("code",[a._v("my.cnf")]),a._v(", which varies in location depending on your OS and how MySQL was installed.")]),a._v(" "),s("p",[a._v("More recent versions of MySQL have moved the default configuration to "),s("code",[a._v("mysql.conf.d/mysqld.cnf")]),a._v(" or for MariaDB installations the default configuration should be in "),s("code",[a._v("50-server.cnf")]),a._v(". "),s("em",[a._v("However")]),a._v(", "),s("code",[a._v("my.cnf")]),a._v(" has been changed to update the default configurations so you don't edit your default configuration files (this is now considered bad practice)!")]),a._v(" "),s("p",[a._v("If you open "),s("code",[a._v("my.cnf")]),a._v(", you'll want to add the lines:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[mysqld]\nbind-address=0.0.0.0\n")])])]),s("p",[a._v("This will override the default MySQL configuration, which by default will only accept requests from lo. Updating this will allow connections on all interfaces, and thus, external connections.")]),a._v(" "),s("p",[a._v("If your Node and Daemon are on the same machine, and you won't be needing external access, you can also use the "),s("code",[a._v("docker0")]),a._v(" interface IP address, rather than "),s("code",[a._v("127.0.0.1")]),a._v(". This IP address can be found by running "),s("code",[a._v("ip addr | grep docker0")]),a._v(", and it likely looks something like "),s("code",[a._v("172.x.x.x")]),a._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{420:function(a,e,s){"use strict";s.r(e);var t=s(48),n=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:"setting-up-mysql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-mysql"}},[a._v("#")]),a._v(" Setting up MySQL")]),a._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#creating-a-database-for-pterodactyl"}},[a._v("Creating a database for Pterodactyl")]),s("ul",[s("li",[s("a",{attrs:{href:"#logging-in"}},[a._v("Logging In")])]),s("li",[s("a",{attrs:{href:"#creating-a-user"}},[a._v("Creating a user")])]),s("li",[s("a",{attrs:{href:"#create-a-database"}},[a._v("Create a database")])]),s("li",[s("a",{attrs:{href:"#assigning-permissions"}},[a._v("Assigning permissions")])])])]),s("li",[s("a",{attrs:{href:"#creating-a-database-host-for-nodes"}},[a._v("Creating a Database Host for Nodes")]),s("ul",[s("li",[s("a",{attrs:{href:"#creating-a-user"}},[a._v("Creating a user")])]),s("li",[s("a",{attrs:{href:"#assigning-permissions"}},[a._v("Assigning permissions")])]),s("li",[s("a",{attrs:{href:"#allowing-external-database-access"}},[a._v("Allowing external database access")])])])])])]),s("p"),a._v(" "),s("h2",{attrs:{id:"creating-a-database-for-pterodactyl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-database-for-pterodactyl"}},[a._v("#")]),a._v(" Creating a database for Pterodactyl")]),a._v(" "),s("p",[a._v("MySQL is a core component of Pterodactyl Panel but it can be confusing to setup and use if you've never done so before.\nThis is a very basic tutorial that skims just enough of the surface to set MySQL up and running with the panel.\nIf you're interested in learning more, there are some great tutorials available on the Internet.")]),a._v(" "),s("h3",{attrs:{id:"logging-in"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#logging-in"}},[a._v("#")]),a._v(" Logging In")]),a._v(" "),s("p",[a._v("The first step in this process is to login to the MySQL command line where we will be executing some statements to get\nthings setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when\ninstalling MySQL. If you do not remember doing this, chances are you can just hit enter as no password is set.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("mysql -u root -p\n")])])]),s("h3",{attrs:{id:"creating-a-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user"}},[a._v("#")]),a._v(" Creating a user")]),a._v(" "),s("p",[a._v("For security sake, and due to changes in MySQL 5.7, you'll need to create a new user for the panel. To do so, we want\nto first tell MySQL to use the mysql database, which stores such information.")]),a._v(" "),s("p",[a._v("Next, we will create a user called "),s("code",[a._v("pterodactyl")]),a._v(" and allow logins from localhost which prevents any external connections\nto our database. You can also use "),s("code",[a._v("%")]),a._v(" as a wildcard or enter a numeric IP. We will also set the account password\nto "),s("code",[a._v("somePassword")]),a._v(".")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USE")]),a._v(" mysql"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Remember to change 'somePassword' below to be a unique password specific to this account.")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USER")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyl'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" IDENTIFIED "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("BY")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'somePassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-database"}},[a._v("#")]),a._v(" Create a database")]),a._v(" "),s("p",[a._v("Next, we need to create a database for the panel. In this tutorial we will be naming the database "),s("code",[a._v("panel")]),a._v(", but you can\nsubstitute that for whatever name you wish.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("DATABASE")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"assigning-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assigning-permissions"}},[a._v("#")]),a._v(" Assigning permissions")]),a._v(" "),s("p",[a._v("Finally, we need to tell MySQL that our pterodactyl user should have access to the panel database. To do this, simply\nrun the command below. If you plan on also using this MySQL instance as a database host on the Panel you'll want to\ninclude the "),s("code",[a._v("WITH GRANT OPTION")]),a._v(" (which we are doing here). If you won't be using this user as part of the host setup\nyou can remove that.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ALL")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ON")]),a._v(" panel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("TO")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyl'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WITH")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("OPTION")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\nFLUSH "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h2",{attrs:{id:"creating-a-database-host-for-nodes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-database-host-for-nodes"}},[a._v("#")]),a._v(" Creating a Database Host for Nodes")]),a._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("This section covers creating a MySQL user that has permission to create and modify users. This allows the Panel to create per-server databases on the given host.")])]),a._v(" "),s("h3",{attrs:{id:"creating-a-user-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-user-2"}},[a._v("#")]),a._v(" Creating a user")]),a._v(" "),s("p",[a._v("If your database is on a different host than the one where your Panel or Daemon is installed make sure to use the IP address of the machine the Panel is running on. If you use "),s("code",[a._v("127.0.0.1")]),a._v(" and try to connect externally, you will receive a connection refused error.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USE")]),a._v(" mysql"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# You should change the username and password below to something unique.")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("CREATE")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("USER")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyluser'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" IDENTIFIED "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("BY")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'somepassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"assigning-permissions-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assigning-permissions-2"}},[a._v("#")]),a._v(" Assigning permissions")]),a._v(" "),s("p",[a._v("The command below will give your newly created user the ability to create additional users, as well as create and destroy databases. As above, ensure "),s("code",[a._v("127.0.0.1")]),a._v(" matches the IP address you used in the previous command.")]),a._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ALL")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("ON")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("*")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("TO")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'pterodactyluser'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("@'127.0.0.1'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("WITH")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("GRANT")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("OPTION")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\nFLUSH "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("PRIVILEGES")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v("\n")])])]),s("h3",{attrs:{id:"allowing-external-database-access"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#allowing-external-database-access"}},[a._v("#")]),a._v(" Allowing external database access")]),a._v(" "),s("p",[a._v("Chances are you'll need to allow external access to this MySQL instance in order to allow servers to connect to it. To do this, open "),s("code",[a._v("my.cnf")]),a._v(", which varies in location depending on your OS and how MySQL was installed.")]),a._v(" "),s("p",[a._v("More recent versions of MySQL have moved the default configuration to "),s("code",[a._v("mysql.conf.d/mysqld.cnf")]),a._v(" or for MariaDB installations the default configuration should be in "),s("code",[a._v("50-server.cnf")]),a._v(". "),s("em",[a._v("However")]),a._v(", "),s("code",[a._v("my.cnf")]),a._v(" has been changed to update the default configurations so you don't edit your default configuration files (this is now considered bad practice)!")]),a._v(" "),s("p",[a._v("If you open "),s("code",[a._v("my.cnf")]),a._v(", you'll want to add the lines:")]),a._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("[mysqld]\nbind-address=0.0.0.0\n")])])]),s("p",[a._v("This will override the default MySQL configuration, which by default will only accept requests from lo. Updating this will allow connections on all interfaces, and thus, external connections.")]),a._v(" "),s("p",[a._v("If your Node and Daemon are on the same machine, and you won't be needing external access, you can also use the "),s("code",[a._v("docker0")]),a._v(" interface IP address, rather than "),s("code",[a._v("127.0.0.1")]),a._v(". This IP address can be found by running "),s("code",[a._v("ip addr | grep docker0")]),a._v(", and it likely looks something like "),s("code",[a._v("172.x.x.x")]),a._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/77.c4108655.js b/assets/js/77.87c74d94.js similarity index 99% rename from assets/js/77.c4108655.js rename to assets/js/77.87c74d94.js index b8ef7213..fa700edd 100644 --- a/assets/js/77.c4108655.js +++ b/assets/js/77.87c74d94.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{420:function(t,e,a){"use strict";a.r(e);var s=a(48),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"additional-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[t._v("#")]),t._v(" Additional Configuration")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#private-registries"}},[t._v("Private Registries")]),a("ul",[a("li",[a("a",{attrs:{href:"#available-keys"}},[t._v("Available Keys")])]),a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#custom-network-interfaces"}},[t._v("Custom Network Interfaces")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#enabling-cloudflare-proxy"}},[t._v("Enabling Cloudflare proxy")])]),a("li",[a("a",{attrs:{href:"#throttles-limits"}},[t._v("Throttles Limits")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#other-values"}},[t._v("Other values")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if\nyou misconfigure something. Proceed only if you know what each configuration value does.")])]),t._v(" "),a("p",[t._v("You must apply all changes to your Wings "),a("code",[t._v("config.yml")]),t._v(" file located at "),a("code",[t._v("/etc/pterodactyl")]),t._v(". Verify your config file using "),a("a",{attrs:{href:"http://www.yamllint.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Yaml Lint"),a("OutboundLink")],1),t._v(" should you receive errors related to YAML parsing.")]),t._v(" "),a("h2",{attrs:{id:"private-registries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#private-registries"}},[t._v("#")]),t._v(" Private Registries")]),t._v(" "),a("p",[t._v("You can use these settings to authenticate against (private) docker registries when pulling images.")]),t._v(" "),a("h3",{attrs:{id:"available-keys"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#available-keys"}},[t._v("#")]),t._v(" Available Keys")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("name")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry address")])]),t._v(" "),a("tr",[a("td",[t._v("username")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry username")])]),t._v(" "),a("tr",[a("td",[t._v("password")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry password")])])])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("docker")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("registries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("registry.example.com")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"registryusername"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"registrypassword"')]),t._v("\n")])])]),a("h2",{attrs:{id:"custom-network-interfaces"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-network-interfaces"}},[t._v("#")]),t._v(" Custom Network Interfaces")]),t._v(" "),a("p",[t._v("You can change the network interface that Wings uses for all containers by editing the network name; it is by default set to "),a("code",[t._v("pterodactyl_nw")]),t._v(". For example, to enable Docker host mode change the network name to "),a("code",[t._v("host")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Changing network mode to "),a("code",[t._v("host")]),t._v(" grants Pterodactyl direct access to all machine interfaces and Panel users can bind to any IP or Port even if it's not allocated to their container. You will lose all benefits of Docker network isolation. It is not recommended for public installations that are hosting other users' servers.")])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage-2"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("docker")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("network_mode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host \n")])])]),a("p",[t._v("After making changes, the following commands will stop the Wings, remove the Pterodactyl network, and start the Wings again. Run at your own risk.\n"),a("code",[t._v("systemctl stop wings && docker network rm pterodactyl_nw && systemctl start wings")])]),t._v(" "),a("h2",{attrs:{id:"enabling-cloudflare-proxy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-cloudflare-proxy"}},[t._v("#")]),t._v(" Enabling Cloudflare proxy")]),t._v(" "),a("p",[t._v("Cloudflare proxying of the Wings isn't beneficial since users will be connecting to the machine directly and bypassing any Cloudflare protection. As such, your Node machine IP will still be exposed.")]),t._v(" "),a("p",[t._v("To enable Cloudflare proxy, you must change the Wings port to one of the Cloudflare HTTPS ports, such as 8443, because Cloudflare only supports HTTP on port 8080. Select your Node in the Admin Panel, and on the settings tab, change the port.")]),t._v(" "),a("p",[t._v("You are unable to proxy the SFTP port through Cloudflare unless you have their enterprise plan.")]),t._v(" "),a("h2",{attrs:{id:"throttles-limits"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#throttles-limits"}},[t._v("#")]),t._v(" Throttles Limits")]),t._v(" "),a("p",[t._v("You can use these settings to adjust or completely disable throttling.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",{staticStyle:{"text-align":"left"}},[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("enabled")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("Whether or not the throttler is enabled")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("lines")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("2000")]),t._v(" "),a("td",[t._v("Total lines that can be output in a given line_reset_interval period")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("maximum_trigger_count")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),a("td",[t._v("Amount of times throttle limit can be triggered before the server will be stopped")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("line_reset_interval")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("100")]),t._v(" "),a("td",[t._v("The amount of time after which the number of lines processed is reset to 0")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("decay_interval")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("10000")]),t._v(" "),a("td",[t._v("Time in milliseconds that must pass without triggering throttle limit before trigger count is decremented")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("stop_grace_period")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("15")]),t._v(" "),a("td",[t._v("Time that a server is allowed to be stopping for before it is terminated forcefully if it triggers output throttle")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("write_limit")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),a("td",[t._v("Impose I/O write limit for backups to the disk, 0 = unlimited. Value greater than 0 throttles write speed to the set value in MiB/s")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("download_limit")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),a("td",[t._v("Impose a Network I/O read limit for archives, 0 = unlimited. Value greater than 0 throttles read speed to the set value in MiB/s.")])])])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage-3"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("throttles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("lines")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2000")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("maximum_trigger_count")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("line_reset_interval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("decay_interval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10000")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("stop_grace_period")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\n")])])]),a("h2",{attrs:{id:"other-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#other-values"}},[t._v("#")]),t._v(" Other values")]),t._v(" "),a("p",[t._v("More commonly discussed values. View all Wings config values and explanations in "),a("a",{attrs:{href:"https://github.com/pterodactyl/wings/tree/develop/config",target:"_blank",rel:"noopener noreferrer"}},[t._v("these two files."),a("OutboundLink")],1)]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("debug")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("false")]),t._v(" "),a("td",[t._v("Force Wings to run in debug mode")])]),t._v(" "),a("tr",[a("td",[t._v("tmpfs_size")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("100")]),t._v(" "),a("td",[t._v("The size of the /tmp directory in MB when mounted into a container")])]),t._v(" "),a("tr",[a("td",[t._v("websocket_log_count")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("150")]),t._v(" "),a("td",[t._v("The number of lines to display in the console")])]),t._v(" "),a("tr",[a("td",[t._v("detect_clean_exit_as_crash")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button")])]),t._v(" "),a("tr",[a("td",[t._v("(crash detection) timeout")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("60")]),t._v(" "),a("td",[t._v("Timeout between server crashes that will not cause the server to be automatically restarted")])]),t._v(" "),a("tr",[a("td",[t._v("app_name")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v('"Pterodactyl"')]),t._v(" "),a("td",[t._v("Changes the name of the daemon, shown in the panel's game console")])]),t._v(" "),a("tr",[a("td",[t._v("check_permissions_on_boot")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("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")])])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{421:function(t,e,a){"use strict";a.r(e);var s=a(48),r=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"additional-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[t._v("#")]),t._v(" Additional Configuration")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#private-registries"}},[t._v("Private Registries")]),a("ul",[a("li",[a("a",{attrs:{href:"#available-keys"}},[t._v("Available Keys")])]),a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#custom-network-interfaces"}},[t._v("Custom Network Interfaces")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#enabling-cloudflare-proxy"}},[t._v("Enabling Cloudflare proxy")])]),a("li",[a("a",{attrs:{href:"#throttles-limits"}},[t._v("Throttles Limits")]),a("ul",[a("li",[a("a",{attrs:{href:"#example-of-usage"}},[t._v("Example of usage")])])])]),a("li",[a("a",{attrs:{href:"#other-values"}},[t._v("Other values")])])])]),a("p"),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if\nyou misconfigure something. Proceed only if you know what each configuration value does.")])]),t._v(" "),a("p",[t._v("You must apply all changes to your Wings "),a("code",[t._v("config.yml")]),t._v(" file located at "),a("code",[t._v("/etc/pterodactyl")]),t._v(". Verify your config file using "),a("a",{attrs:{href:"http://www.yamllint.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Yaml Lint"),a("OutboundLink")],1),t._v(" should you receive errors related to YAML parsing.")]),t._v(" "),a("h2",{attrs:{id:"private-registries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#private-registries"}},[t._v("#")]),t._v(" Private Registries")]),t._v(" "),a("p",[t._v("You can use these settings to authenticate against (private) docker registries when pulling images.")]),t._v(" "),a("h3",{attrs:{id:"available-keys"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#available-keys"}},[t._v("#")]),t._v(" Available Keys")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("name")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry address")])]),t._v(" "),a("tr",[a("td",[t._v("username")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry username")])]),t._v(" "),a("tr",[a("td",[t._v("password")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("null")]),t._v(" "),a("td",[t._v("Registry password")])])])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("docker")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("registries")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("registry.example.com")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"registryusername"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"registrypassword"')]),t._v("\n")])])]),a("h2",{attrs:{id:"custom-network-interfaces"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-network-interfaces"}},[t._v("#")]),t._v(" Custom Network Interfaces")]),t._v(" "),a("p",[t._v("You can change the network interface that Wings uses for all containers by editing the network name; it is by default set to "),a("code",[t._v("pterodactyl_nw")]),t._v(". For example, to enable Docker host mode change the network name to "),a("code",[t._v("host")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Changing network mode to "),a("code",[t._v("host")]),t._v(" grants Pterodactyl direct access to all machine interfaces and Panel users can bind to any IP or Port even if it's not allocated to their container. You will lose all benefits of Docker network isolation. It is not recommended for public installations that are hosting other users' servers.")])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage-2"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("docker")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("network_mode")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host \n")])])]),a("p",[t._v("After making changes, the following commands will stop the Wings, remove the Pterodactyl network, and start the Wings again. Run at your own risk.\n"),a("code",[t._v("systemctl stop wings && docker network rm pterodactyl_nw && systemctl start wings")])]),t._v(" "),a("h2",{attrs:{id:"enabling-cloudflare-proxy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-cloudflare-proxy"}},[t._v("#")]),t._v(" Enabling Cloudflare proxy")]),t._v(" "),a("p",[t._v("Cloudflare proxying of the Wings isn't beneficial since users will be connecting to the machine directly and bypassing any Cloudflare protection. As such, your Node machine IP will still be exposed.")]),t._v(" "),a("p",[t._v("To enable Cloudflare proxy, you must change the Wings port to one of the Cloudflare HTTPS ports, such as 8443, because Cloudflare only supports HTTP on port 8080. Select your Node in the Admin Panel, and on the settings tab, change the port.")]),t._v(" "),a("p",[t._v("You are unable to proxy the SFTP port through Cloudflare unless you have their enterprise plan.")]),t._v(" "),a("h2",{attrs:{id:"throttles-limits"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#throttles-limits"}},[t._v("#")]),t._v(" Throttles Limits")]),t._v(" "),a("p",[t._v("You can use these settings to adjust or completely disable throttling.")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",{staticStyle:{"text-align":"left"}},[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("enabled")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("Whether or not the throttler is enabled")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("lines")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("2000")]),t._v(" "),a("td",[t._v("Total lines that can be output in a given line_reset_interval period")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("maximum_trigger_count")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),a("td",[t._v("Amount of times throttle limit can be triggered before the server will be stopped")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("line_reset_interval")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("100")]),t._v(" "),a("td",[t._v("The amount of time after which the number of lines processed is reset to 0")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("decay_interval")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("10000")]),t._v(" "),a("td",[t._v("Time in milliseconds that must pass without triggering throttle limit before trigger count is decremented")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("stop_grace_period")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("15")]),t._v(" "),a("td",[t._v("Time that a server is allowed to be stopping for before it is terminated forcefully if it triggers output throttle")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("write_limit")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),a("td",[t._v("Impose I/O write limit for backups to the disk, 0 = unlimited. Value greater than 0 throttles write speed to the set value in MiB/s")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("download_limit")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("0")]),t._v(" "),a("td",[t._v("Impose a Network I/O read limit for archives, 0 = unlimited. Value greater than 0 throttles read speed to the set value in MiB/s.")])])])]),t._v(" "),a("h3",{attrs:{id:"example-of-usage-3"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#example-of-usage-3"}},[t._v("#")]),t._v(" Example of usage")]),t._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"}},[t._v("throttles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("enabled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean important"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("lines")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2000")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("maximum_trigger_count")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("line_reset_interval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("decay_interval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10000")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("stop_grace_period")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\n")])])]),a("h2",{attrs:{id:"other-values"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#other-values"}},[t._v("#")]),t._v(" Other values")]),t._v(" "),a("p",[t._v("More commonly discussed values. View all Wings config values and explanations in "),a("a",{attrs:{href:"https://github.com/pterodactyl/wings/tree/develop/config",target:"_blank",rel:"noopener noreferrer"}},[t._v("these two files."),a("OutboundLink")],1)]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Setting Key")]),t._v(" "),a("th",{staticStyle:{"text-align":"center"}},[t._v("Default Value")]),t._v(" "),a("th",[t._v("Notes")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("debug")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("false")]),t._v(" "),a("td",[t._v("Force Wings to run in debug mode")])]),t._v(" "),a("tr",[a("td",[t._v("tmpfs_size")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("100")]),t._v(" "),a("td",[t._v("The size of the /tmp directory in MB when mounted into a container")])]),t._v(" "),a("tr",[a("td",[t._v("websocket_log_count")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("150")]),t._v(" "),a("td",[t._v("The number of lines to display in the console")])]),t._v(" "),a("tr",[a("td",[t._v("detect_clean_exit_as_crash")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button")])]),t._v(" "),a("tr",[a("td",[t._v("(crash detection) timeout")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("60")]),t._v(" "),a("td",[t._v("Timeout between server crashes that will not cause the server to be automatically restarted")])]),t._v(" "),a("tr",[a("td",[t._v("app_name")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v('"Pterodactyl"')]),t._v(" "),a("td",[t._v("Changes the name of the daemon, shown in the panel's game console")])]),t._v(" "),a("tr",[a("td",[t._v("check_permissions_on_boot")]),t._v(" "),a("td",{staticStyle:{"text-align":"center"}},[t._v("true")]),t._v(" "),a("td",[t._v("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")])])])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/78.eff775df.js b/assets/js/78.4e09480d.js similarity index 96% rename from assets/js/78.eff775df.js rename to assets/js/78.4e09480d.js index 99b5e8c9..649689fd 100644 --- a/assets/js/78.eff775df.js +++ b/assets/js/78.4e09480d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{423: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",[a("strong",[t._v("1.4.x")])]),t._v(" "),a("td",[a("strong",[t._v("1.4.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(".")]),t._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"}},[t._v("curl")]),t._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\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 +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{424: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",[a("strong",[t._v("1.4.x")])]),t._v(" "),a("td",[a("strong",[t._v("1.4.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(".")]),t._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"}},[t._v("curl")]),t._v(" -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64\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.8b0b6dd8.js b/assets/js/app.a2e98793.js similarity index 93% rename from assets/js/app.8b0b6dd8.js rename to assets/js/app.a2e98793.js index de56b252..c8781e52 100644 --- a/assets/js/app.8b0b6dd8.js +++ b/assets/js/app.a2e98793.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],u=e[1],l=e[2],f=0,p=[];f=0&&(e=t.slice(r),t=t.slice(0,r));var i=t.indexOf("?");return i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),{path:t,query:n,hash:e}}(i.path||""),c=e&&e.path||"/",f=l.path?k(l.path,c,n||i.append):c,h=function(t,e,n){void 0===e&&(e={});var r,i=n||d;try{r=i(t||"")}catch(t){r={}}for(var o in e){var a=e[o];r[o]=Array.isArray(a)?a.map(p):p(a)}return r}(l.query,i.query,r&&r.options.parseQuery),v=i.hash||l.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:f,query:h,hash:v}}var G,K=function(){},X={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),o=i.location,s=i.route,u=i.href,l={},c=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==c?"router-link-active":c,d=null==f?"router-link-exact-active":f,h=null==this.activeClass?p:this.activeClass,m=null==this.exactActiveClass?d:this.exactActiveClass,y=s.redirectedFrom?g(null,W(s.redirectedFrom),null,n):s;l[m]=w(r,y,this.exactPath),l[h]=this.exact||this.exactPath?l[m]:function(t,e){return 0===t.path.replace(v,"/").indexOf(e.path.replace(v,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,y);var b=l[m]?this.ariaCurrentValue:null,_=function(t){Q(t)&&(e.replace?n.replace(o,K):n.push(o,K))},x={click:Q};Array.isArray(this.event)?this.event.forEach((function(t){x[t]=_})):x[this.event]=_;var S={class:l},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:u,route:s,navigate:_,isActive:l[h],isExactActive:l[m]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?t():t("span",{},C)}if("a"===this.tag)S.on=x,S.attrs={href:u,"aria-current":b};else{var O=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=H(c.path,s.params),u(c,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[i]?e(t[i],(function(){r(i+1)})):r(i+1)};r(0)}var xt={redirected:2,aborted:4,cancelled:8,duplicated:16};function St(t,e){return Ot(t,e,xt.redirected,'Redirected when going from "'+t.fullPath+'" to "'+function(t){if("string"==typeof t)return t;if("path"in t)return t.path;var e={};return kt.forEach((function(n){n in t&&(e[n]=t[n])})),JSON.stringify(e,null,2)}(e)+'" via a navigation guard.')}function Ct(t,e){return Ot(t,e,xt.cancelled,'Navigation cancelled from "'+t.fullPath+'" to "'+e.fullPath+'" with a new navigation.')}function Ot(t,e,n,r){var i=new Error(r);return i._isRouter=!0,i.from=t,i.to=e,i.type=n,i}var kt=["params","query","hash"];function Pt(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function Et(t,e){return Pt(t)&&t._isRouter&&(null==e||t.type===e)}function jt(t){return function(e,n,r){var i=!1,o=0,a=null;At(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){i=!0,o++;var u,l=Lt((function(e){var i;((i=e).__esModule||Tt&&"Module"===i[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:G.extend(e),n.components[s]=e,--o<=0&&r()})),c=Lt((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Pt(t)?t:new Error(e),r(a))}));try{u=t(l,c)}catch(t){c(t)}if(u)if("function"==typeof u.then)u.then(l,c);else{var f=u.component;f&&"function"==typeof f.then&&f.then(l,c)}}})),i||r()}}function At(t,e){return $t(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function $t(t){return Array.prototype.concat.apply([],t)}var Tt="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Lt(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Rt=function(t,e){this.router=t,this.base=function(t){if(!t)if(J){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=y,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Dt(t,e,n,r){var i=At(t,(function(t,r,i,o){var a=function(t,e){"function"!=typeof t&&(t=G.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,i,o)})):n(a,r,i,o)}));return $t(r?i.reverse():i)}function It(t,e){if(e)return function(){return t.apply(e,arguments)}}Rt.prototype.listen=function(t){this.cb=t},Rt.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Rt.prototype.onError=function(t){this.errorCbs.push(t)},Rt.prototype.transitionTo=function(t,e,n){var r,i=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var o=this.current;this.confirmTransition(r,(function(){i.updateRoute(r),e&&e(r),i.ensureURL(),i.router.afterHooks.forEach((function(t){t&&t(r,o)})),i.ready||(i.ready=!0,i.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!i.ready&&(Et(t,xt.redirected)&&o===y||(i.ready=!0,i.readyErrorCbs.forEach((function(e){e(t)}))))}))},Rt.prototype.confirmTransition=function(t,e,n){var r=this,i=this.current;this.pending=t;var o,a,s=function(t){!Et(t)&&Pt(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},u=t.matched.length-1,l=i.matched.length-1;if(w(t,i)&&u===l&&t.matched[u]===i.matched[l])return this.ensureURL(),s(((a=Ot(o=i,t,xt.duplicated,'Avoided redundant navigation to current location: "'+o.fullPath+'".')).name="NavigationDuplicated",a));var c=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=yt&&n;r&&this.listeners.push(ut());var i=function(){var n=t.current,i=Nt(t.base);t.current===y&&i===t._startLocation||t.transitionTo(i,(function(t){r&<(e,t,n,!0)}))};window.addEventListener("popstate",i),this.listeners.push((function(){window.removeEventListener("popstate",i)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){bt(P(r.base+t.fullPath)),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){_t(P(r.base+t.fullPath)),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Nt(this.base)!==this.current.fullPath){var e=P(this.base+this.current.fullPath);t?bt(e):_t(e)}},e.prototype.getCurrentLocation=function(){return Nt(this.base)},e}(Rt);function Nt(t){var e=window.location.pathname;return t&&0===e.toLowerCase().indexOf(t.toLowerCase())&&(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ut=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Nt(t);if(!/^\/#/.test(e))return window.location.replace(P(t+"/#"+e)),!0}(this.base)||Ft()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=yt&&e;n&&this.listeners.push(ut());var r=function(){var e=t.current;Ft()&&t.transitionTo(Bt(),(function(r){n&<(t.router,r,e,!0),yt||Vt(r.fullPath)}))},i=yt?"popstate":"hashchange";window.addEventListener(i,r),this.listeners.push((function(){window.removeEventListener(i,r)}))}},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){qt(t.fullPath),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){Vt(t.fullPath),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Bt()!==e&&(t?qt(e):Vt(e))},e.prototype.getCurrentLocation=function(){return Bt()},e}(Rt);function Ft(){var t=Bt();return"/"===t.charAt(0)||(Vt("/"+t),!1)}function Bt(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function zt(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function qt(t){yt?bt(zt(t)):window.location.hash=t}function Vt(t){yt?_t(zt(t)):window.location.replace(zt(t))}var Ht=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Et(t,xt.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Rt),Wt=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=tt(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!yt&&!1!==t.fallback,this.fallback&&(e="hash"),J||(e="abstract"),this.mode=e,e){case"history":this.history=new Mt(this,t.base);break;case"hash":this.history=new Ut(this,t.base,this.fallback);break;case"abstract":this.history=new Ht(this,t.base);break;default:0}},Gt={currentRoute:{configurable:!0}};function Kt(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Wt.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Gt.currentRoute.get=function(){return this.history&&this.history.current},Wt.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Mt||n instanceof Ut){var r=function(t){n.setupListeners(),function(t){var r=n.current,i=e.options.scrollBehavior;yt&&i&&"fullPath"in t&<(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Wt.prototype.beforeEach=function(t){return Kt(this.beforeHooks,t)},Wt.prototype.beforeResolve=function(t){return Kt(this.resolveHooks,t)},Wt.prototype.afterEach=function(t){return Kt(this.afterHooks,t)},Wt.prototype.onReady=function(t,e){this.history.onReady(t,e)},Wt.prototype.onError=function(t){this.history.onError(t)},Wt.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Wt.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Wt.prototype.go=function(t){this.history.go(t)},Wt.prototype.back=function(){this.go(-1)},Wt.prototype.forward=function(){this.go(1)},Wt.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Wt.prototype.resolve=function(t,e,n){var r=W(t,e=e||this.history.current,n,this),i=this.match(r,e),o=i.redirectedFrom||i.fullPath;return{location:r,route:i,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?P(t+"/"+r):r}(this.history.base,o,this.mode),normalizedTo:r,resolved:i}},Wt.prototype.getRoutes=function(){return this.matcher.getRoutes()},Wt.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Wt.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Wt.prototype,Gt),Wt.install=function t(e){if(!t.installed||G!==e){t.installed=!0,G=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",C),e.component("RouterLink",X);var i=e.config.optionMergeStrategies;i.beforeRouteEnter=i.beforeRouteLeave=i.beforeRouteUpdate=i.created}},Wt.version="3.5.1",Wt.isNavigationFailure=Et,Wt.NavigationFailureType=xt,Wt.START_LOCATION=y,J&&window.Vue&&window.Vue.use(Wt);var Xt=Wt;n(51),n(197),n(199),n(144),n(145),n(71),n(110),n(52);function Qt(t){t.locales&&Object.keys(t.locales).forEach((function(e){t.locales[e].path=e})),Object.freeze(t)}n(201),n(146),n(50),n(202),n(70),n(44),n(61),n(93);function Jt(t){return(Jt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var Yt=n(31),Zt={DropdownLink:function(){return Promise.all([n.e(0),n.e(7)]).then(n.bind(null,324))},DropdownTransition:function(){return Promise.all([n.e(0),n.e(18)]).then(n.bind(null,321))},Home:function(){return Promise.all([n.e(2),n.e(8)]).then(n.bind(null,341))},Layout:function(){return Promise.all([n.e(0),n.e(2),n.e(1),n.e(4)]).then(n.bind(null,364))},NavLink:function(){return n.e(10).then(n.bind(null,315))},NavLinks:function(){return Promise.all([n.e(0),n.e(6)]).then(n.bind(null,325))},Navbar:function(){return Promise.all([n.e(0),n.e(5)]).then(n.bind(null,342))},NotFound:function(){return n.e(24).then(n.bind(null,365))},Page:function(){return n.e(15).then(n.bind(null,343))},SearchBox:function(){return n.e(13).then(n.bind(null,331))},Sidebar:function(){return Promise.all([n.e(0),n.e(1),n.e(9)]).then(n.bind(null,344))},SidebarButton:function(){return n.e(25).then(n.bind(null,333))},SidebarGroup:function(){return Promise.all([n.e(0),n.e(1)]).then(n.bind(null,345))},SidebarLink:function(){return n.e(16).then(n.bind(null,334))},SlickCarousel:function(){return Promise.all([n.e(2),n.e(26)]).then(n.bind(null,330))},VersionSelect:function(){return n.e(11).then(n.bind(null,346))},VersionSelectItem:function(){return n.e(27).then(n.bind(null,332))}},te={"v-680eebc3":function(){return n.e(28).then(n.bind(null,366))},"v-4e72e1d8":function(){return n.e(29).then(n.bind(null,367))},"v-7d127123":function(){return n.e(30).then(n.bind(null,368))},"v-4a1e6e3a":function(){return n.e(12).then(n.bind(null,369))},"v-10fe793a":function(){return n.e(31).then(n.bind(null,370))},"v-622f23e3":function(){return n.e(17).then(n.bind(null,371))},"v-ef34fffa":function(){return n.e(32).then(n.bind(null,372))},"v-090070fa":function(){return n.e(33).then(n.bind(null,373))},"v-67c3f2ba":function(){return n.e(14).then(n.bind(null,374))},"v-0af75f63":function(){return n.e(34).then(n.bind(null,375))},"v-cc322cfa":function(){return n.e(35).then(n.bind(null,376))},"v-4d5d0f9b":function(){return n.e(36).then(n.bind(null,377))},"v-22a01883":function(){return n.e(37).then(n.bind(null,378))},"v-047b1c1f":function(){return n.e(38).then(n.bind(null,379))},"v-030337f1":function(){return n.e(39).then(n.bind(null,380))},"v-26037fe3":function(){return n.e(40).then(n.bind(null,381))},"v-9619ebfa":function(){return n.e(41).then(n.bind(null,382))},"v-432db923":function(){return n.e(42).then(n.bind(null,383))},"v-3dac3903":function(){return n.e(43).then(n.bind(null,384))},"v-e046bab2":function(){return n.e(44).then(n.bind(null,385))},"v-e336830e":function(){return n.e(45).then(n.bind(null,386))},"v-7c7b3203":function(){return n.e(46).then(n.bind(null,387))},"v-07a77f72":function(){return n.e(47).then(n.bind(null,388))},"v-00d38f11":function(){return n.e(48).then(n.bind(null,389))},"v-d39223ba":function(){return n.e(19).then(n.bind(null,390))},"v-a31c3dba":function(){return n.e(49).then(n.bind(null,391))},"v-6f0eac21":function(){return n.e(50).then(n.bind(null,392))},"v-481dea23":function(){return n.e(51).then(n.bind(null,393))},"v-15b388aa":function(){return n.e(52).then(n.bind(null,394))},"v-8a6363ba":function(){return n.e(53).then(n.bind(null,395))},"v-7f0b5429":function(){return n.e(54).then(n.bind(null,396))},"v-29055241":function(){return n.e(55).then(n.bind(null,397))},"v-c0e60bfa":function(){return n.e(56).then(n.bind(null,398))},"v-589003f5":function(){return n.e(57).then(n.bind(null,399))},"v-2339aa03":function(){return n.e(58).then(n.bind(null,400))},"v-019cb63a":function(){return n.e(59).then(n.bind(null,401))},"v-7ffeb723":function(){return n.e(60).then(n.bind(null,402))},"v-9478f2ba":function(){return n.e(61).then(n.bind(null,403))},"v-4f03fe0f":function(){return n.e(62).then(n.bind(null,404))},"v-5baa92ba":function(){return n.e(63).then(n.bind(null,405))},"v-c249e07a":function(){return n.e(64).then(n.bind(null,406))},"v-27941b23":function(){return n.e(65).then(n.bind(null,407))},"v-6f4baca5":function(){return n.e(66).then(n.bind(null,408))},"v-fa75e63a":function(){return n.e(67).then(n.bind(null,409))},"v-dacf6e56":function(){return n.e(68).then(n.bind(null,410))},"v-8eec473a":function(){return n.e(69).then(n.bind(null,411))},"v-29d5bc56":function(){return n.e(70).then(n.bind(null,412))},"v-cbda523a":function(){return n.e(71).then(n.bind(null,413))},"v-a75af93a":function(){return n.e(72).then(n.bind(null,414))},"v-22ba6d3a":function(){return n.e(73).then(n.bind(null,415))},"v-d6319362":function(){return n.e(74).then(n.bind(null,416))},"v-7b99cfba":function(){return n.e(20).then(n.bind(null,417))},"v-6ec4d123":function(){return n.e(75).then(n.bind(null,418))},"v-5c5d50fa":function(){return n.e(76).then(n.bind(null,419))},"v-6cd19ba3":function(){return n.e(77).then(n.bind(null,420))},"v-55eb8eca":function(){return n.e(21).then(n.bind(null,421))},"v-1ec46263":function(){return n.e(22).then(n.bind(null,422))},"v-9213d4fa":function(){return n.e(78).then(n.bind(null,423))}};function ee(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var ne=/-(\w)/g,re=ee((function(t){return t.replace(ne,(function(t,e){return e?e.toUpperCase():""}))})),ie=/\B([A-Z])/g,oe=ee((function(t){return t.replace(ie,"-$1").toLowerCase()})),ae=ee((function(t){return t.charAt(0).toUpperCase()+t.slice(1)}));function se(t,e){if(e)return t(e)?t(e):e.includes("-")?t(ae(re(e))):t(ae(e))||t(oe(e))}var ue=Object.assign({},Zt,te),le=function(t){return ue[t]},ce=function(t){return te[t]},fe=function(t){return Zt[t]},pe=function(t){return o.a.component(t)};function de(t){return se(ce,t)}function he(t){return se(fe,t)}function ve(t){return se(le,t)}function ge(t){return se(pe,t)}function me(){for(var t=arguments.length,e=new Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:"";return t?''):""}function Oe(t,e){if(e&&Object(Yt.a)(e).filter((function(t){return t.parentNode===document.head})).forEach((function(t){return document.head.removeChild(t)})),t)return t.map((function(t){var e=document.createElement("meta");return Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])})),document.head.appendChild(e),e}))}function ke(t){for(var e=0,n=["name","property","itemprop"];e"})).join("\n "):"",this.$ssrContext.canonicalLink=Ce(this.$canonicalUrl)}var e},mounted:function(){this.currentMetaTags=Object(Yt.a)(document.querySelectorAll("meta")),this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta:function(){document.title=this.$title,document.documentElement.lang=this.$lang;var t=this.getMergedMetaTags();this.currentMetaTags=Oe(t,this.currentMetaTags)},getMergedMetaTags:function(){var t=this.$page.frontmatter.meta||[];return xe()([{name:"description",content:this.$description}],t,this.siteMeta,ke)},updateCanonicalLink:function(){Se(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",Ce(this.$canonicalUrl))}},watch:{$page:function(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy:function(){Oe(null,this.currentMetaTags),Se()}}],Ee={name:"GlobalLayout",computed:{layout:function(){var t=this.getLayout();return ye("layout",t),o.a.component(t)}},methods:{getLayout:function(){if(this.$page.path){var t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},je=n(48),Ae=Object(je.a)(Ee,(function(){var t=this.$createElement;return(this._self._c||t)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){var r;switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),(r=t[e]).push.apply(r,Object(Yt.a)(n));break;default:throw new Error("Unknown option name.")}}(Ae,"mixins",Pe);var $e=[{name:"v-680eebc3",path:"/404.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-680eebc3").then(n)}},{name:"v-4e72e1d8",path:"/",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4e72e1d8").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-7d127123",path:"/community/about.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7d127123").then(n)}},{name:"v-4a1e6e3a",path:"/community/config/eggs/creating_a_custom_egg.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4a1e6e3a").then(n)}},{name:"v-10fe793a",path:"/community/config/eggs/creating_a_custom_image.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-10fe793a").then(n)}},{name:"v-622f23e3",path:"/community/config/nodes/add_node.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-622f23e3").then(n)}},{name:"v-ef34fffa",path:"/community/customization/panel.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-ef34fffa").then(n)}},{name:"v-090070fa",path:"/community/customization/wings.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-090070fa").then(n)}},{name:"v-67c3f2ba",path:"/community/games/minecraft.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-67c3f2ba").then(n)}},{name:"v-0af75f63",path:"/community/installation-guides/panel/centos7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-0af75f63").then(n)}},{name:"v-cc322cfa",path:"/community/installation-guides/panel/centos8.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-cc322cfa").then(n)}},{name:"v-4d5d0f9b",path:"/community/installation-guides/panel/debian10.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4d5d0f9b").then(n)}},{name:"v-22a01883",path:"/community/installation-guides/panel/debian9.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-22a01883").then(n)}},{name:"v-047b1c1f",path:"/community/installation-guides/panel/ubuntu1804.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-047b1c1f").then(n)}},{name:"v-030337f1",path:"/community/installation-guides/panel/ubuntu2004.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-030337f1").then(n)}},{name:"v-26037fe3",path:"/community/installation-guides/wings/centos7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-26037fe3").then(n)}},{name:"v-9619ebfa",path:"/community/installation-guides/wings/centos8.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9619ebfa").then(n)}},{name:"v-432db923",path:"/community/installation-guides/wings/debian10.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-432db923").then(n)}},{name:"v-3dac3903",path:"/community/installation-guides/wings/debian9.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-3dac3903").then(n)}},{name:"v-e046bab2",path:"/community/installation-guides/wings/ubuntu1804.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-e046bab2").then(n)}},{name:"v-e336830e",path:"/community/installation-guides/wings/ubuntu2004.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-e336830e").then(n)}},{name:"v-7c7b3203",path:"/community/tutorials/artisan.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7c7b3203").then(n)}},{name:"v-07a77f72",path:"/daemon/0.6/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-07a77f72").then(n)}},{name:"v-00d38f11",path:"/daemon/0.6/debian_8_docker.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-00d38f11").then(n)}},{name:"v-d39223ba",path:"/daemon/0.6/installing.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-d39223ba").then(n)}},{name:"v-a31c3dba",path:"/daemon/0.6/kernel_modifications.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-a31c3dba").then(n)}},{name:"v-6f0eac21",path:"/daemon/0.6/standalone_sftp.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6f0eac21").then(n)}},{name:"v-481dea23",path:"/daemon/0.6/upgrade/0.4_to_0.5.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-481dea23").then(n)}},{name:"v-15b388aa",path:"/daemon/0.6/upgrade/0.5.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-15b388aa").then(n)}},{name:"v-8a6363ba",path:"/daemon/0.6/upgrade/0.5_to_0.6.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-8a6363ba").then(n)}},{name:"v-7f0b5429",path:"/daemon/0.6/upgrade/0.6.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7f0b5429").then(n)}},{name:"v-29055241",path:"/daemon/0.6/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-29055241").then(n)}},{name:"v-c0e60bfa",path:"/guides/mounts.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-c0e60bfa").then(n)}},{name:"v-589003f5",path:"/guides/php_upgrade.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-589003f5").then(n)}},{name:"v-2339aa03",path:"/ops/publish_release.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-2339aa03").then(n)}},{name:"v-019cb63a",path:"/panel/0.7/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-019cb63a").then(n)}},{name:"v-7ffeb723",path:"/panel/0.7/getting_started.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7ffeb723").then(n)}},{name:"v-9478f2ba",path:"/panel/0.7/troubleshooting.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9478f2ba").then(n)}},{name:"v-4f03fe0f",path:"/panel/0.7/upgrade/0.6_to_0.7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4f03fe0f").then(n)}},{name:"v-5baa92ba",path:"/panel/0.7/upgrade/0.7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-5baa92ba").then(n)}},{name:"v-c249e07a",path:"/panel/0.7/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-c249e07a").then(n)}},{name:"v-27941b23",path:"/panel/0.7/webserver_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-27941b23").then(n)}},{name:"v-6f4baca5",path:"/panel/1.0/additional_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6f4baca5").then(n)}},{name:"v-fa75e63a",path:"/panel/1.0/getting_started.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-fa75e63a").then(n)}},{name:"v-dacf6e56",path:"/panel/1.0/legacy_upgrade.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-dacf6e56").then(n)}},{name:"v-8eec473a",path:"/panel/1.0/troubleshooting.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-8eec473a").then(n)}},{name:"v-29d5bc56",path:"/panel/1.0/updating.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-29d5bc56").then(n)}},{name:"v-cbda523a",path:"/panel/1.0/webserver_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-cbda523a").then(n)}},{name:"v-a75af93a",path:"/project/about.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-a75af93a").then(n)}},{name:"v-22ba6d3a",path:"/project/community.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-22ba6d3a").then(n)}},{name:"v-d6319362",path:"/project/introduction.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-d6319362").then(n)}},{name:"v-7b99cfba",path:"/project/terms.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7b99cfba").then(n)}},{name:"v-6ec4d123",path:"/tutorials/creating_ssl_certificates.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6ec4d123").then(n)}},{name:"v-5c5d50fa",path:"/tutorials/mysql_setup.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-5c5d50fa").then(n)}},{name:"v-6cd19ba3",path:"/wings/1.0/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6cd19ba3").then(n)}},{name:"v-55eb8eca",path:"/wings/1.0/installing.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-55eb8eca").then(n)}},{name:"v-1ec46263",path:"/wings/1.0/migrating.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-1ec46263").then(n)}},{name:"v-9213d4fa",path:"/wings/1.0/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9213d4fa").then(n)}},{path:"*",component:Ae}],Te={title:"Pterodactyl",description:"Pterodactyl is an open-source game server management panel built with PHP 7, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.",base:"/",headTags:[["link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}],["link",{rel:"icon",type:"image/png",href:"/favicons/favicon-32x32.png",sizes:"32x32"}],["link",{rel:"icon",type:"image/png",href:"/favicons/favicon-16x16.png",sizes:"16x16"}],["link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#0e4688"}],["link",{rel:"manifest",href:"/favicons/site.webmanifest"}],["link",{rel:"shortcut icon",href:"/favicons/favicon.ico"}],["meta",{name:"msapplication-config",content:"/favicons/browserconfig.xml"}],["meta",{name:"theme-color",content:"#0e4688"}]],pages:[{frontmatter:{},regularPath:"/404.html",relativePath:"404.md",key:"v-680eebc3",path:"/404.html"},{title:"Home",frontmatter:{home:!0,heroImage:"/doc_pterry.png",actionText:"Get Started →",actionLink:"/project/introduction",features:[{title:"Security First",details:"Security is a first-class citizen on this platform with bcrypt hashing, AES-256-CBC encryption, and HTTPS support out of the box."},{title:"Modern Tooling",details:"Built on a modern stack utilizing the best design practices that make it easy to jump in and make modifications."},{title:"Docker to the Core",details:"All servers run in isolated Docker containers that limit attack vectors, provide strict resource limits, and provide environments tailored to each specific game."}],footer:"MIT Licensed | Copyright © 2015 - 2018 Dane Everitt & Contributors"},regularPath:"/",relativePath:"README.md",key:"v-4e72e1d8",path:"/"},{title:"Community Guides and Tutorials",frontmatter:{},regularPath:"/community/about.html",relativePath:"community/about.md",key:"v-7d127123",path:"/community/about.html",headers:[{level:2,title:"About",slug:"about"}]},{title:"Creating a Custom Egg",frontmatter:{},regularPath:"/community/config/eggs/creating_a_custom_egg.html",relativePath:"community/config/eggs/creating_a_custom_egg.md",key:"v-4a1e6e3a",path:"/community/config/eggs/creating_a_custom_egg.html",headers:[{level:2,title:"Create New Option",slug:"create-new-option"},{level:2,title:"Configure Process Management",slug:"configure-process-management"},{level:3,title:"Stop Command",slug:"stop-command"},{level:3,title:"Log Storage",slug:"log-storage"},{level:3,title:"Configuration Files",slug:"configuration-files"},{level:3,title:"Start Configuration",slug:"start-configuration"},{level:2,title:"Copy Settings From",slug:"copy-settings-from"},{level:2,title:"Egg Variables",slug:"egg-variables"},{level:2,title:"List of default variables",slug:"list-of-default-variables"}]},{title:"Creating a Custom Docker Image",frontmatter:{},regularPath:"/community/config/eggs/creating_a_custom_image.html",relativePath:"community/config/eggs/creating_a_custom_image.md",key:"v-10fe793a",path:"/community/config/eggs/creating_a_custom_image.html",headers:[{level:2,title:"Creating the Dockerfile",slug:"creating-the-dockerfile"},{level:2,title:"Installing Dependencies",slug:"installing-dependencies"},{level:2,title:"Creating a Container User",slug:"creating-a-container-user"},{level:2,title:"Work Directory & Entrypoint",slug:"work-directory-entrypoint"},{level:2,title:"Entrypoint Script",slug:"entrypoint-script"},{level:2,title:"Modifying the Startup Command",slug:"modifying-the-startup-command"},{level:2,title:"Run the Command",slug:"run-the-command"},{level:3,title:"Note",slug:"note"}]},{title:"Creating a New Node",frontmatter:{},regularPath:"/community/config/nodes/add_node.html",relativePath:"community/config/nodes/add_node.md",key:"v-622f23e3",path:"/community/config/nodes/add_node.html",headers:[{level:2,title:"Location",slug:"location"},{level:2,title:"Information Required",slug:"information-required"},{level:2,title:"Install the Daemon",slug:"install-the-daemon"},{level:2,title:"Configuring the Node",slug:"configuring-the-node"},{level:3,title:"Auto-Deploy",slug:"auto-deploy"}]},{title:"Building Panel Assets",frontmatter:{},regularPath:"/community/customization/panel.html",relativePath:"community/customization/panel.md",key:"v-ef34fffa",path:"/community/customization/panel.html",headers:[{level:2,title:"Install Dependencies",slug:"install-dependencies"},{level:2,title:"Build Panel Assets",slug:"build-panel-assets"}]},{title:"Building Wings",frontmatter:{},regularPath:"/community/customization/wings.html",relativePath:"community/customization/wings.md",key:"v-090070fa",path:"/community/customization/wings.html",headers:[{level:2,title:"Build Requirements",slug:"build-requirements"},{level:2,title:"Building",slug:"building"},{level:2,title:"Install the new binary",slug:"install-the-new-binary"},{level:2,title:"Troubleshooting",slug:"troubleshooting"}]},{title:"Minecraft",frontmatter:{},regularPath:"/community/games/minecraft.html",relativePath:"community/games/minecraft.md",key:"v-67c3f2ba",path:"/community/games/minecraft.html",headers:[{level:2,title:"Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)",slug:"configuring-a-server-network-bungeecord-waterfall-hexacord-etc"},{level:3,title:"Allocations in the Panel",slug:"allocations-in-the-panel"},{level:3,title:"proxy server settings",slug:"proxy-server-settings"},{level:3,title:"paper/spigot/bukkit settings",slug:"paper-spigot-bukkit-settings"},{level:3,title:"Firewalls",slug:"firewalls"}]},{title:"CentOS 7",frontmatter:{},regularPath:"/community/installation-guides/panel/centos7.html",relativePath:"community/installation-guides/panel/centos7.md",key:"v-0af75f63",path:"/community/installation-guides/panel/centos7.html",headers:[{level:2,title:"Install Requirements and Additional Utilities",slug:"install-requirements-and-additional-utilities"},{level:3,title:"SELinux tools",slug:"selinux-tools"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Composer",slug:"composer"},{level:2,title:"Install Utility Packages",slug:"install-utility-packages"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"CentOS 8",frontmatter:{},regularPath:"/community/installation-guides/panel/centos8.html",relativePath:"community/installation-guides/panel/centos8.md",key:"v-cc322cfa",path:"/community/installation-guides/panel/centos8.html",headers:[{level:2,title:"Install Requirements and Additional Utilities",slug:"install-requirements-and-additional-utilities"},{level:3,title:"SELinux tools",slug:"selinux-tools"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Composer",slug:"composer"},{level:2,title:"Install Utility Packages",slug:"install-utility-packages"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Debian 10",frontmatter:{},regularPath:"/community/installation-guides/panel/debian10.html",relativePath:"community/installation-guides/panel/debian10.md",key:"v-4d5d0f9b",path:"/community/installation-guides/panel/debian10.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Debian 9",frontmatter:{},regularPath:"/community/installation-guides/panel/debian9.html",relativePath:"community/installation-guides/panel/debian9.md",key:"v-22a01883",path:"/community/installation-guides/panel/debian9.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Ubuntu 18.04",frontmatter:{},regularPath:"/community/installation-guides/panel/ubuntu1804.html",relativePath:"community/installation-guides/panel/ubuntu1804.md",key:"v-047b1c1f",path:"/community/installation-guides/panel/ubuntu1804.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Ubuntu 20.04",frontmatter:{},regularPath:"/community/installation-guides/panel/ubuntu2004.html",relativePath:"community/installation-guides/panel/ubuntu2004.md",key:"v-030337f1",path:"/community/installation-guides/panel/ubuntu2004.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"CentOS 7",frontmatter:{},regularPath:"/community/installation-guides/wings/centos7.html",relativePath:"community/installation-guides/wings/centos7.md",key:"v-26037fe3",path:"/community/installation-guides/wings/centos7.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:3,title:"FirewallD Changes",slug:"firewalld-changes"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"CentOS 8",frontmatter:{},regularPath:"/community/installation-guides/wings/centos8.html",relativePath:"community/installation-guides/wings/centos8.md",key:"v-9619ebfa",path:"/community/installation-guides/wings/centos8.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:3,title:"FirewallD Changes",slug:"firewalld-changes"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Debian 10",frontmatter:{},regularPath:"/community/installation-guides/wings/debian10.html",relativePath:"community/installation-guides/wings/debian10.md",key:"v-432db923",path:"/community/installation-guides/wings/debian10.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Debian 9",frontmatter:{},regularPath:"/community/installation-guides/wings/debian9.html",relativePath:"community/installation-guides/wings/debian9.md",key:"v-3dac3903",path:"/community/installation-guides/wings/debian9.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Ubuntu 18.04",frontmatter:{},regularPath:"/community/installation-guides/wings/ubuntu1804.html",relativePath:"community/installation-guides/wings/ubuntu1804.md",key:"v-e046bab2",path:"/community/installation-guides/wings/ubuntu1804.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Ubuntu 20.04",frontmatter:{},regularPath:"/community/installation-guides/wings/ubuntu2004.html",relativePath:"community/installation-guides/wings/ubuntu2004.md",key:"v-e336830e",path:"/community/installation-guides/wings/ubuntu2004.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Artisan CLI",frontmatter:{},regularPath:"/community/tutorials/artisan.html",relativePath:"community/tutorials/artisan.md",key:"v-7c7b3203",path:"/community/tutorials/artisan.html",headers:[{level:2,title:"User Management",slug:"user-management"},{level:3,title:"Create User",slug:"create-user"},{level:3,title:"Delete User",slug:"delete-user"},{level:3,title:"Disable 2FA",slug:"disable-2fa"},{level:2,title:"Server & Node Management",slug:"server-node-management"},{level:3,title:"Create Location",slug:"create-location"},{level:3,title:"Delete Location",slug:"delete-location"},{level:3,title:"Server Bulk Power",slug:"server-bulk-power"},{level:3,title:"Server Rebuild",slug:"server-rebuild"},{level:2,title:"Panel Management",slug:"panel-management"},{level:3,title:"View Panel Info",slug:"view-panel-info"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/daemon/0.6/configuration.html",relativePath:"daemon/0.6/configuration.md",key:"v-07a77f72",path:"/daemon/0.6/configuration.html",headers:[{level:2,title:"Output Throttles",slug:"output-throttles"},{level:2,title:"Custom Network Interfaces",slug:"custom-network-interfaces"},{level:2,title:"Private Registries",slug:"private-registries"},{level:2,title:"Security Policies",slug:"security-policies"},{level:2,title:"Container Policy",slug:"container-policy"},{level:3,title:"Default Security Opts Array",slug:"default-security-opts-array"},{level:3,title:"Default Capabilities Drop Array",slug:"default-capabilities-drop-array"},{level:2,title:"Enabling Cloudflare",slug:"enabling-cloudflare"}]},{title:"Docker on Debian 8",frontmatter:{},regularPath:"/daemon/0.6/debian_8_docker.html",relativePath:"daemon/0.6/debian_8_docker.md",key:"v-00d38f11",path:"/daemon/0.6/debian_8_docker.html",headers:[{level:2,title:"Install Docker",slug:"install-docker"},{level:2,title:"Update GRUB Startup",slug:"update-grub-startup"},{level:2,title:"Add Backports Repo",slug:"add-backports-repo"},{level:2,title:"Update Software & Setup Docker",slug:"update-software-setup-docker"}]},{title:"Installation",frontmatter:{},regularPath:"/daemon/0.6/installing.html",relativePath:"daemon/0.6/installing.md",key:"v-d39223ba",path:"/daemon/0.6/installing.html",headers:[{level:2,title:"Supported Systems",slug:"supported-systems"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Installing Docker",slug:"installing-docker"},{level:3,title:"Installing Nodejs",slug:"installing-nodejs"},{level:2,title:"Installing Daemon Software",slug:"installing-daemon-software"},{level:2,title:"Configure Daemon",slug:"configure-daemon"},{level:2,title:"Starting the Daemon",slug:"starting-the-daemon"},{level:3,title:"Daemonizing (using systemd)",slug:"daemonizing-using-systemd"}]},{title:"Kernel Modifications",frontmatter:{},regularPath:"/daemon/0.6/kernel_modifications.html",relativePath:"daemon/0.6/kernel_modifications.md",key:"v-a31c3dba",path:"/daemon/0.6/kernel_modifications.html",headers:[{level:2,title:"Update Kernel",slug:"update-kernel"},{level:2,title:"Confirm Kernel",slug:"confirm-kernel"},{level:2,title:"Set Default Boot",slug:"set-default-boot"},{level:2,title:"Boot from hard disk",slug:"boot-from-hard-disk"}]},{title:"Standalone SFTP Server",frontmatter:{},regularPath:"/daemon/0.6/standalone_sftp.html",relativePath:"daemon/0.6/standalone_sftp.md",key:"v-6f0eac21",path:"/daemon/0.6/standalone_sftp.html",headers:[{level:2,title:"Disable Daemon's Server",slug:"disable-daemon-s-server"},{level:2,title:"Run the Standalone Server",slug:"run-the-standalone-server"},{level:3,title:"Start the Server",slug:"start-the-server"},{level:2,title:"Daemonize Server",slug:"daemonize-server"},{level:3,title:"Customizing Startup",slug:"customizing-startup"}]},{title:"Upgrading 0.4.X to 0.5.X",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.4_to_0.5.html",relativePath:"daemon/0.6/upgrade/0.4_to_0.5.md",key:"v-481dea23",path:"/daemon/0.6/upgrade/0.4_to_0.5.html",headers:[{level:2,title:"Docker Adjustments",slug:"docker-adjustments"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"SFTP Cleanup",slug:"sftp-cleanup"},{level:2,title:"File Migration",slug:"file-migration"},{level:3,title:"Rebuild Containers",slug:"rebuild-containers"}]},{title:"Upgrading 0.5 Series",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.5.html",relativePath:"daemon/0.6/upgrade/0.5.md",key:"v-15b388aa",path:"/daemon/0.6/upgrade/0.5.html",headers:[{level:2,title:"Download Newest Release",slug:"download-newest-release"},{level:2,title:"Update Components",slug:"update-components"}]},{title:"Upgrading 0.5.X to 0.6.X",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.5_to_0.6.html",relativePath:"daemon/0.6/upgrade/0.5_to_0.6.md",key:"v-8a6363ba",path:"/daemon/0.6/upgrade/0.5_to_0.6.html",headers:[{level:2,title:"Breaking Changes",slug:"breaking-changes"},{level:2,title:"Download Files",slug:"download-files"},{level:3,title:"Start the Daemon",slug:"start-the-daemon"},{level:2,title:"Rebuild Containers",slug:"rebuild-containers"}]},{title:"Upgrading 0.6 Series",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.6.html",relativePath:"daemon/0.6/upgrade/0.6.md",key:"v-7f0b5429",path:"/daemon/0.6/upgrade/0.6.html",headers:[{level:2,title:"Download Newest Release",slug:"download-newest-release"},{level:2,title:"Update Components",slug:"update-components"}]},{title:"Upgrading",frontmatter:{},regularPath:"/daemon/0.6/upgrading.html",relativePath:"daemon/0.6/upgrading.md",key:"v-29055241",path:"/daemon/0.6/upgrading.html",headers:[{level:2,title:"Version Specific Guides",slug:"version-specific-guides"}]},{title:"Using Mounts",frontmatter:{},regularPath:"/guides/mounts.html",relativePath:"guides/mounts.md",key:"v-c0e60bfa",path:"/guides/mounts.html",headers:[{level:2,title:"Wings Configuration",slug:"wings-configuration"},{level:2,title:"Panel Configuration",slug:"panel-configuration"},{level:3,title:"Creating a Mount",slug:"creating-a-mount"},{level:3,title:"Assigning a Mount to a Server",slug:"assigning-a-mount-to-a-server"}]},{title:"Upgrading PHP",frontmatter:{},regularPath:"/guides/php_upgrade.html",relativePath:"guides/php_upgrade.md",key:"v-589003f5",path:"/guides/php_upgrade.html",headers:[{level:2,title:"Install PHP",slug:"install-php"},{level:2,title:"Update Composer",slug:"update-composer"},{level:2,title:"Webserver Configuration",slug:"webserver-configuration"}]},{title:"Publishing a Release",frontmatter:{},regularPath:"/ops/publish_release.html",relativePath:"ops/publish_release.md",key:"v-2339aa03",path:"/ops/publish_release.html",headers:[{level:2,title:"Pick a Codename",slug:"pick-a-codename"},{level:2,title:"Create the Release Branch",slug:"create-the-release-branch"},{level:2,title:"Tag a Release",slug:"tag-a-release"},{level:3,title:"Update the Release on GitHub",slug:"update-the-release-on-github"},{level:2,title:"Generate Signatures & Hashes",slug:"generate-signatures-hashes"},{level:3,title:"Create Checksum",slug:"create-checksum"},{level:3,title:"GPG Sign Release",slug:"gpg-sign-release"},{level:3,title:"Attach to Release",slug:"attach-to-release"},{level:2,title:"Update Documentation",slug:"update-documentation"},{level:2,title:"Update CDN",slug:"update-cdn"},{level:2,title:"Make Discord Announcement",slug:"make-discord-announcement"},{level:2,title:"Example Process",slug:"example-process"}]},{title:"Environment Configuration",frontmatter:{},regularPath:"/panel/0.7/configuration.html",relativePath:"panel/0.7/configuration.md",key:"v-019cb63a",path:"/panel/0.7/configuration.html",headers:[{level:2,title:"Reporting All Exceptions",slug:"reporting-all-exceptions"},{level:2,title:"Client Databases",slug:"client-databases"},{level:2,title:"Reverse Proxy Setup",slug:"reverse-proxy-setup"},{level:3,title:"NGINX Specific Configuration",slug:"nginx-specific-configuration"},{level:3,title:"Cloudflare Specific Configuration",slug:"cloudflare-specific-configuration"},{level:2,title:"Increasing the Editable File Size",slug:"increasing-the-editable-file-size"},{level:2,title:"Disable or Modify ReCaptcha",slug:"disable-or-modify-recaptcha"},{level:3,title:"Using Your Own Keys",slug:"using-your-own-keys"}]},{title:"Getting Started",frontmatter:{},regularPath:"/panel/0.7/getting_started.html",relativePath:"panel/0.7/getting_started.md",key:"v-7ffeb723",path:"/panel/0.7/getting_started.html",headers:[{level:2,title:"Picking a Server OS",slug:"picking-a-server-os"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Example Dependency Installation",slug:"example-dependency-installation"},{level:3,title:"Installing Composer",slug:"installing-composer"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"Installation",slug:"installation"},{level:3,title:"Environment Configuration",slug:"environment-configuration"},{level:3,title:"Database Setup",slug:"database-setup"},{level:3,title:"Add The First User",slug:"add-the-first-user"},{level:3,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Queue Listeners",slug:"queue-listeners"},{level:3,title:"Crontab Configuration",slug:"crontab-configuration"},{level:3,title:"Create Queue Worker",slug:"create-queue-worker"}]},{title:"Troubleshooting",frontmatter:{},regularPath:"/panel/0.7/troubleshooting.html",relativePath:"panel/0.7/troubleshooting.md",key:"v-9478f2ba",path:"/panel/0.7/troubleshooting.html",headers:[{level:2,title:"Reading Error Logs",slug:"reading-error-logs"},{level:3,title:"Parsing the Error",slug:"parsing-the-error"},{level:3,title:"Understanding the Error",slug:"understanding-the-error"},{level:3,title:"Utilizing GREP",slug:"utilizing-grep"},{level:2,title:"Transfer Exceptions / XHR Poll Error",slug:"transfer-exceptions-xhr-poll-error"},{level:3,title:"Example Errors",slug:"example-errors"},{level:3,title:"Basic Debugging Steps",slug:"basic-debugging-steps"},{level:3,title:"More Advanced Debugging Steps",slug:"more-advanced-debugging-steps"},{level:2,title:"Invalid MAC Exception",slug:"invalid-mac-exception"},{level:2,title:"SELinux Issues",slug:"selinux-issues"},{level:3,title:"Redis Permissions Errors",slug:"redis-permissions-errors"},{level:3,title:"In case there is any weirdness with parts of the panel",slug:"in-case-there-is-any-weirdness-with-parts-of-the-panel"},{level:3,title:"Daemon Connection Errors",slug:"daemon-connection-errors"},{level:2,title:"FirewallD issues",slug:"firewalld-issues"},{level:2,title:"Database Errors",slug:"database-errors"},{level:3,title:"DatabaseController.php:142",slug:"databasecontroller-php-142"}]},{title:"Upgrading 0.6 to 0.7",frontmatter:{},regularPath:"/panel/0.7/upgrade/0.6_to_0.7.html",relativePath:"panel/0.7/upgrade/0.6_to_0.7.md",key:"v-4f03fe0f",path:"/panel/0.7/upgrade/0.6_to_0.7.html",headers:[{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Clear Compiled Assets",slug:"clear-compiled-assets"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Update Environment",slug:"update-environment"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Cleanup API Keys",slug:"cleanup-api-keys"},{level:2,title:"Set Permissions",slug:"set-permissions"}]},{title:"Upgrading 0.7 Series",frontmatter:{},regularPath:"/panel/0.7/upgrade/0.7.html",relativePath:"panel/0.7/upgrade/0.7.md",key:"v-5baa92ba",path:"/panel/0.7/upgrade/0.7.html",headers:[{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"}]},{title:"Upgrading",frontmatter:{},regularPath:"/panel/0.7/upgrading.html",relativePath:"panel/0.7/upgrading.md",key:"v-c249e07a",path:"/panel/0.7/upgrading.html",headers:[{level:2,title:"Maintenance Mode",slug:"maintenance-mode"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:2,title:"Version Specific Guides",slug:"version-specific-guides"}]},{title:"Webserver Configuration",frontmatter:{},regularPath:"/panel/0.7/webserver_configuration.html",relativePath:"panel/0.7/webserver_configuration.md",key:"v-27941b23",path:"/panel/0.7/webserver_configuration.html",headers:[{level:2,title:"NGINX",slug:"nginx"},{level:3,title:"NGINX With SSL",slug:"nginx-with-ssl"},{level:3,title:"NGINX Without SSL",slug:"nginx-without-ssl"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration"},{level:2,title:"Apache",slug:"apache"},{level:3,title:"Apache With SSL",slug:"apache-with-ssl"},{level:3,title:"Apache Without SSL",slug:"apache-without-ssl"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-2"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/panel/1.0/additional_configuration.html",relativePath:"panel/1.0/additional_configuration.md",key:"v-6f4baca5",path:"/panel/1.0/additional_configuration.html",headers:[{level:2,title:"Backups",slug:"backups"},{level:3,title:"Using S3 Backups",slug:"using-s3-backups"},{level:2,title:"reCAPTCHA",slug:"recaptcha"},{level:3,title:"Configuring reCAPTCHA",slug:"configuring-recaptcha"},{level:3,title:"Disabling reCAPTCHA",slug:"disabling-recaptcha"},{level:2,title:"2FA",slug:"_2fa"},{level:3,title:"Disable 2FA requirement",slug:"disable-2fa-requirement"},{level:3,title:"Disable 2FA for a specific user",slug:"disable-2fa-for-a-specific-user"}]},{title:"Getting Started",frontmatter:{},regularPath:"/panel/1.0/getting_started.html",relativePath:"panel/1.0/getting_started.md",key:"v-fa75e63a",path:"/panel/1.0/getting_started.html",headers:[{level:2,title:"Picking a Server OS",slug:"picking-a-server-os"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Example Dependency Installation",slug:"example-dependency-installation"},{level:3,title:"Installing Composer",slug:"installing-composer"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"Installation",slug:"installation"},{level:3,title:"Environment Configuration",slug:"environment-configuration"},{level:3,title:"Database Setup",slug:"database-setup"},{level:3,title:"Add The First User",slug:"add-the-first-user"},{level:3,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Queue Listeners",slug:"queue-listeners"},{level:3,title:"Crontab Configuration",slug:"crontab-configuration"},{level:3,title:"Create Queue Worker",slug:"create-queue-worker"}]},{title:"Legacy Upgrades",frontmatter:{},regularPath:"/panel/1.0/legacy_upgrade.html",relativePath:"panel/1.0/legacy_upgrade.md",key:"v-dacf6e56",path:"/panel/1.0/legacy_upgrade.html",headers:[{level:2,title:"Enter Maintenance Mode",slug:"enter-maintenance-mode"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Update Dependencies",slug:"update-dependencies-2"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:2,title:"Exit Maintenance Mode",slug:"exit-maintenance-mode"},{level:2,title:"Switch to Wings",slug:"switch-to-wings"}]},{title:"Troubleshooting",frontmatter:{},regularPath:"/panel/1.0/troubleshooting.html",relativePath:"panel/1.0/troubleshooting.md",key:"v-8eec473a",path:"/panel/1.0/troubleshooting.html",headers:[{level:2,title:"Reading Error Logs",slug:"reading-error-logs"},{level:3,title:"Parsing the Error",slug:"parsing-the-error"},{level:3,title:"Understanding the Error",slug:"understanding-the-error"},{level:3,title:"Utilizing GREP",slug:"utilizing-grep"},{level:2,title:"Cannot Connect to Server Errors",slug:"cannot-connect-to-server-errors"},{level:3,title:"Basic Debugging Steps",slug:"basic-debugging-steps"},{level:3,title:"More Advanced Debugging Steps",slug:"more-advanced-debugging-steps"},{level:2,title:"Invalid MAC Exception",slug:"invalid-mac-exception"},{level:2,title:"SELinux Issues",slug:"selinux-issues"},{level:3,title:"Redis Permissions Errors",slug:"redis-permissions-errors"},{level:3,title:"Wings Connection Errors",slug:"wings-connection-errors"},{level:2,title:"FirewallD issues",slug:"firewalld-issues"}]},{title:"Updating the Panel",frontmatter:{},regularPath:"/panel/1.0/updating.html",relativePath:"panel/1.0/updating.md",key:"v-29d5bc56",path:"/panel/1.0/updating.html",headers:[{level:2,title:"Panel Version Requirements",slug:"panel-version-requirements"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:3,title:"Enter Maintenance Mode",slug:"enter-maintenance-mode"},{level:3,title:"Download the Update",slug:"download-the-update"},{level:2,title:"Update Dependencies",slug:"update-dependencies-2"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:3,title:"Exit Maintenance Mode",slug:"exit-maintenance-mode"}]},{title:"Webserver Configuration",frontmatter:{},regularPath:"/panel/1.0/webserver_configuration.html",relativePath:"panel/1.0/webserver_configuration.md",key:"v-cbda523a",path:"/panel/1.0/webserver_configuration.html",headers:[{level:3,title:"Enabling Configuration",slug:"enabling-configuration"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-2"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-3"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-4"}]},{title:"About",frontmatter:{},regularPath:"/project/about.html",relativePath:"project/about.md",key:"v-a75af93a",path:"/project/about.html",headers:[{level:2,title:"Core Project Team",slug:"core-project-team"},{level:2,title:"Community Team",slug:"community-team"},{level:2,title:"Sponsors",slug:"sponsors"},{level:2,title:"License",slug:"license"},{level:2,title:"GPG Signature",slug:"gpg-signature"}]},{title:"Community Standards",frontmatter:{},regularPath:"/project/community.html",relativePath:"project/community.md",key:"v-22ba6d3a",path:"/project/community.html",headers:[{level:2,title:"Community Guidelines",slug:"community-guidelines"},{level:3,title:"Be Mature",slug:"be-mature"},{level:3,title:"Limit the Drama",slug:"limit-the-drama"},{level:3,title:"Be Patient",slug:"be-patient"},{level:3,title:"No Commercial Services",slug:"no-commercial-services"},{level:3,title:"No Mention or Ping Spam",slug:"no-mention-or-ping-spam"}]},{title:"Introduction",frontmatter:{},regularPath:"/project/introduction.html",relativePath:"project/introduction.md",key:"v-d6319362",path:"/project/introduction.html",headers:[{level:2,title:"Supported Games",slug:"supported-games"},{level:2,title:"Responsible Disclosure",slug:"responsible-disclosure"}]},{title:"Terminology",frontmatter:{},regularPath:"/project/terms.html",relativePath:"project/terms.md",key:"v-7b99cfba",path:"/project/terms.html",headers:[{level:2,title:"Example Setup Diagram",slug:"example-setup-diagram"}]},{title:"Creating SSL Certificates",frontmatter:{},regularPath:"/tutorials/creating_ssl_certificates.html",relativePath:"tutorials/creating_ssl_certificates.md",key:"v-6ec4d123",path:"/tutorials/creating_ssl_certificates.html",headers:[{level:3,title:"Creating a Certificate",slug:"creating-a-certificate"},{level:3,title:"Auto Renewal",slug:"auto-renewal"},{level:3,title:"Troubleshooting",slug:"troubleshooting"},{level:3,title:"Obtaining CloudFlare API Key",slug:"obtaining-cloudflare-api-key"},{level:3,title:"Creating a Certificate",slug:"creating-a-certificate-2"},{level:3,title:"Auto Renewal",slug:"auto-renewal-2"}]},{title:"Setting up MySQL",frontmatter:{},regularPath:"/tutorials/mysql_setup.html",relativePath:"tutorials/mysql_setup.md",key:"v-5c5d50fa",path:"/tutorials/mysql_setup.html",headers:[{level:2,title:"Creating a database for Pterodactyl",slug:"creating-a-database-for-pterodactyl"},{level:3,title:"Logging In",slug:"logging-in"},{level:3,title:"Creating a user",slug:"creating-a-user"},{level:3,title:"Create a database",slug:"create-a-database"},{level:3,title:"Assigning permissions",slug:"assigning-permissions"},{level:2,title:"Creating a Database Host for Nodes",slug:"creating-a-database-host-for-nodes"},{level:3,title:"Creating a user",slug:"creating-a-user-2"},{level:3,title:"Assigning permissions",slug:"assigning-permissions-2"},{level:3,title:"Allowing external database access",slug:"allowing-external-database-access"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/wings/1.0/configuration.html",relativePath:"wings/1.0/configuration.md",key:"v-6cd19ba3",path:"/wings/1.0/configuration.html",headers:[{level:2,title:"Private Registries",slug:"private-registries"},{level:3,title:"Available Keys",slug:"available-keys"},{level:3,title:"Example of usage",slug:"example-of-usage"},{level:2,title:"Custom Network Interfaces",slug:"custom-network-interfaces"},{level:3,title:"Example of usage",slug:"example-of-usage-2"},{level:2,title:"Enabling Cloudflare proxy",slug:"enabling-cloudflare-proxy"},{level:2,title:"Throttles Limits",slug:"throttles-limits"},{level:3,title:"Example of usage",slug:"example-of-usage-3"},{level:2,title:"Other values",slug:"other-values"}]},{title:"Installing Wings",frontmatter:{},regularPath:"/wings/1.0/installing.html",relativePath:"wings/1.0/installing.md",key:"v-55eb8eca",path:"/wings/1.0/installing.html",headers:[{level:2,title:"Supported Systems",slug:"supported-systems"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Installing Docker",slug:"installing-docker"},{level:2,title:"Installing Wings",slug:"installing-wings-2"},{level:2,title:"Configure",slug:"configure"},{level:3,title:"Starting Wings",slug:"starting-wings"},{level:3,title:"Daemonizing (using systemd)",slug:"daemonizing-using-systemd"}]},{title:"Migrating to Wings",frontmatter:{},regularPath:"/wings/1.0/migrating.html",relativePath:"wings/1.0/migrating.md",key:"v-1ec46263",path:"/wings/1.0/migrating.html",headers:[{level:2,title:"Install Wings",slug:"install-wings"},{level:2,title:"Copy New Configuration File",slug:"copy-new-configuration-file"},{level:2,title:"Remove Old Daemon",slug:"remove-old-daemon"},{level:3,title:"Remove Standalone SFTP",slug:"remove-standalone-sftp"},{level:2,title:"Daemonize Wings",slug:"daemonize-wings"}]},{title:"Upgrading Wings",frontmatter:{},regularPath:"/wings/1.0/upgrading.html",relativePath:"wings/1.0/upgrading.md",key:"v-9213d4fa",path:"/wings/1.0/upgrading.html",headers:[{level:2,title:"Wings Version Requirements",slug:"wings-version-requirements"},{level:2,title:"Download Updated Binary",slug:"download-updated-binary"},{level:2,title:"Restart Process",slug:"restart-process"}]}],themeConfig:{repo:"pterodactyl/panel",docsRepo:"pterodactyl/documentation",repoLabel:"Contribute",editLinkText:"Help us improve this page.",editLinks:!0,logo:"/logos/pterry.svg",nav:[{text:"Documentation",link:"/project/introduction.md"},{text:"Community Guides",link:"/community/about.md"},{text:"Get Help",link:"https://discord.gg/pterodactyl"},{text:"API",link:"https://dashflo.net/docs/api/pterodactyl/v1/"}],sidebar:{"/community/":[{title:"Community Guides",collapsable:!1,children:["/community/about.md"]},{title:"Panel Installation",collapsable:!1,children:["/community/installation-guides/panel/centos7.md","/community/installation-guides/panel/centos8.md","/community/installation-guides/panel/debian9.md","/community/installation-guides/panel/debian10.md","/community/installation-guides/panel/ubuntu1804.md","/community/installation-guides/panel/ubuntu2004.md"]},{title:"Wings Installation",collapsable:!1,children:["/community/installation-guides/wings/centos7.md","/community/installation-guides/wings/centos8.md","/community/installation-guides/wings/debian9.md","/community/installation-guides/wings/debian10.md","/community/installation-guides/wings/ubuntu1804.md","/community/installation-guides/wings/ubuntu2004.md"]},{title:"Creating Eggs",collapsable:!1,children:["/community/config/eggs/creating_a_custom_egg.md","/community/config/eggs/creating_a_custom_image.md"]},{title:"Game Configuration",collapsable:!1,children:["/community/games/minecraft.md"]},{title:"Tutorials",collapsable:!1,children:["/community/config/nodes/add_node.md","/community/tutorials/artisan.md"]},{title:"Customization",collapsable:!1,children:["/community/customization/panel.md","/community/customization/wings.md"]}],"/":[{title:"Project Information",collapsable:!1,children:["/project/introduction.md","/project/about.md","/project/terms.md","/project/community.md"]},{title:"Panel",collapsable:!1,path:"/panel/",currentVersion:"1.0",versions:[{title:"1.4",name:"1.0",status:"stable",children:["/getting_started","/webserver_configuration","/additional_configuration","/updating","/troubleshooting","/legacy_upgrade"]}]},{title:"Wings",collapsable:!1,path:"/wings/",currentVersion:"1.0",versions:[{title:"1.4",name:"1.0",status:"stable",children:["/installing","/upgrading","/migrating","/configuration"]}]},{title:"Tutorials",collapsable:!1,children:["/tutorials/mysql_setup.md","/tutorials/creating_ssl_certificates.md"]},{title:"Guides",collapsable:!1,children:["/guides/mounts.md"]},{title:"Development & Ops",collapsable:!0,children:["/ops/publish_release.md"]}]}}},Le=(n(300),n(302),n(303),n(181),n(74),n(108));function Re(){for(var t="/",e=new RegExp(t+"{1,}","g"),n=arguments.length,r=new Array(n),i=0;i2&&void 0!==arguments[2]?arguments[2]:o.a;Qt(e),n.$vuepress.$set("siteData",e);var r=t(n.$vuepress.$get("siteData")),i=new r,a=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(i)),s={};return Object.keys(a).reduce((function(t,e){return e.startsWith("$")&&(t[e]=a[e].get),t}),s),{computed:s}}((function(t){return function(){function e(){Ue(this,e)}return Be(e,[{key:"setPage",value:function(t){this.__page=t}},{key:"$site",get:function(){return t}},{key:"$themeConfig",get:function(){return this.$site.themeConfig}},{key:"$frontmatter",get:function(){return this.$page.frontmatter}},{key:"$localeConfig",get:function(){var t,e,n=this.$site.locales,r=void 0===n?{}:n;for(var i in r)"/"===i?e=r[i]:0===this.$page.path.indexOf(i)&&(t=r[i]);return t||e||{}}},{key:"$siteTitle",get:function(){return this.$localeConfig.title||this.$site.title||""}},{key:"$canonicalUrl",get:function(){var t=this.$page.frontmatter.canonicalUrl;return"string"==typeof t&&t}},{key:"$title",get:function(){var t=this.$page,e=this.$page.frontmatter.metaTitle;if("string"==typeof e)return e;var n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}},{key:"$description",get:function(){var t=function(t){if(t){var e=t.filter((function(t){return"description"===t.name}))[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}},{key:"$lang",get:function(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}},{key:"$localePath",get:function(){return this.$localeConfig.path||"/"}},{key:"$themeLocaleConfig",get:function(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}},{key:"$page",get:function(){return this.__page?this.__page:function(t,e){for(var n=0;n=0&&(e=t.slice(r),t=t.slice(0,r));var i=t.indexOf("?");return i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),{path:t,query:n,hash:e}}(i.path||""),c=e&&e.path||"/",f=l.path?k(l.path,c,n||i.append):c,h=function(t,e,n){void 0===e&&(e={});var r,i=n||d;try{r=i(t||"")}catch(t){r={}}for(var o in e){var a=e[o];r[o]=Array.isArray(a)?a.map(p):p(a)}return r}(l.query,i.query,r&&r.options.parseQuery),v=i.hash||l.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:f,query:h,hash:v}}var G,K=function(){},X={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),o=i.location,s=i.route,u=i.href,l={},c=n.options.linkActiveClass,f=n.options.linkExactActiveClass,p=null==c?"router-link-active":c,d=null==f?"router-link-exact-active":f,h=null==this.activeClass?p:this.activeClass,m=null==this.exactActiveClass?d:this.exactActiveClass,y=s.redirectedFrom?g(null,W(s.redirectedFrom),null,n):s;l[m]=w(r,y,this.exactPath),l[h]=this.exact||this.exactPath?l[m]:function(t,e){return 0===t.path.replace(v,"/").indexOf(e.path.replace(v,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,y);var b=l[m]?this.ariaCurrentValue:null,_=function(t){Q(t)&&(e.replace?n.replace(o,K):n.push(o,K))},x={click:Q};Array.isArray(this.event)?this.event.forEach((function(t){x[t]=_})):x[this.event]=_;var S={class:l},C=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:u,route:s,navigate:_,isActive:l[h],isExactActive:l[m]});if(C){if(1===C.length)return C[0];if(C.length>1||!C.length)return 0===C.length?t():t("span",{},C)}if("a"===this.tag)S.on=x,S.attrs={href:u,"aria-current":b};else{var O=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=H(c.path,s.params),u(c,s,a)}if(s.path){s.params={};for(var d=0;d=t.length?n():t[i]?e(t[i],(function(){r(i+1)})):r(i+1)};r(0)}var xt={redirected:2,aborted:4,cancelled:8,duplicated:16};function St(t,e){return Ot(t,e,xt.redirected,'Redirected when going from "'+t.fullPath+'" to "'+function(t){if("string"==typeof t)return t;if("path"in t)return t.path;var e={};return kt.forEach((function(n){n in t&&(e[n]=t[n])})),JSON.stringify(e,null,2)}(e)+'" via a navigation guard.')}function Ct(t,e){return Ot(t,e,xt.cancelled,'Navigation cancelled from "'+t.fullPath+'" to "'+e.fullPath+'" with a new navigation.')}function Ot(t,e,n,r){var i=new Error(r);return i._isRouter=!0,i.from=t,i.to=e,i.type=n,i}var kt=["params","query","hash"];function Pt(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function Et(t,e){return Pt(t)&&t._isRouter&&(null==e||t.type===e)}function jt(t){return function(e,n,r){var i=!1,o=0,a=null;At(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){i=!0,o++;var u,l=Lt((function(e){var i;((i=e).__esModule||Tt&&"Module"===i[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:G.extend(e),n.components[s]=e,--o<=0&&r()})),c=Lt((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Pt(t)?t:new Error(e),r(a))}));try{u=t(l,c)}catch(t){c(t)}if(u)if("function"==typeof u.then)u.then(l,c);else{var f=u.component;f&&"function"==typeof f.then&&f.then(l,c)}}})),i||r()}}function At(t,e){return $t(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function $t(t){return Array.prototype.concat.apply([],t)}var Tt="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Lt(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Rt=function(t,e){this.router=t,this.base=function(t){if(!t)if(J){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=y,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Dt(t,e,n,r){var i=At(t,(function(t,r,i,o){var a=function(t,e){"function"!=typeof t&&(t=G.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,i,o)})):n(a,r,i,o)}));return $t(r?i.reverse():i)}function It(t,e){if(e)return function(){return t.apply(e,arguments)}}Rt.prototype.listen=function(t){this.cb=t},Rt.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Rt.prototype.onError=function(t){this.errorCbs.push(t)},Rt.prototype.transitionTo=function(t,e,n){var r,i=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var o=this.current;this.confirmTransition(r,(function(){i.updateRoute(r),e&&e(r),i.ensureURL(),i.router.afterHooks.forEach((function(t){t&&t(r,o)})),i.ready||(i.ready=!0,i.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!i.ready&&(Et(t,xt.redirected)&&o===y||(i.ready=!0,i.readyErrorCbs.forEach((function(e){e(t)}))))}))},Rt.prototype.confirmTransition=function(t,e,n){var r=this,i=this.current;this.pending=t;var o,a,s=function(t){!Et(t)&&Pt(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},u=t.matched.length-1,l=i.matched.length-1;if(w(t,i)&&u===l&&t.matched[u]===i.matched[l])return this.ensureURL(),s(((a=Ot(o=i,t,xt.duplicated,'Avoided redundant navigation to current location: "'+o.fullPath+'".')).name="NavigationDuplicated",a));var c=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=yt&&n;r&&this.listeners.push(ut());var i=function(){var n=t.current,i=Nt(t.base);t.current===y&&i===t._startLocation||t.transitionTo(i,(function(t){r&<(e,t,n,!0)}))};window.addEventListener("popstate",i),this.listeners.push((function(){window.removeEventListener("popstate",i)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){bt(P(r.base+t.fullPath)),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){_t(P(r.base+t.fullPath)),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Nt(this.base)!==this.current.fullPath){var e=P(this.base+this.current.fullPath);t?bt(e):_t(e)}},e.prototype.getCurrentLocation=function(){return Nt(this.base)},e}(Rt);function Nt(t){var e=window.location.pathname;return t&&0===e.toLowerCase().indexOf(t.toLowerCase())&&(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ut=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Nt(t);if(!/^\/#/.test(e))return window.location.replace(P(t+"/#"+e)),!0}(this.base)||Ft()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=yt&&e;n&&this.listeners.push(ut());var r=function(){var e=t.current;Ft()&&t.transitionTo(Bt(),(function(r){n&<(t.router,r,e,!0),yt||Vt(r.fullPath)}))},i=yt?"popstate":"hashchange";window.addEventListener(i,r),this.listeners.push((function(){window.removeEventListener(i,r)}))}},e.prototype.push=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){qt(t.fullPath),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,i=this.current;this.transitionTo(t,(function(t){Vt(t.fullPath),lt(r.router,t,i,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Bt()!==e&&(t?qt(e):Vt(e))},e.prototype.getCurrentLocation=function(){return Bt()},e}(Rt);function Ft(){var t=Bt();return"/"===t.charAt(0)||(Vt("/"+t),!1)}function Bt(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function zt(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function qt(t){yt?bt(zt(t)):window.location.hash=t}function Vt(t){yt?_t(zt(t)):window.location.replace(zt(t))}var Ht=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Et(t,xt.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Rt),Wt=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=tt(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!yt&&!1!==t.fallback,this.fallback&&(e="hash"),J||(e="abstract"),this.mode=e,e){case"history":this.history=new Mt(this,t.base);break;case"hash":this.history=new Ut(this,t.base,this.fallback);break;case"abstract":this.history=new Ht(this,t.base);break;default:0}},Gt={currentRoute:{configurable:!0}};function Kt(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Wt.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Gt.currentRoute.get=function(){return this.history&&this.history.current},Wt.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Mt||n instanceof Ut){var r=function(t){n.setupListeners(),function(t){var r=n.current,i=e.options.scrollBehavior;yt&&i&&"fullPath"in t&<(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Wt.prototype.beforeEach=function(t){return Kt(this.beforeHooks,t)},Wt.prototype.beforeResolve=function(t){return Kt(this.resolveHooks,t)},Wt.prototype.afterEach=function(t){return Kt(this.afterHooks,t)},Wt.prototype.onReady=function(t,e){this.history.onReady(t,e)},Wt.prototype.onError=function(t){this.history.onError(t)},Wt.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Wt.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Wt.prototype.go=function(t){this.history.go(t)},Wt.prototype.back=function(){this.go(-1)},Wt.prototype.forward=function(){this.go(1)},Wt.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Wt.prototype.resolve=function(t,e,n){var r=W(t,e=e||this.history.current,n,this),i=this.match(r,e),o=i.redirectedFrom||i.fullPath;return{location:r,route:i,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?P(t+"/"+r):r}(this.history.base,o,this.mode),normalizedTo:r,resolved:i}},Wt.prototype.getRoutes=function(){return this.matcher.getRoutes()},Wt.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Wt.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Wt.prototype,Gt),Wt.install=function t(e){if(!t.installed||G!==e){t.installed=!0,G=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",C),e.component("RouterLink",X);var i=e.config.optionMergeStrategies;i.beforeRouteEnter=i.beforeRouteLeave=i.beforeRouteUpdate=i.created}},Wt.version="3.5.1",Wt.isNavigationFailure=Et,Wt.NavigationFailureType=xt,Wt.START_LOCATION=y,J&&window.Vue&&window.Vue.use(Wt);var Xt=Wt;n(51),n(197),n(199),n(144),n(145),n(71),n(110),n(52);function Qt(t){t.locales&&Object.keys(t.locales).forEach((function(e){t.locales[e].path=e})),Object.freeze(t)}n(201),n(146),n(50),n(202),n(70),n(44),n(61),n(93);function Jt(t){return(Jt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var Yt=n(31),Zt={DropdownLink:function(){return Promise.all([n.e(0),n.e(7)]).then(n.bind(null,324))},DropdownTransition:function(){return Promise.all([n.e(0),n.e(18)]).then(n.bind(null,321))},Home:function(){return Promise.all([n.e(2),n.e(8)]).then(n.bind(null,341))},Layout:function(){return Promise.all([n.e(0),n.e(2),n.e(1),n.e(4)]).then(n.bind(null,365))},NavLink:function(){return n.e(10).then(n.bind(null,315))},NavLinks:function(){return Promise.all([n.e(0),n.e(6)]).then(n.bind(null,325))},Navbar:function(){return Promise.all([n.e(0),n.e(5)]).then(n.bind(null,342))},NotFound:function(){return n.e(24).then(n.bind(null,366))},Page:function(){return n.e(15).then(n.bind(null,343))},SearchBox:function(){return n.e(13).then(n.bind(null,331))},Sidebar:function(){return Promise.all([n.e(0),n.e(1),n.e(9)]).then(n.bind(null,344))},SidebarButton:function(){return n.e(25).then(n.bind(null,333))},SidebarGroup:function(){return Promise.all([n.e(0),n.e(1)]).then(n.bind(null,345))},SidebarLink:function(){return n.e(16).then(n.bind(null,334))},SlickCarousel:function(){return Promise.all([n.e(2),n.e(26)]).then(n.bind(null,330))},VersionSelect:function(){return n.e(11).then(n.bind(null,346))},VersionSelectItem:function(){return n.e(27).then(n.bind(null,332))}},te={"v-680eebc3":function(){return n.e(28).then(n.bind(null,367))},"v-4e72e1d8":function(){return n.e(29).then(n.bind(null,368))},"v-7d127123":function(){return n.e(30).then(n.bind(null,369))},"v-4a1e6e3a":function(){return n.e(12).then(n.bind(null,370))},"v-10fe793a":function(){return n.e(31).then(n.bind(null,371))},"v-622f23e3":function(){return n.e(17).then(n.bind(null,372))},"v-ef34fffa":function(){return n.e(32).then(n.bind(null,373))},"v-090070fa":function(){return n.e(33).then(n.bind(null,374))},"v-67c3f2ba":function(){return n.e(14).then(n.bind(null,375))},"v-0af75f63":function(){return n.e(34).then(n.bind(null,376))},"v-cc322cfa":function(){return n.e(35).then(n.bind(null,377))},"v-4d5d0f9b":function(){return n.e(36).then(n.bind(null,378))},"v-22a01883":function(){return n.e(37).then(n.bind(null,379))},"v-047b1c1f":function(){return n.e(38).then(n.bind(null,380))},"v-030337f1":function(){return n.e(39).then(n.bind(null,381))},"v-26037fe3":function(){return n.e(40).then(n.bind(null,382))},"v-9619ebfa":function(){return n.e(41).then(n.bind(null,383))},"v-432db923":function(){return n.e(42).then(n.bind(null,384))},"v-3dac3903":function(){return n.e(43).then(n.bind(null,385))},"v-e046bab2":function(){return n.e(44).then(n.bind(null,386))},"v-e336830e":function(){return n.e(45).then(n.bind(null,387))},"v-7c7b3203":function(){return n.e(46).then(n.bind(null,388))},"v-07a77f72":function(){return n.e(47).then(n.bind(null,389))},"v-00d38f11":function(){return n.e(48).then(n.bind(null,390))},"v-d39223ba":function(){return n.e(20).then(n.bind(null,391))},"v-a31c3dba":function(){return n.e(49).then(n.bind(null,392))},"v-6f0eac21":function(){return n.e(50).then(n.bind(null,393))},"v-481dea23":function(){return n.e(51).then(n.bind(null,394))},"v-15b388aa":function(){return n.e(52).then(n.bind(null,395))},"v-8a6363ba":function(){return n.e(53).then(n.bind(null,396))},"v-7f0b5429":function(){return n.e(54).then(n.bind(null,397))},"v-29055241":function(){return n.e(55).then(n.bind(null,398))},"v-c0e60bfa":function(){return n.e(56).then(n.bind(null,399))},"v-589003f5":function(){return n.e(57).then(n.bind(null,400))},"v-2339aa03":function(){return n.e(58).then(n.bind(null,401))},"v-019cb63a":function(){return n.e(59).then(n.bind(null,402))},"v-7ffeb723":function(){return n.e(60).then(n.bind(null,403))},"v-9478f2ba":function(){return n.e(61).then(n.bind(null,404))},"v-4f03fe0f":function(){return n.e(62).then(n.bind(null,405))},"v-5baa92ba":function(){return n.e(63).then(n.bind(null,406))},"v-c249e07a":function(){return n.e(64).then(n.bind(null,407))},"v-27941b23":function(){return n.e(65).then(n.bind(null,408))},"v-6f4baca5":function(){return n.e(66).then(n.bind(null,409))},"v-fa75e63a":function(){return n.e(67).then(n.bind(null,410))},"v-dacf6e56":function(){return n.e(68).then(n.bind(null,411))},"v-8eec473a":function(){return n.e(69).then(n.bind(null,412))},"v-29d5bc56":function(){return n.e(70).then(n.bind(null,413))},"v-cbda523a":function(){return n.e(71).then(n.bind(null,414))},"v-a75af93a":function(){return n.e(72).then(n.bind(null,415))},"v-22ba6d3a":function(){return n.e(73).then(n.bind(null,416))},"v-d6319362":function(){return n.e(74).then(n.bind(null,417))},"v-7b99cfba":function(){return n.e(21).then(n.bind(null,418))},"v-6ec4d123":function(){return n.e(75).then(n.bind(null,419))},"v-5c5d50fa":function(){return n.e(76).then(n.bind(null,420))},"v-6cd19ba3":function(){return n.e(77).then(n.bind(null,421))},"v-55eb8eca":function(){return n.e(19).then(n.bind(null,422))},"v-1ec46263":function(){return n.e(22).then(n.bind(null,423))},"v-9213d4fa":function(){return n.e(78).then(n.bind(null,424))}};function ee(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var ne=/-(\w)/g,re=ee((function(t){return t.replace(ne,(function(t,e){return e?e.toUpperCase():""}))})),ie=/\B([A-Z])/g,oe=ee((function(t){return t.replace(ie,"-$1").toLowerCase()})),ae=ee((function(t){return t.charAt(0).toUpperCase()+t.slice(1)}));function se(t,e){if(e)return t(e)?t(e):e.includes("-")?t(ae(re(e))):t(ae(e))||t(oe(e))}var ue=Object.assign({},Zt,te),le=function(t){return ue[t]},ce=function(t){return te[t]},fe=function(t){return Zt[t]},pe=function(t){return o.a.component(t)};function de(t){return se(ce,t)}function he(t){return se(fe,t)}function ve(t){return se(le,t)}function ge(t){return se(pe,t)}function me(){for(var t=arguments.length,e=new Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:"";return t?''):""}function Oe(t,e){if(e&&Object(Yt.a)(e).filter((function(t){return t.parentNode===document.head})).forEach((function(t){return document.head.removeChild(t)})),t)return t.map((function(t){var e=document.createElement("meta");return Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])})),document.head.appendChild(e),e}))}function ke(t){for(var e=0,n=["name","property","itemprop"];e"})).join("\n "):"",this.$ssrContext.canonicalLink=Ce(this.$canonicalUrl)}var e},mounted:function(){this.currentMetaTags=Object(Yt.a)(document.querySelectorAll("meta")),this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta:function(){document.title=this.$title,document.documentElement.lang=this.$lang;var t=this.getMergedMetaTags();this.currentMetaTags=Oe(t,this.currentMetaTags)},getMergedMetaTags:function(){var t=this.$page.frontmatter.meta||[];return xe()([{name:"description",content:this.$description}],t,this.siteMeta,ke)},updateCanonicalLink:function(){Se(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",Ce(this.$canonicalUrl))}},watch:{$page:function(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy:function(){Oe(null,this.currentMetaTags),Se()}}],Ee={name:"GlobalLayout",computed:{layout:function(){var t=this.getLayout();return ye("layout",t),o.a.component(t)}},methods:{getLayout:function(){if(this.$page.path){var t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},je=n(48),Ae=Object(je.a)(Ee,(function(){var t=this.$createElement;return(this._self._c||t)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){var r;switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),(r=t[e]).push.apply(r,Object(Yt.a)(n));break;default:throw new Error("Unknown option name.")}}(Ae,"mixins",Pe);var $e=[{name:"v-680eebc3",path:"/404.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-680eebc3").then(n)}},{name:"v-4e72e1d8",path:"/",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4e72e1d8").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-7d127123",path:"/community/about.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7d127123").then(n)}},{name:"v-4a1e6e3a",path:"/community/config/eggs/creating_a_custom_egg.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4a1e6e3a").then(n)}},{name:"v-10fe793a",path:"/community/config/eggs/creating_a_custom_image.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-10fe793a").then(n)}},{name:"v-622f23e3",path:"/community/config/nodes/add_node.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-622f23e3").then(n)}},{name:"v-ef34fffa",path:"/community/customization/panel.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-ef34fffa").then(n)}},{name:"v-090070fa",path:"/community/customization/wings.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-090070fa").then(n)}},{name:"v-67c3f2ba",path:"/community/games/minecraft.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-67c3f2ba").then(n)}},{name:"v-0af75f63",path:"/community/installation-guides/panel/centos7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-0af75f63").then(n)}},{name:"v-cc322cfa",path:"/community/installation-guides/panel/centos8.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-cc322cfa").then(n)}},{name:"v-4d5d0f9b",path:"/community/installation-guides/panel/debian10.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4d5d0f9b").then(n)}},{name:"v-22a01883",path:"/community/installation-guides/panel/debian9.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-22a01883").then(n)}},{name:"v-047b1c1f",path:"/community/installation-guides/panel/ubuntu1804.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-047b1c1f").then(n)}},{name:"v-030337f1",path:"/community/installation-guides/panel/ubuntu2004.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-030337f1").then(n)}},{name:"v-26037fe3",path:"/community/installation-guides/wings/centos7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-26037fe3").then(n)}},{name:"v-9619ebfa",path:"/community/installation-guides/wings/centos8.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9619ebfa").then(n)}},{name:"v-432db923",path:"/community/installation-guides/wings/debian10.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-432db923").then(n)}},{name:"v-3dac3903",path:"/community/installation-guides/wings/debian9.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-3dac3903").then(n)}},{name:"v-e046bab2",path:"/community/installation-guides/wings/ubuntu1804.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-e046bab2").then(n)}},{name:"v-e336830e",path:"/community/installation-guides/wings/ubuntu2004.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-e336830e").then(n)}},{name:"v-7c7b3203",path:"/community/tutorials/artisan.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7c7b3203").then(n)}},{name:"v-07a77f72",path:"/daemon/0.6/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-07a77f72").then(n)}},{name:"v-00d38f11",path:"/daemon/0.6/debian_8_docker.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-00d38f11").then(n)}},{name:"v-d39223ba",path:"/daemon/0.6/installing.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-d39223ba").then(n)}},{name:"v-a31c3dba",path:"/daemon/0.6/kernel_modifications.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-a31c3dba").then(n)}},{name:"v-6f0eac21",path:"/daemon/0.6/standalone_sftp.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6f0eac21").then(n)}},{name:"v-481dea23",path:"/daemon/0.6/upgrade/0.4_to_0.5.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-481dea23").then(n)}},{name:"v-15b388aa",path:"/daemon/0.6/upgrade/0.5.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-15b388aa").then(n)}},{name:"v-8a6363ba",path:"/daemon/0.6/upgrade/0.5_to_0.6.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-8a6363ba").then(n)}},{name:"v-7f0b5429",path:"/daemon/0.6/upgrade/0.6.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7f0b5429").then(n)}},{name:"v-29055241",path:"/daemon/0.6/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-29055241").then(n)}},{name:"v-c0e60bfa",path:"/guides/mounts.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-c0e60bfa").then(n)}},{name:"v-589003f5",path:"/guides/php_upgrade.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-589003f5").then(n)}},{name:"v-2339aa03",path:"/ops/publish_release.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-2339aa03").then(n)}},{name:"v-019cb63a",path:"/panel/0.7/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-019cb63a").then(n)}},{name:"v-7ffeb723",path:"/panel/0.7/getting_started.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7ffeb723").then(n)}},{name:"v-9478f2ba",path:"/panel/0.7/troubleshooting.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9478f2ba").then(n)}},{name:"v-4f03fe0f",path:"/panel/0.7/upgrade/0.6_to_0.7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-4f03fe0f").then(n)}},{name:"v-5baa92ba",path:"/panel/0.7/upgrade/0.7.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-5baa92ba").then(n)}},{name:"v-c249e07a",path:"/panel/0.7/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-c249e07a").then(n)}},{name:"v-27941b23",path:"/panel/0.7/webserver_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-27941b23").then(n)}},{name:"v-6f4baca5",path:"/panel/1.0/additional_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6f4baca5").then(n)}},{name:"v-fa75e63a",path:"/panel/1.0/getting_started.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-fa75e63a").then(n)}},{name:"v-dacf6e56",path:"/panel/1.0/legacy_upgrade.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-dacf6e56").then(n)}},{name:"v-8eec473a",path:"/panel/1.0/troubleshooting.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-8eec473a").then(n)}},{name:"v-29d5bc56",path:"/panel/1.0/updating.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-29d5bc56").then(n)}},{name:"v-cbda523a",path:"/panel/1.0/webserver_configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-cbda523a").then(n)}},{name:"v-a75af93a",path:"/project/about.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-a75af93a").then(n)}},{name:"v-22ba6d3a",path:"/project/community.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-22ba6d3a").then(n)}},{name:"v-d6319362",path:"/project/introduction.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-d6319362").then(n)}},{name:"v-7b99cfba",path:"/project/terms.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-7b99cfba").then(n)}},{name:"v-6ec4d123",path:"/tutorials/creating_ssl_certificates.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6ec4d123").then(n)}},{name:"v-5c5d50fa",path:"/tutorials/mysql_setup.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-5c5d50fa").then(n)}},{name:"v-6cd19ba3",path:"/wings/1.0/configuration.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-6cd19ba3").then(n)}},{name:"v-55eb8eca",path:"/wings/1.0/installing.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-55eb8eca").then(n)}},{name:"v-1ec46263",path:"/wings/1.0/migrating.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-1ec46263").then(n)}},{name:"v-9213d4fa",path:"/wings/1.0/upgrading.html",component:Ae,beforeEnter:function(t,e,n){me("Layout","v-9213d4fa").then(n)}},{path:"*",component:Ae}],Te={title:"Pterodactyl",description:"Pterodactyl is an open-source game server management panel built with PHP 7, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.",base:"/",headTags:[["link",{rel:"apple-touch-icon",sizes:"180x180",href:"/favicons/apple-touch-icon.png"}],["link",{rel:"icon",type:"image/png",href:"/favicons/favicon-32x32.png",sizes:"32x32"}],["link",{rel:"icon",type:"image/png",href:"/favicons/favicon-16x16.png",sizes:"16x16"}],["link",{rel:"mask-icon",href:"/favicons/safari-pinned-tab.svg",color:"#0e4688"}],["link",{rel:"manifest",href:"/favicons/site.webmanifest"}],["link",{rel:"shortcut icon",href:"/favicons/favicon.ico"}],["meta",{name:"msapplication-config",content:"/favicons/browserconfig.xml"}],["meta",{name:"theme-color",content:"#0e4688"}]],pages:[{frontmatter:{},regularPath:"/404.html",relativePath:"404.md",key:"v-680eebc3",path:"/404.html"},{title:"Home",frontmatter:{home:!0,heroImage:"/doc_pterry.png",actionText:"Get Started →",actionLink:"/project/introduction",features:[{title:"Security First",details:"Security is a first-class citizen on this platform with bcrypt hashing, AES-256-CBC encryption, and HTTPS support out of the box."},{title:"Modern Tooling",details:"Built on a modern stack utilizing the best design practices that make it easy to jump in and make modifications."},{title:"Docker to the Core",details:"All servers run in isolated Docker containers that limit attack vectors, provide strict resource limits, and provide environments tailored to each specific game."}],footer:"MIT Licensed | Copyright © 2015 - 2018 Dane Everitt & Contributors"},regularPath:"/",relativePath:"README.md",key:"v-4e72e1d8",path:"/"},{title:"Community Guides and Tutorials",frontmatter:{},regularPath:"/community/about.html",relativePath:"community/about.md",key:"v-7d127123",path:"/community/about.html",headers:[{level:2,title:"About",slug:"about"}]},{title:"Creating a Custom Egg",frontmatter:{},regularPath:"/community/config/eggs/creating_a_custom_egg.html",relativePath:"community/config/eggs/creating_a_custom_egg.md",key:"v-4a1e6e3a",path:"/community/config/eggs/creating_a_custom_egg.html",headers:[{level:2,title:"Create New Option",slug:"create-new-option"},{level:2,title:"Configure Process Management",slug:"configure-process-management"},{level:3,title:"Stop Command",slug:"stop-command"},{level:3,title:"Log Storage",slug:"log-storage"},{level:3,title:"Configuration Files",slug:"configuration-files"},{level:3,title:"Start Configuration",slug:"start-configuration"},{level:2,title:"Copy Settings From",slug:"copy-settings-from"},{level:2,title:"Egg Variables",slug:"egg-variables"},{level:2,title:"List of default variables",slug:"list-of-default-variables"}]},{title:"Creating a Custom Docker Image",frontmatter:{},regularPath:"/community/config/eggs/creating_a_custom_image.html",relativePath:"community/config/eggs/creating_a_custom_image.md",key:"v-10fe793a",path:"/community/config/eggs/creating_a_custom_image.html",headers:[{level:2,title:"Creating the Dockerfile",slug:"creating-the-dockerfile"},{level:2,title:"Installing Dependencies",slug:"installing-dependencies"},{level:2,title:"Creating a Container User",slug:"creating-a-container-user"},{level:2,title:"Work Directory & Entrypoint",slug:"work-directory-entrypoint"},{level:2,title:"Entrypoint Script",slug:"entrypoint-script"},{level:2,title:"Modifying the Startup Command",slug:"modifying-the-startup-command"},{level:2,title:"Run the Command",slug:"run-the-command"},{level:3,title:"Note",slug:"note"}]},{title:"Creating a New Node",frontmatter:{},regularPath:"/community/config/nodes/add_node.html",relativePath:"community/config/nodes/add_node.md",key:"v-622f23e3",path:"/community/config/nodes/add_node.html",headers:[{level:2,title:"Location",slug:"location"},{level:2,title:"Information Required",slug:"information-required"},{level:2,title:"Install the Daemon",slug:"install-the-daemon"},{level:2,title:"Configuring the Node",slug:"configuring-the-node"},{level:3,title:"Auto-Deploy",slug:"auto-deploy"}]},{title:"Building Panel Assets",frontmatter:{},regularPath:"/community/customization/panel.html",relativePath:"community/customization/panel.md",key:"v-ef34fffa",path:"/community/customization/panel.html",headers:[{level:2,title:"Install Dependencies",slug:"install-dependencies"},{level:2,title:"Build Panel Assets",slug:"build-panel-assets"}]},{title:"Building Wings",frontmatter:{},regularPath:"/community/customization/wings.html",relativePath:"community/customization/wings.md",key:"v-090070fa",path:"/community/customization/wings.html",headers:[{level:2,title:"Build Requirements",slug:"build-requirements"},{level:2,title:"Building",slug:"building"},{level:2,title:"Install the new binary",slug:"install-the-new-binary"},{level:2,title:"Troubleshooting",slug:"troubleshooting"}]},{title:"Minecraft",frontmatter:{},regularPath:"/community/games/minecraft.html",relativePath:"community/games/minecraft.md",key:"v-67c3f2ba",path:"/community/games/minecraft.html",headers:[{level:2,title:"Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)",slug:"configuring-a-server-network-bungeecord-waterfall-hexacord-etc"},{level:3,title:"Allocations in the Panel",slug:"allocations-in-the-panel"},{level:3,title:"proxy server settings",slug:"proxy-server-settings"},{level:3,title:"paper/spigot/bukkit settings",slug:"paper-spigot-bukkit-settings"},{level:3,title:"Firewalls",slug:"firewalls"}]},{title:"CentOS 7",frontmatter:{},regularPath:"/community/installation-guides/panel/centos7.html",relativePath:"community/installation-guides/panel/centos7.md",key:"v-0af75f63",path:"/community/installation-guides/panel/centos7.html",headers:[{level:2,title:"Install Requirements and Additional Utilities",slug:"install-requirements-and-additional-utilities"},{level:3,title:"SELinux tools",slug:"selinux-tools"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Composer",slug:"composer"},{level:2,title:"Install Utility Packages",slug:"install-utility-packages"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"CentOS 8",frontmatter:{},regularPath:"/community/installation-guides/panel/centos8.html",relativePath:"community/installation-guides/panel/centos8.md",key:"v-cc322cfa",path:"/community/installation-guides/panel/centos8.html",headers:[{level:2,title:"Install Requirements and Additional Utilities",slug:"install-requirements-and-additional-utilities"},{level:3,title:"SELinux tools",slug:"selinux-tools"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Composer",slug:"composer"},{level:2,title:"Install Utility Packages",slug:"install-utility-packages"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Debian 10",frontmatter:{},regularPath:"/community/installation-guides/panel/debian10.html",relativePath:"community/installation-guides/panel/debian10.md",key:"v-4d5d0f9b",path:"/community/installation-guides/panel/debian10.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Debian 9",frontmatter:{},regularPath:"/community/installation-guides/panel/debian9.html",relativePath:"community/installation-guides/panel/debian9.md",key:"v-22a01883",path:"/community/installation-guides/panel/debian9.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Ubuntu 18.04",frontmatter:{},regularPath:"/community/installation-guides/panel/ubuntu1804.html",relativePath:"community/installation-guides/panel/ubuntu1804.md",key:"v-047b1c1f",path:"/community/installation-guides/panel/ubuntu1804.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"Ubuntu 20.04",frontmatter:{},regularPath:"/community/installation-guides/panel/ubuntu2004.html",relativePath:"community/installation-guides/panel/ubuntu2004.md",key:"v-030337f1",path:"/community/installation-guides/panel/ubuntu2004.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"MariaDB",slug:"mariadb"},{level:3,title:"PHP 7.4",slug:"php-7-4"},{level:3,title:"Nginx",slug:"nginx"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Additional Utilities",slug:"additional-utilities"},{level:2,title:"Server Configuration",slug:"server-configuration"},{level:3,title:"Configuring MariaDB",slug:"configuring-mariadb"},{level:3,title:"Setup PHP",slug:"setup-php"},{level:3,title:"Nginx",slug:"nginx-2"},{level:3,title:"Redis Setup",slug:"redis-setup"},{level:2,title:"Installing the Panel",slug:"installing-the-panel"}]},{title:"CentOS 7",frontmatter:{},regularPath:"/community/installation-guides/wings/centos7.html",relativePath:"community/installation-guides/wings/centos7.md",key:"v-26037fe3",path:"/community/installation-guides/wings/centos7.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:3,title:"FirewallD Changes",slug:"firewalld-changes"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"CentOS 8",frontmatter:{},regularPath:"/community/installation-guides/wings/centos8.html",relativePath:"community/installation-guides/wings/centos8.md",key:"v-9619ebfa",path:"/community/installation-guides/wings/centos8.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:3,title:"FirewallD Changes",slug:"firewalld-changes"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Debian 10",frontmatter:{},regularPath:"/community/installation-guides/wings/debian10.html",relativePath:"community/installation-guides/wings/debian10.md",key:"v-432db923",path:"/community/installation-guides/wings/debian10.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Debian 9",frontmatter:{},regularPath:"/community/installation-guides/wings/debian9.html",relativePath:"community/installation-guides/wings/debian9.md",key:"v-3dac3903",path:"/community/installation-guides/wings/debian9.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Ubuntu 18.04",frontmatter:{},regularPath:"/community/installation-guides/wings/ubuntu1804.html",relativePath:"community/installation-guides/wings/ubuntu1804.md",key:"v-e046bab2",path:"/community/installation-guides/wings/ubuntu1804.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Ubuntu 20.04",frontmatter:{},regularPath:"/community/installation-guides/wings/ubuntu2004.html",relativePath:"community/installation-guides/wings/ubuntu2004.md",key:"v-e336830e",path:"/community/installation-guides/wings/ubuntu2004.html",headers:[{level:2,title:"Install Requirements",slug:"install-requirements"},{level:3,title:"Docker",slug:"docker"},{level:2,title:"Installing Wings",slug:"installing-wings"}]},{title:"Artisan CLI",frontmatter:{},regularPath:"/community/tutorials/artisan.html",relativePath:"community/tutorials/artisan.md",key:"v-7c7b3203",path:"/community/tutorials/artisan.html",headers:[{level:2,title:"User Management",slug:"user-management"},{level:3,title:"Create User",slug:"create-user"},{level:3,title:"Delete User",slug:"delete-user"},{level:3,title:"Disable 2FA",slug:"disable-2fa"},{level:2,title:"Server & Node Management",slug:"server-node-management"},{level:3,title:"Create Location",slug:"create-location"},{level:3,title:"Delete Location",slug:"delete-location"},{level:3,title:"Server Bulk Power",slug:"server-bulk-power"},{level:3,title:"Server Rebuild",slug:"server-rebuild"},{level:2,title:"Panel Management",slug:"panel-management"},{level:3,title:"View Panel Info",slug:"view-panel-info"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/daemon/0.6/configuration.html",relativePath:"daemon/0.6/configuration.md",key:"v-07a77f72",path:"/daemon/0.6/configuration.html",headers:[{level:2,title:"Output Throttles",slug:"output-throttles"},{level:2,title:"Custom Network Interfaces",slug:"custom-network-interfaces"},{level:2,title:"Private Registries",slug:"private-registries"},{level:2,title:"Security Policies",slug:"security-policies"},{level:2,title:"Container Policy",slug:"container-policy"},{level:3,title:"Default Security Opts Array",slug:"default-security-opts-array"},{level:3,title:"Default Capabilities Drop Array",slug:"default-capabilities-drop-array"},{level:2,title:"Enabling Cloudflare",slug:"enabling-cloudflare"}]},{title:"Docker on Debian 8",frontmatter:{},regularPath:"/daemon/0.6/debian_8_docker.html",relativePath:"daemon/0.6/debian_8_docker.md",key:"v-00d38f11",path:"/daemon/0.6/debian_8_docker.html",headers:[{level:2,title:"Install Docker",slug:"install-docker"},{level:2,title:"Update GRUB Startup",slug:"update-grub-startup"},{level:2,title:"Add Backports Repo",slug:"add-backports-repo"},{level:2,title:"Update Software & Setup Docker",slug:"update-software-setup-docker"}]},{title:"Installation",frontmatter:{},regularPath:"/daemon/0.6/installing.html",relativePath:"daemon/0.6/installing.md",key:"v-d39223ba",path:"/daemon/0.6/installing.html",headers:[{level:2,title:"Supported Systems",slug:"supported-systems"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Installing Docker",slug:"installing-docker"},{level:3,title:"Installing Nodejs",slug:"installing-nodejs"},{level:2,title:"Installing Daemon Software",slug:"installing-daemon-software"},{level:2,title:"Configure Daemon",slug:"configure-daemon"},{level:2,title:"Starting the Daemon",slug:"starting-the-daemon"},{level:3,title:"Daemonizing (using systemd)",slug:"daemonizing-using-systemd"}]},{title:"Kernel Modifications",frontmatter:{},regularPath:"/daemon/0.6/kernel_modifications.html",relativePath:"daemon/0.6/kernel_modifications.md",key:"v-a31c3dba",path:"/daemon/0.6/kernel_modifications.html",headers:[{level:2,title:"Update Kernel",slug:"update-kernel"},{level:2,title:"Confirm Kernel",slug:"confirm-kernel"},{level:2,title:"Set Default Boot",slug:"set-default-boot"},{level:2,title:"Boot from hard disk",slug:"boot-from-hard-disk"}]},{title:"Standalone SFTP Server",frontmatter:{},regularPath:"/daemon/0.6/standalone_sftp.html",relativePath:"daemon/0.6/standalone_sftp.md",key:"v-6f0eac21",path:"/daemon/0.6/standalone_sftp.html",headers:[{level:2,title:"Disable Daemon's Server",slug:"disable-daemon-s-server"},{level:2,title:"Run the Standalone Server",slug:"run-the-standalone-server"},{level:3,title:"Start the Server",slug:"start-the-server"},{level:2,title:"Daemonize Server",slug:"daemonize-server"},{level:3,title:"Customizing Startup",slug:"customizing-startup"}]},{title:"Upgrading 0.4.X to 0.5.X",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.4_to_0.5.html",relativePath:"daemon/0.6/upgrade/0.4_to_0.5.md",key:"v-481dea23",path:"/daemon/0.6/upgrade/0.4_to_0.5.html",headers:[{level:2,title:"Docker Adjustments",slug:"docker-adjustments"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"SFTP Cleanup",slug:"sftp-cleanup"},{level:2,title:"File Migration",slug:"file-migration"},{level:3,title:"Rebuild Containers",slug:"rebuild-containers"}]},{title:"Upgrading 0.5 Series",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.5.html",relativePath:"daemon/0.6/upgrade/0.5.md",key:"v-15b388aa",path:"/daemon/0.6/upgrade/0.5.html",headers:[{level:2,title:"Download Newest Release",slug:"download-newest-release"},{level:2,title:"Update Components",slug:"update-components"}]},{title:"Upgrading 0.5.X to 0.6.X",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.5_to_0.6.html",relativePath:"daemon/0.6/upgrade/0.5_to_0.6.md",key:"v-8a6363ba",path:"/daemon/0.6/upgrade/0.5_to_0.6.html",headers:[{level:2,title:"Breaking Changes",slug:"breaking-changes"},{level:2,title:"Download Files",slug:"download-files"},{level:3,title:"Start the Daemon",slug:"start-the-daemon"},{level:2,title:"Rebuild Containers",slug:"rebuild-containers"}]},{title:"Upgrading 0.6 Series",frontmatter:{},regularPath:"/daemon/0.6/upgrade/0.6.html",relativePath:"daemon/0.6/upgrade/0.6.md",key:"v-7f0b5429",path:"/daemon/0.6/upgrade/0.6.html",headers:[{level:2,title:"Download Newest Release",slug:"download-newest-release"},{level:2,title:"Update Components",slug:"update-components"}]},{title:"Upgrading",frontmatter:{},regularPath:"/daemon/0.6/upgrading.html",relativePath:"daemon/0.6/upgrading.md",key:"v-29055241",path:"/daemon/0.6/upgrading.html",headers:[{level:2,title:"Version Specific Guides",slug:"version-specific-guides"}]},{title:"Using Mounts",frontmatter:{},regularPath:"/guides/mounts.html",relativePath:"guides/mounts.md",key:"v-c0e60bfa",path:"/guides/mounts.html",headers:[{level:2,title:"Wings Configuration",slug:"wings-configuration"},{level:2,title:"Panel Configuration",slug:"panel-configuration"},{level:3,title:"Creating a Mount",slug:"creating-a-mount"},{level:3,title:"Assigning a Mount to a Server",slug:"assigning-a-mount-to-a-server"}]},{title:"Upgrading PHP",frontmatter:{},regularPath:"/guides/php_upgrade.html",relativePath:"guides/php_upgrade.md",key:"v-589003f5",path:"/guides/php_upgrade.html",headers:[{level:2,title:"Install PHP",slug:"install-php"},{level:2,title:"Update Composer",slug:"update-composer"},{level:2,title:"Webserver Configuration",slug:"webserver-configuration"}]},{title:"Publishing a Release",frontmatter:{},regularPath:"/ops/publish_release.html",relativePath:"ops/publish_release.md",key:"v-2339aa03",path:"/ops/publish_release.html",headers:[{level:2,title:"Pick a Codename",slug:"pick-a-codename"},{level:2,title:"Create the Release Branch",slug:"create-the-release-branch"},{level:2,title:"Tag a Release",slug:"tag-a-release"},{level:3,title:"Update the Release on GitHub",slug:"update-the-release-on-github"},{level:2,title:"Generate Signatures & Hashes",slug:"generate-signatures-hashes"},{level:3,title:"Create Checksum",slug:"create-checksum"},{level:3,title:"GPG Sign Release",slug:"gpg-sign-release"},{level:3,title:"Attach to Release",slug:"attach-to-release"},{level:2,title:"Update Documentation",slug:"update-documentation"},{level:2,title:"Update CDN",slug:"update-cdn"},{level:2,title:"Make Discord Announcement",slug:"make-discord-announcement"},{level:2,title:"Example Process",slug:"example-process"}]},{title:"Environment Configuration",frontmatter:{},regularPath:"/panel/0.7/configuration.html",relativePath:"panel/0.7/configuration.md",key:"v-019cb63a",path:"/panel/0.7/configuration.html",headers:[{level:2,title:"Reporting All Exceptions",slug:"reporting-all-exceptions"},{level:2,title:"Client Databases",slug:"client-databases"},{level:2,title:"Reverse Proxy Setup",slug:"reverse-proxy-setup"},{level:3,title:"NGINX Specific Configuration",slug:"nginx-specific-configuration"},{level:3,title:"Cloudflare Specific Configuration",slug:"cloudflare-specific-configuration"},{level:2,title:"Increasing the Editable File Size",slug:"increasing-the-editable-file-size"},{level:2,title:"Disable or Modify ReCaptcha",slug:"disable-or-modify-recaptcha"},{level:3,title:"Using Your Own Keys",slug:"using-your-own-keys"}]},{title:"Getting Started",frontmatter:{},regularPath:"/panel/0.7/getting_started.html",relativePath:"panel/0.7/getting_started.md",key:"v-7ffeb723",path:"/panel/0.7/getting_started.html",headers:[{level:2,title:"Picking a Server OS",slug:"picking-a-server-os"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Example Dependency Installation",slug:"example-dependency-installation"},{level:3,title:"Installing Composer",slug:"installing-composer"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"Installation",slug:"installation"},{level:3,title:"Environment Configuration",slug:"environment-configuration"},{level:3,title:"Database Setup",slug:"database-setup"},{level:3,title:"Add The First User",slug:"add-the-first-user"},{level:3,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Queue Listeners",slug:"queue-listeners"},{level:3,title:"Crontab Configuration",slug:"crontab-configuration"},{level:3,title:"Create Queue Worker",slug:"create-queue-worker"}]},{title:"Troubleshooting",frontmatter:{},regularPath:"/panel/0.7/troubleshooting.html",relativePath:"panel/0.7/troubleshooting.md",key:"v-9478f2ba",path:"/panel/0.7/troubleshooting.html",headers:[{level:2,title:"Reading Error Logs",slug:"reading-error-logs"},{level:3,title:"Parsing the Error",slug:"parsing-the-error"},{level:3,title:"Understanding the Error",slug:"understanding-the-error"},{level:3,title:"Utilizing GREP",slug:"utilizing-grep"},{level:2,title:"Transfer Exceptions / XHR Poll Error",slug:"transfer-exceptions-xhr-poll-error"},{level:3,title:"Example Errors",slug:"example-errors"},{level:3,title:"Basic Debugging Steps",slug:"basic-debugging-steps"},{level:3,title:"More Advanced Debugging Steps",slug:"more-advanced-debugging-steps"},{level:2,title:"Invalid MAC Exception",slug:"invalid-mac-exception"},{level:2,title:"SELinux Issues",slug:"selinux-issues"},{level:3,title:"Redis Permissions Errors",slug:"redis-permissions-errors"},{level:3,title:"In case there is any weirdness with parts of the panel",slug:"in-case-there-is-any-weirdness-with-parts-of-the-panel"},{level:3,title:"Daemon Connection Errors",slug:"daemon-connection-errors"},{level:2,title:"FirewallD issues",slug:"firewalld-issues"},{level:2,title:"Database Errors",slug:"database-errors"},{level:3,title:"DatabaseController.php:142",slug:"databasecontroller-php-142"}]},{title:"Upgrading 0.6 to 0.7",frontmatter:{},regularPath:"/panel/0.7/upgrade/0.6_to_0.7.html",relativePath:"panel/0.7/upgrade/0.6_to_0.7.md",key:"v-4f03fe0f",path:"/panel/0.7/upgrade/0.6_to_0.7.html",headers:[{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Clear Compiled Assets",slug:"clear-compiled-assets"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Update Environment",slug:"update-environment"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Cleanup API Keys",slug:"cleanup-api-keys"},{level:2,title:"Set Permissions",slug:"set-permissions"}]},{title:"Upgrading 0.7 Series",frontmatter:{},regularPath:"/panel/0.7/upgrade/0.7.html",relativePath:"panel/0.7/upgrade/0.7.md",key:"v-5baa92ba",path:"/panel/0.7/upgrade/0.7.html",headers:[{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"}]},{title:"Upgrading",frontmatter:{},regularPath:"/panel/0.7/upgrading.html",relativePath:"panel/0.7/upgrading.md",key:"v-c249e07a",path:"/panel/0.7/upgrading.html",headers:[{level:2,title:"Maintenance Mode",slug:"maintenance-mode"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:2,title:"Version Specific Guides",slug:"version-specific-guides"}]},{title:"Webserver Configuration",frontmatter:{},regularPath:"/panel/0.7/webserver_configuration.html",relativePath:"panel/0.7/webserver_configuration.md",key:"v-27941b23",path:"/panel/0.7/webserver_configuration.html",headers:[{level:2,title:"NGINX",slug:"nginx"},{level:3,title:"NGINX With SSL",slug:"nginx-with-ssl"},{level:3,title:"NGINX Without SSL",slug:"nginx-without-ssl"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration"},{level:2,title:"Apache",slug:"apache"},{level:3,title:"Apache With SSL",slug:"apache-with-ssl"},{level:3,title:"Apache Without SSL",slug:"apache-without-ssl"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-2"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/panel/1.0/additional_configuration.html",relativePath:"panel/1.0/additional_configuration.md",key:"v-6f4baca5",path:"/panel/1.0/additional_configuration.html",headers:[{level:2,title:"Backups",slug:"backups"},{level:3,title:"Using S3 Backups",slug:"using-s3-backups"},{level:2,title:"reCAPTCHA",slug:"recaptcha"},{level:3,title:"Configuring reCAPTCHA",slug:"configuring-recaptcha"},{level:3,title:"Disabling reCAPTCHA",slug:"disabling-recaptcha"},{level:2,title:"2FA",slug:"_2fa"},{level:3,title:"Disable 2FA requirement",slug:"disable-2fa-requirement"},{level:3,title:"Disable 2FA for a specific user",slug:"disable-2fa-for-a-specific-user"}]},{title:"Getting Started",frontmatter:{},regularPath:"/panel/1.0/getting_started.html",relativePath:"panel/1.0/getting_started.md",key:"v-fa75e63a",path:"/panel/1.0/getting_started.html",headers:[{level:2,title:"Picking a Server OS",slug:"picking-a-server-os"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Example Dependency Installation",slug:"example-dependency-installation"},{level:3,title:"Installing Composer",slug:"installing-composer"},{level:2,title:"Download Files",slug:"download-files"},{level:2,title:"Installation",slug:"installation"},{level:3,title:"Environment Configuration",slug:"environment-configuration"},{level:3,title:"Database Setup",slug:"database-setup"},{level:3,title:"Add The First User",slug:"add-the-first-user"},{level:3,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Queue Listeners",slug:"queue-listeners"},{level:3,title:"Crontab Configuration",slug:"crontab-configuration"},{level:3,title:"Create Queue Worker",slug:"create-queue-worker"}]},{title:"Legacy Upgrades",frontmatter:{},regularPath:"/panel/1.0/legacy_upgrade.html",relativePath:"panel/1.0/legacy_upgrade.md",key:"v-dacf6e56",path:"/panel/1.0/legacy_upgrade.html",headers:[{level:2,title:"Enter Maintenance Mode",slug:"enter-maintenance-mode"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:2,title:"Update Dependencies",slug:"update-dependencies-2"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:2,title:"Exit Maintenance Mode",slug:"exit-maintenance-mode"},{level:2,title:"Switch to Wings",slug:"switch-to-wings"}]},{title:"Troubleshooting",frontmatter:{},regularPath:"/panel/1.0/troubleshooting.html",relativePath:"panel/1.0/troubleshooting.md",key:"v-8eec473a",path:"/panel/1.0/troubleshooting.html",headers:[{level:2,title:"Reading Error Logs",slug:"reading-error-logs"},{level:3,title:"Parsing the Error",slug:"parsing-the-error"},{level:3,title:"Understanding the Error",slug:"understanding-the-error"},{level:3,title:"Utilizing GREP",slug:"utilizing-grep"},{level:2,title:"Cannot Connect to Server Errors",slug:"cannot-connect-to-server-errors"},{level:3,title:"Basic Debugging Steps",slug:"basic-debugging-steps"},{level:3,title:"More Advanced Debugging Steps",slug:"more-advanced-debugging-steps"},{level:2,title:"Invalid MAC Exception",slug:"invalid-mac-exception"},{level:2,title:"SELinux Issues",slug:"selinux-issues"},{level:3,title:"Redis Permissions Errors",slug:"redis-permissions-errors"},{level:3,title:"Wings Connection Errors",slug:"wings-connection-errors"},{level:2,title:"FirewallD issues",slug:"firewalld-issues"}]},{title:"Updating the Panel",frontmatter:{},regularPath:"/panel/1.0/updating.html",relativePath:"panel/1.0/updating.md",key:"v-29d5bc56",path:"/panel/1.0/updating.html",headers:[{level:2,title:"Panel Version Requirements",slug:"panel-version-requirements"},{level:2,title:"Update Dependencies",slug:"update-dependencies"},{level:2,title:"Fetch Updated Files",slug:"fetch-updated-files"},{level:3,title:"Enter Maintenance Mode",slug:"enter-maintenance-mode"},{level:3,title:"Download the Update",slug:"download-the-update"},{level:2,title:"Update Dependencies",slug:"update-dependencies-2"},{level:2,title:"Clear Compiled Template Cache",slug:"clear-compiled-template-cache"},{level:2,title:"Database Updates",slug:"database-updates"},{level:2,title:"Set Permissions",slug:"set-permissions"},{level:2,title:"Restarting Queue Workers",slug:"restarting-queue-workers"},{level:3,title:"Exit Maintenance Mode",slug:"exit-maintenance-mode"}]},{title:"Webserver Configuration",frontmatter:{},regularPath:"/panel/1.0/webserver_configuration.html",relativePath:"panel/1.0/webserver_configuration.md",key:"v-cbda523a",path:"/panel/1.0/webserver_configuration.html",headers:[{level:3,title:"Enabling Configuration",slug:"enabling-configuration"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-2"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-3"},{level:3,title:"Enabling Configuration",slug:"enabling-configuration-4"}]},{title:"About",frontmatter:{},regularPath:"/project/about.html",relativePath:"project/about.md",key:"v-a75af93a",path:"/project/about.html",headers:[{level:2,title:"Core Project Team",slug:"core-project-team"},{level:2,title:"Community Team",slug:"community-team"},{level:2,title:"Sponsors",slug:"sponsors"},{level:2,title:"License",slug:"license"},{level:2,title:"GPG Signature",slug:"gpg-signature"}]},{title:"Community Standards",frontmatter:{},regularPath:"/project/community.html",relativePath:"project/community.md",key:"v-22ba6d3a",path:"/project/community.html",headers:[{level:2,title:"Community Guidelines",slug:"community-guidelines"},{level:3,title:"Be Mature",slug:"be-mature"},{level:3,title:"Limit the Drama",slug:"limit-the-drama"},{level:3,title:"Be Patient",slug:"be-patient"},{level:3,title:"No Commercial Services",slug:"no-commercial-services"},{level:3,title:"No Mention or Ping Spam",slug:"no-mention-or-ping-spam"}]},{title:"Introduction",frontmatter:{},regularPath:"/project/introduction.html",relativePath:"project/introduction.md",key:"v-d6319362",path:"/project/introduction.html",headers:[{level:2,title:"Supported Games",slug:"supported-games"},{level:2,title:"Responsible Disclosure",slug:"responsible-disclosure"}]},{title:"Terminology",frontmatter:{},regularPath:"/project/terms.html",relativePath:"project/terms.md",key:"v-7b99cfba",path:"/project/terms.html",headers:[{level:2,title:"Example Setup Diagram",slug:"example-setup-diagram"}]},{title:"Creating SSL Certificates",frontmatter:{},regularPath:"/tutorials/creating_ssl_certificates.html",relativePath:"tutorials/creating_ssl_certificates.md",key:"v-6ec4d123",path:"/tutorials/creating_ssl_certificates.html",headers:[{level:3,title:"Creating a Certificate",slug:"creating-a-certificate"},{level:3,title:"Auto Renewal",slug:"auto-renewal"},{level:3,title:"Troubleshooting",slug:"troubleshooting"},{level:3,title:"Obtaining CloudFlare API Key",slug:"obtaining-cloudflare-api-key"},{level:3,title:"Creating a Certificate",slug:"creating-a-certificate-2"},{level:3,title:"Auto Renewal",slug:"auto-renewal-2"}]},{title:"Setting up MySQL",frontmatter:{},regularPath:"/tutorials/mysql_setup.html",relativePath:"tutorials/mysql_setup.md",key:"v-5c5d50fa",path:"/tutorials/mysql_setup.html",headers:[{level:2,title:"Creating a database for Pterodactyl",slug:"creating-a-database-for-pterodactyl"},{level:3,title:"Logging In",slug:"logging-in"},{level:3,title:"Creating a user",slug:"creating-a-user"},{level:3,title:"Create a database",slug:"create-a-database"},{level:3,title:"Assigning permissions",slug:"assigning-permissions"},{level:2,title:"Creating a Database Host for Nodes",slug:"creating-a-database-host-for-nodes"},{level:3,title:"Creating a user",slug:"creating-a-user-2"},{level:3,title:"Assigning permissions",slug:"assigning-permissions-2"},{level:3,title:"Allowing external database access",slug:"allowing-external-database-access"}]},{title:"Additional Configuration",frontmatter:{},regularPath:"/wings/1.0/configuration.html",relativePath:"wings/1.0/configuration.md",key:"v-6cd19ba3",path:"/wings/1.0/configuration.html",headers:[{level:2,title:"Private Registries",slug:"private-registries"},{level:3,title:"Available Keys",slug:"available-keys"},{level:3,title:"Example of usage",slug:"example-of-usage"},{level:2,title:"Custom Network Interfaces",slug:"custom-network-interfaces"},{level:3,title:"Example of usage",slug:"example-of-usage-2"},{level:2,title:"Enabling Cloudflare proxy",slug:"enabling-cloudflare-proxy"},{level:2,title:"Throttles Limits",slug:"throttles-limits"},{level:3,title:"Example of usage",slug:"example-of-usage-3"},{level:2,title:"Other values",slug:"other-values"}]},{title:"Installing Wings",frontmatter:{},regularPath:"/wings/1.0/installing.html",relativePath:"wings/1.0/installing.md",key:"v-55eb8eca",path:"/wings/1.0/installing.html",headers:[{level:2,title:"Supported Systems",slug:"supported-systems"},{level:2,title:"System Requirements",slug:"system-requirements"},{level:2,title:"Dependencies",slug:"dependencies"},{level:3,title:"Installing Docker",slug:"installing-docker"},{level:2,title:"Installing Wings",slug:"installing-wings-2"},{level:2,title:"Configure",slug:"configure"},{level:3,title:"Starting Wings",slug:"starting-wings"},{level:3,title:"Daemonizing (using systemd)",slug:"daemonizing-using-systemd"},{level:3,title:"Node Allocations",slug:"node-allocations"}]},{title:"Migrating to Wings",frontmatter:{},regularPath:"/wings/1.0/migrating.html",relativePath:"wings/1.0/migrating.md",key:"v-1ec46263",path:"/wings/1.0/migrating.html",headers:[{level:2,title:"Install Wings",slug:"install-wings"},{level:2,title:"Copy New Configuration File",slug:"copy-new-configuration-file"},{level:2,title:"Remove Old Daemon",slug:"remove-old-daemon"},{level:3,title:"Remove Standalone SFTP",slug:"remove-standalone-sftp"},{level:2,title:"Daemonize Wings",slug:"daemonize-wings"}]},{title:"Upgrading Wings",frontmatter:{},regularPath:"/wings/1.0/upgrading.html",relativePath:"wings/1.0/upgrading.md",key:"v-9213d4fa",path:"/wings/1.0/upgrading.html",headers:[{level:2,title:"Wings Version Requirements",slug:"wings-version-requirements"},{level:2,title:"Download Updated Binary",slug:"download-updated-binary"},{level:2,title:"Restart Process",slug:"restart-process"}]}],themeConfig:{repo:"pterodactyl/panel",docsRepo:"pterodactyl/documentation",repoLabel:"Contribute",editLinkText:"Help us improve this page.",editLinks:!0,logo:"/logos/pterry.svg",nav:[{text:"Documentation",link:"/project/introduction.md"},{text:"Community Guides",link:"/community/about.md"},{text:"Get Help",link:"https://discord.gg/pterodactyl"},{text:"API",link:"https://dashflo.net/docs/api/pterodactyl/v1/"}],sidebar:{"/community/":[{title:"Community Guides",collapsable:!1,children:["/community/about.md"]},{title:"Panel Installation",collapsable:!1,children:["/community/installation-guides/panel/centos7.md","/community/installation-guides/panel/centos8.md","/community/installation-guides/panel/debian9.md","/community/installation-guides/panel/debian10.md","/community/installation-guides/panel/ubuntu1804.md","/community/installation-guides/panel/ubuntu2004.md"]},{title:"Wings Installation",collapsable:!1,children:["/community/installation-guides/wings/centos7.md","/community/installation-guides/wings/centos8.md","/community/installation-guides/wings/debian9.md","/community/installation-guides/wings/debian10.md","/community/installation-guides/wings/ubuntu1804.md","/community/installation-guides/wings/ubuntu2004.md"]},{title:"Creating Eggs",collapsable:!1,children:["/community/config/eggs/creating_a_custom_egg.md","/community/config/eggs/creating_a_custom_image.md"]},{title:"Game Configuration",collapsable:!1,children:["/community/games/minecraft.md"]},{title:"Tutorials",collapsable:!1,children:["/community/config/nodes/add_node.md","/community/tutorials/artisan.md"]},{title:"Customization",collapsable:!1,children:["/community/customization/panel.md","/community/customization/wings.md"]}],"/":[{title:"Project Information",collapsable:!1,children:["/project/introduction.md","/project/about.md","/project/terms.md","/project/community.md"]},{title:"Panel",collapsable:!1,path:"/panel/",currentVersion:"1.0",versions:[{title:"1.4",name:"1.0",status:"stable",children:["/getting_started","/webserver_configuration","/additional_configuration","/updating","/troubleshooting","/legacy_upgrade"]}]},{title:"Wings",collapsable:!1,path:"/wings/",currentVersion:"1.0",versions:[{title:"1.4",name:"1.0",status:"stable",children:["/installing","/upgrading","/migrating","/configuration"]}]},{title:"Tutorials",collapsable:!1,children:["/tutorials/mysql_setup.md","/tutorials/creating_ssl_certificates.md"]},{title:"Guides",collapsable:!1,children:["/guides/mounts.md"]},{title:"Development & Ops",collapsable:!0,children:["/ops/publish_release.md"]}]}}},Le=(n(300),n(302),n(303),n(181),n(74),n(108));function Re(){for(var t="/",e=new RegExp(t+"{1,}","g"),n=arguments.length,r=new Array(n),i=0;i2&&void 0!==arguments[2]?arguments[2]:o.a;Qt(e),n.$vuepress.$set("siteData",e);var r=t(n.$vuepress.$get("siteData")),i=new r,a=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(i)),s={};return Object.keys(a).reduce((function(t,e){return e.startsWith("$")&&(t[e]=a[e].get),t}),s),{computed:s}}((function(t){return function(){function e(){Ue(this,e)}return Be(e,[{key:"setPage",value:function(t){this.__page=t}},{key:"$site",get:function(){return t}},{key:"$themeConfig",get:function(){return this.$site.themeConfig}},{key:"$frontmatter",get:function(){return this.$page.frontmatter}},{key:"$localeConfig",get:function(){var t,e,n=this.$site.locales,r=void 0===n?{}:n;for(var i in r)"/"===i?e=r[i]:0===this.$page.path.indexOf(i)&&(t=r[i]);return t||e||{}}},{key:"$siteTitle",get:function(){return this.$localeConfig.title||this.$site.title||""}},{key:"$canonicalUrl",get:function(){var t=this.$page.frontmatter.canonicalUrl;return"string"==typeof t&&t}},{key:"$title",get:function(){var t=this.$page,e=this.$page.frontmatter.metaTitle;if("string"==typeof e)return e;var n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}},{key:"$description",get:function(){var t=function(t){if(t){var e=t.filter((function(t){return"description"===t.name}))[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}},{key:"$lang",get:function(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}},{key:"$localePath",get:function(){return this.$localeConfig.path||"/"}},{key:"$themeLocaleConfig",get:function(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}},{key:"$page",get:function(){return this.__page?this.__page:function(t,e){for(var n=0;n - + @@ -39,6 +39,6 @@ feel are important to share with the community, but do not fit into the theme of our core documentation.

    Here you'll find in-depth OS-specific installation guides, advanced network configurations, individual game setup instructions, and so much more.

    - + diff --git a/community/config/eggs/creating_a_custom_egg.html b/community/config/eggs/creating_a_custom_egg.html index 408d872c..b4910d29 100644 --- a/community/config/eggs/creating_a_custom_egg.html +++ b/community/config/eggs/creating_a_custom_egg.html @@ -15,7 +15,7 @@ - + @@ -125,6 +125,6 @@ regex as any letters or numbers (\w\d) including underscore (Ubuntu 20.04
    - + diff --git a/community/config/eggs/creating_a_custom_image.html b/community/config/eggs/creating_a_custom_image.html index 722a2bcd..936d42c1 100644 --- a/community/config/eggs/creating_a_custom_image.html +++ b/community/config/eggs/creating_a_custom_image.html @@ -15,7 +15,7 @@ - + @@ -100,6 +100,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 9177ee21..79fd809a 100644 --- a/community/config/nodes/add_node.html +++ b/community/config/nodes/add_node.html @@ -15,7 +15,7 @@ - + @@ -48,6 +48,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 96d8503e..fbca5086 100644 --- a/community/customization/panel.html +++ b/community/customization/panel.html @@ -15,7 +15,7 @@ - + @@ -54,6 +54,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 0ea4446b..837997ae 100644 --- a/community/customization/wings.html +++ b/community/customization/wings.html @@ -15,7 +15,7 @@ - + @@ -47,6 +47,6 @@ systemctl start wings
    - + diff --git a/community/games/minecraft.html b/community/games/minecraft.html index ab4bebd4..0acb0c1e 100644 --- a/community/games/minecraft.html +++ b/community/games/minecraft.html @@ -15,7 +15,7 @@ - + @@ -41,6 +41,6 @@ ← Creating a Custom Docker Image
    - + diff --git a/community/installation-guides/panel/centos7.html b/community/installation-guides/panel/centos7.html index b3210c3e..a4196401 100644 --- a/community/installation-guides/panel/centos7.html +++ b/community/installation-guides/panel/centos7.html @@ -15,7 +15,7 @@ - + @@ -169,6 +169,6 @@ server { ← Community Guides and Tutorials
    - + diff --git a/community/installation-guides/panel/centos8.html b/community/installation-guides/panel/centos8.html index e41da96f..3d02bad4 100644 --- a/community/installation-guides/panel/centos8.html +++ b/community/installation-guides/panel/centos8.html @@ -15,7 +15,7 @@ - + @@ -152,6 +152,6 @@ server { ← CentOS 7
    - + diff --git a/community/installation-guides/panel/debian10.html b/community/installation-guides/panel/debian10.html index c091e7ef..724da1d9 100644 --- a/community/installation-guides/panel/debian10.html +++ b/community/installation-guides/panel/debian10.html @@ -15,7 +15,7 @@ - + @@ -131,6 +131,6 @@ server { ← Debian 9
    - + diff --git a/community/installation-guides/panel/debian9.html b/community/installation-guides/panel/debian9.html index 8fb46e1a..e5dd18d1 100644 --- a/community/installation-guides/panel/debian9.html +++ b/community/installation-guides/panel/debian9.html @@ -15,7 +15,7 @@ - + @@ -138,6 +138,6 @@ server { ← CentOS 8
    - + diff --git a/community/installation-guides/panel/ubuntu1804.html b/community/installation-guides/panel/ubuntu1804.html index 749f6886..2d5f2af5 100644 --- a/community/installation-guides/panel/ubuntu1804.html +++ b/community/installation-guides/panel/ubuntu1804.html @@ -15,7 +15,7 @@ - + @@ -131,6 +131,6 @@ server { ← Debian 10
    - + diff --git a/community/installation-guides/panel/ubuntu2004.html b/community/installation-guides/panel/ubuntu2004.html index b0770e51..18e95d89 100644 --- a/community/installation-guides/panel/ubuntu2004.html +++ b/community/installation-guides/panel/ubuntu2004.html @@ -15,7 +15,7 @@ - + @@ -131,6 +131,6 @@ server { ← Ubuntu 18.04
    - + diff --git a/community/installation-guides/wings/centos7.html b/community/installation-guides/wings/centos7.html index 8e4b961b..b9e49a24 100644 --- a/community/installation-guides/wings/centos7.html +++ b/community/installation-guides/wings/centos7.html @@ -15,7 +15,7 @@ - + @@ -56,6 +56,6 @@ firewall-cmd --reload ← Ubuntu 20.04
    - + diff --git a/community/installation-guides/wings/centos8.html b/community/installation-guides/wings/centos8.html index 591ca676..ccdcd691 100644 --- a/community/installation-guides/wings/centos8.html +++ b/community/installation-guides/wings/centos8.html @@ -15,7 +15,7 @@ - + @@ -56,6 +56,6 @@ firewall-cmd --reload ← CentOS 7
    - + diff --git a/community/installation-guides/wings/debian10.html b/community/installation-guides/wings/debian10.html index be6e4fbb..fcb52468 100644 --- a/community/installation-guides/wings/debian10.html +++ b/community/installation-guides/wings/debian10.html @@ -15,7 +15,7 @@ - + @@ -55,6 +55,6 @@ systemctl start docker ← Debian 9
    - + diff --git a/community/installation-guides/wings/debian9.html b/community/installation-guides/wings/debian9.html index fe41fbe1..a7d2224c 100644 --- a/community/installation-guides/wings/debian9.html +++ b/community/installation-guides/wings/debian9.html @@ -15,7 +15,7 @@ - + @@ -55,6 +55,6 @@ systemctl start docker ← CentOS 8
    - + diff --git a/community/installation-guides/wings/ubuntu1804.html b/community/installation-guides/wings/ubuntu1804.html index 93132361..0a845bbc 100644 --- a/community/installation-guides/wings/ubuntu1804.html +++ b/community/installation-guides/wings/ubuntu1804.html @@ -15,7 +15,7 @@ - + @@ -45,6 +45,6 @@ systemctl start docker ← Debian 10
    - + diff --git a/community/installation-guides/wings/ubuntu2004.html b/community/installation-guides/wings/ubuntu2004.html index 434f45bd..d0856ef5 100644 --- a/community/installation-guides/wings/ubuntu2004.html +++ b/community/installation-guides/wings/ubuntu2004.html @@ -15,7 +15,7 @@ - + @@ -45,6 +45,6 @@ systemctl start docker ← Ubuntu 18.04
    - + diff --git a/community/tutorials/artisan.html b/community/tutorials/artisan.html index d4006eeb..5cc092e8 100644 --- a/community/tutorials/artisan.html +++ b/community/tutorials/artisan.html @@ -15,7 +15,7 @@ - + @@ -58,6 +58,6 @@ ← Creating a New Node
    - + diff --git a/daemon/0.6/configuration.html b/daemon/0.6/configuration.html index d439a2d9..b62e2559 100644 --- a/daemon/0.6/configuration.html +++ b/daemon/0.6/configuration.html @@ -15,7 +15,7 @@ - + @@ -97,6 +97,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 91b634c7..d1730123 100644 --- a/daemon/0.6/debian_8_docker.html +++ b/daemon/0.6/debian_8_docker.html @@ -15,7 +15,7 @@ - + @@ -69,6 +69,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 ff5021da..4be257be 100644 --- a/daemon/0.6/installing.html +++ b/daemon/0.6/installing.html @@ -15,7 +15,7 @@ - + @@ -104,6 +104,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 070ad9ad..c231e0db 100644 --- a/daemon/0.6/kernel_modifications.html +++ b/daemon/0.6/kernel_modifications.html @@ -15,7 +15,7 @@ - + @@ -69,6 +69,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 c1a71716..c071002b 100644 --- a/daemon/0.6/standalone_sftp.html +++ b/daemon/0.6/standalone_sftp.html @@ -15,7 +15,7 @@ - + @@ -84,6 +84,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 9af5932a..cc77911c 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 @@ - + @@ -75,6 +75,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 12e03987..01b80936 100644 --- a/daemon/0.6/upgrade/0.5.html +++ b/daemon/0.6/upgrade/0.5.html @@ -15,7 +15,7 @@ - + @@ -52,6 +52,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 eec20c7f..96a97314 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 @@ - + @@ -62,6 +62,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 591b42dc..5bc38fb2 100644 --- a/daemon/0.6/upgrade/0.6.html +++ b/daemon/0.6/upgrade/0.6.html @@ -15,7 +15,7 @@ - + @@ -54,6 +54,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 b6e31e73..eacd0df3 100644 --- a/daemon/0.6/upgrading.html +++ b/daemon/0.6/upgrading.html @@ -15,7 +15,7 @@ - + @@ -46,6 +46,6 @@ current

  • # 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 b92bf508..cfa8e0cf 100644 --- a/guides/mounts.html +++ b/guides/mounts.html @@ -15,7 +15,7 @@ - + @@ -50,6 +50,6 @@ ← Creating SSL Certificates
    - + diff --git a/guides/php_upgrade.html b/guides/php_upgrade.html index 8d60f5e7..9bb51651 100644 --- a/guides/php_upgrade.html +++ b/guides/php_upgrade.html @@ -15,7 +15,7 @@ - + @@ -62,6 +62,6 @@ a2enmod php8.0 # Hint: a2dismod = a2_disable_module 🤯 a2dismod php7.3

    # Return to the 1.X.X Upgrade Guide

    - + diff --git a/index.html b/index.html index a300ccf7..9ffd2296 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@ - + @@ -57,6 +57,6 @@ Take the plunge today and discover why thousands of users trust Pterodactyl to manage their game servers.

    - + diff --git a/node_allocations.png b/node_allocations.png new file mode 100644 index 0000000000000000000000000000000000000000..c7547b6a1bfc0e4822397a4a41a01a2c31c93112 GIT binary patch literal 129194 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 - + @@ -90,6 +90,6 @@ gpg --detach-sig --output panel.asc panel.tar.gz
    - + diff --git a/panel/0.7/configuration.html b/panel/0.7/configuration.html index 93428c18..cd5acb64 100644 --- a/panel/0.7/configuration.html +++ b/panel/0.7/configuration.html @@ -15,7 +15,7 @@ - + @@ -80,6 +80,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 b94022ef..d1173b4d 100644 --- a/panel/0.7/getting_started.html +++ b/panel/0.7/getting_started.html @@ -15,7 +15,7 @@ - + @@ -141,6 +141,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 28ba2c45..d0182803 100644 --- a/panel/0.7/troubleshooting.html +++ b/panel/0.7/troubleshooting.html @@ -15,7 +15,7 @@ - + @@ -94,6 +94,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 e42aee37..61decfa3 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 @@ - + @@ -81,6 +81,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 ef2a8a88..59fe621b 100644 --- a/panel/0.7/upgrade/0.7.html +++ b/panel/0.7/upgrade/0.7.html @@ -15,7 +15,7 @@ - + @@ -71,6 +71,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 b6218778..229cc4f5 100644 --- a/panel/0.7/upgrading.html +++ b/panel/0.7/upgrading.html @@ -15,7 +15,7 @@ - + @@ -53,6 +53,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 eb3044f3..ae74f3e8 100644 --- a/panel/0.7/webserver_configuration.html +++ b/panel/0.7/webserver_configuration.html @@ -15,7 +15,7 @@ - + @@ -199,6 +199,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 76890b0a..d258c49d 100644 --- a/panel/1.0/additional_configuration.html +++ b/panel/1.0/additional_configuration.html @@ -15,7 +15,7 @@ - + @@ -58,6 +58,6 @@ 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
     
    - + diff --git a/panel/1.0/getting_started.html b/panel/1.0/getting_started.html index dab2d19b..c5b38dec 100644 --- a/panel/1.0/getting_started.html +++ b/panel/1.0/getting_started.html @@ -15,7 +15,7 @@ - + @@ -132,6 +132,6 @@ WantedBy=multi-user.target 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

    - + diff --git a/panel/1.0/legacy_upgrade.html b/panel/1.0/legacy_upgrade.html index 23539d83..351117b9 100644 --- a/panel/1.0/legacy_upgrade.html +++ b/panel/1.0/legacy_upgrade.html @@ -15,7 +15,7 @@ - + @@ -93,6 +93,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 31a5a680..776ea7e8 100644 --- a/panel/1.0/troubleshooting.html +++ b/panel/1.0/troubleshooting.html @@ -15,7 +15,7 @@ - + @@ -92,6 +92,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 51075516..af0dcc80 100644 --- a/panel/1.0/updating.html +++ b/panel/1.0/updating.html @@ -15,7 +15,7 @@ - + @@ -87,6 +87,6 @@ is www-data but can vary from system to system — sometimes being

    # 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

    - + diff --git a/panel/1.0/webserver_configuration.html b/panel/1.0/webserver_configuration.html index 6b4d0b72..02c09ade 100644 --- a/panel/1.0/webserver_configuration.html +++ b/panel/1.0/webserver_configuration.html @@ -15,7 +15,7 @@ - + @@ -207,6 +207,6 @@ below! You only need to run systemctl restart httpd.

    sudo a2enmod rewrite systemctl restart apache2

    # Next Step: Wings Installation

    - + diff --git a/project/about.html b/project/about.html index 91acb5e3..0aef88dc 100644 --- a/project/about.html +++ b/project/about.html @@ -15,7 +15,7 @@ - + @@ -118,6 +118,6 @@ gkSI5o2kam0QGYUhqg== ← Introduction
    - + diff --git a/project/community.html b/project/community.html index f439c629..5808962b 100644 --- a/project/community.html +++ b/project/community.html @@ -15,7 +15,7 @@ - + @@ -69,6 +69,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 4e840278..c2d84394 100644 --- a/project/introduction.html +++ b/project/introduction.html @@ -15,7 +15,7 @@ - + @@ -53,6 +53,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 1195e268..da45a4fb 100644 --- a/project/terms.html +++ b/project/terms.html @@ -15,7 +15,7 @@ - + @@ -51,6 +51,6 @@ created on nodes, and you can have multiple servers per node.

    Con ← About

    - + diff --git a/tutorials/creating_ssl_certificates.html b/tutorials/creating_ssl_certificates.html index 4002bf7e..c0de46e6 100644 --- a/tutorials/creating_ssl_certificates.html +++ b/tutorials/creating_ssl_certificates.html @@ -15,7 +15,7 @@ - + @@ -82,6 +82,6 @@ This will happen especially if you're running NGINX instead of Apache. The solut ← Setting up MySQL
    - + diff --git a/tutorials/mysql_setup.html b/tutorials/mysql_setup.html index 9806b7fe..f230964b 100644 --- a/tutorials/mysql_setup.html +++ b/tutorials/mysql_setup.html @@ -15,7 +15,7 @@ - + @@ -74,6 +74,6 @@ bind-address=0.0.0.0 ← Community Standards
    - + diff --git a/wings/1.0/configuration.html b/wings/1.0/configuration.html index f109d8c1..adedc87f 100644 --- a/wings/1.0/configuration.html +++ b/wings/1.0/configuration.html @@ -15,7 +15,7 @@ - + @@ -62,6 +62,6 @@ you misconfigure something. Proceed only if you know what each configuration val decay_interval: 10000 stop_grace_period: 15

    # 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 07e2700a..4f75cf76 100644 --- a/wings/1.0/installing.html +++ b/wings/1.0/installing.html @@ -15,7 +15,7 @@ - + @@ -44,7 +44,7 @@ current

  • # 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.0. Do not install this software +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

    Operating System Version Supported Notes
    Ubuntu 18.04 Documentation written assuming Ubuntu 18.04 as the base OS.
    20.04
    CentOS 7
    8
    Debian 9
    10

    # System Requirements

    In order to run Wings you will need a system capable of running Docker containers. Most VPS and almost all dedicated servers should be capable of running Docker, but there are edge cases.

    If your provider makes use of Virtuozzo, OpenVZ (or OVZ), or LXC then you will most likely be unable to run Wings. If you are unsure what your host is using there are a couple of options. The easiest is to check @@ -73,7 +73,7 @@ run the commands below which will create the base directory and download the win chmod u+x /usr/local/bin/wings

    OVH/SYS Servers

    If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to /home, and not / by default. Please consider using /home/daemon-data for server data. This can be easily -set when creating the node.

    # Configure

    Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button.

    After you have created a node, click on it and there will be a tab called Configuration. Copy the code block content, paste it into a new file called config.yml in /etc/pterodactyl and save it.

    Alternatively, you can click on the Generate Token button, copy the bash command and paste it into your terminal.

    # Starting Wings

    To start Wings, simply run the command below, which will start it in a debug mode. Once you confirmed that it is running without errors, use CTRL+C to terminate the process and daemonize it by following the instructions below. Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes.

    sudo wings --debug
    +set when creating the node.

    # Configure

    Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button.

    After you have created a node, click on it and there will be a tab called Configuration. Copy the code block content, paste it into a new file called config.yml in /etc/pterodactyl and save it.

    Alternatively, you can click on the Generate Token button, copy the bash command and paste it into your terminal.

    WARNING

    When your Panel is using SSL, the Wings must also have one created for its FQDN. See Creating SSL Certificates documentation page for how to create these certificates before continuing.

    # Starting Wings

    To start Wings, simply run the command below, which will start it in a debug mode. Once you confirmed that it is running without errors, use CTRL+C to terminate the process and daemonize it by following the instructions below. Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes.

    sudo wings --debug
     

    You may optionally add the --debug flag to run Wings in debug mode.

    # Daemonizing (using systemd)

    Running Wings in the background is a simple task, just make sure that it runs without errors before doing this. Place the contents below in a file called wings.service in the /etc/systemd/system directory.

    [Unit]
     Description=Pterodactyl Wings Daemon
    @@ -93,7 +93,7 @@ StartLimitInterval=600
     [Install]
     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.

    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 2de82420..a905288f 100644 --- a/wings/1.0/migrating.html +++ b/wings/1.0/migrating.html @@ -15,7 +15,7 @@ - + @@ -93,6 +93,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 0df13cdf..b85ba849 100644 --- a/wings/1.0/upgrading.html +++ b/wings/1.0/upgrading.html @@ -15,7 +15,7 @@ - + @@ -50,6 +50,6 @@ most cases your base Wings version should match that of your Panel.

    <

    # 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
     
    - +