From 3e73dfafd89dc3c9a5b27d903ecc9b75becff4d6 Mon Sep 17 00:00:00 2001 From: DaneEveritt Date: Sat, 6 Mar 2021 19:59:41 +0000 Subject: [PATCH] deploy: b71f89f4e93c95f3c75fd892429eb55936160ab3 --- 404.html | 33 ++++--- ...les.26db9e46.css => 0.styles.b4cb0fef.css} | 0 assets/js/1.d0c981d7.js | 1 + assets/js/1.d27374d7.js | 1 - assets/js/10.27cec751.js | 1 + assets/js/10.bcaf3754.js | 1 - assets/js/{11.e5240661.js => 11.53217705.js} | 2 +- assets/js/{12.bc37074e.js => 12.6783fda9.js} | 2 +- assets/js/{13.d96e5a31.js => 13.bd04c4ec.js} | 2 +- assets/js/14.2b6a0c7b.js | 1 - assets/js/{15.dcb97977.js => 14.2e96f1b8.js} | 2 +- assets/js/{16.f2393fa3.js => 15.a6802091.js} | 2 +- assets/js/16.f2dea920.js | 1 + assets/js/{17.403d3937.js => 17.8289ca23.js} | 2 +- assets/js/{18.a38a22c6.js => 18.fcb158a9.js} | 2 +- assets/js/{19.2909f3bf.js => 19.bb80f931.js} | 2 +- assets/js/{2.17b53296.js => 2.21e1a937.js} | 4 +- assets/js/{20.2b0e82e7.js => 20.a127d7e5.js} | 2 +- assets/js/{21.de639223.js => 21.971336a8.js} | 2 +- assets/js/{22.ba247afa.js => 22.9a00df11.js} | 2 +- assets/js/{23.6388ee5d.js => 23.7fd88d34.js} | 2 +- assets/js/{24.a7d8bd12.js => 24.18e132d5.js} | 2 +- assets/js/{25.a18e760a.js => 25.5a8ed612.js} | 2 +- assets/js/{26.ce110c77.js => 26.0b63e77f.js} | 2 +- assets/js/{27.1bc51cad.js => 27.0711df74.js} | 2 +- assets/js/28.17b33d85.js | 1 + assets/js/28.45d4fe86.js | 1 - assets/js/29.1cc47d12.js | 1 - assets/js/29.9c25f524.js | 1 + assets/js/{30.831cc1fd.js => 30.34c4472a.js} | 2 +- assets/js/{31.55c4be08.js => 31.4a35c00f.js} | 2 +- assets/js/{32.86eddebf.js => 32.d98a3373.js} | 2 +- assets/js/{33.257d9d0e.js => 33.88a8819c.js} | 2 +- assets/js/{34.fead0e36.js => 34.0edc39f4.js} | 2 +- assets/js/{35.bc9ceac9.js => 35.969d92c8.js} | 2 +- assets/js/{36.0050a325.js => 36.49b831e2.js} | 2 +- assets/js/{37.13038a4c.js => 37.46d8127b.js} | 2 +- assets/js/{38.7687dfa0.js => 38.9d9c367c.js} | 2 +- assets/js/{39.b4cd4648.js => 39.4e9577b6.js} | 2 +- assets/js/4.9dfb277d.js | 3 + assets/js/4.cda5f594.js | 3 - assets/js/{40.04b12ca0.js => 40.273f9b41.js} | 2 +- assets/js/{41.c2275e99.js => 41.32790d14.js} | 2 +- assets/js/{42.b62aa882.js => 42.d9689e6d.js} | 2 +- assets/js/{43.f9c88a30.js => 43.9992155a.js} | 2 +- assets/js/{44.d08991a7.js => 44.e7f6dd0e.js} | 2 +- assets/js/{45.f1a12be4.js => 45.32b9b890.js} | 2 +- assets/js/{46.ca2282dc.js => 46.c04b0749.js} | 2 +- assets/js/{47.37177763.js => 47.8a528b5d.js} | 2 +- assets/js/{48.264a4203.js => 48.0bb564a9.js} | 2 +- assets/js/{49.467bb35d.js => 49.70313a9d.js} | 2 +- assets/js/5.73a53d7a.js | 1 + assets/js/5.7eab6273.js | 1 - assets/js/{50.56f9cafe.js => 50.6b4f4718.js} | 2 +- assets/js/{51.591e996b.js => 51.75e9c6d8.js} | 2 +- assets/js/{52.d8a55dab.js => 52.5803bd20.js} | 2 +- assets/js/{53.49cf15bb.js => 53.c0284790.js} | 2 +- assets/js/{54.9cf0343b.js => 54.14aa3f16.js} | 2 +- assets/js/{55.38afd6c1.js => 55.4e7ca13f.js} | 2 +- assets/js/{56.7c20f0d9.js => 56.cbbea30d.js} | 2 +- assets/js/57.7fee903e.js | 1 + assets/js/{57.bf8211fd.js => 58.df220808.js} | 2 +- assets/js/{58.4d4d61ab.js => 59.06f08aee.js} | 2 +- assets/js/6.8999fd8a.js | 1 + assets/js/6.f86bc75a.js | 1 - assets/js/{59.8b2e0e29.js => 60.a3853cbe.js} | 2 +- assets/js/{60.f1fb5037.js => 61.360ebc59.js} | 2 +- assets/js/{61.1111872b.js => 62.db0d6812.js} | 2 +- assets/js/{62.5f8f5d5e.js => 63.8a89fed0.js} | 2 +- assets/js/{63.818b0c85.js => 64.8fe43c5c.js} | 2 +- assets/js/{64.c9825ab0.js => 65.d4df1bb2.js} | 2 +- assets/js/66.6eb152b3.js | 1 - assets/js/{65.c8ff65d1.js => 66.6f45bd01.js} | 2 +- assets/js/67.178227eb.js | 1 + assets/js/67.4a6e498c.js | 1 - assets/js/68.0031d838.js | 1 + assets/js/68.da47c92a.js | 1 - assets/js/69.5b1543d7.js | 1 - assets/js/69.ec490c70.js | 1 + assets/js/7.4a1def3b.js | 1 - assets/js/7.9f1ce256.js | 1 + assets/js/70.31ac2858.js | 1 - assets/js/70.8d69a395.js | 1 + assets/js/{71.21185529.js => 71.80cd5f49.js} | 2 +- assets/js/{72.0f099e82.js => 72.bfd59abc.js} | 2 +- assets/js/{73.afbaa1a8.js => 73.ebba4afb.js} | 2 +- assets/js/74.5f063a47.js | 1 + assets/js/74.80dd8d0e.js | 1 - assets/js/{75.bc6f52b4.js => 75.d8da70f3.js} | 2 +- assets/js/{76.f3d105b7.js => 76.acf66e95.js} | 2 +- assets/js/77.0dc87057.js | 1 + assets/js/77.c8845eb4.js | 1 - assets/js/8.4c71898e.js | 1 + assets/js/8.ece8e8ed.js | 1 - assets/js/9.7af626f7.js | 1 + assets/js/9.ec68f296.js | 1 - assets/js/app.24fefc80.js | 11 +++ assets/js/app.5ed11237.js | 11 --- community/about.html | 27 ++--- .../config/eggs/creating_a_custom_egg.html | 29 +++--- .../config/eggs/creating_a_custom_image.html | 47 ++++----- community/config/nodes/add_node.html | 23 ++--- community/customization/panel.html | 23 ++--- community/customization/wings.html | 25 ++--- community/games/minecraft.html | 23 ++--- .../installation-guides/panel/centos7.html | 23 ++--- .../installation-guides/panel/centos8.html | 23 ++--- .../installation-guides/panel/debian10.html | 23 ++--- .../installation-guides/panel/debian9.html | 23 ++--- .../installation-guides/panel/ubuntu1804.html | 23 ++--- .../installation-guides/panel/ubuntu2004.html | 23 ++--- .../installation-guides/wings/centos7.html | 23 ++--- .../installation-guides/wings/centos8.html | 23 ++--- .../installation-guides/wings/debian10.html | 23 ++--- .../installation-guides/wings/debian9.html | 23 ++--- .../installation-guides/wings/ubuntu1804.html | 23 ++--- .../installation-guides/wings/ubuntu2004.html | 23 ++--- community/tutorials/artisan.html | 23 ++--- daemon/0.6/configuration.html | 35 +++---- daemon/0.6/debian_8_docker.html | 35 +++---- daemon/0.6/installing.html | 39 ++++---- daemon/0.6/kernel_modifications.html | 33 ++++--- daemon/0.6/standalone_sftp.html | 39 ++++---- daemon/0.6/upgrade/0.4_to_0.5.html | 35 +++---- daemon/0.6/upgrade/0.5.html | 33 ++++--- daemon/0.6/upgrade/0.5_to_0.6.html | 33 ++++--- daemon/0.6/upgrade/0.6.html | 33 ++++--- daemon/0.6/upgrading.html | 33 ++++--- guides/mounts.html | 35 +++---- guides/php_upgrade.html | 64 ++++++++++++ index.html | 33 ++++--- ops/publish_release.html | 35 +++---- panel/0.7/configuration.html | 37 +++---- panel/0.7/getting_started.html | 33 ++++--- panel/0.7/troubleshooting.html | 35 +++---- panel/0.7/upgrade/0.6_to_0.7.html | 33 ++++--- panel/0.7/upgrade/0.7.html | 33 ++++--- panel/0.7/upgrading.html | 33 ++++--- panel/0.7/webserver_configuration.html | 33 ++++--- panel/1.0/additional_configuration.html | 35 +++---- panel/1.0/getting_started.html | 41 ++++---- panel/1.0/legacy_upgrade.html | 98 +++++++++++++++++++ panel/1.0/updating.html | 93 ++++++++++++++++++ panel/1.0/upgrade/0.7_to_1.0.html | 95 ------------------ panel/1.0/upgrade/1.0.html | 74 -------------- panel/1.0/upgrading.html | 57 ----------- panel/1.0/webserver_configuration.html | 45 ++++----- project/about.html | 37 +++---- project/community.html | 33 ++++--- project/introduction.html | 37 +++---- project/terms.html | 33 ++++--- tutorials/creating_ssl_certificates.html | 41 ++++---- tutorials/mysql_setup.html | 35 +++---- wings/1.0/configuration.html | 35 +++---- wings/1.0/installing.html | 37 +++---- wings/1.0/migrating.html | 35 +++---- wings/1.0/upgrading.html | 37 +++---- 157 files changed, 1222 insertions(+), 1137 deletions(-) rename assets/css/{0.styles.26db9e46.css => 0.styles.b4cb0fef.css} (100%) create mode 100644 assets/js/1.d0c981d7.js delete mode 100644 assets/js/1.d27374d7.js create mode 100644 assets/js/10.27cec751.js delete mode 100644 assets/js/10.bcaf3754.js rename assets/js/{11.e5240661.js => 11.53217705.js} (75%) rename assets/js/{12.bc37074e.js => 12.6783fda9.js} (97%) rename assets/js/{13.d96e5a31.js => 13.bd04c4ec.js} (82%) delete mode 100644 assets/js/14.2b6a0c7b.js rename assets/js/{15.dcb97977.js => 14.2e96f1b8.js} (97%) rename assets/js/{16.f2393fa3.js => 15.a6802091.js} (66%) create mode 100644 assets/js/16.f2dea920.js rename assets/js/{17.403d3937.js => 17.8289ca23.js} (92%) rename assets/js/{18.a38a22c6.js => 18.fcb158a9.js} (52%) rename assets/js/{19.2909f3bf.js => 19.bb80f931.js} (98%) rename assets/js/{2.17b53296.js => 2.21e1a937.js} (99%) rename assets/js/{20.2b0e82e7.js => 20.a127d7e5.js} (98%) rename assets/js/{21.de639223.js => 21.971336a8.js} (98%) rename assets/js/{22.ba247afa.js => 22.9a00df11.js} (98%) rename assets/js/{23.6388ee5d.js => 23.7fd88d34.js} (59%) rename assets/js/{24.a7d8bd12.js => 24.18e132d5.js} (79%) rename assets/js/{25.a18e760a.js => 25.5a8ed612.js} (82%) rename assets/js/{26.ce110c77.js => 26.0b63e77f.js} (90%) rename assets/js/{27.1bc51cad.js => 27.0711df74.js} (75%) create mode 100644 assets/js/28.17b33d85.js delete mode 100644 assets/js/28.45d4fe86.js delete mode 100644 assets/js/29.1cc47d12.js create mode 100644 assets/js/29.9c25f524.js rename assets/js/{30.831cc1fd.js => 30.34c4472a.js} (86%) rename assets/js/{31.55c4be08.js => 31.4a35c00f.js} (99%) rename assets/js/{32.86eddebf.js => 32.d98a3373.js} (96%) rename assets/js/{33.257d9d0e.js => 33.88a8819c.js} (96%) rename assets/js/{34.fead0e36.js => 34.0edc39f4.js} (98%) rename assets/js/{35.bc9ceac9.js => 35.969d92c8.js} (99%) rename assets/js/{36.0050a325.js => 36.49b831e2.js} (98%) rename assets/js/{37.13038a4c.js => 37.46d8127b.js} (98%) rename assets/js/{38.7687dfa0.js => 38.9d9c367c.js} (98%) rename assets/js/{39.b4cd4648.js => 39.4e9577b6.js} (98%) create mode 100644 assets/js/4.9dfb277d.js delete mode 100644 assets/js/4.cda5f594.js rename assets/js/{40.04b12ca0.js => 40.273f9b41.js} (96%) rename assets/js/{41.c2275e99.js => 41.32790d14.js} (95%) rename assets/js/{42.b62aa882.js => 42.d9689e6d.js} (95%) rename assets/js/{43.f9c88a30.js => 43.9992155a.js} (95%) rename assets/js/{44.d08991a7.js => 44.e7f6dd0e.js} (94%) rename assets/js/{45.f1a12be4.js => 45.32b9b890.js} (94%) rename assets/js/{46.ca2282dc.js => 46.c04b0749.js} (98%) rename assets/js/{47.37177763.js => 47.8a528b5d.js} (99%) rename assets/js/{48.264a4203.js => 48.0bb564a9.js} (97%) rename assets/js/{49.467bb35d.js => 49.70313a9d.js} (97%) create mode 100644 assets/js/5.73a53d7a.js delete mode 100644 assets/js/5.7eab6273.js rename assets/js/{50.56f9cafe.js => 50.6b4f4718.js} (97%) rename assets/js/{51.591e996b.js => 51.75e9c6d8.js} (98%) rename assets/js/{52.d8a55dab.js => 52.5803bd20.js} (95%) rename assets/js/{53.49cf15bb.js => 53.c0284790.js} (97%) rename assets/js/{54.9cf0343b.js => 54.14aa3f16.js} (96%) rename assets/js/{55.38afd6c1.js => 55.4e7ca13f.js} (92%) rename assets/js/{56.7c20f0d9.js => 56.cbbea30d.js} (96%) create mode 100644 assets/js/57.7fee903e.js rename assets/js/{57.bf8211fd.js => 58.df220808.js} (98%) rename assets/js/{58.4d4d61ab.js => 59.06f08aee.js} (98%) create mode 100644 assets/js/6.8999fd8a.js delete mode 100644 assets/js/6.f86bc75a.js rename assets/js/{59.8b2e0e29.js => 60.a3853cbe.js} (99%) rename assets/js/{60.f1fb5037.js => 61.360ebc59.js} (98%) rename assets/js/{61.1111872b.js => 62.db0d6812.js} (98%) rename assets/js/{62.5f8f5d5e.js => 63.8a89fed0.js} (97%) rename assets/js/{63.818b0c85.js => 64.8fe43c5c.js} (95%) rename assets/js/{64.c9825ab0.js => 65.d4df1bb2.js} (98%) delete mode 100644 assets/js/66.6eb152b3.js rename assets/js/{65.c8ff65d1.js => 66.6f45bd01.js} (97%) create mode 100644 assets/js/67.178227eb.js delete mode 100644 assets/js/67.4a6e498c.js create mode 100644 assets/js/68.0031d838.js delete mode 100644 assets/js/68.da47c92a.js delete mode 100644 assets/js/69.5b1543d7.js create mode 100644 assets/js/69.ec490c70.js delete mode 100644 assets/js/7.4a1def3b.js create mode 100644 assets/js/7.9f1ce256.js delete mode 100644 assets/js/70.31ac2858.js create mode 100644 assets/js/70.8d69a395.js rename assets/js/{71.21185529.js => 71.80cd5f49.js} (98%) rename assets/js/{72.0f099e82.js => 72.bfd59abc.js} (97%) rename assets/js/{73.afbaa1a8.js => 73.ebba4afb.js} (95%) create mode 100644 assets/js/74.5f063a47.js delete mode 100644 assets/js/74.80dd8d0e.js rename assets/js/{75.bc6f52b4.js => 75.d8da70f3.js} (98%) rename assets/js/{76.f3d105b7.js => 76.acf66e95.js} (95%) create mode 100644 assets/js/77.0dc87057.js delete mode 100644 assets/js/77.c8845eb4.js create mode 100644 assets/js/8.4c71898e.js delete mode 100644 assets/js/8.ece8e8ed.js create mode 100644 assets/js/9.7af626f7.js delete mode 100644 assets/js/9.ec68f296.js create mode 100644 assets/js/app.24fefc80.js delete mode 100644 assets/js/app.5ed11237.js create mode 100644 guides/php_upgrade.html create mode 100644 panel/1.0/legacy_upgrade.html create mode 100644 panel/1.0/updating.html delete mode 100644 panel/1.0/upgrade/0.7_to_1.0.html delete mode 100644 panel/1.0/upgrade/1.0.html delete mode 100644 panel/1.0/upgrading.html diff --git a/404.html b/404.html index f067cea6..deb0f66e 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +
- + 1.3 + current

  • + diff --git a/assets/css/0.styles.26db9e46.css b/assets/css/0.styles.b4cb0fef.css similarity index 100% rename from assets/css/0.styles.26db9e46.css rename to assets/css/0.styles.b4cb0fef.css diff --git a/assets/js/1.d0c981d7.js b/assets/js/1.d0c981d7.js new file mode 100644 index 00000000..4ea2db6b --- /dev/null +++ b/assets/js/1.d0c981d7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,11,16,18,27],{312:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"j",(function(){return u})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return f})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return d})),n.d(e,"l",(function(){return p})),n.d(e,"m",(function(){return v})),n.d(e,"c",(function(){return g})),n.d(e,"k",(function(){return m}));n(26),n(51),n(180),n(73),n(107),n(49),n(104),n(50),n(313),n(70),n(316),n(52);var r=n(108),i=/#.*$/,s=/\.(md|html)$/,a=/\/$/,u=/^(https?:|mailto:|tel:)/;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return u.test(t)}function c(t){return/^mailto:/.test(t)}function f(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;var e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function d(t,e){var n=t.hash,r=function(t){var e=t.match(i);if(e)return e[0]}(e);return(!r||n===r)&&o(t.path)===o(e)}function p(t,e,n){n&&(e=function(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;var i=e.split("/");n&&i[i.length-1]||i.pop();for(var s=t.replace(/^\//,"").split("/"),a=0;a1||"".split(/.?/).length?function(t,n){var r=String(a(this)),s=void 0===n?4294967295:n>>>0;if(0===s)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,s);for(var u,o,l,c=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,v=new RegExp(t.source,h+"g");(u=f.call(v,r))&&!((o=v.lastIndex)>p&&(c.push(r.slice(p,u.index)),u.length>1&&u.index=s));)v.lastIndex===u.index&&v.lastIndex++;return p===r.length?!l&&v.test("")||c.push(""):c.push(r.slice(p)),c.length>s?c.slice(0,s):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=a(this),s=null==e?void 0:e[t];return void 0!==s?s.call(e,i,n):r.call(String(i),e,n)},function(t,i){var a=n(r,t,this,i,r!==e);if(a.done)return a.value;var f=s(t),h=String(this),d=u(f,RegExp),g=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(v?"y":"g"),b=new d(v?f:"^(?:"+f.source+")",m),x=void 0===i?4294967295:i>>>0;if(0===x)return[];if(0===h.length)return null===c(b,h)?[h]:[];for(var S=0,y=0,_=[];y1?arguments[1]:void 0)}}),s("find")},332:function(t,e,n){"use strict";n.r(e);var r={name:"VersionSelectItem",props:{version:{type:Object,required:!0}},computed:{classes:function(){return{deprecated:["text-orange"],current:["text-green-dark"],stable:["text-green-dark"],beta:["text-blue"]}[this.version.status]||["text-grey"]}}},i=n(48),s=Object(i.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"inline-block"},[t._v("\n "+t._s(t.version.title||t.version.name)+"\n "),n("span",{staticClass:"rounded-full ml-2",class:t.classes},[t._v(t._s(t.version.status))])])}),[],!1,null,null,null);e.default=s.exports},334:function(t,e,n){"use strict";n.r(e);n(49),n(179);var r=n(312);function i(t,e,n,r){return t("router-link",{props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}},n)}function s(t,e,n,a,u){var o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1;return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var l=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,l),s(t,e.children,n,a,u,o+1)])})))}var a={functional:!0,props:["item"],render:function(t,e){var n=e.parent,a=n.$page,u=n.$site,o=n.$route,l=e.props.item,c=Object(r.e)(o,l.path),f="auto"===l.type?c||l.children.some((function(t){return Object(r.e)(o,l.basePath+"#"+t.slug)})):c,h=i(t,l.path,l.title||l.path,f),d=null!=a.frontmatter.sidebarDepth?a.frontmatter.sidebarDepth:u.themeConfig.sidebarDepth,p=null==d?1:d,v=!!u.themeConfig.displayAllHeaders;return"auto"===l.type?[h,s(t,l.children,l.basePath,o,p)]:(f||v)&&l.headers&&!r.d.test(l.path)?[h,s(t,Object(r.c)(l.headers),l.path,o,p)]:h}},u=n(48),o=Object(u.a)(a,void 0,void 0,!1,null,null,null);e.default=o.exports},336:function(t,e,n){"use strict";var r=n(5),i=n(4),s=n(76),a=n(11),u=n(9),o=n(18),l=n(182),c=n(53),f=n(2),h=n(32),d=n(54).f,p=n(21).f,v=n(8).f,g=n(323).trim,m=i.Number,b=m.prototype,x="Number"==o(h(b)),S=function(t){var e,n,r,i,s,a,u,o,l=c(t,!1);if("string"==typeof l&&l.length>2)if(43===(e=(l=g(l)).charCodeAt(0))||45===e){if(88===(n=l.charCodeAt(2))||120===n)return NaN}else if(48===e){switch(l.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+l}for(a=(s=l.slice(2)).length,u=0;ui)return NaN;return parseInt(s,r)}return+l};if(s("Number",!m(" 0o1")||!m("0b1")||m("+0x1"))){for(var y,_=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof _&&(x?f((function(){b.valueOf.call(n)})):"Number"!=o(n))?l(new m(S(e)),n,_):S(e)},I=r?d(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),N=0;I.length>N;N++)u(m,y=I[N])&&!u(_,y)&&v(_,y,p(m,y));_.prototype=b,b.constructor=_,a(i,"Number",_)}},345:function(t,e,n){"use strict";n.r(e);n(329),n(180),n(49),n(104),n(50),n(348),n(316),n(110);var r=n(334),i=n(321),s=n(346),a={name:"SidebarGroup",props:["item","first","open","collapsable"],components:{SidebarLink:r.default,DropdownTransition:i.default,VersionSelect:s.default},data:function(){var t=this.item.versions.length>0,e="";if(t&&(e=this.item.currentVersion||this.item.versions[0].name,this.$router.currentRoute.path.startsWith(this.item.path))){var n=this.$router.currentRoute.path.split("/")[2];e=~this.item.versions.map((function(t){return t.name})).indexOf(n)?n:this.item.currentVersion}return{isVersioned:t,versionSelect:e}},watch:{versionSelect:function(t,e){if(e!==t&&this.$router.currentRoute.path.startsWith(this.item.path)&&this.selectedVersion.children.length>0){var n=this.$router.currentRoute.path;n=n.substr(n.indexOf(e)+e.length),this.$router.push(this.selectedVersion.children.find((function(t){return t.path.endsWith(n)}))||this.selectedVersion.children[0])}},$route:function(t,e){if(this.isVersioned&&t.path.startsWith(this.item.path)){var n=t.path.split("/")[2];~this.item.versions.map((function(t){return t.name})).indexOf(n)&&(this.versionSelect=n)}}},computed:{selectedVersion:function(){var t=this;return this.item.versions.find((function(e){return e.name===t.versionSelect}))},children:function(){return this.isVersioned?this.selectedVersion.children:this.item.children}}},u=n(48),o=Object(u.a)(a,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-group",class:{first:t.first,collapsable:t.collapsable}},[n("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e(),t._v(" "),t.isVersioned?n("VersionSelect",{staticClass:"float-right",attrs:{versions:t.item.versions},model:{value:t.versionSelect,callback:function(e){t.versionSelect=e},expression:"versionSelect"}}):t._e()],1),t._v(" "),n("DropdownTransition",[t.open||!t.collapsable?n("ul",{ref:"items",staticClass:"sidebar-group-items"},t._l(t.children,(function(t){return n("li",[n("SidebarLink",{attrs:{item:t}})],1)})),0):t._e()])],1)}),[],!1,null,null,null);e.default=o.exports},346:function(t,e,n){"use strict";n.r(e);n(329),n(104),n(336);var r={name:"VersionSelect",components:{VersionSelectItem:n(332).default},props:{versions:{type:Array,required:!0},tabindex:{type:Number,required:!1,default:0},value:{type:String,required:!1}},data:function(){var t=this;return{selected:this.versions.find((function(e){return e.name===t.value}))||(this.versions.length>0?this.versions[0]:null),open:!1}},watch:{value:function(t,e){var n=this;if(t!==e){var r=this.versions.find((function(t){return t.name===n.value}));r&&(this.selected=r)}}},mounted:function(){this.$emit("input",this.selected.name)}},i=n(48),s=Object(i.a)(r,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"version-select custom-select",attrs:{tabindex:t.tabindex},on:{blur:function(e){t.open=!1}}},[n("div",{staticClass:"selected",class:{open:t.open},on:{click:function(e){t.open=!t.open}}},[n("VersionSelectItem",{attrs:{version:t.selected}}),t._v(" "),n("span",{staticClass:"arrow"})],1),t._v(" "),n("div",{staticClass:"items",class:{hidden:!t.open}},t._l(t.versions,(function(e){return n("div",{key:e.name,staticClass:"item",on:{click:function(n){t.selected=e,t.open=!1,t.$emit("input",e.name)}}},[n("VersionSelectItem",{attrs:{version:e}})],1)})),0)])}),[],!1,null,null,null);e.default=s.exports},348:function(t,e,n){"use strict";var r,i=n(0),s=n(21).f,a=n(10),u=n(111),o=n(25),l=n(112),c=n(22),f="".endsWith,h=Math.min,d=l("endsWith");i({target:"String",proto:!0,forced:!!(c||d||(r=s(String.prototype,"endsWith"),!r||r.writable))&&!d},{endsWith:function(t){var e=String(o(this));u(t);var n=arguments.length>1?arguments[1]:void 0,r=a(e.length),i=void 0===n?r:h(a(n),r),s=String(t);return f?f.call(e,s,i):e.slice(i-s.length,i)===s}})}}]); \ No newline at end of file diff --git a/assets/js/1.d27374d7.js b/assets/js/1.d27374d7.js deleted file mode 100644 index 9fce4466..00000000 --- a/assets/js/1.d27374d7.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1,6,9,18],{309:function(t,n,e){"use strict";e.d(n,"d",(function(){return i})),e.d(n,"a",(function(){return a})),e.d(n,"j",(function(){return o})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return l})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return f})),e.d(n,"b",(function(){return h})),e.d(n,"e",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"m",(function(){return v})),e.d(n,"c",(function(){return g})),e.d(n,"k",(function(){return m}));e(22),e(50),e(177),e(71),e(106),e(47),e(103),e(48),e(313),e(69),e(311),e(51);var r=e(107),i=/#.*$/,s=/\.(md|html)$/,a=/\/$/,o=/^(https?:|mailto:|tel:)/;function u(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return o.test(t)}function c(t){return/^mailto:/.test(t)}function f(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;var n=t.match(i),e=n?n[0]:"",r=u(t);return a.test(r)?t:r+".html"+e}function p(t,n){var e=t.hash,r=function(t){var n=t.match(i);if(n)return n[0]}(n);return(!r||e===r)&&u(t.path)===u(n)}function d(t,n,e){e&&(n=function(t,n,e){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;var i=n.split("/");e&&i[i.length-1]||i.pop();for(var s=t.replace(/^\//,"").split("/"),a=0;a1?arguments[1]:void 0)}})},311:function(t,n,e){"use strict";var r=e(174),i=e(105),s=e(7),a=e(26),o=e(104),u=e(175),l=e(10),c=e(176),f=e(70),h=e(2),p=[].push,d=Math.min,v=!h((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(t,n,e){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,e){var r=String(a(this)),s=void 0===e?4294967295:e>>>0;if(0===s)return[];if(void 0===t)return[r];if(!i(t))return n.call(r,t,s);for(var o,u,l,c=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,v=new RegExp(t.source,h+"g");(o=f.call(v,r))&&!((u=v.lastIndex)>d&&(c.push(r.slice(d,o.index)),o.length>1&&o.index=s));)v.lastIndex===o.index&&v.lastIndex++;return d===r.length?!l&&v.test("")||c.push(""):c.push(r.slice(d)),c.length>s?c.slice(0,s):c}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var i=a(this),s=null==n?void 0:n[t];return void 0!==s?s.call(n,i,e):r.call(String(i),n,e)},function(t,i){var a=e(r,t,this,i,r!==n);if(a.done)return a.value;var f=s(t),h=String(this),p=o(f,RegExp),g=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(v?"y":"g"),k=new p(v?f:"^(?:"+f.source+")",m),b=void 0===i?4294967295:i>>>0;if(0===b)return[];if(0===h.length)return null===c(k,h)?[h]:[];for(var x=0,_=0,w=[];_"+a+""}},323:function(t,n,e){var r=e(2);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}},324:function(t,n,e){"use strict";var r=e(312);e.n(r).a},333:function(t,n,e){"use strict";e.r(n);e(179),e(47),e(310),e(72),e(180),e(48),e(76),e(313),e(69);var r=e(44),i=e(341),s=e(309),a={components:{NavLink:e(317).default,DropdownLink:i.default},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,n=this.$site.locales;if(n&&Object.keys(n).length>1){var e=this.$page.path,i=this.$router.options.routes,s=this.$site.themeConfig.locales||{},a={text:this.$themeLocaleConfig.selectText||"Languages",items:Object.keys(n).map((function(r){var a,o=n[r],u=s[r]&&s[r].label||o.lang;return o.lang===t.$lang?a=e:(a=e.replace(t.$localeConfig.path,r),i.some((function(t){return t.path===a}))||(a=r)),{text:u,link:a}}))};return[].concat(Object(r.a)(this.userNav),[a])}return this.userNav},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(s.k)(t),{items:(t.items||[]).map(s.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],n=["GitHub","GitLab","Bitbucket"],e=0;e1||"".split(/.?/).length?function(t,e){var r=String(l(this)),u=void 0===e?4294967295:e>>>0;if(0===u)return[];if(void 0===t)return[r];if(!i(t))return n.call(r,t,u);for(var a,s,o,c=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,h+"g");(a=f.call(g,r))&&!((s=g.lastIndex)>d&&(c.push(r.slice(d,a.index)),a.length>1&&a.index=u));)g.lastIndex===a.index&&g.lastIndex++;return d===r.length?!o&&g.test("")||c.push(""):c.push(r.slice(d)),c.length>u?c.slice(0,u):c}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var i=l(this),u=null==n?void 0:n[t];return void 0!==u?u.call(n,i,e):r.call(String(i),n,e)},function(t,i){var l=e(r,t,this,i,r!==n);if(l.done)return l.value;var f=u(t),h=String(this),p=a(f,RegExp),v=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(g?"y":"g"),b=new p(g?f:"^(?:"+f.source+")",m),x=void 0===i?4294967295:i>>>0;if(0===x)return[];if(0===h.length)return null===c(b,h)?[h]:[];for(var k=0,y=0,j=[];y"+l+""}},319:function(t,n,e){var r=e(2);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}}}]); \ No newline at end of file diff --git a/assets/js/10.bcaf3754.js b/assets/js/10.bcaf3754.js deleted file mode 100644 index 3421085d..00000000 --- a/assets/js/10.bcaf3754.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10,13,25],{314:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},315:function(t,e,s){var n=s(26),i="["+s(314)+"]",o=RegExp("^"+i+i+"*"),u=RegExp(i+i+"*$"),r=function(t){return function(e){var s=String(n(e));return 1&t&&(s=s.replace(o,"")),2&t&&(s=s.replace(u,"")),s}};t.exports={start:r(1),end:r(2),trim:r(3)}},327:function(t,e,s){"use strict";var n=s(0),i=s(315).trim;n({target:"String",proto:!0,forced:s(328)("trim")},{trim:function(){return i(this)}})},328:function(t,e,s){var n=s(2),i=s(314);t.exports=function(t){return n((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},332:function(t,e,s){"use strict";s.r(e);s(177),s(327);var n={data:function(){return{query:"",focused:!1,focusIndex:0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site,s=e.pages,n=e.themeConfig.searchMaxSuggestions||5,i=this.$localePath,o=function(e){return e.title&&e.title.toLowerCase().indexOf(t)>-1},u=[],r=0;r=n);r++){var a=s[r];if(this.getPageLocalePath(a)===i)if(o(a))u.push(a);else if(a.headers)for(var c=0;c=n);c++){var l=a.headers[c];o(l)&&u.push(Object.assign({},a,{path:a.path+"#"+l.slug,header:l}))}}return u}},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=o.exports},335:function(t,e,s){"use strict";s.r(e);var n=s(46),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},343:function(t,e,s){"use strict";s.r(e);var n=s(335),i=s(332),o=s(333),u={components:{SidebarButton:n.default,NavLinks:o.default,SearchBox:i.default},computed:{}},r=s(46),a=Object(r.a)(u,(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=a.exports}}]); \ No newline at end of file diff --git a/assets/js/11.e5240661.js b/assets/js/11.53217705.js similarity index 75% rename from assets/js/11.e5240661.js rename to assets/js/11.53217705.js index 5a0a783d..2aa31811 100644 --- a/assets/js/11.e5240661.js +++ b/assets/js/11.53217705.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11,27],{314:function(e,t){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},315:function(e,t,n){var r=n(26),s="["+n(314)+"]",i=RegExp("^"+s+s+"*"),a=RegExp(s+s+"*$"),o=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(a,"")),n}};e.exports={start:o(1),end:o(2),trim:o(3)}},316:function(e,t,n){"use strict";var r=n(0),s=n(49).find,i=n(73),a=n(20),o=!0,c=a("find");"find"in[]&&Array(1).find((function(){o=!1})),r({target:"Array",proto:!0,forced:o||!c},{find:function(e){return s(this,e,arguments.length>1?arguments[1]:void 0)}}),i("find")},319:function(e,t,n){"use strict";n.r(t);var r={name:"VersionSelectItem",props:{version:{type:Object,required:!0}},computed:{classes:function(){return{deprecated:["text-orange"],current:["text-green-dark"],stable:["text-green-dark"],beta:["text-blue"]}[this.version.status]||["text-grey"]}}},s=n(46),i=Object(s.a)(r,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"inline-block"},[e._v("\n "+e._s(e.version.title||e.version.name)+"\n "),n("span",{staticClass:"rounded-full ml-2",class:e.classes},[e._v(e._s(e.version.status))])])}),[],!1,null,null,null);t.default=i.exports},325:function(e,t,n){"use strict";var r=n(5),s=n(4),i=n(74),a=n(11),o=n(9),c=n(18),u=n(178),l=n(53),f=n(2),d=n(31),p=n(54).f,v=n(21).f,m=n(8).f,h=n(315).trim,N=s.Number,I=N.prototype,b="Number"==c(d(I)),g=function(e){var t,n,r,s,i,a,o,c,u=l(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=h(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,s=49;break;case 79:case 111:r=8,s=55;break;default:return+u}for(a=(i=u.slice(2)).length,o=0;os)return NaN;return parseInt(i,r)}return+u};if(i("Number",!N(" 0o1")||!N("0b1")||N("+0x1"))){for(var _,E=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof E&&(b?f((function(){I.valueOf.call(n)})):"Number"!=c(n))?u(new N(g(t)),n,E):g(t)},x=r?p(N):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),A=0;x.length>A;A++)o(N,_=x[A])&&!o(E,_)&&m(E,_,v(N,_));E.prototype=I,I.constructor=E,a(s,"Number",E)}},326:function(e,t,n){"use strict";n.r(t);n(316),n(103),n(325);var r={name:"VersionSelect",components:{VersionSelectItem:n(319).default},props:{versions:{type:Array,required:!0},tabindex:{type:Number,required:!1,default:0},value:{type:String,required:!1}},data:function(){var e=this;return{selected:this.versions.find((function(t){return t.name===e.value}))||(this.versions.length>0?this.versions[0]:null),open:!1}},watch:{value:function(e,t){var n=this;if(e!==t){var r=this.versions.find((function(e){return e.name===n.value}));r&&(this.selected=r)}}},mounted:function(){this.$emit("input",this.selected.name)}},s=n(46),i=Object(s.a)(r,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"version-select custom-select",attrs:{tabindex:e.tabindex},on:{blur:function(t){e.open=!1}}},[n("div",{staticClass:"selected",class:{open:e.open},on:{click:function(t){e.open=!e.open}}},[n("VersionSelectItem",{attrs:{version:e.selected}}),e._v(" "),n("span",{staticClass:"arrow"})],1),e._v(" "),n("div",{staticClass:"items",class:{hidden:!e.open}},e._l(e.versions,(function(t){return n("div",{key:t.name,staticClass:"item",on:{click:function(n){e.selected=t,e.open=!1,e.$emit("input",t.name)}}},[n("VersionSelectItem",{attrs:{version:t}})],1)})),0)])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[11,27],{320:function(e,t){e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},323:function(e,t,n){var r=n(25),s="["+n(320)+"]",i=RegExp("^"+s+s+"*"),a=RegExp(s+s+"*$"),o=function(e){return function(t){var n=String(r(t));return 1&e&&(n=n.replace(i,"")),2&e&&(n=n.replace(a,"")),n}};e.exports={start:o(1),end:o(2),trim:o(3)}},329:function(e,t,n){"use strict";var r=n(0),s=n(33).find,i=n(75),a=n(19),o=!0,c=a("find");"find"in[]&&Array(1).find((function(){o=!1})),r({target:"Array",proto:!0,forced:o||!c},{find:function(e){return s(this,e,arguments.length>1?arguments[1]:void 0)}}),i("find")},332:function(e,t,n){"use strict";n.r(t);var r={name:"VersionSelectItem",props:{version:{type:Object,required:!0}},computed:{classes:function(){return{deprecated:["text-orange"],current:["text-green-dark"],stable:["text-green-dark"],beta:["text-blue"]}[this.version.status]||["text-grey"]}}},s=n(48),i=Object(s.a)(r,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"inline-block"},[e._v("\n "+e._s(e.version.title||e.version.name)+"\n "),n("span",{staticClass:"rounded-full ml-2",class:e.classes},[e._v(e._s(e.version.status))])])}),[],!1,null,null,null);t.default=i.exports},336:function(e,t,n){"use strict";var r=n(5),s=n(4),i=n(76),a=n(11),o=n(9),c=n(18),u=n(182),l=n(53),f=n(2),d=n(32),p=n(54).f,v=n(21).f,m=n(8).f,h=n(323).trim,N=s.Number,I=N.prototype,b="Number"==c(d(I)),g=function(e){var t,n,r,s,i,a,o,c,u=l(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=h(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,s=49;break;case 79:case 111:r=8,s=55;break;default:return+u}for(a=(i=u.slice(2)).length,o=0;os)return NaN;return parseInt(i,r)}return+u};if(i("Number",!N(" 0o1")||!N("0b1")||N("+0x1"))){for(var _,E=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof E&&(b?f((function(){I.valueOf.call(n)})):"Number"!=c(n))?u(new N(g(t)),n,E):g(t)},x=r?p(N):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),A=0;x.length>A;A++)o(N,_=x[A])&&!o(E,_)&&m(E,_,v(N,_));E.prototype=I,I.constructor=E,a(s,"Number",E)}},346:function(e,t,n){"use strict";n.r(t);n(329),n(104),n(336);var r={name:"VersionSelect",components:{VersionSelectItem:n(332).default},props:{versions:{type:Array,required:!0},tabindex:{type:Number,required:!1,default:0},value:{type:String,required:!1}},data:function(){var e=this;return{selected:this.versions.find((function(t){return t.name===e.value}))||(this.versions.length>0?this.versions[0]:null),open:!1}},watch:{value:function(e,t){var n=this;if(e!==t){var r=this.versions.find((function(e){return e.name===n.value}));r&&(this.selected=r)}}},mounted:function(){this.$emit("input",this.selected.name)}},s=n(48),i=Object(s.a)(r,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"version-select custom-select",attrs:{tabindex:e.tabindex},on:{blur:function(t){e.open=!1}}},[n("div",{staticClass:"selected",class:{open:e.open},on:{click:function(t){e.open=!e.open}}},[n("VersionSelectItem",{attrs:{version:e.selected}}),e._v(" "),n("span",{staticClass:"arrow"})],1),e._v(" "),n("div",{staticClass:"items",class:{hidden:!e.open}},e._l(e.versions,(function(t){return n("div",{key:t.name,staticClass:"item",on:{click:function(n){e.selected=t,e.open=!1,e.$emit("input",t.name)}}},[n("VersionSelectItem",{attrs:{version:t}})],1)})),0)])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/12.bc37074e.js b/assets/js/12.6783fda9.js similarity index 97% rename from assets/js/12.bc37074e.js rename to assets/js/12.6783fda9.js index 090dcd46..dfd97775 100644 --- a/assets/js/12.bc37074e.js +++ b/assets/js/12.6783fda9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Process_Management.516b5b6f.png"},349:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Select.5a2867ee.png"},350:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Copy_Settings_From.e3102cdd.png"},351:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Variables.3962b264.png"},352:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Startup.b6e22637.png"},367:function(e,t,a){"use strict";a.r(t);var s=a(46),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"creating-a-custom-egg"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-egg"}},[e._v("#")]),e._v(" Creating a Custom Egg")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor\nchanges to these, and you'll lose any changes you've made.")])]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#create-new-option"}},[e._v("Create New Option")])]),s("li",[s("a",{attrs:{href:"#configure-process-management"}},[e._v("Configure Process Management")]),s("ul",[s("li",[s("a",{attrs:{href:"#stop-command"}},[e._v("Stop Command")])]),s("li",[s("a",{attrs:{href:"#log-storage"}},[e._v("Log Storage")])]),s("li",[s("a",{attrs:{href:"#configuration-files"}},[e._v("Configuration Files")])]),s("li",[s("a",{attrs:{href:"#start-configuration"}},[e._v("Start Configuration")])])])]),s("li",[s("a",{attrs:{href:"#copy-settings-from"}},[e._v("Copy Settings From")])]),s("li",[s("a",{attrs:{href:"#egg-variables"}},[e._v("Egg Variables")])]),s("li",[s("a",{attrs:{href:"#list-of-default-variables"}},[e._v("List of default variables")])])])]),s("p"),e._v(" "),s("p",[e._v("The first thing you'll need to do is create a new service. In this case, the name and description speak for themselves\nin this case. The "),s("code",[e._v("Folder Name")]),e._v(" "),s("em",[e._v("must be a unique name")]),e._v(" not being used by any other service, and should only\ncontain letters, numbers, underscores, and dashes. This is the name of the folder where the daemon will be storing\nthe service options on the daemon.")]),e._v(" "),s("p",[e._v("The default start command is also required, however it can be changed per-option.")]),e._v(" "),s("h2",{attrs:{id:"create-new-option"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-new-option"}},[e._v("#")]),e._v(" Create New Option")]),e._v(" "),s("p",[e._v("After creating the service, in the bottom right of the page you should see a button titled "),s("code",[e._v("New Egg")]),e._v(", press it.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(349),alt:""}})]),e._v(" "),s("p",[e._v("You will be taken to a new service option page which is where most of the configuration happens. The first thing\nyou need to do is select your service that you created previously from the "),s("code",[e._v("Associated Nest")]),e._v(" dropdown.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("After that, enter an Option Name to describe it, in this case I am using "),s("code",[e._v("Widget")]),e._v(". You will also need to provide a\n"),s("em",[e._v("valid")]),e._v(" docker image, as well as a start command to be assigned to servers under this service option (remember, this\ncan be tweaked per-server if needed).")]),e._v(" "),s("p",[s("em",[e._v("Docker images must be specifically designed to work with Pterodactyl Panel.")]),e._v(" You should read more about that in\nour "),s("RouterLink",{attrs:{to:"/community/config/eggs/creating_a_custom_image.html"}},[e._v("Creating a Docker Image")]),e._v(" guide.")],1),e._v(" "),s("h2",{attrs:{id:"configure-process-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-process-management"}},[e._v("#")]),e._v(" Configure Process Management")]),e._v(" "),s("p",[e._v("This is perhaps the most important step in this service option configuration, as this tells the Daemon how to run everything.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("The first field you'll encounter is "),s("code",[e._v("Copy Settings From")]),e._v(". The default selection is "),s("code",[e._v("None")]),e._v(". That is expected, and okay.\nThis dropdown is discussed at the end of this article.")]),e._v(" "),s("h3",{attrs:{id:"stop-command"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stop-command"}},[e._v("#")]),e._v(" Stop Command")]),e._v(" "),s("p",[e._v("Next, you'll encounter "),s("code",[e._v("Stop Command")]),e._v(" and, as the name implies, this should be the command used to safely stop the\noption. For some games, this is "),s("code",[e._v("stop")]),e._v(" or "),s("code",[e._v("end")]),e._v(". Certain programs and games don't have a specified stop command, so\nyou can enter "),s("code",[e._v("^C")]),e._v(" to have the daemon execute a "),s("code",[e._v("SIGINT")]),e._v(" to end the process.")]),e._v(" "),s("h3",{attrs:{id:"log-storage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#log-storage"}},[e._v("#")]),e._v(" Log Storage")]),e._v(" "),s("p",[e._v("Logs are competely handeled by the daemon now and use the docker logs to output the complete output from the server.\nThis can be set like below.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("h3",{attrs:{id:"configuration-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-files"}},[e._v("#")]),e._v(" Configuration Files")]),e._v(" "),s("p",[e._v("The next block is one of the most complex blocks, the "),s("code",[e._v("Configuration Files")]),e._v(" descriptor. The Daemon will process this\nblock prior to booting the server to ensure all of the required settings are defined and set correctly.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server.properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-ip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"enable-query"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"true"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"query.port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are telling the Daemon to read "),s("code",[e._v("server.properties")]),e._v(" in "),s("code",[e._v("/home/container")]),e._v(". Within this block, we\ndefine a "),s("code",[e._v("parser")]),e._v(", in this case "),s("code",[e._v("properties")]),e._v(" but the following are "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/parser/parser.go#L25-L30",target:"_blank",rel:"noopener noreferrer"}},[e._v("valid parsers"),s("OutboundLink")],1),e._v(":")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("file")]),e._v(" — This parser goes based on matching the beginning of lines, and not a specific property like the other four.\nAvoid using this parser if possible.")]),e._v(" "),s("li",[s("code",[e._v("yaml")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("properties")])]),e._v(" "),s("li",[s("code",[e._v("ini")])]),e._v(" "),s("li",[s("code",[e._v("json")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("xml")])])]),e._v(" "),s("p",[e._v("Once you have defined a parser, we then define a "),s("code",[e._v("find")]),e._v(" block which tells the Daemon what specific elements to find\nand replace. In this example, we have provided four separate items within the "),s("code",[e._v("server.properties")]),e._v(" file that we want to\nfind and replace to the assigned values. You can use either an exact value, or define a specific server setting from\nthe "),s("code",[e._v("server.json")]),e._v(" file. In this case, we're assigning the default server port to be used as the "),s("code",[e._v("server-port")]),e._v(" and\n"),s("code",[e._v("query.port")]),e._v(". "),s("strong",[e._v("These placeholders are case sensitive, and should have no spaces in them.")])]),e._v(" "),s("p",[e._v("You can have multiple files listed here, the Daemon will process them in parallel before starting the server. When\nusing "),s("code",[e._v("yaml")]),e._v(" or "),s("code",[e._v("json")]),e._v(" you can use more advanced searching for elements.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"config.yml"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yaml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].host"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0:{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"servers.*.address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"127.0.0.1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"localhost"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are parsing "),s("code",[e._v("config.yml")]),e._v(" using the "),s("code",[e._v("yaml")]),e._v(" parser. The first three find items are simply assigning\nports and IPs for the first listener block. The last one, "),s("code",[e._v("servers.*.address")]),e._v(" uses wildcard matching to match any items\nwithin the "),s("code",[e._v("servers")]),e._v(" block, and then finding each "),s("code",[e._v("address")]),e._v(" block for those items.")]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("An advanced feature of this file configuration is the ability to define multiple find and replace statements for a\nsingle matching line. In this case, we are looking for either "),s("code",[e._v("127.0.0.1")]),e._v(" or "),s("code",[e._v("localhost")]),e._v(" and replacing them with the\ndocker interface defined in the configuration file using "),s("code",[e._v("{{config.docker.interface}}")]),e._v(".")])]),s("h3",{attrs:{id:"start-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-configuration"}},[e._v("#")]),e._v(" Start Configuration")]),e._v(" "),s("p",[e._v("The last block to configure is the "),s("code",[e._v("Start Configuration")]),e._v(" for servers running using this service option.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"userInteraction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Go to eula.txt for more info."')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In the example block above, we define "),s("code",[e._v("done")]),e._v(" as the entire line, or part of a line that indicates a server is done\nstarting, and is ready for players to join. When the Daemon sees this output, it will mark the server as "),s("code",[e._v("ON")]),e._v(" rather\nthan "),s("code",[e._v("STARTING")]),e._v(". We can also define "),s("code",[e._v("userInteraction")]),e._v(" as an array of lines that should indicate that the server\n"),s("em",[e._v("did not crash")]),e._v(", but rather stopped because the user needs to perform some action.")]),e._v(" "),s("p",[e._v("In this case, we define it as the line asking users to agree to the EULA. You are not required to have\n"),s("code",[e._v("userInteraction")]),e._v(" lines, however if you are going to leave it empty, it should still be defined with an empty array,\nas shown below:")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"userInteraction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("That concludes basic service option configuration.")]),e._v(" "),s("h2",{attrs:{id:"copy-settings-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#copy-settings-from"}},[e._v("#")]),e._v(" Copy Settings From")]),e._v(" "),s("p",[e._v("As mentioned above, there is a unique "),s("code",[e._v("Copy Settings From")]),e._v(" dropdown when adding a new option. This gives you the\nability to, as the name suggests, copy settings defined above from a different option.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(350),alt:""}})]),e._v(" "),s("p",[e._v("In the panel, we use this to copy settings that remain the same between similar service options, such as many of the\nMinecraft options.")]),e._v(" "),s("p",[e._v("For example, lets look at the "),s("code",[e._v("Sponge (SpongeVanilla)")]),e._v(" service option.")]),e._v(" "),s("p",[e._v("As you can see, it as been told to copy settings from "),s("code",[e._v("Vanilla Minecraft")]),e._v(". This means that any of the fields that are\nleft blank will inherit from the assigned parent. We then define a specific "),s("code",[e._v("userInteraction")]),e._v(" line that is different in\nSponge compared to Vanilla, but tell it that everything else should remain the same.")]),e._v(" "),s("p",[s("em",[e._v("Please note that "),s("code",[e._v("Copy Settings From")]),e._v(" does not support nested copies, you can only copy from a single parent,\nand that parent "),s("strong",[e._v("must not be copying from another option.")])])]),e._v(" "),s("h2",{attrs:{id:"egg-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#egg-variables"}},[e._v("#")]),e._v(" Egg Variables")]),e._v(" "),s("p",[e._v("One of the great parts of the Egg Variables is the ability to define specific variables that users and/or admins can\ncontrol to tweak different settings without letting users modify the startup command. To create new variables, or edit\nexisting ones, visit the new service option you created, and click the "),s("code",[e._v("Variables")]),e._v(" tab at the top of the page. Lets take\na look at an example variable that we can create.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(351),alt:""}})]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("The name and description are rather self-explanitory, so I'll skip down to the "),s("code",[e._v("Environment Variable")]),e._v(" box. This should\nbe an Alpha-Numeric name with underscores, and should be uppercase. This will be the name of the environment variable\nwhich can be accessed in the startup command as "),s("code",[e._v("{{WOOZLE_WOO}}")]),e._v(", within file modifications as "),s("code",[e._v("{{env.WOOZLE_WOO}}")]),e._v(", or\njust "),s("code",[e._v("${WOOZLE_WOO}")]),e._v(" in any shell scripts (it is passed through in the environment). We also define a default value for\nthis environment variable in this example, but it is not required to do so.")])]),s("p",[e._v("The next section is "),s("code",[e._v("Permissions")]),e._v(", which is a dropdown with two options: "),s("code",[e._v("Users Can View")]),e._v(" and "),s("code",[e._v("Users Can Edit")]),e._v(".")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Users Can View")]),e._v(" — allows a user to view the field on the front-end, as well as the assigned value of that variable.\nThey will be able to see it replaced in their startup command.")]),e._v(" "),s("li",[s("code",[e._v("Users Can Edit")]),e._v(" — allows a user to edit the value of the variable, for example the name of their "),s("code",[e._v("server.jar")]),e._v(" file\nif running Minecraft.")])]),e._v(" "),s("p",[e._v("You should use caution here, even if you assign neither of the permissions it does not mean that the value will be\nhidden. Crafty users will still be able to get the environment on their server. In most cases this is simply hiding\nit from the user, and then used within the Dockerfile to perform actions, thus it is not important for the user to see.")]),e._v(" "),s("p",[e._v("Finally, you will need to define some input rules to validate the value against. In this example, we use\n"),s("code",[e._v("required|string|between:1,10")]),e._v(", which means the field is "),s("code",[e._v("required")]),e._v(", must be a "),s("code",[e._v("string")]),e._v(", and must be between "),s("code",[e._v("1")]),e._v(" and\n"),s("code",[e._v("10")]),e._v(" characters in length. You can find "),s("a",{attrs:{href:"https://laravel.com/docs/5.6/validation#available-validation-rules",target:"_blank",rel:"noopener noreferrer"}},[e._v("all of the available validation rules"),s("OutboundLink")],1),e._v("\non the Laravel website. You can also use ReGEX based validation by using the "),s("code",[e._v("regex:")]),e._v(" rule flag. For example,\n"),s("a",{attrs:{href:"https://regex101.com/r/k4oEOn/1",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("required|regex:/^([\\w\\d._-]+)(\\.jar)$/")]),s("OutboundLink")],1),e._v(" will require the field, and will match the\nregex as any letters or numbers ("),s("code",[e._v("\\w\\d")]),e._v(") including underscore ("),s("code",[e._v("_")]),e._v("), periods ("),s("code",[e._v(".")]),e._v("), and dashes ("),s("code",[e._v("-")]),e._v(") ending in "),s("code",[e._v(".jar")]),e._v(".")]),e._v(" "),s("p",[e._v("They will then be visible when managing the startup for a server in both the Admin CP and on the Front-End.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(352),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"list-of-default-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#list-of-default-variables"}},[e._v("#")]),e._v(" List of default variables")]),e._v(" "),s("p",[e._v("The default variables are always accessible to all eggs and don't have to be created separately. They can be used in the egg startup, install script, or the configuration file parser.")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Variable")]),e._v(" "),s("th",[e._v("Description")]),e._v(" "),s("th",[e._v("Example")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("TZ")]),e._v(" "),s("td",[e._v("Time Zone")]),e._v(" "),s("td",[s("code",[e._v("Etc/UTC")])])]),e._v(" "),s("tr",[s("td",[e._v("STARTUP")]),e._v(" "),s("td",[e._v("Startup command of the egg")]),e._v(" "),s("td",[s("code",[e._v("java -Xms128M -Xmx"+e._s(e.SERVER_MEMORY)+"M -jar "+e._s(e.SERVER_JARFILE))])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_MEMORY")]),e._v(" "),s("td",[e._v("Memory available for the server in MB")]),e._v(" "),s("td",[s("code",[e._v("512")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_IP")]),e._v(" "),s("td",[e._v("Default ip of the server")]),e._v(" "),s("td",[s("code",[e._v("127.0.0.1")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_PORT")]),e._v(" "),s("td",[e._v("Primary Server Port")]),e._v(" "),s("td",[s("code",[e._v("27015")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_LOCATION")]),e._v(" "),s("td",[e._v("Location of the server")]),e._v(" "),s("td",[s("code",[e._v("Example City")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_UUID")]),e._v(" "),s("td",[e._v("UUID of the server")]),e._v(" "),s("td",[s("code",[e._v("539fdca8-4a08-4551-a8d2-8ee5475b50d9")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_ALLOCATION_LIMIT")]),e._v(" "),s("td",[e._v("Limit of allocations allowed for the server")]),e._v(" "),s("td",[s("code",[e._v("0")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Process_Management.516b5b6f.png"},351:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Select.5a2867ee.png"},352:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Copy_Settings_From.e3102cdd.png"},353:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Variables.3962b264.png"},354:function(e,t,a){e.exports=a.p+"assets/img/Pterodactyl_Create_New_Egg_Startup.b6e22637.png"},369:function(e,t,a){"use strict";a.r(t);var s=a(48),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"creating-a-custom-egg"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-custom-egg"}},[e._v("#")]),e._v(" Creating a Custom Egg")]),e._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor\nchanges to these, and you'll lose any changes you've made.")])]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#create-new-option"}},[e._v("Create New Option")])]),s("li",[s("a",{attrs:{href:"#configure-process-management"}},[e._v("Configure Process Management")]),s("ul",[s("li",[s("a",{attrs:{href:"#stop-command"}},[e._v("Stop Command")])]),s("li",[s("a",{attrs:{href:"#log-storage"}},[e._v("Log Storage")])]),s("li",[s("a",{attrs:{href:"#configuration-files"}},[e._v("Configuration Files")])]),s("li",[s("a",{attrs:{href:"#start-configuration"}},[e._v("Start Configuration")])])])]),s("li",[s("a",{attrs:{href:"#copy-settings-from"}},[e._v("Copy Settings From")])]),s("li",[s("a",{attrs:{href:"#egg-variables"}},[e._v("Egg Variables")])]),s("li",[s("a",{attrs:{href:"#list-of-default-variables"}},[e._v("List of default variables")])])])]),s("p"),e._v(" "),s("p",[e._v("The first thing you'll need to do is create a new service. In this case, the name and description speak for themselves\nin this case. The "),s("code",[e._v("Folder Name")]),e._v(" "),s("em",[e._v("must be a unique name")]),e._v(" not being used by any other service, and should only\ncontain letters, numbers, underscores, and dashes. This is the name of the folder where the daemon will be storing\nthe service options on the daemon.")]),e._v(" "),s("p",[e._v("The default start command is also required, however it can be changed per-option.")]),e._v(" "),s("h2",{attrs:{id:"create-new-option"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-new-option"}},[e._v("#")]),e._v(" Create New Option")]),e._v(" "),s("p",[e._v("After creating the service, in the bottom right of the page you should see a button titled "),s("code",[e._v("New Egg")]),e._v(", press it.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(351),alt:""}})]),e._v(" "),s("p",[e._v("You will be taken to a new service option page which is where most of the configuration happens. The first thing\nyou need to do is select your service that you created previously from the "),s("code",[e._v("Associated Nest")]),e._v(" dropdown.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("After that, enter an Option Name to describe it, in this case I am using "),s("code",[e._v("Widget")]),e._v(". You will also need to provide a\n"),s("em",[e._v("valid")]),e._v(" docker image, as well as a start command to be assigned to servers under this service option (remember, this\ncan be tweaked per-server if needed).")]),e._v(" "),s("p",[s("em",[e._v("Docker images must be specifically designed to work with Pterodactyl Panel.")]),e._v(" You should read more about that in\nour "),s("RouterLink",{attrs:{to:"/community/config/eggs/creating_a_custom_image.html"}},[e._v("Creating a Docker Image")]),e._v(" guide.")],1),e._v(" "),s("h2",{attrs:{id:"configure-process-management"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-process-management"}},[e._v("#")]),e._v(" Configure Process Management")]),e._v(" "),s("p",[e._v("This is perhaps the most important step in this service option configuration, as this tells the Daemon how to run everything.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(340),alt:""}})]),e._v(" "),s("p",[e._v("The first field you'll encounter is "),s("code",[e._v("Copy Settings From")]),e._v(". The default selection is "),s("code",[e._v("None")]),e._v(". That is expected, and okay.\nThis dropdown is discussed at the end of this article.")]),e._v(" "),s("h3",{attrs:{id:"stop-command"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stop-command"}},[e._v("#")]),e._v(" Stop Command")]),e._v(" "),s("p",[e._v("Next, you'll encounter "),s("code",[e._v("Stop Command")]),e._v(" and, as the name implies, this should be the command used to safely stop the\noption. For some games, this is "),s("code",[e._v("stop")]),e._v(" or "),s("code",[e._v("end")]),e._v(". Certain programs and games don't have a specified stop command, so\nyou can enter "),s("code",[e._v("^C")]),e._v(" to have the daemon execute a "),s("code",[e._v("SIGINT")]),e._v(" to end the process.")]),e._v(" "),s("h3",{attrs:{id:"log-storage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#log-storage"}},[e._v("#")]),e._v(" Log Storage")]),e._v(" "),s("p",[e._v("Logs are competely handeled by the daemon now and use the docker logs to output the complete output from the server.\nThis can be set like below.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("h3",{attrs:{id:"configuration-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-files"}},[e._v("#")]),e._v(" Configuration Files")]),e._v(" "),s("p",[e._v("The next block is one of the most complex blocks, the "),s("code",[e._v("Configuration Files")]),e._v(" descriptor. The Daemon will process this\nblock prior to booting the server to ensure all of the required settings are defined and set correctly.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server.properties"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"properties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-ip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"enable-query"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"true"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"server-port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"query.port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are telling the Daemon to read "),s("code",[e._v("server.properties")]),e._v(" in "),s("code",[e._v("/home/container")]),e._v(". Within this block, we\ndefine a "),s("code",[e._v("parser")]),e._v(", in this case "),s("code",[e._v("properties")]),e._v(" but the following are "),s("a",{attrs:{href:"https://github.com/pterodactyl/wings/blob/develop/parser/parser.go#L25-L30",target:"_blank",rel:"noopener noreferrer"}},[e._v("valid parsers"),s("OutboundLink")],1),e._v(":")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("file")]),e._v(" — This parser goes based on matching the beginning of lines, and not a specific property like the other four.\nAvoid using this parser if possible.")]),e._v(" "),s("li",[s("code",[e._v("yaml")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("properties")])]),e._v(" "),s("li",[s("code",[e._v("ini")])]),e._v(" "),s("li",[s("code",[e._v("json")]),e._v(" (supports "),s("code",[e._v("*")]),e._v(" notation)")]),e._v(" "),s("li",[s("code",[e._v("xml")])])]),e._v(" "),s("p",[e._v("Once you have defined a parser, we then define a "),s("code",[e._v("find")]),e._v(" block which tells the Daemon what specific elements to find\nand replace. In this example, we have provided four separate items within the "),s("code",[e._v("server.properties")]),e._v(" file that we want to\nfind and replace to the assigned values. You can use either an exact value, or define a specific server setting from\nthe "),s("code",[e._v("server.json")]),e._v(" file. In this case, we're assigning the default server port to be used as the "),s("code",[e._v("server-port")]),e._v(" and\n"),s("code",[e._v("query.port")]),e._v(". "),s("strong",[e._v("These placeholders are case sensitive, and should have no spaces in them.")])]),e._v(" "),s("p",[e._v("You can have multiple files listed here, the Daemon will process them in parallel before starting the server. When\nusing "),s("code",[e._v("yaml")]),e._v(" or "),s("code",[e._v("json")]),e._v(" you can use more advanced searching for elements.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"config.yml"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"parser"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yaml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"find"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_enabled"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].query_port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"listeners[0].host"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"0.0.0.0:{{server.build.default.port}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"servers.*.address"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"127.0.0.1"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"localhost"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{{config.docker.interface}}"')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In this example, we are parsing "),s("code",[e._v("config.yml")]),e._v(" using the "),s("code",[e._v("yaml")]),e._v(" parser. The first three find items are simply assigning\nports and IPs for the first listener block. The last one, "),s("code",[e._v("servers.*.address")]),e._v(" uses wildcard matching to match any items\nwithin the "),s("code",[e._v("servers")]),e._v(" block, and then finding each "),s("code",[e._v("address")]),e._v(" block for those items.")]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("An advanced feature of this file configuration is the ability to define multiple find and replace statements for a\nsingle matching line. In this case, we are looking for either "),s("code",[e._v("127.0.0.1")]),e._v(" or "),s("code",[e._v("localhost")]),e._v(" and replacing them with the\ndocker interface defined in the configuration file using "),s("code",[e._v("{{config.docker.interface}}")]),e._v(".")])]),s("h3",{attrs:{id:"start-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#start-configuration"}},[e._v("#")]),e._v(" Start Configuration")]),e._v(" "),s("p",[e._v("The last block to configure is the "),s("code",[e._v("Start Configuration")]),e._v(" for servers running using this service option.")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"userInteraction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Go to eula.txt for more info."')]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("In the example block above, we define "),s("code",[e._v("done")]),e._v(" as the entire line, or part of a line that indicates a server is done\nstarting, and is ready for players to join. When the Daemon sees this output, it will mark the server as "),s("code",[e._v("ON")]),e._v(" rather\nthan "),s("code",[e._v("STARTING")]),e._v(". We can also define "),s("code",[e._v("userInteraction")]),e._v(" as an array of lines that should indicate that the server\n"),s("em",[e._v("did not crash")]),e._v(", but rather stopped because the user needs to perform some action.")]),e._v(" "),s("p",[e._v("In this case, we define it as the line asking users to agree to the EULA. You are not required to have\n"),s("code",[e._v("userInteraction")]),e._v(" lines, however if you are going to leave it empty, it should still be defined with an empty array,\nas shown below:")]),e._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"done"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[e._v('")! For help, type "')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[e._v('"userInteraction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),s("p",[e._v("That concludes basic service option configuration.")]),e._v(" "),s("h2",{attrs:{id:"copy-settings-from"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#copy-settings-from"}},[e._v("#")]),e._v(" Copy Settings From")]),e._v(" "),s("p",[e._v("As mentioned above, there is a unique "),s("code",[e._v("Copy Settings From")]),e._v(" dropdown when adding a new option. This gives you the\nability to, as the name suggests, copy settings defined above from a different option.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(352),alt:""}})]),e._v(" "),s("p",[e._v("In the panel, we use this to copy settings that remain the same between similar service options, such as many of the\nMinecraft options.")]),e._v(" "),s("p",[e._v("For example, lets look at the "),s("code",[e._v("Sponge (SpongeVanilla)")]),e._v(" service option.")]),e._v(" "),s("p",[e._v("As you can see, it as been told to copy settings from "),s("code",[e._v("Vanilla Minecraft")]),e._v(". This means that any of the fields that are\nleft blank will inherit from the assigned parent. We then define a specific "),s("code",[e._v("userInteraction")]),e._v(" line that is different in\nSponge compared to Vanilla, but tell it that everything else should remain the same.")]),e._v(" "),s("p",[s("em",[e._v("Please note that "),s("code",[e._v("Copy Settings From")]),e._v(" does not support nested copies, you can only copy from a single parent,\nand that parent "),s("strong",[e._v("must not be copying from another option.")])])]),e._v(" "),s("h2",{attrs:{id:"egg-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#egg-variables"}},[e._v("#")]),e._v(" Egg Variables")]),e._v(" "),s("p",[e._v("One of the great parts of the Egg Variables is the ability to define specific variables that users and/or admins can\ncontrol to tweak different settings without letting users modify the startup command. To create new variables, or edit\nexisting ones, visit the new service option you created, and click the "),s("code",[e._v("Variables")]),e._v(" tab at the top of the page. Lets take\na look at an example variable that we can create.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(353),alt:""}})]),e._v(" "),s("div",{pre:!0},[s("p",[e._v("The name and description are rather self-explanitory, so I'll skip down to the "),s("code",[e._v("Environment Variable")]),e._v(" box. This should\nbe an Alpha-Numeric name with underscores, and should be uppercase. This will be the name of the environment variable\nwhich can be accessed in the startup command as "),s("code",[e._v("{{WOOZLE_WOO}}")]),e._v(", within file modifications as "),s("code",[e._v("{{env.WOOZLE_WOO}}")]),e._v(", or\njust "),s("code",[e._v("${WOOZLE_WOO}")]),e._v(" in any shell scripts (it is passed through in the environment). We also define a default value for\nthis environment variable in this example, but it is not required to do so.")])]),s("p",[e._v("The next section is "),s("code",[e._v("Permissions")]),e._v(", which is a dropdown with two options: "),s("code",[e._v("Users Can View")]),e._v(" and "),s("code",[e._v("Users Can Edit")]),e._v(".")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Users Can View")]),e._v(" — allows a user to view the field on the front-end, as well as the assigned value of that variable.\nThey will be able to see it replaced in their startup command.")]),e._v(" "),s("li",[s("code",[e._v("Users Can Edit")]),e._v(" — allows a user to edit the value of the variable, for example the name of their "),s("code",[e._v("server.jar")]),e._v(" file\nif running Minecraft.")])]),e._v(" "),s("p",[e._v("You should use caution here, even if you assign neither of the permissions it does not mean that the value will be\nhidden. Crafty users will still be able to get the environment on their server. In most cases this is simply hiding\nit from the user, and then used within the Dockerfile to perform actions, thus it is not important for the user to see.")]),e._v(" "),s("p",[e._v("Finally, you will need to define some input rules to validate the value against. In this example, we use\n"),s("code",[e._v("required|string|between:1,10")]),e._v(", which means the field is "),s("code",[e._v("required")]),e._v(", must be a "),s("code",[e._v("string")]),e._v(", and must be between "),s("code",[e._v("1")]),e._v(" and\n"),s("code",[e._v("10")]),e._v(" characters in length. You can find "),s("a",{attrs:{href:"https://laravel.com/docs/5.6/validation#available-validation-rules",target:"_blank",rel:"noopener noreferrer"}},[e._v("all of the available validation rules"),s("OutboundLink")],1),e._v("\non the Laravel website. You can also use ReGEX based validation by using the "),s("code",[e._v("regex:")]),e._v(" rule flag. For example,\n"),s("a",{attrs:{href:"https://regex101.com/r/k4oEOn/1",target:"_blank",rel:"noopener noreferrer"}},[s("code",[e._v("required|regex:/^([\\w\\d._-]+)(\\.jar)$/")]),s("OutboundLink")],1),e._v(" will require the field, and will match the\nregex as any letters or numbers ("),s("code",[e._v("\\w\\d")]),e._v(") including underscore ("),s("code",[e._v("_")]),e._v("), periods ("),s("code",[e._v(".")]),e._v("), and dashes ("),s("code",[e._v("-")]),e._v(") ending in "),s("code",[e._v(".jar")]),e._v(".")]),e._v(" "),s("p",[e._v("They will then be visible when managing the startup for a server in both the Admin CP and on the Front-End.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(354),alt:""}})]),e._v(" "),s("h2",{attrs:{id:"list-of-default-variables"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#list-of-default-variables"}},[e._v("#")]),e._v(" List of default variables")]),e._v(" "),s("p",[e._v("The default variables are always accessible to all eggs and don't have to be created separately. They can be used in the egg startup, install script, or the configuration file parser.")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th",[e._v("Variable")]),e._v(" "),s("th",[e._v("Description")]),e._v(" "),s("th",[e._v("Example")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("TZ")]),e._v(" "),s("td",[e._v("Time Zone")]),e._v(" "),s("td",[s("code",[e._v("Etc/UTC")])])]),e._v(" "),s("tr",[s("td",[e._v("STARTUP")]),e._v(" "),s("td",[e._v("Startup command of the egg")]),e._v(" "),s("td",[s("code",[e._v("java -Xms128M -Xmx"+e._s(e.SERVER_MEMORY)+"M -jar "+e._s(e.SERVER_JARFILE))])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_MEMORY")]),e._v(" "),s("td",[e._v("Memory available for the server in MB")]),e._v(" "),s("td",[s("code",[e._v("512")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_IP")]),e._v(" "),s("td",[e._v("Default ip of the server")]),e._v(" "),s("td",[s("code",[e._v("127.0.0.1")])])]),e._v(" "),s("tr",[s("td",[e._v("SERVER_PORT")]),e._v(" "),s("td",[e._v("Primary Server Port")]),e._v(" "),s("td",[s("code",[e._v("27015")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_LOCATION")]),e._v(" "),s("td",[e._v("Location of the server")]),e._v(" "),s("td",[s("code",[e._v("Example City")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_UUID")]),e._v(" "),s("td",[e._v("UUID of the server")]),e._v(" "),s("td",[s("code",[e._v("539fdca8-4a08-4551-a8d2-8ee5475b50d9")])])]),e._v(" "),s("tr",[s("td",[e._v("P_SERVER_ALLOCATION_LIMIT")]),e._v(" "),s("td",[e._v("Limit of allocations allowed for the server")]),e._v(" "),s("td",[s("code",[e._v("0")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/13.d96e5a31.js b/assets/js/13.bd04c4ec.js similarity index 82% rename from assets/js/13.d96e5a31.js rename to assets/js/13.bd04c4ec.js index 6b575505..1c2bca78 100644 --- a/assets/js/13.d96e5a31.js +++ b/assets/js/13.bd04c4ec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{314:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},315:function(t,e,n){var s=n(26),o="["+n(314)+"]",i=RegExp("^"+o+o+"*"),u=RegExp(o+o+"*$"),r=function(t){return function(e){var n=String(s(e));return 1&t&&(n=n.replace(i,"")),2&t&&(n=n.replace(u,"")),n}};t.exports={start:r(1),end:r(2),trim:r(3)}},327:function(t,e,n){"use strict";var s=n(0),o=n(315).trim;s({target:"String",proto:!0,forced:n(328)("trim")},{trim:function(){return o(this)}})},328:function(t,e,n){var s=n(2),o=n(314);t.exports=function(t){return s((function(){return!!o[t]()||"​…᠎"!="​…᠎"[t]()||o[t].name!==t}))}},332:function(t,e,n){"use strict";n.r(e);n(177),n(327);var s={data:function(){return{query:"",focused:!1,focusIndex:0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site,n=e.pages,s=e.themeConfig.searchMaxSuggestions||5,o=this.$localePath,i=function(e){return e.title&&e.title.toLowerCase().indexOf(t)>-1},u=[],r=0;r=s);r++){var a=n[r];if(this.getPageLocalePath(a)===o)if(i(a))u.push(a);else if(a.headers)for(var c=0;c=s);c++){var f=a.headers[c];i(f)&&u.push(Object.assign({},a,{path:a.path+"#"+f.slug,header:f}))}}return u}},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=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{320:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},323:function(t,e,n){var s=n(25),o="["+n(320)+"]",i=RegExp("^"+o+o+"*"),u=RegExp(o+o+"*$"),r=function(t){return function(e){var n=String(s(e));return 1&t&&(n=n.replace(i,"")),2&t&&(n=n.replace(u,"")),n}};t.exports={start:r(1),end:r(2),trim:r(3)}},326:function(t,e,n){"use strict";var s=n(0),o=n(323).trim;s({target:"String",proto:!0,forced:n(327)("trim")},{trim:function(){return o(this)}})},327:function(t,e,n){var s=n(2),o=n(320);t.exports=function(t){return s((function(){return!!o[t]()||"​…᠎"!="​…᠎"[t]()||o[t].name!==t}))}},331:function(t,e,n){"use strict";n.r(e);n(180),n(326);var s={data:function(){return{query:"",focused:!1,focusIndex:0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site,n=e.pages,s=e.themeConfig.searchMaxSuggestions||5,o=this.$localePath,i=function(e){return e.title&&e.title.toLowerCase().indexOf(t)>-1},u=[],r=0;r=s);r++){var a=n[r];if(this.getPageLocalePath(a)===o)if(i(a))u.push(a);else if(a.headers)for(var c=0;c=s);c++){var f=a.headers[c];i(f)&&u.push(Object.assign({},a,{path:a.path+"#"+f.slug,header:f}))}}return u}},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=i.exports}}]); \ No newline at end of file diff --git a/assets/js/14.2b6a0c7b.js b/assets/js/14.2b6a0c7b.js deleted file mode 100644 index 59a2ae40..00000000 --- a/assets/js/14.2b6a0c7b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{309:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"j",(function(){return s})),n.d(e,"i",(function(){return l})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return f})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"m",(function(){return g})),n.d(e,"c",(function(){return v})),n.d(e,"k",(function(){return b}));n(22),n(50),n(177),n(71),n(106),n(47),n(103),n(48),n(313),n(69),n(311),n(51);var r=n(107),i=/#.*$/,u=/\.(md|html)$/,a=/\/$/,s=/^(https?:|mailto:|tel:)/;function l(t){return decodeURI(t).replace(i,"").replace(u,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function f(t){return/^tel:/.test(t)}function h(t){if(o(t))return t;var e=t.match(i),n=e?e[0]:"",r=l(t);return a.test(r)?t:r+".html"+n}function p(t,e){var n=t.hash,r=function(t){var e=t.match(i);if(e)return e[0]}(e);return(!r||n===r)&&l(t.path)===l(e)}function d(t,e,n){n&&(e=function(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;var i=e.split("/");n&&i[i.length-1]||i.pop();for(var u=t.replace(/^\//,"").split("/"),a=0;a1?arguments[1]:void 0)}})},311:function(t,e,n){"use strict";var r=n(174),i=n(105),u=n(7),a=n(26),s=n(104),l=n(175),o=n(10),c=n(176),f=n(70),h=n(2),p=[].push,d=Math.min,g=!h((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(a(this)),u=void 0===n?4294967295:n>>>0;if(0===u)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,u);for(var s,l,o,c=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,h+"g");(s=f.call(g,r))&&!((l=g.lastIndex)>d&&(c.push(r.slice(d,s.index)),s.length>1&&s.index=u));)g.lastIndex===s.index&&g.lastIndex++;return d===r.length?!o&&g.test("")||c.push(""):c.push(r.slice(d)),c.length>u?c.slice(0,u):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=a(this),u=null==e?void 0:e[t];return void 0!==u?u.call(e,i,n):r.call(String(i),e,n)},function(t,i){var a=n(r,t,this,i,r!==e);if(a.done)return a.value;var f=u(t),h=String(this),p=s(f,RegExp),v=f.unicode,b=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(g?"y":"g"),m=new p(g?f:"^(?:"+f.source+")",b),y=void 0===i?4294967295:i>>>0;if(0===y)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var x=0,j=0,O=[];j5&&void 0!==arguments[5]?arguments[5]:1;return!e||l>s?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var o=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,o),u(t,e.children,n,a,s,l+1)])})))}var a={functional:!0,props:["item"],render:function(t,e){var n=e.parent,a=n.$page,s=n.$site,l=n.$route,o=e.props.item,c=Object(r.e)(l,o.path),f="auto"===o.type?c||o.children.some((function(t){return Object(r.e)(l,o.basePath+"#"+t.slug)})):c,h=i(t,o.path,o.title||o.path,f),p=null!=a.frontmatter.sidebarDepth?a.frontmatter.sidebarDepth:s.themeConfig.sidebarDepth,d=null==p?1:p,g=!!s.themeConfig.displayAllHeaders;return"auto"===o.type?[h,u(t,o.children,o.basePath,l,d)]:(f||g)&&o.headers&&!r.d.test(o.path)?[h,u(t,Object(r.c)(o.headers),o.path,l,d)]:h}},s=n(46),l=Object(s.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/15.dcb97977.js b/assets/js/14.2e96f1b8.js similarity index 97% rename from assets/js/15.dcb97977.js rename to assets/js/14.2e96f1b8.js index 6278309b..ca4686bf 100644 --- a/assets/js/15.dcb97977.js +++ b/assets/js/14.2e96f1b8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{356:function(A,e){A.exports="data:image/png;base64,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"},357:function(A,e){A.exports="data:image/png;base64,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"},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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"},372:function(A,e,t){"use strict";t.r(e);var a=t(46),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(356),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(357),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(358),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(359),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 +(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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"},374: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/16.f2393fa3.js b/assets/js/15.a6802091.js similarity index 66% rename from assets/js/16.f2393fa3.js rename to assets/js/15.a6802091.js index be3aa9ad..95abb911 100644 --- a/assets/js/16.f2393fa3.js +++ b/assets/js/15.a6802091.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{309:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"j",(function(){return u})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return p})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"m",(function(){return v})),n.d(e,"c",(function(){return g})),n.d(e,"k",(function(){return m}));n(22),n(50),n(177),n(71),n(106),n(47),n(103),n(48),n(313),n(69),n(311),n(51);var r=n(107),i=/#.*$/,a=/\.(md|html)$/,s=/\/$/,u=/^(https?:|mailto:|tel:)/;function o(t){return decodeURI(t).replace(i,"").replace(a,"")}function l(t){return u.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function d(t){if(l(t))return t;var e=t.match(i),n=e?e[0]:"",r=o(t);return s.test(r)?t:r+".html"+n}function f(t,e){var n=t.hash,r=function(t){var e=t.match(i);if(e)return e[0]}(e);return(!r||n===r)&&o(t.path)===o(e)}function h(t,e,n){n&&(e=function(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;var i=e.split("/");n&&i[i.length-1]||i.pop();for(var a=t.replace(/^\//,"").split("/"),s=0;s1||"".split(/.?/).length?function(t,n){var r=String(s(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,a);for(var u,o,l,c=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),h=0,v=new RegExp(t.source,d+"g");(u=p.call(v,r))&&!((o=v.lastIndex)>h&&(c.push(r.slice(h,u.index)),u.length>1&&u.index=a));)v.lastIndex===u.index&&v.lastIndex++;return h===r.length?!l&&v.test("")||c.push(""):c.push(r.slice(h)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=s(this),a=null==e?void 0:e[t];return void 0!==a?a.call(e,i,n):r.call(String(i),e,n)},function(t,i){var s=n(r,t,this,i,r!==e);if(s.done)return s.value;var p=a(t),d=String(this),f=u(p,RegExp),g=p.unicode,m=(p.ignoreCase?"i":"")+(p.multiline?"m":"")+(p.unicode?"u":"")+(v?"y":"g"),b=new f(v?p:"^(?:"+p.source+")",m),x=void 0===i?4294967295:i>>>0;if(0===x)return[];if(0===d.length)return null===c(b,d)?[d]:[];for(var _=0,$=0,k=[];$1||"".split(/.?/).length?function(t,n){var r=String(s(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,a);for(var u,o,l,c=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),h=0,v=new RegExp(t.source,d+"g");(u=p.call(v,r))&&!((o=v.lastIndex)>h&&(c.push(r.slice(h,u.index)),u.length>1&&u.index=a));)v.lastIndex===u.index&&v.lastIndex++;return h===r.length?!l&&v.test("")||c.push(""):c.push(r.slice(h)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=s(this),a=null==e?void 0:e[t];return void 0!==a?a.call(e,i,n):r.call(String(i),e,n)},function(t,i){var s=n(r,t,this,i,r!==e);if(s.done)return s.value;var p=a(t),d=String(this),f=u(p,RegExp),g=p.unicode,m=(p.ignoreCase?"i":"")+(p.multiline?"m":"")+(p.unicode?"u":"")+(v?"y":"g"),b=new f(v?p:"^(?:"+p.source+")",m),x=void 0===i?4294967295:i>>>0;if(0===x)return[];if(0===d.length)return null===c(b,d)?[d]:[];for(var _=0,$=0,k=[];$1||"".split(/.?/).length?function(t,e){var r=String(a(this)),u=void 0===e?4294967295:e>>>0;if(0===u)return[];if(void 0===t)return[r];if(!i(t))return n.call(r,t,u);for(var l,s,o,c=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,h+"g");(l=f.call(g,r))&&!((s=g.lastIndex)>d&&(c.push(r.slice(d,l.index)),l.length>1&&l.index=u));)g.lastIndex===l.index&&g.lastIndex++;return d===r.length?!o&&g.test("")||c.push(""):c.push(r.slice(d)),c.length>u?c.slice(0,u):c}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var i=a(this),u=null==n?void 0:n[t];return void 0!==u?u.call(n,i,e):r.call(String(i),n,e)},function(t,i){var a=e(r,t,this,i,r!==n);if(a.done)return a.value;var f=u(t),h=String(this),p=l(f,RegExp),v=f.unicode,b=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(g?"y":"g"),m=new p(g?f:"^(?:"+f.source+")",b),x=void 0===i?4294967295:i>>>0;if(0===x)return[];if(0===h.length)return null===c(m,h)?[h]:[];for(var y=0,j=0,O=[];j5&&void 0!==arguments[5]?arguments[5]:1;return!n||s>l?null:t("ul",{class:"sidebar-sub-headers"},n.map((function(n){var o=Object(r.e)(a,e+"#"+n.slug);return t("li",{class:"sidebar-sub-header"},[i(t,e+"#"+n.slug,n.title,o),u(t,n.children,e,a,l,s+1)])})))}var a={functional:!0,props:["item"],render:function(t,n){var e=n.parent,a=e.$page,l=e.$site,s=e.$route,o=n.props.item,c=Object(r.e)(s,o.path),f="auto"===o.type?c||o.children.some((function(t){return Object(r.e)(s,o.basePath+"#"+t.slug)})):c,h=i(t,o.path,o.title||o.path,f),p=null!=a.frontmatter.sidebarDepth?a.frontmatter.sidebarDepth:l.themeConfig.sidebarDepth,d=null==p?1:p,g=!!l.themeConfig.displayAllHeaders;return"auto"===o.type?[h,u(t,o.children,o.basePath,s,d)]:(f||g)&&o.headers&&!r.d.test(o.path)?[h,u(t,Object(r.c)(o.headers),o.path,s,d)]:h}},l=e(48),s=Object(l.a)(a,void 0,void 0,!1,null,null,null);n.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/17.403d3937.js b/assets/js/17.8289ca23.js similarity index 92% rename from assets/js/17.403d3937.js rename to assets/js/17.8289ca23.js index 2baeae81..ba3d5d82 100644 --- a/assets/js/17.403d3937.js +++ b/assets/js/17.8289ca23.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{353:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_create_button.66eefa0e.png"},354:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_new_page.e4cc0663.png"},355:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_config.91ee33a6.png"},369:function(e,t,o){"use strict";o.r(t);var a=o(46),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:"creating-a-new-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-node"}},[e._v("#")]),e._v(" Creating a New Node")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#location"}},[e._v("Location")])]),a("li",[a("a",{attrs:{href:"#information-required"}},[e._v("Information Required")])]),a("li",[a("a",{attrs:{href:"#install-the-daemon"}},[e._v("Install the Daemon")])]),a("li",[a("a",{attrs:{href:"#configuring-the-node"}},[e._v("Configuring the Node")]),a("ul",[a("li",[a("a",{attrs:{href:"#auto-deploy"}},[e._v("Auto-Deploy")])])])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"location"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#location"}},[e._v("#")]),e._v(" Location")]),e._v(" "),a("p",[e._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.")]),e._v(" "),a("p",[a("img",{attrs:{src:o(353),alt:""}})]),e._v(" "),a("h2",{attrs:{id:"information-required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#information-required"}},[e._v("#")]),e._v(" Information Required")]),e._v(" "),a("p",[a("img",{attrs:{src:o(354),alt:""}})]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Name")]),e._v(": a quick identifiable name for the daemon")]),e._v(" "),a("li",[a("strong",[e._v("Description")]),e._v(": a long description that is used to help you identify the node.")]),e._v(" "),a("li",[a("strong",[e._v("Location")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("FQDN")]),e._v(": the fully qualified domain name for the node — for example: "),a("code",[e._v("node.demon.pterodactyl.io")])]),e._v(" "),a("li",[a("strong",[e._v("Communicate over SSL")]),e._v(": if the panel is using SSL the Daemon is required to use SSL as well.")]),e._v(" "),a("li",[a("strong",[e._v("Behind Proxy")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("Server File Directory")]),e._v(": the location on the physical server where the daemon is to store the files the servers\ngenerate. By default this is "),a("code",[e._v("/srv/daemon-data")]),e._v(".")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("OVH Users")]),e._v(" "),a("p",[e._v("Some OVH users regularly have their "),a("code",[e._v("/home")]),e._v(" folder be the largest filesystem. You may want to change to use\n"),a("code",[e._v("/home/daemon-data")]),e._v(" if you are on a default OVH box.")])]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Total Memory")]),e._v(": the total amount of RAM the node should be able to allocate automatically.")]),e._v(" "),a("li",[a("strong",[e._v("Memory Overallocate")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("Total Disk Space")]),e._v(": the total amount of disk space the node should be able to allocate automatically.")]),e._v(" "),a("li",[a("strong",[e._v("Disk Overallocate")]),e._v(": works the same way as memory overallocation.")])]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Don't forget to account for OS overhead and other software requirements on machines.")])]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Daemon Port")]),e._v(": the port that the Daemon should listen on.")]),e._v(" "),a("li",[a("strong",[e._v("Daemon SFTP Port")]),e._v(": the port the Daemon sftp-server or standalone SFTP server should listen on.")])]),e._v(" "),a("h2",{attrs:{id:"install-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-the-daemon"}},[e._v("#")]),e._v(" Install the Daemon")]),e._v(" "),a("p",[e._v("At this point you'll need to have the Daemon installed on your machine. Check out the "),a("RouterLink",{attrs:{to:"/daemon/installing.html"}},[e._v("documentation")]),e._v("\nfor more information, or try one of the community guides for "),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos7.html"}},[e._v("CentOS")]),e._v(",\n"),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/ubuntu1804.html"}},[e._v("Ubuntu")]),e._v(", or "),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian9.html"}},[e._v("Debian")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"configuring-the-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-node"}},[e._v("#")]),e._v(" Configuring the Node")]),e._v(" "),a("p",[e._v("Go to the Node Configuration page")]),e._v(" "),a("p",[a("img",{attrs:{src:o(355),alt:""}})]),e._v(" "),a("p",[e._v("Copy and paste the config into the "),a("code",[e._v("core.json")]),e._v(" file. (Default location is "),a("code",[e._v("/srv/daemon/config/core.json")]),e._v(")")]),e._v(" "),a("h3",{attrs:{id:"auto-deploy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-deploy"}},[e._v("#")]),e._v(" Auto-Deploy")]),e._v(" "),a("p",[e._v("This will generate a command to run on the node server to configure the daemon for you. (This needs to be run in the "),a("code",[e._v("/srv/daemon")]),e._v(" folder, or "),a("code",[e._v("/home/daemon")]),e._v(" if you're using the "),a("code",[e._v("/home")]),e._v(" directory to store the Daemon)")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{355:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_create_button.66eefa0e.png"},356:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_new_page.e4cc0663.png"},357:function(e,t,o){e.exports=o.p+"assets/img/pterodactyl_add_node_config.91ee33a6.png"},371:function(e,t,o){"use strict";o.r(t);var a=o(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:"creating-a-new-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-node"}},[e._v("#")]),e._v(" Creating a New Node")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#location"}},[e._v("Location")])]),a("li",[a("a",{attrs:{href:"#information-required"}},[e._v("Information Required")])]),a("li",[a("a",{attrs:{href:"#install-the-daemon"}},[e._v("Install the Daemon")])]),a("li",[a("a",{attrs:{href:"#configuring-the-node"}},[e._v("Configuring the Node")]),a("ul",[a("li",[a("a",{attrs:{href:"#auto-deploy"}},[e._v("Auto-Deploy")])])])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"location"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#location"}},[e._v("#")]),e._v(" Location")]),e._v(" "),a("p",[e._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.")]),e._v(" "),a("p",[a("img",{attrs:{src:o(355),alt:""}})]),e._v(" "),a("h2",{attrs:{id:"information-required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#information-required"}},[e._v("#")]),e._v(" Information Required")]),e._v(" "),a("p",[a("img",{attrs:{src:o(356),alt:""}})]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Name")]),e._v(": a quick identifiable name for the daemon")]),e._v(" "),a("li",[a("strong",[e._v("Description")]),e._v(": a long description that is used to help you identify the node.")]),e._v(" "),a("li",[a("strong",[e._v("Location")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("FQDN")]),e._v(": the fully qualified domain name for the node — for example: "),a("code",[e._v("node.demon.pterodactyl.io")])]),e._v(" "),a("li",[a("strong",[e._v("Communicate over SSL")]),e._v(": if the panel is using SSL the Daemon is required to use SSL as well.")]),e._v(" "),a("li",[a("strong",[e._v("Behind Proxy")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("Server File Directory")]),e._v(": the location on the physical server where the daemon is to store the files the servers\ngenerate. By default this is "),a("code",[e._v("/srv/daemon-data")]),e._v(".")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("OVH Users")]),e._v(" "),a("p",[e._v("Some OVH users regularly have their "),a("code",[e._v("/home")]),e._v(" folder be the largest filesystem. You may want to change to use\n"),a("code",[e._v("/home/daemon-data")]),e._v(" if you are on a default OVH box.")])]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Total Memory")]),e._v(": the total amount of RAM the node should be able to allocate automatically.")]),e._v(" "),a("li",[a("strong",[e._v("Memory Overallocate")]),e._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.")]),e._v(" "),a("li",[a("strong",[e._v("Total Disk Space")]),e._v(": the total amount of disk space the node should be able to allocate automatically.")]),e._v(" "),a("li",[a("strong",[e._v("Disk Overallocate")]),e._v(": works the same way as memory overallocation.")])]),e._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),a("p",[e._v("Don't forget to account for OS overhead and other software requirements on machines.")])]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("Daemon Port")]),e._v(": the port that the Daemon should listen on.")]),e._v(" "),a("li",[a("strong",[e._v("Daemon SFTP Port")]),e._v(": the port the Daemon sftp-server or standalone SFTP server should listen on.")])]),e._v(" "),a("h2",{attrs:{id:"install-the-daemon"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-the-daemon"}},[e._v("#")]),e._v(" Install the Daemon")]),e._v(" "),a("p",[e._v("At this point you'll need to have the Daemon installed on your machine. Check out the "),a("RouterLink",{attrs:{to:"/daemon/installing.html"}},[e._v("documentation")]),e._v("\nfor more information, or try one of the community guides for "),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/centos7.html"}},[e._v("CentOS")]),e._v(",\n"),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/ubuntu1804.html"}},[e._v("Ubuntu")]),e._v(", or "),a("RouterLink",{attrs:{to:"/community/installation-guides/daemon/debian9.html"}},[e._v("Debian")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"configuring-the-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-node"}},[e._v("#")]),e._v(" Configuring the Node")]),e._v(" "),a("p",[e._v("Go to the Node Configuration page")]),e._v(" "),a("p",[a("img",{attrs:{src:o(357),alt:""}})]),e._v(" "),a("p",[e._v("Copy and paste the config into the "),a("code",[e._v("core.json")]),e._v(" file. (Default location is "),a("code",[e._v("/srv/daemon/config/core.json")]),e._v(")")]),e._v(" "),a("h3",{attrs:{id:"auto-deploy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#auto-deploy"}},[e._v("#")]),e._v(" Auto-Deploy")]),e._v(" "),a("p",[e._v("This will generate a command to run on the node server to configure the daemon for you. (This needs to be run in the "),a("code",[e._v("/srv/daemon")]),e._v(" folder, or "),a("code",[e._v("/home/daemon")]),e._v(" if you're using the "),a("code",[e._v("/home")]),e._v(" directory to store the Daemon)")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/18.a38a22c6.js b/assets/js/18.fcb158a9.js similarity index 52% rename from assets/js/18.a38a22c6.js rename to assets/js/18.fcb158a9.js index 65e6f0b9..92e11c7d 100644 --- a/assets/js/18.a38a22c6.js +++ b/assets/js/18.fcb158a9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{312:function(t,e,n){},318:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},s=(n(324),n(46)),o=Object(s.a)(i,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},324:function(t,e,n){"use strict";var i=n(312);n.n(i).a}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{314:function(t,e,n){},321:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},s=(n(322),n(48)),o=Object(s.a)(i,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},322:function(t,e,n){"use strict";var i=n(314);n.n(i).a}}]); \ No newline at end of file diff --git a/assets/js/19.2909f3bf.js b/assets/js/19.bb80f931.js similarity index 98% rename from assets/js/19.2909f3bf.js rename to assets/js/19.bb80f931.js index 75e6e6f0..0c4586be 100644 --- a/assets/js/19.2909f3bf.js +++ b/assets/js/19.bb80f931.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{360:function(e,t,a){e.exports=a.p+"assets/img/daemon_configuration_example.7d1665c4.png"},388:function(e,t,a){"use strict";a.r(t);var s=a(46),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(360),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([[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 diff --git a/assets/js/2.17b53296.js b/assets/js/2.21e1a937.js similarity index 99% rename from assets/js/2.17b53296.js rename to assets/js/2.21e1a937.js index 1cd24caa..8718b9f8 100644 --- a/assets/js/2.17b53296.js +++ b/assets/js/2.21e1a937.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{330:function(e,t,n){var i; +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{328:function(e,t,n){var i; /*! * jQuery JavaScript Library v3.5.0 * https://jquery.com/ @@ -22,4 +22,4 @@ * * Date: 2020-03-14 */ -function(e){var t,n,i,o,r,s,a,l,c,d,u,p,f,h,v,g,y,m,w,b="sizzle"+1*new Date,x=e.document,T=0,k=0,S=le(),C=le(),$=le(),A=le(),E=function(e,t){return e===t&&(u=!0),0},D={}.hasOwnProperty,j=[],L=j.pop,N=j.push,H=j.push,O=j.slice,P=function(e,t){for(var n=0,i=e.length;n+~]|"+M+")"+M+"*"),X=new RegExp(M+"|>"),_=new RegExp(W),Y=new RegExp("^"+I+"$"),V={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+z),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+q+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,J=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},se=be((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{H.apply(j=O.call(x.childNodes),x.childNodes),j[x.childNodes.length].nodeType}catch(e){H={apply:j.length?function(e,t){N.apply(e,O.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function ae(e,t,i,o){var r,a,c,d,u,h,y,m=t&&t.ownerDocument,x=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return i;if(!o&&(p(t),t=t||f,v)){if(11!==x&&(u=Z.exec(e)))if(r=u[1]){if(9===x){if(!(c=t.getElementById(r)))return i;if(c.id===r)return i.push(c),i}else if(m&&(c=m.getElementById(r))&&w(t,c)&&c.id===r)return i.push(c),i}else{if(u[2])return H.apply(i,t.getElementsByTagName(e)),i;if((r=u[3])&&n.getElementsByClassName&&t.getElementsByClassName)return H.apply(i,t.getElementsByClassName(r)),i}if(n.qsa&&!A[e+" "]&&(!g||!g.test(e))&&(1!==x||"object"!==t.nodeName.toLowerCase())){if(y=e,m=t,1===x&&(X.test(e)||U.test(e))){for((m=ee.test(e)&&ye(t.parentNode)||t)===t&&n.scope||((d=t.getAttribute("id"))?d=d.replace(ie,oe):t.setAttribute("id",d=b)),a=(h=s(e)).length;a--;)h[a]=(d?"#"+d:":scope")+" "+we(h[a]);y=h.join(",")}try{return H.apply(i,m.querySelectorAll(y)),i}catch(t){A(e,!0)}finally{d===b&&t.removeAttribute("id")}}}return l(e.replace(F,"$1"),t,i,o)}function le(){var e=[];return function t(n,o){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=o}}function ce(e){return e[b]=!0,e}function de(e){var t=f.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=t}function pe(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function he(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ve(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&se(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ge(e){return ce((function(t){return t=+t,ce((function(n,i){for(var o,r=e([],n.length,t),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function ye(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ae.support={},r=ae.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!G.test(t||n&&n.nodeName||"HTML")},p=ae.setDocument=function(e){var t,o,s=e?e.ownerDocument||e:x;return s!=f&&9===s.nodeType&&s.documentElement?(h=(f=s).documentElement,v=!r(f),x!=f&&(o=f.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",re,!1):o.attachEvent&&o.attachEvent("onunload",re)),n.scope=de((function(e){return h.appendChild(e).appendChild(f.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),n.attributes=de((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=de((function(e){return e.appendChild(f.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=K.test(f.getElementsByClassName),n.getById=de((function(e){return h.appendChild(e).id=b,!f.getElementsByName||!f.getElementsByName(b).length})),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&v){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&v){var n,i,o,r=t.getElementById(e);if(r){if((n=r.getAttributeNode("id"))&&n.value===e)return[r];for(o=t.getElementsByName(e),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===e)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],o=0,r=t.getElementsByTagName(e);if("*"===e){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&v)return t.getElementsByClassName(e)},y=[],g=[],(n.qsa=K.test(f.querySelectorAll))&&(de((function(e){var t;h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+M+"*(?:value|"+q+")"),e.querySelectorAll("[id~="+b+"-]").length||g.push("~="),(t=f.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||g.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||g.push(".#.+[+~]"),e.querySelectorAll("\\\f"),g.push("[\\r\\n\\f]")})),de((function(e){e.innerHTML="";var t=f.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")}))),(n.matchesSelector=K.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&de((function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",W)})),g=g.length&&new RegExp(g.join("|")),y=y.length&&new RegExp(y.join("|")),t=K.test(h.compareDocumentPosition),w=t||K.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},E=t?function(e,t){if(e===t)return u=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e==f||e.ownerDocument==x&&w(x,e)?-1:t==f||t.ownerDocument==x&&w(x,t)?1:d?P(d,e)-P(d,t):0:4&i?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,i=0,o=e.parentNode,r=t.parentNode,s=[e],a=[t];if(!o||!r)return e==f?-1:t==f?1:o?-1:r?1:d?P(d,e)-P(d,t):0;if(o===r)return pe(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?pe(s[i],a[i]):s[i]==x?-1:a[i]==x?1:0},f):f},ae.matches=function(e,t){return ae(e,null,null,t)},ae.matchesSelector=function(e,t){if(p(e),n.matchesSelector&&v&&!A[t+" "]&&(!y||!y.test(t))&&(!g||!g.test(t)))try{var i=m.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){A(t,!0)}return ae(t,f,null,[e]).length>0},ae.contains=function(e,t){return(e.ownerDocument||e)!=f&&p(e),w(e,t)},ae.attr=function(e,t){(e.ownerDocument||e)!=f&&p(e);var o=i.attrHandle[t.toLowerCase()],r=o&&D.call(i.attrHandle,t.toLowerCase())?o(e,t,!v):void 0;return void 0!==r?r:n.attributes||!v?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},ae.escape=function(e){return(e+"").replace(ie,oe)},ae.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ae.uniqueSort=function(e){var t,i=[],o=0,r=0;if(u=!n.detectDuplicates,d=!n.sortStable&&e.slice(0),e.sort(E),u){for(;t=e[r++];)t===e[r]&&(o=i.push(r));for(;o--;)e.splice(i[o],1)}return d=null,e},o=ae.getText=function(e){var t,n="",i=0,r=e.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===r||4===r)return e.nodeValue}else for(;t=e[i++];)n+=o(t);return n},(i=ae.selectors={cacheLength:50,createPseudo:ce,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ae.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ae.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&_.test(n)&&(t=s(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=S[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&S(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(i){var o=ae.attr(i,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&o.indexOf(n)>-1:"$="===t?n&&o.slice(-n.length)===n:"~="===t?(" "+o.replace(R," ")+" ").indexOf(n)>-1:"|="===t&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,i,o){var r="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===i&&0===o?function(e){return!!e.parentNode}:function(t,n,l){var c,d,u,p,f,h,v=r!==s?"nextSibling":"previousSibling",g=t.parentNode,y=a&&t.nodeName.toLowerCase(),m=!l&&!a,w=!1;if(g){if(r){for(;v;){for(p=t;p=p[v];)if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=v="only"===e&&!h&&"nextSibling"}return!0}if(h=[s?g.firstChild:g.lastChild],s&&m){for(w=(f=(c=(d=(u=(p=g)[b]||(p[b]={}))[p.uniqueID]||(u[p.uniqueID]={}))[e]||[])[0]===T&&c[1])&&c[2],p=f&&g.childNodes[f];p=++f&&p&&p[v]||(w=f=0)||h.pop();)if(1===p.nodeType&&++w&&p===t){d[e]=[T,f,w];break}}else if(m&&(w=f=(c=(d=(u=(p=t)[b]||(p[b]={}))[p.uniqueID]||(u[p.uniqueID]={}))[e]||[])[0]===T&&c[1]),!1===w)for(;(p=++f&&p&&p[v]||(w=f=0)||h.pop())&&((a?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++w||(m&&((d=(u=p[b]||(p[b]={}))[p.uniqueID]||(u[p.uniqueID]={}))[e]=[T,w]),p!==t)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(e,t){var n,o=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ae.error("unsupported pseudo: "+e);return o[b]?o(t):o.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ce((function(e,n){for(var i,r=o(e,t),s=r.length;s--;)e[i=P(e,r[s])]=!(n[i]=r[s])})):function(e){return o(e,0,n)}):o}},pseudos:{not:ce((function(e){var t=[],n=[],i=a(e.replace(F,"$1"));return i[b]?ce((function(e,t,n,o){for(var r,s=i(e,null,o,[]),a=e.length;a--;)(r=s[a])&&(e[a]=!(t[a]=r))})):function(e,o,r){return t[0]=e,i(t,null,r,n),t[0]=null,!n.pop()}})),has:ce((function(e){return function(t){return ae(e,t).length>0}})),contains:ce((function(e){return e=e.replace(te,ne),function(t){return(t.textContent||o(t)).indexOf(e)>-1}})),lang:ce((function(e){return Y.test(e||"")||ae.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=v?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ve(!1),disabled:ve(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return J.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ge((function(){return[0]})),last:ge((function(e,t){return[t-1]})),eq:ge((function(e,t,n){return[n<0?n+t:n]})),even:ge((function(e,t){for(var n=0;nt?t:n;--i>=0;)e.push(i);return e})),gt:ge((function(e,t,n){for(var i=n<0?n+t:n;++i1?function(t,n,i){for(var o=e.length;o--;)if(!e[o](t,n,i))return!1;return!0}:e[0]}function Te(e,t,n,i,o){for(var r,s=[],a=0,l=e.length,c=null!=t;a-1&&(r[c]=!(s[c]=u))}}else y=Te(y===s?y.splice(h,y.length):y),o?o(null,s,y,l):H.apply(s,y)}))}function Se(e){for(var t,n,o,r=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,d=be((function(e){return e===t}),a,!0),u=be((function(e){return P(t,e)>-1}),a,!0),p=[function(e,n,i){var o=!s&&(i||n!==c)||((t=n).nodeType?d(e,n,i):u(e,n,i));return t=null,o}];l1&&xe(p),l>1&&we(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=e.length>0,r=function(r,s,a,l,d){var u,h,g,y=0,m="0",w=r&&[],b=[],x=c,k=r||o&&i.find.TAG("*",d),S=T+=null==x?1:Math.random()||.1,C=k.length;for(d&&(c=s==f||s||d);m!==C&&null!=(u=k[m]);m++){if(o&&u){for(h=0,s||u.ownerDocument==f||(p(u),a=!v);g=e[h++];)if(g(u,s||f,a)){l.push(u);break}d&&(T=S)}n&&((u=!g&&u)&&y--,r&&w.push(u))}if(y+=m,n&&m!==y){for(h=0;g=t[h++];)g(w,b,s,a);if(r){if(y>0)for(;m--;)w[m]||b[m]||(b[m]=L.call(l));b=Te(b)}H.apply(l,b),d&&!r&&b.length>0&&y+t.length>1&&ae.uniqueSort(l)}return d&&(T=S,c=x),w};return n?ce(r):r}(r,o))).selector=e}return a},l=ae.select=function(e,t,n,o){var r,l,c,d,u,p="function"==typeof e&&e,f=!o&&s(e=p.selector||e);if(n=n||[],1===f.length){if((l=f[0]=f[0].slice(0)).length>2&&"ID"===(c=l[0]).type&&9===t.nodeType&&v&&i.relative[l[1].type]){if(!(t=(i.find.ID(c.matches[0].replace(te,ne),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(l.shift().value.length)}for(r=V.needsContext.test(e)?0:l.length;r--&&(c=l[r],!i.relative[d=c.type]);)if((u=i.find[d])&&(o=u(c.matches[0].replace(te,ne),ee.test(l[0].type)&&ye(t.parentNode)||t))){if(l.splice(r,1),!(e=o.length&&we(l)))return H.apply(n,o),n;break}}return(p||a(e,f))(o,t,!v,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},n.sortStable=b.split("").sort(E).join("")===b,n.detectDuplicates=!!u,p(),n.sortDetached=de((function(e){return 1&e.compareDocumentPosition(f.createElement("fieldset"))})),de((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||ue("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),n.attributes&&de((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||ue("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),de((function(e){return null==e.getAttribute("disabled")}))||ue(q,(function(e,t,n){var i;if(!n)return!0===e[t]?t.toLowerCase():(i=e.getAttributeNode(t))&&i.specified?i.value:null})),ae}(n);k.find=C,k.expr=C.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=C.uniqueSort,k.text=C.getText,k.isXMLDoc=C.isXML,k.contains=C.contains,k.escapeSelector=C.escape;var $=function(e,t,n){for(var i=[],o=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(o&&k(e).is(n))break;i.push(e)}return i},A=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},E=k.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var j=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return y(t)?k.grep(e,(function(e,i){return!!t.call(e,i,e)!==n})):t.nodeType?k.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?k.grep(e,(function(e){return d.call(t,e)>-1!==n})):k.filter(t,e,n)}k.filter=function(e,t,n){var i=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===i.nodeType?k.find.matchesSelector(i,e)?[i]:[]:k.find.matches(e,k.grep(t,(function(e){return 1===e.nodeType})))},k.fn.extend({find:function(e){var t,n,i=this.length,o=this;if("string"!=typeof e)return this.pushStack(k(e).filter((function(){for(t=0;t1?k.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&E.test(e)?k(e):e||[],!1).length}});var N,H=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||N,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:H.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),j.test(i[1])&&k.isPlainObject(t))for(i in t)y(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=w.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,N=k(w);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};function q(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&k.find.matchesSelector(n,e))){r.push(n);break}return this.pushStack(r.length>1?k.uniqueSort(r):r)},index:function(e){return e?"string"==typeof e?d.call(k(e),this[0]):d.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return $(e,"parentNode")},parentsUntil:function(e,t,n){return $(e,"parentNode",n)},next:function(e){return q(e,"nextSibling")},prev:function(e){return q(e,"previousSibling")},nextAll:function(e){return $(e,"nextSibling")},prevAll:function(e){return $(e,"previousSibling")},nextUntil:function(e,t,n){return $(e,"nextSibling",n)},prevUntil:function(e,t,n){return $(e,"previousSibling",n)},siblings:function(e){return A((e.parentNode||{}).firstChild,e)},children:function(e){return A(e.firstChild)},contents:function(e){return null!=e.contentDocument&&s(e.contentDocument)?e.contentDocument:(D(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},(function(e,t){k.fn[e]=function(n,i){var o=k.map(this,t,n);return"Until"!==e.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=k.filter(i,o)),this.length>1&&(P[e]||k.uniqueSort(o),O.test(e)&&o.reverse()),this.pushStack(o)}}));var M=/[^\x20\t\r\n\f]+/g;function I(e){return e}function z(e){throw e}function W(e,t,n,i){var o;try{e&&y(o=e.promise)?o.call(e).done(t).fail(n):e&&y(o=e.then)?o.call(e,t,n):t.apply(void 0,[e].slice(i))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return k.each(e.match(M)||[],(function(e,n){t[n]=!0})),t}(e):k.extend({},e);var t,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||e.once,i=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(e){return e?k.inArray(e,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||t||(r=n=""),this},locked:function(){return!!o},fireWith:function(e,n){return o||(n=[e,(n=n||[]).slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!i}};return c},k.extend({Deferred:function(e){var t=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",o={state:function(){return i},always:function(){return r.done(arguments).fail(arguments),this},catch:function(e){return o.then(null,e)},pipe:function(){var e=arguments;return k.Deferred((function(n){k.each(t,(function(t,i){var o=y(e[i[4]])&&e[i[4]];r[i[1]]((function(){var e=o&&o.apply(this,arguments);e&&y(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[e]:arguments)}))})),e=null})).promise()},then:function(e,i,o){var r=0;function s(e,t,i,o){return function(){var a=this,l=arguments,c=function(){var n,c;if(!(e=r&&(i!==z&&(a=void 0,l=[n]),t.rejectWith(a,l))}};e?d():(k.Deferred.getStackHook&&(d.stackTrace=k.Deferred.getStackHook()),n.setTimeout(d))}}return k.Deferred((function(n){t[0][3].add(s(0,n,y(o)?o:I,n.notifyWith)),t[1][3].add(s(0,n,y(e)?e:I)),t[2][3].add(s(0,n,y(i)?i:z))})).promise()},promise:function(e){return null!=e?k.extend(e,o):o}},r={};return k.each(t,(function(e,n){var s=n[2],a=n[5];o[n[1]]=s.add,a&&s.add((function(){i=a}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),s.add(n[3].fire),r[n[0]]=function(){return r[n[0]+"With"](this===r?void 0:this,arguments),this},r[n[0]+"With"]=s.fireWith})),o.promise(r),e&&e.call(r,r),r},when:function(e){var t=arguments.length,n=t,i=Array(n),o=a.call(arguments),r=k.Deferred(),s=function(e){return function(n){i[e]=this,o[e]=arguments.length>1?a.call(arguments):n,--t||r.resolveWith(i,o)}};if(t<=1&&(W(e,r.done(s(n)).resolve,r.reject,!t),"pending"===r.state()||y(o[n]&&o[n].then)))return r.then();for(;n--;)W(o[n],s(n),r.reject);return r.promise()}});var R=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){n.console&&n.console.warn&&e&&R.test(e.name)&&n.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){n.setTimeout((function(){throw e}))};var F=k.Deferred();function B(){w.removeEventListener("DOMContentLoaded",B),n.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e).catch((function(e){k.readyException(e)})),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0,!0!==e&&--k.readyWait>0||F.resolveWith(w,[k]))}}),k.ready.then=F.then,"complete"===w.readyState||"loading"!==w.readyState&&!w.documentElement.doScroll?n.setTimeout(k.ready):(w.addEventListener("DOMContentLoaded",B),n.addEventListener("load",B));var U=function(e,t,n,i,o,r,s){var a=0,l=e.length,c=null==n;if("object"===T(n))for(a in o=!0,n)U(e,t,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,y(i)||(s=!0),c&&(s?(t.call(e,i),t=null):(c=t,t=function(e,t,n){return c.call(k(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each((function(){K.remove(this,e)}))}}),k.extend({queue:function(e,t,n){var i;if(e)return t=(t||"fx")+"queue",i=Q.get(e,t),n&&(!i||Array.isArray(n)?i=Q.access(e,t,k.makeArray(n)):i.push(n)),i||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),i=n.length,o=n.shift(),r=k._queueHooks(e,t);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===t&&n.unshift("inprogress"),delete r.stop,o.call(e,(function(){k.dequeue(e,t)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add((function(){Q.remove(e,[t+"queue",n])}))})}}),k.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,ye=/^$|^module$|\/(?:java|ecma)script/i;fe=w.createDocumentFragment().appendChild(w.createElement("div")),(he=w.createElement("input")).setAttribute("type","radio"),he.setAttribute("checked","checked"),he.setAttribute("name","t"),fe.appendChild(he),g.checkClone=fe.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.innerHTML="",g.noCloneChecked=!!fe.cloneNode(!0).lastChild.defaultValue,fe.innerHTML="",g.option=!!fe.lastChild;var me={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function we(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?k.merge([e],n):n}function be(e,t){for(var n=0,i=e.length;n",""]);var xe=/<|&#?\w+;/;function Te(e,t,n,i,o){for(var r,s,a,l,c,d,u=t.createDocumentFragment(),p=[],f=0,h=e.length;f-1)o&&o.push(r);else if(c=se(r),s=we(u.appendChild(r),"script"),c&&be(s),n)for(d=0;r=s[d++];)ye.test(r.type||"")&&n.push(r);return u}var ke=/^key/,Se=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function $e(){return!0}function Ae(){return!1}function Ee(e,t){return e===function(){try{return w.activeElement}catch(e){}}()==("focus"===t)}function De(e,t,n,i,o,r){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)De(e,a,n,i,t[a],r);return e}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Ae;else if(!o)return e;return 1===r&&(s=o,(o=function(e){return k().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=k.guid++)),e.each((function(){k.event.add(this,t,o,i,n)}))}function je(e,t,n){n?(Q.set(e,t,!1),k.event.add(e,t,{namespace:!1,handler:function(e){var i,o,r=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(r.length)(k.event.special[t]||{}).delegateType&&e.stopPropagation();else if(r=a.call(arguments),Q.set(this,t,r),i=n(this,t),this[t](),r!==(o=Q.get(this,t))||i?Q.set(this,t,!1):o={},r!==o)return e.stopImmediatePropagation(),e.preventDefault(),o.value}else r.length&&(Q.set(this,t,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&k.event.add(e,t,$e)}k.event={global:{},add:function(e,t,n,i,o){var r,s,a,l,c,d,u,p,f,h,v,g=Q.get(e);if(G(e))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&k.find.matchesSelector(re,o),n.guid||(n.guid=k.guid++),(l=g.events)||(l=g.events=Object.create(null)),(s=g.handle)||(s=g.handle=function(t){return void 0!==k&&k.event.triggered!==t.type?k.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(M)||[""]).length;c--;)f=v=(a=Ce.exec(t[c])||[])[1],h=(a[2]||"").split(".").sort(),f&&(u=k.event.special[f]||{},f=(o?u.delegateType:u.bindType)||f,u=k.event.special[f]||{},d=k.extend({type:f,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&k.expr.match.needsContext.test(o),namespace:h.join(".")},r),(p=l[f])||((p=l[f]=[]).delegateCount=0,u.setup&&!1!==u.setup.call(e,i,h,s)||e.addEventListener&&e.addEventListener(f,s)),u.add&&(u.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),o?p.splice(p.delegateCount++,0,d):p.push(d),k.event.global[f]=!0)},remove:function(e,t,n,i,o){var r,s,a,l,c,d,u,p,f,h,v,g=Q.hasData(e)&&Q.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(M)||[""]).length;c--;)if(f=v=(a=Ce.exec(t[c])||[])[1],h=(a[2]||"").split(".").sort(),f){for(u=k.event.special[f]||{},p=l[f=(i?u.delegateType:u.bindType)||f]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=p.length;r--;)d=p[r],!o&&v!==d.origType||n&&n.guid!==d.guid||a&&!a.test(d.namespace)||i&&i!==d.selector&&("**"!==i||!d.selector)||(p.splice(r,1),d.selector&&p.delegateCount--,u.remove&&u.remove.call(e,d));s&&!p.length&&(u.teardown&&!1!==u.teardown.call(e,h,g.handle)||k.removeEvent(e,f,g.handle),delete l[f])}else for(f in l)k.event.remove(e,f+t[c],n,i,!0);k.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,i,o,r,s,a=new Array(arguments.length),l=k.event.fix(e),c=(Q.get(this,"events")||Object.create(null))[l.type]||[],d=k.event.special[l.type]||{};for(a[0]=l,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||!0!==c.disabled)){for(r=[],s={},n=0;n-1:k.find(o,this,null,[c]).length),s[o]&&r.push(i);r.length&&a.push({elem:c,handlers:r})}return c=this,l\s*$/g;function Oe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,i,o,r,s,a;if(1===t.nodeType){if(Q.hasData(e)&&(a=Q.get(e).events))for(o in Q.remove(t,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof h&&!g.checkClone&&Ne.test(h))return e.each((function(o){var r=e.eq(o);v&&(t[0]=h.call(this,o,r.html())),ze(r,t,n,i)}));if(p&&(r=(o=Te(t,e[0].ownerDocument,!1,e,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=k.map(we(o,"script"),Pe)).length;u0&&be(s,!l&&we(e,"script")),a},cleanData:function(e){for(var t,n,i,o=k.event.special,r=0;void 0!==(n=e[r]);r++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(i in t.events)o[i]?k.event.remove(n,i):k.removeEvent(n,i,t.handle);n[Q.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return U(this,(function(e){return void 0===e?k.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return ze(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)}))},prepend:function(){return ze(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return ze(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return ze(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(we(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return k.clone(this,e,t)}))},html:function(e){return U(this,(function(e){var t=this[0]||{},n=0,i=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Le.test(e)&&!me[(ge.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n3,re.removeChild(e)),a}}))}();var Ye=["Webkit","Moz","ms"],Ve=w.createElement("div").style,Ge={};function Je(e){var t=k.cssProps[e]||Ge[e];return t||(e in Ve?e:Ge[e]=function(e){for(var t=e[0].toUpperCase()+e.slice(1),n=Ye.length;n--;)if((e=Ye[n]+t)in Ve)return e}(e)||e)}var Qe=/^(none|table(?!-c[ea]).+)/,Ke=/^--/,Ze={position:"absolute",visibility:"hidden",display:"block"},et={letterSpacing:"0",fontWeight:"400"};function tt(e,t,n){var i=ie.exec(t);return i?Math.max(0,i[2]-(n||0))+(i[3]||"px"):t}function nt(e,t,n,i,o,r){var s="width"===t?1:0,a=0,l=0;if(n===(i?"border":"content"))return 0;for(;s<4;s+=2)"margin"===n&&(l+=k.css(e,n+oe[s],!0,o)),i?("content"===n&&(l-=k.css(e,"padding"+oe[s],!0,o)),"margin"!==n&&(l-=k.css(e,"border"+oe[s]+"Width",!0,o))):(l+=k.css(e,"padding"+oe[s],!0,o),"padding"!==n?l+=k.css(e,"border"+oe[s]+"Width",!0,o):a+=k.css(e,"border"+oe[s]+"Width",!0,o));return!i&&r>=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-r-l-a-.5))||0),l}function it(e,t,n){var i=Fe(e),o=(!g.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,i),r=o,s=Xe(e,t,i),a="offset"+t[0].toUpperCase()+t.slice(1);if(Re.test(s)){if(!n)return s;s="auto"}return(!g.boxSizingReliable()&&o||!g.reliableTrDimensions()&&D(e,"tr")||"auto"===s||!parseFloat(s)&&"inline"===k.css(e,"display",!1,i))&&e.getClientRects().length&&(o="border-box"===k.css(e,"boxSizing",!1,i),(r=a in e)&&(s=e[a])),(s=parseFloat(s)||0)+nt(e,t,n||(o?"border":"content"),r,i,s)+"px"}function ot(e,t,n,i,o){return new ot.prototype.init(e,t,n,i,o)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Xe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,r,s,a=V(t),l=Ke.test(t),c=e.style;if(l||(t=Je(a)),s=k.cssHooks[t]||k.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(e,!1,i))?o:c[t];"string"===(r=typeof n)&&(o=ie.exec(n))&&o[1]&&(n=ce(e,t,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(k.cssNumber[a]?"":"px")),g.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,i))||(l?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,i){var o,r,s,a=V(t);return Ke.test(t)||(t=Je(a)),(s=k.cssHooks[t]||k.cssHooks[a])&&"get"in s&&(o=s.get(e,!0,n)),void 0===o&&(o=Xe(e,t,i)),"normal"===o&&t in et&&(o=et[t]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),k.each(["height","width"],(function(e,t){k.cssHooks[t]={get:function(e,n,i){if(n)return!Qe.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?it(e,t,i):Be(e,Ze,(function(){return it(e,t,i)}))},set:function(e,n,i){var o,r=Fe(e),s=!g.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===k.css(e,"boxSizing",!1,r),l=i?nt(e,t,i,a,r):0;return a&&s&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(r[t])-nt(e,t,"border",!1,r)-.5)),l&&(o=ie.exec(n))&&"px"!==(o[3]||"px")&&(e.style[t]=n,n=k.css(e,t)),tt(0,n,l)}}})),k.cssHooks.marginLeft=_e(g.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Xe(e,"marginLeft"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),k.each({margin:"",padding:"",border:"Width"},(function(e,t){k.cssHooks[e+t]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[e+oe[i]+t]=r[i]||r[i-2]||r[0];return o}},"margin"!==e&&(k.cssHooks[e+t].set=tt)})),k.fn.extend({css:function(e,t){return U(this,(function(e,t,n){var i,o,r={},s=0;if(Array.isArray(t)){for(i=Fe(e),o=t.length;s1)}}),k.Tween=ot,ot.prototype={constructor:ot,init:function(e,t,n,i,o,r){this.elem=e,this.prop=n,this.easing=o||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=i,this.unit=r||(k.cssNumber[n]?"":"px")},cur:function(){var e=ot.propHooks[this.prop];return e&&e.get?e.get(this):ot.propHooks._default.get(this)},run:function(e){var t,n=ot.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ot.propHooks._default.set(this),this}},ot.prototype.init.prototype=ot.prototype,ot.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Je(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}},ot.propHooks.scrollTop=ot.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=ot.prototype.init,k.fx.step={};var rt,st,at=/^(?:toggle|show|hide)$/,lt=/queueHooks$/;function ct(){st&&(!1===w.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(ct):n.setTimeout(ct,k.fx.interval),k.fx.tick())}function dt(){return n.setTimeout((function(){rt=void 0})),rt=Date.now()}function ut(e,t){var n,i=0,o={height:e};for(t=t?1:0;i<4;i+=2-t)o["margin"+(n=oe[i])]=o["padding"+n]=e;return t&&(o.opacity=o.width=e),o}function pt(e,t,n){for(var i,o=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(e){return this.each((function(){k.removeAttr(this,e)}))}}),k.extend({attr:function(e,t,n){var i,o,r=e.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===e.getAttribute?k.prop(e,t,n):(1===r&&k.isXMLDoc(e)||(o=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):o&&"set"in o&&void 0!==(i=o.set(e,n,t))?i:(e.setAttribute(t,n+""),n):o&&"get"in o&&null!==(i=o.get(e,t))?i:null==(i=k.find.attr(e,t))?void 0:i)},attrHooks:{type:{set:function(e,t){if(!g.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,i=0,o=t&&t.match(M);if(o&&1===e.nodeType)for(;n=o[i++];)e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=vt[t]||k.find.attr;vt[t]=function(e,t,i){var o,r,s=t.toLowerCase();return i||(r=vt[s],vt[s]=o,o=null!=n(e,t,i)?s:null,vt[s]=r),o}}));var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(M)||[]).join(" ")}function wt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(M)||[]}k.fn.extend({prop:function(e,t){return U(this,k.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[k.propFix[e]||e]}))}}),k.extend({prop:function(e,t,n){var i,o,r=e.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&k.isXMLDoc(e)||(t=k.propFix[t]||t,o=k.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(e,n,t))?i:e[t]=n:o&&"get"in o&&null!==(i=o.get(e,t))?i:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){k.propFix[this.toLowerCase()]=this})),k.fn.extend({addClass:function(e){var t,n,i,o,r,s,a,l=0;if(y(e))return this.each((function(t){k(this).addClass(e.call(this,t,wt(this)))}));if((t=bt(e)).length)for(;n=this[l++];)if(o=wt(n),i=1===n.nodeType&&" "+mt(o)+" "){for(s=0;r=t[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=mt(i))&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,i,o,r,s,a,l=0;if(y(e))return this.each((function(t){k(this).removeClass(e.call(this,t,wt(this)))}));if(!arguments.length)return this.attr("class","");if((t=bt(e)).length)for(;n=this[l++];)if(o=wt(n),i=1===n.nodeType&&" "+mt(o)+" "){for(s=0;r=t[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=mt(i))&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e,i="string"===n||Array.isArray(e);return"boolean"==typeof t&&i?t?this.addClass(e):this.removeClass(e):y(e)?this.each((function(n){k(this).toggleClass(e.call(this,n,wt(this),t),t)})):this.each((function(){var t,o,r,s;if(i)for(o=0,r=k(this),s=bt(e);t=s[o++];)r.hasClass(t)?r.removeClass(t):r.addClass(t);else void 0!==e&&"boolean"!==n||((t=wt(this))&&Q.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":Q.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,i=0;for(t=" "+e+" ";n=this[i++];)if(1===n.nodeType&&(" "+mt(wt(n))+" ").indexOf(t)>-1)return!0;return!1}});var xt=/\r/g;k.fn.extend({val:function(e){var t,n,i,o=this[0];return arguments.length?(i=y(e),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?e.call(this,n,k(this).val()):e)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=k.map(o,(function(e){return null==e?"":e+""}))),(t=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))}))):o?(t=k.valHooks[o.type]||k.valHooks[o.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(xt,""):null==n?"":n:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,i,o=e.options,r=e.selectedIndex,s="select-one"===e.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(e.selectedIndex=-1),r}}}}),k.each(["radio","checkbox"],(function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=k.inArray(k(e).val(),t)>-1}},g.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),g.focusin="onfocusin"in n;var Tt=/^(?:focusinfocus|focusoutblur)$/,kt=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,i,o){var r,s,a,l,c,d,u,p,h=[i||w],v=f.call(e,"type")?e.type:e,g=f.call(e,"namespace")?e.namespace.split("."):[];if(s=p=a=i=i||w,3!==i.nodeType&&8!==i.nodeType&&!Tt.test(v+k.event.triggered)&&(v.indexOf(".")>-1&&(g=v.split("."),v=g.shift(),g.sort()),c=v.indexOf(":")<0&&"on"+v,(e=e[k.expando]?e:new k.Event(v,"object"==typeof e&&e)).isTrigger=o?2:3,e.namespace=g.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=i),t=null==t?[e]:k.makeArray(t,[e]),u=k.event.special[v]||{},o||!u.trigger||!1!==u.trigger.apply(i,t))){if(!o&&!u.noBubble&&!m(i)){for(l=u.delegateType||v,Tt.test(l+v)||(s=s.parentNode);s;s=s.parentNode)h.push(s),a=s;a===(i.ownerDocument||w)&&h.push(a.defaultView||a.parentWindow||n)}for(r=0;(s=h[r++])&&!e.isPropagationStopped();)p=s,e.type=r>1?l:u.bindType||v,(d=(Q.get(s,"events")||Object.create(null))[e.type]&&Q.get(s,"handle"))&&d.apply(s,t),(d=c&&s[c])&&d.apply&&G(s)&&(e.result=d.apply(s,t),!1===e.result&&e.preventDefault());return e.type=v,o||e.isDefaultPrevented()||u._default&&!1!==u._default.apply(h.pop(),t)||!G(i)||c&&y(i[v])&&!m(i)&&((a=i[c])&&(i[c]=null),k.event.triggered=v,e.isPropagationStopped()&&p.addEventListener(v,kt),i[v](),e.isPropagationStopped()&&p.removeEventListener(v,kt),k.event.triggered=void 0,a&&(i[c]=a)),e.result}},simulate:function(e,t,n){var i=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(i,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each((function(){k.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),g.focusin||k.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){k.event.simulate(t,e.target,k.event.fix(e))};k.event.special[t]={setup:function(){var i=this.ownerDocument||this.document||this,o=Q.access(i,t);o||i.addEventListener(e,n,!0),Q.access(i,t,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Q.access(i,t)-1;o?Q.access(i,t,o):(i.removeEventListener(e,n,!0),Q.remove(i,t))}}}));var St=n.location,Ct={guid:Date.now()},$t=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var At=/\[\]$/,Et=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function Lt(e,t,n,i){var o;if(Array.isArray(t))k.each(t,(function(t,o){n||At.test(e)?i(e,o):Lt(e+"["+("object"==typeof o&&null!=o?t:"")+"]",o,n,i)}));else if(n||"object"!==T(t))i(e,t);else for(o in t)Lt(e+"["+o+"]",t[o],n,i)}k.param=function(e,t){var n,i=[],o=function(e,t){var n=y(t)?t():t;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,(function(){o(this.name,this.value)}));else for(n in e)Lt(n,e[n],t,o);return i.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!ve.test(e))})).map((function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,(function(e){return{name:t.name,value:e.replace(Et,"\r\n")}})):{name:t.name,value:n.replace(Et,"\r\n")}})).get()}});var Nt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,qt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},zt={},Wt="*/".concat("*"),Rt=w.createElement("a");function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var i,o=0,r=t.toLowerCase().match(M)||[];if(y(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(e[i]=e[i]||[]).unshift(n)):(e[i]=e[i]||[]).push(n)}}function Bt(e,t,n,i){var o={},r=e===zt;function s(a){var l;return o[a]=!0,k.each(e[a]||[],(function(e,a){var c=a(t,n,i);return"string"!=typeof c||r||o[c]?r?!(l=c):void 0:(t.dataTypes.unshift(c),s(c),!1)})),l}return s(t.dataTypes[0])||!o["*"]&&s("*")}function Ut(e,t){var n,i,o=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((o[n]?e:i||(i={}))[n]=t[n]);return i&&k.extend(!0,e,i),e}Rt.href=St.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:St.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(St.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Wt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ut(Ut(e,k.ajaxSettings),t):Ut(k.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(zt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var i,o,r,s,a,l,c,d,u,p,f=k.ajaxSetup({},t),h=f.context||f,v=f.context&&(h.nodeType||h.jquery)?k(h):k.event,g=k.Deferred(),y=k.Callbacks("once memory"),m=f.statusCode||{},b={},x={},T="canceled",S={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=Pt.exec(r);)s[t[1].toLowerCase()+" "]=(s[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=s[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?r:null},setRequestHeader:function(e,t){return null==c&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(f.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)S.always(e[S.status]);else for(t in e)m[t]=[m[t],e[t]];return this},abort:function(e){var t=e||T;return i&&i.abort(t),C(0,t),this}};if(g.promise(S),f.url=((e||f.url||St.href)+"").replace(Mt,St.protocol+"//"),f.type=t.method||t.type||f.method||f.type,f.dataTypes=(f.dataType||"*").toLowerCase().match(M)||[""],null==f.crossDomain){l=w.createElement("a");try{l.href=f.url,l.href=l.href,f.crossDomain=Rt.protocol+"//"+Rt.host!=l.protocol+"//"+l.host}catch(e){f.crossDomain=!0}}if(f.data&&f.processData&&"string"!=typeof f.data&&(f.data=k.param(f.data,f.traditional)),Bt(It,f,t,S),c)return S;for(u in(d=k.event&&f.global)&&0==k.active++&&k.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!qt.test(f.type),o=f.url.replace(Ht,""),f.hasContent?f.data&&f.processData&&0===(f.contentType||"").indexOf("application/x-www-form-urlencoded")&&(f.data=f.data.replace(Nt,"+")):(p=f.url.slice(o.length),f.data&&(f.processData||"string"==typeof f.data)&&(o+=($t.test(o)?"&":"?")+f.data,delete f.data),!1===f.cache&&(o=o.replace(Ot,"$1"),p=($t.test(o)?"&":"?")+"_="+Ct.guid+++p),f.url=o+p),f.ifModified&&(k.lastModified[o]&&S.setRequestHeader("If-Modified-Since",k.lastModified[o]),k.etag[o]&&S.setRequestHeader("If-None-Match",k.etag[o])),(f.data&&f.hasContent&&!1!==f.contentType||t.contentType)&&S.setRequestHeader("Content-Type",f.contentType),S.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+Wt+"; q=0.01":""):f.accepts["*"]),f.headers)S.setRequestHeader(u,f.headers[u]);if(f.beforeSend&&(!1===f.beforeSend.call(h,S,f)||c))return S.abort();if(T="abort",y.add(f.complete),S.done(f.success),S.fail(f.error),i=Bt(zt,f,t,S)){if(S.readyState=1,d&&v.trigger("ajaxSend",[S,f]),c)return S;f.async&&f.timeout>0&&(a=n.setTimeout((function(){S.abort("timeout")}),f.timeout));try{c=!1,i.send(b,C)}catch(e){if(c)throw e;C(-1,e)}}else C(-1,"No Transport");function C(e,t,s,l){var u,p,w,b,x,T=t;c||(c=!0,a&&n.clearTimeout(a),i=void 0,r=l||"",S.readyState=e>0?4:0,u=e>=200&&e<300||304===e,s&&(b=function(e,t,n){for(var i,o,r,s,a=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||e.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(f,S,s)),!u&&k.inArray("script",f.dataTypes)>-1&&(f.converters["text script"]=function(){}),b=function(e,t,n,i){var o,r,s,a,l,c={},d=e.dataTypes.slice();if(d[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(r=d.shift();r;)if(e.responseFields[r]&&(n[e.responseFields[r]]=t),!l&&i&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=r,r=d.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=c[l+" "+r]||c["* "+r]))for(o in c)if((a=o.split(" "))[1]===r&&(s=c[l+" "+a[0]]||c["* "+a[0]])){!0===s?s=c[o]:!0!==c[o]&&(r=a[0],d.unshift(a[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+r}}}return{state:"success",data:t}}(f,b,S,u),u?(f.ifModified&&((x=S.getResponseHeader("Last-Modified"))&&(k.lastModified[o]=x),(x=S.getResponseHeader("etag"))&&(k.etag[o]=x)),204===e||"HEAD"===f.type?T="nocontent":304===e?T="notmodified":(T=b.state,p=b.data,u=!(w=b.error))):(w=T,!e&&T||(T="error",e<0&&(e=0))),S.status=e,S.statusText=(t||T)+"",u?g.resolveWith(h,[p,T,S]):g.rejectWith(h,[S,T,w]),S.statusCode(m),m=void 0,d&&v.trigger(u?"ajaxSuccess":"ajaxError",[S,f,u?p:w]),y.fireWith(h,[S,T]),d&&(v.trigger("ajaxComplete",[S,f]),--k.active||k.event.trigger("ajaxStop")))}return S},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],(function(e,t){k[t]=function(e,n,i,o){return y(n)&&(o=o||i,i=n,n=void 0),k.ajax(k.extend({url:e,type:t,dataType:o,data:n,success:i},k.isPlainObject(e)&&e))}})),k.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),k._evalUrl=function(e,t,n){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t,n)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(y(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return y(e)?this.each((function(t){k(this).wrapInner(e.call(this,t))})):this.each((function(){var t=k(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=y(e);return this.each((function(n){k(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){k(this).replaceWith(this.childNodes)})),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Xt={0:200,1223:204},_t=k.ajaxSettings.xhr();g.cors=!!_t&&"withCredentials"in _t,g.ajax=_t=!!_t,k.ajaxTransport((function(e){var t,i;if(g.cors||_t&&!e.crossDomain)return{send:function(o,r){var s,a=e.xhr();if(a.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)a[s]=e.xhrFields[s];for(s in e.mimeType&&a.overrideMimeType&&a.overrideMimeType(e.mimeType),e.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);t=function(e){return function(){t&&(t=i=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Xt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=t(),i=a.onerror=a.ontimeout=t("error"),void 0!==a.onabort?a.onabort=i:a.onreadystatechange=function(){4===a.readyState&&n.setTimeout((function(){t&&i()}))},t=t("abort");try{a.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),k.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),k.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(i,o){t=k(" + diff --git a/community/config/eggs/creating_a_custom_egg.html b/community/config/eggs/creating_a_custom_egg.html index 5a2239ce..be8d349a 100644 --- a/community/config/eggs/creating_a_custom_egg.html +++ b/community/config/eggs/creating_a_custom_egg.html @@ -4,7 +4,7 @@ Creating a Custom Egg | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Creating a Custom Egg

    WARNING

    You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor + (opens new window)

    # Creating a Custom Egg

    WARNING

    You should not edit existing services or options that ship with the Panel. Each upgrade we push can make minor changes to these, and you'll lose any changes you've made.

    The first thing you'll need to do is create a new service. In this case, the name and description speak for themselves in this case. The Folder Name must be a unique name not being used by any other service, and should only contain letters, numbers, underscores, and dashes. This is the name of the folder where the daemon will be storing @@ -60,7 +61,7 @@ block prior to booting the server to ensure all of the required settings are def } }

    In this example, we are telling the Daemon to read server.properties in /home/container. Within this block, we -define a parser, in this case properties but the following are valid parsers:

    • file — This parser goes based on matching the beginning of lines, and not a specific property like the other four. +define a parser, in this case properties but the following are valid parsers (opens new window):

      • file — This parser goes based on matching the beginning of lines, and not a specific property like the other four. Avoid using this parser if possible.
      • yaml (supports * notation)
      • properties
      • ini
      • json (supports * notation)
      • xml

      Once you have defined a parser, we then define a find block which tells the Daemon what specific elements to find and replace. In this example, we have provided four separate items within the server.properties file that we want to find and replace to the assigned values. You can use either an exact value, or define a specific server setting from @@ -117,13 +118,13 @@ if running Minecraft.

    You should use caution here, even if you assi hidden. Crafty users will still be able to get the environment on their server. In most cases this is simply hiding it from the user, and then used within the Dockerfile to perform actions, thus it is not important for the user to see.

    Finally, you will need to define some input rules to validate the value against. In this example, we use required|string|between:1,10, which means the field is required, must be a string, and must be between 1 and -10 characters in length. You can find all of the available validation rules +10 characters in length. You can find all of the available validation rules (opens new window) on the Laravel website. You can also use ReGEX based validation by using the regex: rule flag. For example, -required|regex:/^([\w\d._-]+)(\.jar)$/ will require the field, and will match the -regex as any letters or numbers (\w\d) including underscore (_), periods (.), and dashes (-) ending in .jar.

    They will then be visible when managing the startup for a server in both the Admin CP and on the Front-End.

    # List of default variables

    The default variables are always accessible to all eggs and don't have to be created separately. They can be used in the egg startup, install script, or the configuration file parser.

    Variable Description Example
    TZ Time Zone Etc/UTC
    STARTUP Startup command of the egg java -Xms128M -XmxM -jar
    SERVER_MEMORY Memory available for the server in MB 512
    SERVER_IP Default ip of the server 127.0.0.1
    SERVER_PORT Primary Server Port 27015
    P_SERVER_LOCATION Location of the server Example City
    P_SERVER_UUID UUID of the server 539fdca8-4a08-4551-a8d2-8ee5475b50d9
    P_SERVER_ALLOCATION_LIMIT Limit of allocations allowed for the server 0
    - + diff --git a/community/config/eggs/creating_a_custom_image.html b/community/config/eggs/creating_a_custom_image.html index 94923d57..66079fa5 100644 --- a/community/config/eggs/creating_a_custom_image.html +++ b/community/config/eggs/creating_a_custom_image.html @@ -4,7 +4,7 @@ Creating a Custom Docker Image | Pterodactyl - + @@ -14,30 +14,31 @@ - - + + +

    # Creating a Custom Docker Image

    WARNING

    This tutorial uses examples from our core:java docker image, -which can be found on GitHub. This tutorial also assumes some knowledge of Docker, we suggest -reading up if this all looks foreign to you.

    # Creating the Dockerfile

    The most important part of this process is to create the Dockerfile -that will be used by the Daemon. Due to heavy restrictions on server containers, you must setup this file in a specific manner.

    We try to make use of Alpine Linux as much as possible for our images in order to keep their size down.

    # ----------------------------------
    +             (opens new window)

    # Creating a Custom Docker Image

    WARNING

    This tutorial uses examples from our core:java (opens new window) docker image, +which can be found on GitHub. This tutorial also assumes some knowledge of Docker (opens new window), we suggest +reading up if this all looks foreign to you.

    # Creating the Dockerfile

    The most important part of this process is to create the Dockerfile (opens new window) +that will be used by the Daemon. Due to heavy restrictions on server containers, you must setup this file in a specific manner.

    We try to make use of Alpine Linux (opens new window) as much as possible for our images in order to keep their size down.

    # ----------------------------------
     # Pterodactyl Core Dockerfile
     # Environment: Java
     # Minimum Panel Version: 0.6.0
    @@ -57,16 +58,16 @@ WORKDIR /home/container
     COPY ./entrypoint.sh /entrypoint.sh
     
     CMD ["/bin/bash", "/entrypoint.sh"]
    -

    Lets walk through the Dockerfile above. The first thing you'll notice is the FROM declaration.

    FROM openjdk:8-jdk-alpine
    -

    In this case, we are using openjdk:8-jdk-alpine which provides us with Java 8.

    # Installing Dependencies

    The next thing we do is install the dependencies we will need using Alpine's package manager: apk. You'll notice some +

    Lets walk through the Dockerfile above. The first thing you'll notice is the FROM (opens new window) declaration.

    FROM openjdk:8-jdk-alpine
    +

    In this case, we are using openjdk:8-jdk-alpine (opens new window) which provides us with Java 8.

    # Installing Dependencies

    The next thing we do is install the dependencies we will need using Alpine's package manager: apk. You'll notice some specific flags that keep the container small, including --no-cache, as well as everything being contained in a -single RUN block.

    # Creating a Container User

    Within this RUN block, you'll notice the useradd command.

    adduser -D -h /home/container container
    -

    All Pterodactyl containers must have a user named `container`, and the user home **must** be `/home/container`.

    After we create that user, we then define the default container USER -as well as a few ENV settings to be applied to things running -within the container.

    # Work Directory & Entrypoint

    One of the last things we do is define a WORKDIR which -is where everything else will be executed. The WORKDIR must be set the /home/container.

    Finally, we need to copy our ENTRYPOINT script into -the docker image root. This is done using COPY, after which -we define the command to be used when the container is started using CMD. +single RUN (opens new window) block.

    # Creating a Container User

    Within this RUN block, you'll notice the useradd command.

    adduser -D -h /home/container container
    +

    All Pterodactyl containers must have a user named `container`, and the user home **must** be `/home/container`.

    After we create that user, we then define the default container USER (opens new window) +as well as a few ENV (opens new window) settings to be applied to things running +within the container.

    # Work Directory & Entrypoint

    One of the last things we do is define a WORKDIR (opens new window) which +is where everything else will be executed. The WORKDIR must be set the /home/container.

    Finally, we need to copy our ENTRYPOINT (opens new window) script into +the docker image root. This is done using COPY (opens new window), after which +we define the command to be used when the container is started using CMD (opens new window). The CMD line should always point to the entrypoint.sh file.

    COPY ./entrypoint.sh /entrypoint.sh
     CMD ["/bin/bash", "/entrypoint.sh"]
     

    # Entrypoint Script

    In order to complete this Dockerfile, we will need an entrypoint.sh file which tells Docker how to run this @@ -95,10 +96,10 @@ configuration. However, that is not necessarily anything to worry about here.

    The command above simply evaluates the STARTUP environment variable, and then replaces anything surrounded in curly braces {{EXAMPLE}} with a matching environment variable (such as EXAMPLE). Thus, our STARTUP command:

    java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}
     

    Becomes:

    java -Xms128M -Xmx1024M -jar server.jar
    -

    # Run the Command

    The last step is to run this modified startup command, which is done with the line ${MODIFIED_STARTUP}.

    # Note

    Sometimes you may need to change the permissions of the entrypoint.sh file, on linux you can do this by executing chmod +x entrypoint.sh in the directory where the file is.

    - + diff --git a/community/config/nodes/add_node.html b/community/config/nodes/add_node.html index 2f68c5e7..5e05ddf7 100644 --- a/community/config/nodes/add_node.html +++ b/community/config/nodes/add_node.html @@ -4,7 +4,7 @@ Creating a New Node | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Creating a New Node

    # Location

    Head to the admin panel and click the Nodes tab on the left sidebar. After that, click 'Create New' on the top right side to open the page to add a node.

    # Information Required

    • Name: a quick identifiable name for the daemon
    • Description: a long description that is used to help you identify the node.
    • Location: the location you want the node in. These are configured in the 'Locations' section of the panel and one must be created before a node can be created. These simply act as categories for nodes and serve no other purpose at this time.
    • FQDN: the fully qualified domain name for the node — for example: node.demon.pterodactyl.io
    • Communicate over SSL: if the panel is using SSL the Daemon is required to use SSL as well.
    • Behind Proxy: if you have the Daemon behind a proxy that terminates SSL connections before arriving at the Daemon @@ -43,10 +44,10 @@ generate. By default this is /srv/daemon-data.
    /home/daemon-data if you are on a default OVH box.

    • Total Memory: the total amount of RAM the node should be able to allocate automatically.
    • Memory Overallocate: the percentage of RAM to over-allocate on a node. For example, if you have set a 10GB memory limit, with a 20% overallocation, the Panel will allocate up to 12GB of memory on this node in total.
    • Total Disk Space: the total amount of disk space the node should be able to allocate automatically.
    • Disk Overallocate: works the same way as memory overallocation.

    DANGER

    Don't forget to account for OS overhead and other software requirements on machines.

    • Daemon Port: the port that the Daemon should listen on.
    • Daemon SFTP Port: the port the Daemon sftp-server or standalone SFTP server should listen on.

    # Install the Daemon

    At this point you'll need to have the Daemon installed on your machine. Check out the documentation for more information, or try one of the community guides for CentOS, -Ubuntu, or Debian.

    # Configuring the Node

    Go to the Node Configuration page

    Copy and paste the config into the core.json file. (Default location is /srv/daemon/config/core.json)

    # Auto-Deploy

    This will generate a command to run on the node server to configure the daemon for you. (This needs to be run in the /srv/daemon folder, or /home/daemon if you're using the /home directory to store the Daemon)

    - + diff --git a/community/customization/panel.html b/community/customization/panel.html index 09dd0921..d2ebfeca 100644 --- a/community/customization/panel.html +++ b/community/customization/panel.html @@ -4,7 +4,7 @@ Building Panel Assets | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Building Panel Assets

    WARNING

    Do not run the following steps on your production nodes.

    Instructions on how to build the panel are also available in the BUILDING.md file.

    The frontend of the Panel is built with React. Any changes to the source files require to recompile it. + (opens new window)

    # Building Panel Assets

    WARNING

    Do not run the following steps on your production nodes.

    Instructions on how to build the panel are also available in the BUILDING.md (opens new window) file.

    The frontend of the Panel is built with React. Any changes to the source files require to recompile it. This also applies to style sheets. The following sections explain how to do so.

    # Install Dependencies

    The following commands will install the necessary dependencies for building the Panel assets.

    The build tools require NodeJS, yarn is used as the package manager.

    # Ubuntu/Debian
     curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
     apt install -y nodejs
    @@ -49,10 +50,10 @@ This also applies to style sheets. The following sections explain how to do so.<
     yarn # Installs panel build dependencies
     

    # Build Panel Assets

    The following command will rebuild the Panel frontend.

    cd /var/www/pterodactyl
     yarn build:production # Build panel
    -

    You can use command yarn run watch 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 yarn build:production command.

    - + diff --git a/community/customization/wings.html b/community/customization/wings.html index f10b62c1..339f9d4b 100644 --- a/community/customization/wings.html +++ b/community/customization/wings.html @@ -4,7 +4,7 @@ Building Wings | Pterodactyl - + @@ -14,28 +14,29 @@ - - + + +

    # Building Wings

    WARNING

    Do not run the following steps on your production nodes.

    Wings is written in Go. This makes it very easy to modify and compile it on your own, and distribute your own binaries. -This guide will cover the steps necessary to build it yourself.

    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.

    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.

    # Build Requirements

    An up to date version of Go is required to compile Wings. The minimum version can be found at the top of the go.mod file. See the official instructions for help with installing Go.

    # Building

    Execute the following command in your local clone of the repository to compile Wings into a binary.

    go build
    +             (opens new window)

    # Building Wings

    WARNING

    Do not run the following steps on your production nodes.

    Wings is written in Go. This makes it very easy to modify and compile it on your own, and distribute your own binaries. +This guide will cover the steps necessary to build it yourself.

    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.

    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.

    # Build Requirements

    An up to date version of Go is required to compile Wings. The minimum version can be found at the top of the go.mod (opens new window) file. See the official instructions (opens new window) for help with installing Go.

    # Building

    Execute the following command in your local clone of the repository to compile Wings into a binary.

    go build
     

    You should now have a wings binary file in your wings directory.

    # Install the new binary

    Root required

    Some the following commands require root permissions. Prepend them with sudo if you are not logged in as root.

    1. Backup the current installation of wings
    mv /usr/local/bin/wings /usr/local/bin/wings-backup
     
    1. Place the new binary in /usr/local/bin
    cp ./wings /usr/local/bin
     
    1. Restart wings
    systemctl restart wings
    @@ -43,9 +44,9 @@ This guide will cover the steps necessary to build it yourself.

    It will n

    Remember to stop the system service before, and re-enable it afterwards.

    systemctl stop wings
     
     systemctl start wings
    -
    - + diff --git a/community/games/minecraft.html b/community/games/minecraft.html index c268ef99..e48c996f 100644 --- a/community/games/minecraft.html +++ b/community/games/minecraft.html @@ -4,7 +4,7 @@ Minecraft | Pterodactyl - + @@ -14,32 +14,33 @@ - - + + +

    # Minecraft

    # Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)

    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.

    WARNING

    For the setup described below, it is necessary that all servers are on the same node.

    DANGER

    If you are a hosting provider, you should only allow a single proxy network per node, if you are selling them to customers.

    # Allocations in the Panel

    Create a regular allocation for the proxy server which uses the external IP of the node, so users can reach it.

    The actual game servers behind the proxy should use allocations with 127.0.0.1 as the address, so they are only reachable on the node, and not from the public.

    # Example

    10.1.70.62 is an example, replace it with your own public IP address.

    # proxy server settings

    As the proxy server, like all servers, is running in a docker container with network isolation, localhost/127.0.0.1 doesn't refer to the node, but to the container. The node can be reached from within the container using 172.18.0.1 (unless the pterodactyl network is configured differently) instead. You therefore need to use this IP in your proxy server configuration.

    # bungeecord/waterfall configuration

    This will be different for other proxy servers, please refer to their documentation.

    # paper/spigot/bukkit settings

    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.

    # server.properties

    set online-mode false

    # spigot.yml

    set bungeecord to true

    # Firewalls

    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.

    You can use the following commands as an example. 172.18.0.1 is the default address referring to the node within the pterodactyl network. Replace <LOCALHOST_PORT> with the allocated localhost ports of the game servers.

    WARNING

    The following commands will allow any server on the node to access the opened ports.

    # UFW (Ubuntu)

    Allow access to the pterodactyl pterodactyl0 network on a specific port.

    ufw allow in on pterodactyl0 to 172.18.0.1 port <LOCALHOST_PORT> proto tcp
    +             (opens new window)

    # Minecraft

    # Configuring a Server Network (BungeeCord, Waterfall, HexaCord, etc.)

    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.

    WARNING

    For the setup described below, it is necessary that all servers are on the same node.

    DANGER

    If you are a hosting provider, you should only allow a single proxy network per node, if you are selling them to customers.

    # Allocations in the Panel

    Create a regular allocation for the proxy server which uses the external IP of the node, so users can reach it.

    The actual game servers behind the proxy should use allocations with 127.0.0.1 as the address, so they are only reachable on the node, and not from the public.

    # Example

    10.1.70.62 is an example, replace it with your own public IP address.

    # proxy server settings

    As the proxy server, like all servers, is running in a docker container with network isolation, localhost/127.0.0.1 doesn't refer to the node, but to the container. The node can be reached from within the container using 172.18.0.1 (unless the pterodactyl network is configured differently) instead. You therefore need to use this IP in your proxy server configuration.

    # bungeecord/waterfall configuration

    This will be different for other proxy servers, please refer to their documentation.

    # paper/spigot/bukkit settings

    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.

    # server.properties

    set online-mode false

    # spigot.yml

    set bungeecord to true

    # Firewalls

    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.

    You can use the following commands as an example. 172.18.0.1 is the default address referring to the node within the pterodactyl network. Replace <LOCALHOST_PORT> with the allocated localhost ports of the game servers.

    WARNING

    The following commands will allow any server on the node to access the opened ports.

    # UFW (Ubuntu)

    Allow access to the pterodactyl pterodactyl0 network on a specific port.

    ufw allow in on pterodactyl0 to 172.18.0.1 port <LOCALHOST_PORT> proto tcp
     

    # Firewalld (CentOS)

    Allow access to pterodactyl0 from the pterodactyl0 network.

    WARNING

    This command will allow any server to access all other servers as well as all ports on the node.

    firewall-cmd --permanent --zone=public --add-source=172.18.0.1
    -
    - + diff --git a/community/installation-guides/panel/centos7.html b/community/installation-guides/panel/centos7.html index aee6ec26..90444cfc 100644 --- a/community/installation-guides/panel/centos7.html +++ b/community/installation-guides/panel/centos7.html @@ -4,7 +4,7 @@ CentOS 7 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # CentOS 7

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver + (opens new window)

    # CentOS 7

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 7.

    # Install Requirements and Additional Utilities

    We will install all of Pterodactyl's required dependencies and a few aditional utilities.

    TIP

    If you run sestatus and it shows SELinux status: enabled you should install the following packages for later

    # SELinux tools

    yum install -y policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans
     

    # MariaDB

    ## Install Repos
     cat <<EOF > /etc/yum.repos.d/mariadb.repo
    @@ -164,10 +165,10 @@ server {
             deny all;
         }
     }

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/panel/centos8.html b/community/installation-guides/panel/centos8.html index 97d47648..a1cddaca 100644 --- a/community/installation-guides/panel/centos8.html +++ b/community/installation-guides/panel/centos8.html @@ -4,7 +4,7 @@ CentOS 8 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # CentOS 8

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 8.

    # Install Requirements and Additional Utilities

    We will install all of Pterodactyl's required dependencies and a few aditional utilities.

    TIP

    If you run sestatus and it shows SELinux status: enabled you should install the following packages for later

    # SELinux tools

    dnf install -y policycoreutils selinux-policy selinux-policy-targeted setroubleshoot-server setools setools-console mcstrans
    +             (opens new window)

    # CentOS 8

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 8.

    # Install Requirements and Additional Utilities

    We will install all of Pterodactyl's required dependencies and a few aditional utilities.

    TIP

    If you run sestatus and it shows SELinux status: enabled you should install the following packages for later

    # SELinux tools

    dnf install -y policycoreutils selinux-policy selinux-policy-targeted setroubleshoot-server setools setools-console mcstrans
     

    # MariaDB

    dnf install -y mariadb mariadb-server
     
     ## Start maraidb
    @@ -147,10 +148,10 @@ server {
             deny all;
         }
     }

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/panel/debian10.html b/community/installation-guides/panel/debian10.html index 11c53ada..24962d8c 100644 --- a/community/installation-guides/panel/debian10.html +++ b/community/installation-guides/panel/debian10.html @@ -4,7 +4,7 @@ Debian 10 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Debian 10

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 10.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
    +             (opens new window)

    # Debian 10

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 10.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
     apt update
     
     ## Install MariaDB
    @@ -126,10 +127,10 @@ server {
         }
     }
     

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/panel/debian9.html b/community/installation-guides/panel/debian9.html index 212395ba..80c24524 100644 --- a/community/installation-guides/panel/debian9.html +++ b/community/installation-guides/panel/debian9.html @@ -4,7 +4,7 @@ Debian 9 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Debian 9

    In this guide we will install Pterodactyl v1.x — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 9.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    apt install -y software-properties-common dirmngr
    +             (opens new window)

    # Debian 9

    In this guide we will install Pterodactyl v1.x — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 9.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    apt install -y software-properties-common dirmngr
     
     ## Get apt updates
     apt update
    @@ -133,10 +134,10 @@ server {
         }
     }
     

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/panel/ubuntu1804.html b/community/installation-guides/panel/ubuntu1804.html index d3e2a86e..45e947a3 100644 --- a/community/installation-guides/panel/ubuntu1804.html +++ b/community/installation-guides/panel/ubuntu1804.html @@ -4,7 +4,7 @@ Ubuntu 18.04 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Ubuntu 18.04

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 18.04.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
    +             (opens new window)

    # Ubuntu 18.04

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 18.04.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
     apt update -y
     
     ## Install MariaDB
    @@ -126,10 +127,10 @@ server {
         }
     }
     

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/panel/ubuntu2004.html b/community/installation-guides/panel/ubuntu2004.html index 1e60f1d0..f57421b4 100644 --- a/community/installation-guides/panel/ubuntu2004.html +++ b/community/installation-guides/panel/ubuntu2004.html @@ -4,7 +4,7 @@ Ubuntu 20.04 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Ubuntu 20.04

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 20.04.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
    +             (opens new window)

    # Ubuntu 20.04

    In this guide we will install Pterodactyl v1.X — including all of it's dependencies — and configure our webserver to serve it using SSL.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 20.04.

    # Install Requirements

    We will first begin by installing all of Pterodactyl's required dependencies.

    # MariaDB

    ## Get apt updates
     apt update -y
     
     ## Install MariaDB
    @@ -126,10 +127,10 @@ server {
         }
     }
     

    # Redis Setup

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

    # Installing the Panel

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

    - + diff --git a/community/installation-guides/wings/centos7.html b/community/installation-guides/wings/centos7.html index 28983706..dfdaf619 100644 --- a/community/installation-guides/wings/centos7.html +++ b/community/installation-guides/wings/centos7.html @@ -4,7 +4,7 @@ CentOS 7 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # CentOS 7

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 7.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install yum tools
    +             (opens new window)

    # CentOS 7

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 7.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install yum tools
     yum install -y yum-utils device-mapper-persistent-data lvm2
     
     ## Add the docker repo
    @@ -51,10 +52,10 @@ firewall-cmd --add-port 2022/tcp --permanent
     firewall-cmd --permanent --zone=trusted --change-interface=docker0
     firewall-cmd --zone=trusted --add-masquerade --permanent
     firewall-cmd --reload
    -

    # Installing Wings

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

    - + diff --git a/community/installation-guides/wings/centos8.html b/community/installation-guides/wings/centos8.html index 66bca04b..d3941c0c 100644 --- a/community/installation-guides/wings/centos8.html +++ b/community/installation-guides/wings/centos8.html @@ -4,7 +4,7 @@ CentOS 8 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # CentOS 8

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 8.

    # Install Requirements

    We will first begin by installing all of the Wings' required dependencies.

    # Docker

    ## Install yum tools
    +             (opens new window)

    # CentOS 8

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for CentOS 8.

    # Install Requirements

    We will first begin by installing all of the Wings' required dependencies.

    # Docker

    ## Install yum tools
     dnf install -y dnf-utils device-mapper-persistent-data lvm2
     
     ## Add the docker repo
    @@ -51,10 +52,10 @@ firewall-cmd --add-port 2022/tcp --permanent
     firewall-cmd --permanent --zone=trusted --change-interface=pterodactyl0
     firewall-cmd --zone=trusted --add-masquerade --permanent
     firewall-cmd --reload
    -

    # Installing Wings

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

    - + diff --git a/community/installation-guides/wings/debian10.html b/community/installation-guides/wings/debian10.html index 117448c3..efc7c26c 100644 --- a/community/installation-guides/wings/debian10.html +++ b/community/installation-guides/wings/debian10.html @@ -4,7 +4,7 @@ Debian 10 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Debian 10

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 10.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## install apt tools
    +             (opens new window)

    # Debian 10

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 10.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## install apt tools
     apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
     
     ## Import the docker gpg key
    @@ -50,10 +51,10 @@ add-apt-repository "deb [arch=amd64] https://dow
     ## Enable docker service
     systemctl enable docker
     systemctl start docker
    -

    # Installing Wings

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

    - + diff --git a/community/installation-guides/wings/debian9.html b/community/installation-guides/wings/debian9.html index 4b96010f..e6cf2044 100644 --- a/community/installation-guides/wings/debian9.html +++ b/community/installation-guides/wings/debian9.html @@ -4,7 +4,7 @@ Debian 9 | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Debian 9

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 9.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## install apt tools
    +             (opens new window)

    # Debian 9

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Debian 9.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## install apt tools
     apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
     
     ## Import the docker gpg key
    @@ -50,10 +51,10 @@ add-apt-repository "deb [arch=amd64] https://dow
     ## Enable docker service
     systemctl enable docker
     systemctl start docker
    -

    # Installing Wings

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

    - + diff --git a/community/installation-guides/wings/ubuntu1804.html b/community/installation-guides/wings/ubuntu1804.html index f12a8d2c..ce19c0d1 100644 --- a/community/installation-guides/wings/ubuntu1804.html +++ b/community/installation-guides/wings/ubuntu1804.html @@ -4,7 +4,7 @@ Ubuntu 18.04 | Pterodactyl - + @@ -14,36 +14,37 @@ - - + + +

    # Ubuntu 18.04

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 18.04.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install docker
    +             (opens new window)

    # Ubuntu 18.04

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 18.04.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install docker
     apt install -y docker.io
     
     ## Enable docker service
     systemctl enable docker
     systemctl start docker
    -

    # Installing Wings

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

    - + diff --git a/community/installation-guides/wings/ubuntu2004.html b/community/installation-guides/wings/ubuntu2004.html index d4565854..875e5a6e 100644 --- a/community/installation-guides/wings/ubuntu2004.html +++ b/community/installation-guides/wings/ubuntu2004.html @@ -4,7 +4,7 @@ Ubuntu 20.04 | Pterodactyl - + @@ -14,36 +14,37 @@ - - + + +

    # Ubuntu 20.04

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 20.04.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install docker
    +             (opens new window)

    # Ubuntu 20.04

    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.

    TIP

    This guide is based off the official installation documentation but is tailored specifically for Ubuntu 20.04.

    # Install Requirements

    We will first begin by installing all of Wings' required dependencies.

    # Docker

    ## Install docker
     apt install -y docker.io
     
     ## Enable docker service
     systemctl enable docker
     systemctl start docker
    -

    # Installing Wings

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

    - + diff --git a/community/tutorials/artisan.html b/community/tutorials/artisan.html index 6704daff..6bbe12ed 100644 --- a/community/tutorials/artisan.html +++ b/community/tutorials/artisan.html @@ -4,7 +4,7 @@ Artisan CLI | Pterodactyl - + @@ -14,27 +14,28 @@ - - + + +

    # Artisan CLI

    The Artisan CLI, command line interface, is part of the Laravel framework, which Pterodactyl is built on. The Artisan file is located in /var/www/pterodactyl if you followed the official guide. This guide goes over some more Pterodactyl specific/related Artisan commands, which are all prefixed with the letter p (e.g. p:user:make). If you'd like to view all commands, you can do so by running:

    php artisan list
    +             (opens new window)

    # Artisan CLI

    The Artisan CLI, command line interface, is part of the Laravel framework, which Pterodactyl is built on. The Artisan file is located in /var/www/pterodactyl if you followed the official guide. This guide goes over some more Pterodactyl specific/related Artisan commands, which are all prefixed with the letter p (e.g. p:user:make). If you'd like to view all commands, you can do so by running:

    php artisan list
     

    To get information regarding a specific command you can do so by running:

    php artisan help <command>
     

    TIP

    To simplify this documentation, in command usage you'll see things like the following:

    <hello-world> - Required argument

    [hello-world] - Optional argument

    {--hello-world} - Option

    # User Management

    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.

    # Create User

    php artisan p:user:make {--email=user@example.com}
                             {--username=myusername}
    @@ -53,10 +54,10 @@
                                     {--nodes=1,2,3}
     

    # Server Rebuild

    php artisan p:server:rebuild [server-id] {--node=1}
     

    This will initiate a rebuild on all servers, all servers on a node, or a specific server depending on the information given.

    # Panel Management

    # View Panel Info

    php artisan p:info
    -

    Displays a variety of panel information which can be used to check the configuation of this like database and email.

    - + diff --git a/daemon/0.6/configuration.html b/daemon/0.6/configuration.html index e10a3bfb..8dc94746 100644 --- a/daemon/0.6/configuration.html +++ b/daemon/0.6/configuration.html @@ -4,7 +4,7 @@ Additional Configuration | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Additional Configuration

    This Software is Abandoned

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

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

    WARNING

    These are advanced configurations for the daemon. You risk breaking your daemon and making containers un-usable if @@ -80,7 +81,7 @@ to access anything on the host, as well as bind to any IP or Port they wish.

    },

    # Private Registries

    Setting Path Default Value Notes
    username none The username to use when connecting to the registry.
    password none The password associated with the account.
    images none An array of images that are associated with the private registry.
    auth none
    email none
    serveraddress none The address to the server the registry is located on.
    key none A pre-generated base64 encoded authentication string. If provided none of the above options are required.

    Please note that all of the settings above are in the docker.registry.X path. So, username is actually docker.registry.username.

    # Security Policies

    This daemon ships with a very strict security configuration designed to limit access to the host system, and mitigate a large range of potential attack vectors. However, some users might need to tweak these settings, or are running on -a private instance and are willing to decrease some of the security measures.

    Setting Path Default Value Notes
    ipv6 true Set this to false to disable IPv6 networking on the pterodactyl0 interface.
    internal false Set this to true to prevent any external network access to all containers on the pterodactyl0 interface.
    enable_icc true 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.
    enable_ip_masquerade true Set this to false to disable IP Masquerading on the pterodactyl0 interface.

    Please note that all of the settings above are in the docker.policy.network.X path. So, ipv6 is actually docker.policy.network.ipv6.

    # Container Policy

    Setting Path Default Value Notes
    tmpfs rw,exec,nosuid,size=50M These are the arguments used for mounting a tmpfs directory into containers to allow certain programs to run.
    log_driver none ⚠️ This option was removed in v0.6 and is forcibly set to json-file. The log driver to use for containers. We default to none to mitigate a potential DoS attack vector if a server were to spam log output.
    log_opts array
    log_opts.max_size 5m The maximum size of the server output log file created by Docker.
    log_opts.max_files 1 The maximum number of files that Docker will create with output from the server.
    readonly_root true Determines if the root filesystem of the container should be readonly.
    securityopts array An array of security options to apply to a container. The default array is provided below.
    cap_drop array An array of linux capabilities to drop from the container (in addition to ones dropped by docker already. A listing of the default array is below.

    Please note that all of the settings above are in the docker.policy.container.X path. So, tmpfs is actually docker.policy.container.tmpfs.

    # Default Security Opts Array

    [
    +a private instance and are willing to decrease some of the security measures.

    Setting Path Default Value Notes
    ipv6 true Set this to false to disable IPv6 networking on the pterodactyl0 interface.
    internal false Set this to true to prevent any external network access to all containers on the pterodactyl0 interface.
    enable_icc true 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.
    enable_ip_masquerade true Set this to false to disable IP Masquerading on the pterodactyl0 interface.

    Please note that all of the settings above are in the docker.policy.network.X path. So, ipv6 is actually docker.policy.network.ipv6.

    # Container Policy

    Setting Path Default Value Notes
    tmpfs rw,exec,nosuid,size=50M These are the arguments used for mounting a tmpfs directory into containers to allow certain programs to run.
    log_driver none ⚠️ This option was removed in v0.6 and is forcibly set to json-file. The log driver to use for containers. We default to none to mitigate a potential DoS attack vector if a server were to spam log output.
    log_opts array
    log_opts.max_size 5m The maximum size of the server output log file created by Docker.
    log_opts.max_files 1 The maximum number of files that Docker will create with output from the server.
    readonly_root true Determines if the root filesystem of the container should be readonly.
    securityopts array An array of security options to apply to a container. The default array is provided below.
    cap_drop array An array of linux capabilities to drop from the container (in addition to ones dropped by docker already (opens new window). A listing of the default array is below.

    Please note that all of the settings above are in the docker.policy.container.X path. So, tmpfs is actually docker.policy.container.tmpfs.

    # Default Security Opts Array

    [
         'no-new-privileges',
     ]
     

    # Default Capabilities Drop Array

    WARNING

    Starting with v0.6 of the Daemon, the following previously dropped capabilities are available in containers: chown, kill, setgid, and setuid.

    [
    @@ -95,7 +96,7 @@ a private instance and are willing to decrease some of the security measures.

    , 'setfcap', ] -

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

    - +

    # 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 b851f0d2..39d951ca 100644 --- a/daemon/0.6/debian_8_docker.html +++ b/daemon/0.6/debian_8_docker.html @@ -4,7 +4,7 @@ Docker on Debian 8 | Pterodactyl - + @@ -14,37 +14,38 @@ - - + + +

    # Docker on Debian 8

    WARNING

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

    # Install Docker

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

    Once you've done that, if you run docker info you'll notice some missing features at the bottom, something +official documentation for Debian (opens new window).

    Once you've done that, if you run docker info you'll notice some missing features at the bottom, something like the output below.

    WARNING: No memory limit support
     WARNING: No swap limit support
     WARNING: No kernel memory limit support
    @@ -67,7 +68,7 @@ simply run the command below.

     
    sed -i 's,/usr/bin/dockerd,/usr/bin/dockerd --storage-driver=overlay2,g' /lib/systemd/system/docker.service
     

    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!

    - +

    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 5253952f..9a7ab834 100644 --- a/daemon/0.6/installing.html +++ b/daemon/0.6/installing.html @@ -4,7 +4,7 @@ Installation | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Installation

    This Software is Abandoned

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

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

    WARNING

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

    # Supported Systems

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

    # System Requirements

    In order to run the Daemon you will need a system capable of running Docker containers. Most VPS and almost all @@ -57,7 +58,7 @@ doesn't report Xen or LXC you're probably okay to cont VMware, Inc.

    # Dependencies

    Pterodactyl's Daemon requires the following dependencies be installed on your system in order for it to operate.

    • Docker
    • Nodejs (v10, v12, higher versions likely work, but are untested)
    • node-gyp
    • tar
    • unzip
    • make, gcc (gcc-c++ on CentOS), g++
    • python

    # Installing Docker

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

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

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

    Check your Kernel

    Please be aware that some hosts install a modified kernel that does not support important docker features. Please +are listed below for commonly supported systems.

    Check your Kernel

    Please be aware that some hosts install a modified kernel that does not support important docker features. Please check your kernel by running uname -r. If your kernel ends in -xxxx-grs-ipv6-64 or -xxxx-mod-std-ipv6-64 you're probably using a non-supported kernel. Check our Kernel Modifications guide for details.

    # Start Docker on Boot

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

    systemctl enable docker
     

    # Enabling Swap

    On most systems, docker will be unable to setup swap space, you can check if this is the case by running docker info. @@ -68,8 +69,8 @@ Below is an example of what the line should look like, do not copy this line OS specific parameters.

    GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1"
     

    # Installing Nodejs

    NodeJS is also super easy to install! Simply run the command below to make the package accessible to your system.

    curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
     apt -y install nodejs make gcc g++
    -

    Other OS Distributions

    If you are using CentOS, please follow these instructions. Ubuntu and Debian users may also follow the official -instructions provided by Nodejs.

    # Installing Daemon Software

    This Software is Abandoned

    This documentation is for abandoned software which does not recieve any security updates or support +

    Other OS Distributions

    If you are using CentOS, please follow these instructions (opens new window). Ubuntu and Debian users may also follow the official +instructions provided by Nodejs (opens new window).

    # Installing Daemon Software

    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.

    The first step for installing the daemon is to make sure we have the required directory structure setup. To do so, run the commands below.

    mkdir -p /srv/daemon /srv/daemon-data
    @@ -102,7 +103,7 @@ StartLimitInterval=600
     [Install]
     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 f1e5bb53..a6af70c2 100644 --- a/daemon/0.6/kernel_modifications.html +++ b/daemon/0.6/kernel_modifications.html @@ -4,7 +4,7 @@ Kernel Modifications | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Kernel Modifications

    TIP

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

    # Update Kernel

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

    apt-get install linux-image-generic linux-image-extra-virtual
    @@ -67,7 +68,7 @@ the kernel version you install. You might also notice that it matches the first
     command and also the version of the kernel that we installed above. Once you've done that, run the commands below to
     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.

    - +

    # 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 fa66d2af..67a4ad7e 100644 --- a/daemon/0.6/standalone_sftp.html +++ b/daemon/0.6/standalone_sftp.html @@ -4,7 +4,7 @@ Standalone SFTP Server | Pterodactyl - + @@ -14,37 +14,38 @@ - - + + +

    # Standalone SFTP Server

    This Software is Abandoned

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

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

    WARNING

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

    Pterodactyl now ships with the option to use a standalone SFTP server +Pterodactyl Panel 1.0.

    WARNING

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

    Pterodactyl now ships with the option to use a standalone SFTP server (opens new window) rather than using the one that was built into the Daemon. This provides better compatibility with SFTP clients, improved transfer speeds, and a more native approach to file handling and server operation.

    Because this functionality is new, we've decided to make it an opt-in process, rather than an opt-out process. This page will cover how to setup your standalone SFTP server.

    # Disable Daemon's Server

    To disable the Daemon SFTP server, you only need to add sftp.enabled=false to your Daemon's core.json file.

    {
    @@ -60,10 +61,10 @@ will cover how to setup your standalone SFTP server.

    }

    Once you've done that, restarting the Daemon will apply the change and not boot the built-in server.

    # Run the Standalone Server

    To download the standalone server, execute the command below in your Daemon's base directory (generally /srv/daemon).

    curl -Lo sftp-server https://github.com/pterodactyl/sftp-server/releases/download/v1.0.5/sftp-server
     chmod +x sftp-server
    -

    Excellent, now you've got the server binary. Because we've written this server using go there +

    Excellent, now you've got the server binary. Because we've written this server using go (opens new window) there are no additional dependencies you need to install.

    # Start the Server

    Finally, start the SFTP server so that you can then use it to access your files.

    ./sftp-server
     

    By default, this will start the SFTP server on the old port of 2022. If you want to use a different port it can be -specified by passing the --port flag. For more advanced usage, please refer to the GitHub README +specified by passing the --port flag. For more advanced usage, please refer to the GitHub README (opens new window) which includes all of the flags and their default values.

    # Daemonize Server

    Chances are you'll want to daemonize the SFTP server using something like systemd so that it will run in the background. Place the contents below in a file called pterosftp.service in the /etc/systemd/system directory.

    [Unit]
     Description=Pterodactyl Standalone SFTP Server
    @@ -82,7 +83,7 @@ StartLimitInterval=600
     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.

    - +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 5d76ae21..6b36bda7 100644 --- a/daemon/0.6/upgrade/0.4_to_0.5.html +++ b/daemon/0.6/upgrade/0.4_to_0.5.html @@ -4,7 +4,7 @@ Upgrading 0.4.X to 0.5.X | Pterodactyl - + @@ -14,41 +14,42 @@ - - + + +

    # Upgrading 0.4.X to 0.5.X

    This Software is Abandoned

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

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

    DANGER

    This upgrade process will require that all servers running through the Daemon be offline for a short period of time while data is reorganized and server containers are rebuilt. Please plan accordingly for this.

    You will need to update your Panel to the 0.7.X series in order to complete this process as well.

    # Docker Adjustments

    Previously we provided a quick Docker installation script in our installation instructions. We made the regrettable mistake of not reading deeper into it and realizing it enabled edge release channels for Docker. You'll want to take a look at the official documentation for Docker and change your channel to be a stable release channel.

    Please reference the official Docker documentation for how to install Docker CE on your server. Some quick links -are listed below for commonly supported systems.

    # Download Files

    To upgrade from v0.4.X first switch the directory where you installed your Daemon. If you followed the installation +are listed below for commonly supported systems.

    # Download Files

    To upgrade from v0.4.X first switch the directory where you installed your Daemon. If you followed the installation guide your Daemon is most likely located in /srv/daemon. Then, download and unpack the archive using the command below.

    curl -L https://github.com/pterodactyl/daemon/releases/download/v0.5.7/daemon.tar.gz | tar --strip-components=1 -xzv
     

    Then, update the core dependencies for the Daemon with the following command.

    npm update --only=production
    @@ -73,7 +74,7 @@ following command in the Panel directory, not the Daemon directory--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.

    - +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 64f16b5c..a8bc3b18 100644 --- a/daemon/0.6/upgrade/0.5.html +++ b/daemon/0.6/upgrade/0.5.html @@ -4,7 +4,7 @@ Upgrading 0.5 Series | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Upgrading 0.5 Series

    This Software is Abandoned

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

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

    TIP

    Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection @@ -50,7 +51,7 @@ that, run the command below to pull down the latest files and unpack them in the

    # Update Components

    After you've pulled down the latest files the last thing you need to do is run the commands below to update 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 b6e17f81..65a3d08e 100644 --- a/daemon/0.6/upgrade/0.5_to_0.6.html +++ b/daemon/0.6/upgrade/0.5_to_0.6.html @@ -4,7 +4,7 @@ Upgrading 0.5.X to 0.6.X | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Upgrading 0.5.X to 0.6.X

    This Software is Abandoned

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

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

    Server Restart Required

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

    # Breaking Changes

    This release introduces a few breaking changes to how the Daemon operates, but maintains compatibility with v0.7.X of @@ -60,7 +61,7 @@ restart all of your servers. The rebuild step is required, the restart step is o you will not be able to see any console output.

    Run the following commands from the Panel server in order to perform a mass rebuild and restart. Replace ### with the 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 0b6f1fda..c1ca2db4 100644 --- a/daemon/0.6/upgrade/0.6.html +++ b/daemon/0.6/upgrade/0.6.html @@ -4,7 +4,7 @@ Upgrading 0.6 Series | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

    # Upgrading 0.6 Series

    This Software is Abandoned

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

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

    Minor Versions Only

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

    TIP

    Your servers will not go offline during this process thanks to Docker. Clients will briefly lose connection @@ -52,7 +53,7 @@ components and then restart the daemon.

    node -v to check, upgrade if it is v6 or v8.

    Audit Results

    You may see output along the lines of "found 14 vulnerabilities (6 low, 3 moderate, 5 high) in 927 scanned packages". 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 50f31718..d8dbd70e 100644 --- a/daemon/0.6/upgrading.html +++ b/daemon/0.6/upgrading.html @@ -4,7 +4,7 @@ Upgrading | Pterodactyl - + @@ -14,37 +14,38 @@ - - + + +

    # 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

    - +Pterodactyl Panel 1.0.

    # Version Specific Guides

    + diff --git a/guides/mounts.html b/guides/mounts.html index 019b48d2..8e7abf82 100644 --- a/guides/mounts.html +++ b/guides/mounts.html @@ -4,7 +4,7 @@ Using Mounts | Pterodactyl - + @@ -14,41 +14,42 @@ - - + + +

    # Using Mounts

    Mounts can be used to make directories on a node available to servers running on it.

    # Wings Configuration

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

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

    allowed_mounts:
    +  1.3
    +  current

  • # Using Mounts

    Mounts can be used to make directories on a node available to servers running on it.

    # Wings Configuration

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

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

    allowed_mounts:
     - /example
     

    # Panel Configuration

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

    Path in the container

    Mounts can not be mounted at /home/container or any subdirectory of it, as mounts cannot overlap and the server specific files are mounted at that location.

    # Creating a Mount

    1. In the admin panel go to Mounts.
    2. Create a new mount.
    3. Fill in the details as required. -
      • Name: Name for your mount.
      • Description: Description for your mount.
      • Source: The directory where files are stored on the node.
      • Target: The directory where the mount will be placed inside of your server, can not be /home/container.
      • Read Only: Whether the mount will be read-only for the servers using it.
      • User Mountable: Whether to allow users to self mount this mount.
    4. After creating the mount you are required to add Eggs and Nodes that this mount may be used on.

    Mounts used by multiple servers

    All servers using the same mounts will only share its contents when they are on the same node. Mounts are not synchronized between servers.

    # Assigning a Mount to a Server

    1. In the admin panel navigate to the server you would like to use a mount with
    2. Go to the mounts page
    3. Click the + button
    4. Restart the server

    The files of the mount should become available in the target path in the container.

    Mounts cannot be Accessed

    Mounts do not appear in the Panel's file manager, nor are they accessible via SFTP.

    - + diff --git a/guides/php_upgrade.html b/guides/php_upgrade.html new file mode 100644 index 00000000..f8b1481c --- /dev/null +++ b/guides/php_upgrade.html @@ -0,0 +1,64 @@ + + + + + + Upgrading PHP | Pterodactyl + + + + + + + + + + + + + + + +

    # Upgrading PHP

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

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

    # Install PHP

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

    apt -y install php8.0 php8.0-{cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip}
    +

    # Update Composer

    As of Panel@1.3.0 we require composer v2. To update composer you will need to run the following command which will +perform the composer self-update process and move you over to version 2.

    composer self-update --2
    +

    # Webserver Configuration

      # Return to the 1.X.X Upgrade Guide

      + + + diff --git a/index.html b/index.html index 0fa64c11..39e609c1 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ Pterodactyl - + @@ -14,34 +14,35 @@ - - + + + -

      Pterodactyl Panel

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

      - + diff --git a/ops/publish_release.html b/ops/publish_release.html index eae20807..107b4f54 100644 --- a/ops/publish_release.html +++ b/ops/publish_release.html @@ -4,7 +4,7 @@ Publishing a Release | Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +

    • # Publishing a Release

      TIP

      This documentation is specific to the core project team and serves to document how we create, deploy, and announce releases of this software. It might be an interesting read, but you'll likely never use anything out of this on a day-to-day basis.

      # Pick a Codename

      If this is going to be a major version release 0.X or 1.X (not 0.0.X), you will need to have a codename picked out for the release. This should be some type of rhyme or otherwise creative name, ideally using some type of Pterodactyl @@ -86,9 +87,9 @@ shasum -a 256 panel.tar.gz # attach to release -

      - + diff --git a/panel/0.7/configuration.html b/panel/0.7/configuration.html index 2b16f7e0..281d5bb0 100644 --- a/panel/0.7/configuration.html +++ b/panel/0.7/configuration.html @@ -4,7 +4,7 @@ Environment Configuration | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Environment Configuration

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

      To change this behavior you can edit the .env file and change the setting APP_ENVIRONMENT_ONLY=false to @@ -56,7 +57,7 @@ to force a database to be created only on a host belonging to that server's node to be false.

      PTERODACTYL_CLIENT_DATABASES_ENABLED=true
       PTERODACTYL_CLIENT_DATABASES_ALLOW_RANDOM=true
       

      # Reverse Proxy Setup

      If you are planning on running Pterodactyl behind a reverse proxy, either using NGINX or because you are using -Cloudflare's Flexible SSL, +Cloudflare's Flexible SSL (opens new window), you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default when you are using these reverse proxies your Panel will not understand how to properly handle requests and you'll most likely be unable to login, or will see security warnings in your browser console as it attempts to load insecure assets. This @@ -71,14 +72,14 @@ proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_buffering off; proxy_request_buffering off; -

      # Cloudflare Specific Configuration

      If you're using Cloudflare's Flexible SSL you should set TRUSTED_PROXIES to contain their IP addresses. +

      # Cloudflare Specific Configuration

      If you're using Cloudflare's Flexible SSL you should set TRUSTED_PROXIES to contain their IP addresses (opens new window). Below is an example of how to set this.

      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
       

      # Increasing the Editable File Size

      By default the Panel attempts to set a reasonable limit for editing files through the web based file manager. However, some users find it too restrictive and wish to increase the size. This is controlled by a configuration value that can also be set using the .env file. The default value is 50,000 bytes but this can be increased as you see fit.

      PTERODACTYL_FILES_MAX_EDIT_SIZE=50000
       

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

      - +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 875293ec..8a076178 100644 --- a/panel/0.7/getting_started.html +++ b/panel/0.7/getting_started.html @@ -4,7 +4,7 @@ Getting Started | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Getting Started

      This Version is End-of-Life

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

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

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

      This panel does not exist as a drag-and-drop service to run your servers. It is a highly complex system @@ -139,7 +140,7 @@ WantedBy=multi-user.target

      Redis on CentOS

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

      TIP

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

      If you are 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

      - +

      # Next Step: Webserver Configuration

      + diff --git a/panel/0.7/troubleshooting.html b/panel/0.7/troubleshooting.html index 66b78012..ccd87706 100644 --- a/panel/0.7/troubleshooting.html +++ b/panel/0.7/troubleshooting.html @@ -4,7 +4,7 @@ Troubleshooting | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Troubleshooting

      # Reading Error Logs

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

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

      # Parsing the Error

      When you run the command above, you'll probably be hit with a huge wall of text that might scare you. Fear not, @@ -61,7 +62,7 @@ Stack trace:

      The first thing you'll want to do is follow the chain of numbers up until you find #0, this will be the function that triggered the exception. Right above line 0 you will see a line that has the date and time in brackets, [2018-07-19 00:50:24] above for example. This line will be the human readable exception that you can use to understand what went wrong.

      # Understanding the Error

      In the example above we can see that the actual error was:

      local.ERROR: ErrorException: file_put_contents(...): failed to open stream: Permission denied in /srv/www/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122
      -

      From this error we can determine that there was an error performing a file_put_contents() call, and the error was +

      From this error we can determine that there was an error performing a file_put_contents() (opens new window) call, and the error was that we couldn't open the file because permissions were denied. Its okay if you don't understand the error at all, but it does help you get faster support if you're able to provide these logs, and at least find the source of the error. Sometimes the errors are pretty straightforward and will tell you exactly what went wrong, such as a ConnectionException @@ -92,7 +93,7 @@ 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.

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

      - +

      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 7388e258..63a9a681 100644 --- a/panel/0.7/upgrade/0.6_to_0.7.html +++ b/panel/0.7/upgrade/0.6_to_0.7.html @@ -4,7 +4,7 @@ Upgrading 0.6 to 0.7 | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Upgrading 0.6 to 0.7

      This Version is End-of-Life

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

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

      # Fetch Updated Files

      The first step in the update process is to download the new panel files from GitHub. The command below will download the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time @@ -79,7 +80,7 @@ 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 cdbc4fbc..25974cba 100644 --- a/panel/0.7/upgrade/0.7.html +++ b/panel/0.7/upgrade/0.7.html @@ -4,7 +4,7 @@ Upgrading 0.7 Series | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Upgrading 0.7 Series

      This Version is End-of-Life

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

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

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

      WARNING

      If you are using a custom theme please be aware that upgrading will remove those files. You will need to re-upload @@ -69,7 +70,7 @@ 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 8181948f..50450373 100644 --- a/panel/0.7/upgrading.html +++ b/panel/0.7/upgrading.html @@ -4,7 +4,7 @@ Upgrading | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Upgrading

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

      This Version is End-of-Life

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

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

      # Maintenance Mode

      Whenever you are performing an upgrade, you should be sure to place your Panel into "maintenance mode". This will prevent @@ -51,7 +52,7 @@ php artisan down # Bring the Panel back up to receive connections. 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

      - +

      # Version Specific Guides

      + diff --git a/panel/0.7/webserver_configuration.html b/panel/0.7/webserver_configuration.html index 2f4f6acf..34ceb886 100644 --- a/panel/0.7/webserver_configuration.html +++ b/panel/0.7/webserver_configuration.html @@ -4,7 +4,7 @@ Webserver Configuration | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Webserver Configuration

      This Version is End-of-Life

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

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

      DANGER

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

      # NGINX

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

      sudo ln -s /etc/apache2/sites-available/pterodactyl.conf /etc/apache2/sites-enabled/pterodactyl.conf sudo a2enmod rewrite systemctl restart apache2 -
      - +
      + diff --git a/panel/1.0/additional_configuration.html b/panel/1.0/additional_configuration.html index d6955fcd..e713d734 100644 --- a/panel/1.0/additional_configuration.html +++ b/panel/1.0/additional_configuration.html @@ -4,7 +4,7 @@ Additional Configuration | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

      # Additional Configuration

      # Backups

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

      # Using S3 Backups

      AWS S3 (or compatible storage) can be used to store backups. The following configuration options have to be set in the .env file in order to enable it.

      # Sets your panel to use s3 for backups
       APP_BACKUP_DRIVER=s3
       
      @@ -51,9 +52,9 @@
       AWS_SECRET_ACCESS_KEY=
       AWS_BACKUPS_BUCKET=
       AWS_ENDPOINT=
      -

      # reCAPTCHA

      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.

      # Configuring reCAPTCHA

      While we provide a global Site Key and Secret Key by default, we highly recommend changing it for your own setup.

      You can generate your own keys in the reCAPTCHA Admin Console.

      The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the Advanced

      # Disabling reCAPTCHA

      SECURITY WARNING

      We do not recommend disabling reCAPTCHA. It is a security mechanism that makes it harder to perform brute-force attacks on user accounts.

      If users have trouble logging in, or your Panel isn't exposed to the internet, in can make sense to disable reCAPTCHA.

      reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the Advanced tab and set the Status of reCAPTCHA to disabled.

      # Editing your database

      If you cannot access your panel, you can modify the database directly using the following commands.

      mysql -u root -p
      +

      # reCAPTCHA

      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.

      # Configuring reCAPTCHA

      While we provide a global Site Key and Secret Key by default, we highly recommend changing it for your own setup.

      You can generate your own keys in the reCAPTCHA Admin Console (opens new window).

      The keys can then be applied using the Settings in the admin panel. The reCAPTCHA settings can be found on the Advanced

      # Disabling reCAPTCHA

      SECURITY WARNING

      We do not recommend disabling reCAPTCHA. It is a security mechanism that makes it harder to perform brute-force attacks on user accounts.

      If users have trouble logging in, or your Panel isn't exposed to the internet, in can make sense to disable reCAPTCHA.

      reCAPTCHA can easily be disabled using the admin panel. In the Settings, select the Advanced tab and set the Status of reCAPTCHA to disabled.

      # Editing your database

      If you cannot access your panel, you can modify the database directly using the following commands.

      mysql -u root -p
       UPDATE panel.settings SET value = 'false' WHERE `key` = 'settings::recaptcha:enabled';
      -
      - +
      + diff --git a/panel/1.0/getting_started.html b/panel/1.0/getting_started.html index 5f55f7d9..fdbf032d 100644 --- a/panel/1.0/getting_started.html +++ b/panel/1.0/getting_started.html @@ -4,7 +4,7 @@ Getting Started | Pterodactyl - + @@ -14,40 +14,41 @@ - - + + +

      # Getting Started

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

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

      Looking for something simple to setup?

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

      # Picking a Server OS

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

      WARNING

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

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

      # Dependencies

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

      # Example Dependency Installation

      The commands below are simply an example of how you might install these dependencies. Please consult with your +of basic linux system administration you should stop and turn around now.

      Looking for something simple to setup?

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

      # Picking a Server OS

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

      WARNING

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

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

      # Dependencies

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

      # Example Dependency Installation

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

      # Add "add-apt-repository" command
       apt -y install software-properties-common curl apt-transport-https ca-certificates gnupg
       
      @@ -63,7 +64,7 @@ add-apt-repository -y ppa:chris-lea/redis-server
       apt-add-repository universe
       
       # Install Dependencies
      -apt -y install php7.4 php7.4-{cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-server
      +apt -y install php8.0 php8.0-{cli,gd,mysql,pdo,mbstring,tokenizer,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-server
       

      # Installing Composer

      Composer is a dependency manager for PHP that allows us to ship everything you'll need code wise to operate the Panel. You'll need composer installed before continuing in this process.

      curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
       

      # Download Files

      The first step in this process is to create the folder where the panel will live and then move ourselves into that @@ -128,9 +129,9 @@ ExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,stan [Install] WantedBy=multi-user.target

      Redis on CentOS

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

      TIP

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

      If you are 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
      +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

      - +

      # Next Step: Webserver Configuration

      + diff --git a/panel/1.0/legacy_upgrade.html b/panel/1.0/legacy_upgrade.html new file mode 100644 index 00000000..9f10ab4c --- /dev/null +++ b/panel/1.0/legacy_upgrade.html @@ -0,0 +1,98 @@ + + + + + + Legacy Upgrades | Pterodactyl + + + + + + + + + + + + + + + +

      # Legacy Upgrades

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

      # Enter Maintenance Mode

      You'll want to put your Panel into maintenance mode by running the down command below before starting. This +will 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 /var/www/pterodactyl directory when executing the command.

      # Put the Panel into maintenance mode and deny user access
      +php artisan down
      +

      # Update Dependencies

      You'll need to make sure your system dependencies are up to date before performing this upgrade. Please +reference the list below to ensure you have all of the required versions.

      • PHP 7.4 or 8.0 (recommended) with the following extensions: cli, openssl, gd, mysql, PDO, mbstring, +tokenizer, bcmath, xml or dom, curl, zip, and fpm if you are planning to use nginx. See our guide +for Upgrading PHP for details.
      • Composer v2 (composer self-update --2)

      Nginx

      If you upgrade your PHP version and are using nginx as your webserver, you will have to update the +fastcgi_pass value in your nginx's pterodactyl.conf configuration to use the correct php-fpm socket.

      • MySQL 5.7.22 or higher (MySQL 8 recommended) or MariaDB 10.2 or higher.

      Seriously, Double Check your Database Version

      Please make sure you are running the correct version of MariaDB or MySQL listed above! Failure to do so will +result in an error when you attempt to run the migrations.

      Previous documentation (and just the age of this software) likely had you installing MariaDB 10.1 which will not +work with this version of Pterodactyl.

      # Fetch Updated Files

      The first step in the update process is to download the new panel files from GitHub. The command below will download +the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time +to ensure that you're in the /var/www/pterodactyl directory as the command below will automatically unpack the archive +into your current folder.

      We will also be deleting the app/ directory. Because of the way we handle installations and upgrades deleted files +are not always detected properly, so simply uppacking over this location will result in some confusing behavior.

      # Delete the app directory to ensure we start with a clean slate here. This will not affect any
      +# of your settings or servers.
      +curl -L -o panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
      +rm -rf $(find app public resources -depth | head -n -1 | grep -Fv "$(tar -tf panel.tar.gz)")
      +
      +# Download the updated files and delete the archive file.
      +tar -xzvf panel.tar.gz && rm -f panel.tar.gz
      +

      Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid +any webserver related errors.

      chmod -R 755 storage/* bootstrap/cache
      +

      # Update Dependencies

      After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this, +simply run the commands below and follow any prompts.

      composer install --no-dev --optimize-autoloader
      +

      # Clear Compiled Template Cache

      You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for +users.

      php artisan view:clear
      +php artisan config:clear
      +

      # Database Updates

      You'll also need to update your database schema for the newest version of Pterodactyl. Running the two commands below +will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just +remember, never edit core eggs we ship! They will be overwritten by this update process.

      WARNING

      If you used a custom plugin that allowed for server transfers on 0.7 you MUST delete or rename the server_transfers table +before continuing.

      php artisan migrate --force
      +php artisan db:seed --force
      +

      # Set Permissions

      The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this +is www-data but can vary from system to system — sometimes being nginx, apache, or even nobody.

      # If using NGINX or Apache (not on CentOS):
      +chown -R www-data:www-data *
      +
      +# If using NGINX on CentOS:
      +chown -R nginx:nginx *
      +
      +# If using Apache on CentOS
      +chown -R apache:apache *
      +

      # Restarting Queue Workers

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

      php artisan queue:restart
      +

      # Exit Maintenance Mode

      Now that the upgrade is complete, exit maintenance mode and your Panel will now be available.

      # Bring the Panel back up to receive connections.
      +php artisan up
      +

      # Switch to Wings

      We've deprecated the old Node.js daemon in favor of Wings (opens new window), our new server +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/updating.html b/panel/1.0/updating.html new file mode 100644 index 00000000..38b5d08b --- /dev/null +++ b/panel/1.0/updating.html @@ -0,0 +1,93 @@ + + + + + + Updating the Panel | Pterodactyl + + + + + + + + + + + + + + + +

      # Updating the Panel

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

      # Panel Version Requirements

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

      Panel Version Wings Version Supported
      1.0.x 1.0.x
      1.1.x 1.1.x
      1.2.x 1.2.x
      1.3.x 1.3.x

      # Update Dependencies

      Minimum PHP Version Changed

      The latest versions of Pterodactyl Panel — including the 1.3 release — require a minimum version of PHP 7.4 and +Composer v2.

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

      Previous versions of Pterodactyl allowed for you to be running PHP 7.3. However, due to dependency updates and +the fact that 7.3 is now EOL we have bumped the minimum acceptable PHP version to 7.4 — PHP 8 is recommended. You +will also need to be using Composer v2.

      Before continuing, please ensure that your system has been upgraded to at least PHP 7.4 by running php -v. You +should see output similar to the output below. If you do not see at least PHP 7.4 you will need to upgrade by following +our PHP Upgrade Guide and then return to this documentation.

      vagrant@pterodactyl:~/app$ php -v
      +PHP 8.0.1 (cli) (built: Jan 13 2021 08:22:35) ( NTS )
      +Copyright (c) The PHP Group
      +Zend Engine v4.0.1, Copyright (c) Zend Technologies
      +    with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies
      +vagrant@pterodactyl:~/app$ composer --version
      +Composer version 2.0.8 2020-12-03 17:20:38
      +

      # Fetch Updated Files

      # Enter Maintenance Mode

      Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent +users from encountering unexpected errors and ensure everything can be updated before users encounter +potentially new features.

      php artisan down
      +

      # Download the Update

      The first step in the update process is to download the new panel files from GitHub. The command below will download +the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time +to ensure that you're in the /var/www/pterodactyl directory as the command below will automatically unpack the archive +into your current folder.

      curl -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz | tar -xzv
      +

      Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid +any webserver related errors.

      chmod -R 755 storage/* bootstrap/cache
      +

      # Update Dependencies

      After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this, +simply run the commands below and follow any prompts.

      composer install --no-dev --optimize-autoloader
      +

      # Clear Compiled Template Cache

      You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for +users.

      php artisan view:clear
      +php artisan config:clear
      +

      # Database Updates

      You'll also need to update your database schema for the newest version of Pterodactyl. Running the command below +will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just +remember, never edit core eggs we ship! They will be overwritten by this update process.

      php artisan migrate --seed --force
      +

      # Set Permissions

      The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this +is www-data but can vary from system to system — sometimes being nginx, caddy, apache, or even nobody.

      # If using NGINX or Apache (not on CentOS):
      +chown -R www-data:www-data /var/www/pterodactyl/*
      +
      +# If using NGINX on CentOS:
      +chown -R nginx:nginx /var/www/pterodactyl/*
      +
      +# If using Apache on CentOS
      +chown -R apache:apache /var/www/pterodactyl/*
      +

      # Restarting Queue Workers

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

      php artisan queue:restart
      +

      # Exit Maintenance Mode

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

      php artisan up
      +

      # Final Step: Upgrade Wings

      + + + diff --git a/panel/1.0/upgrade/0.7_to_1.0.html b/panel/1.0/upgrade/0.7_to_1.0.html deleted file mode 100644 index 61a26d7d..00000000 --- a/panel/1.0/upgrade/0.7_to_1.0.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - Upgrading 0.7 Series to 1.0 Series | Pterodactyl - - - - - - - - - - - - - - -

      # Upgrading 0.7 Series to 1.0 Series

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

      # Enter Maintenance Mode

      You'll want to put your Panel into maintenance mode by running the down command below before starting. This -will 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 /var/www/pterodactyl directory when executing the command.

      # Put the Panel into maintenance mode and deny user access
      -php artisan down
      -

      # Update Dependencies

      You'll need to make sure your system dependencies are up to date before performing this upgrade. Please -reference the list below to ensure you have all of the required versions.

      • PHP 7.3+ (7.4 recommended) with the following extensions: cli, openssl, gd, mysql, PDO, mbstring, tokenizer, bcmath, xml or dom, curl, zip, and fpm if you are planning to use nginx

      Nginx

      If you upgrade your PHP version and are using nginx as your webserver, you will have to update the -fastcgi_pass value in your nginx's pterodactyl.conf configuration to use the correct php-fpm socket.

      • MySQL 5.7.22 or higher (MySQL 8 recommended) or MariaDB 10.2 or higher.

      Seriously, Double Check your Database Version

      Please make sure you are running the correct version of MariaDB or MySQL listed above! Failure to do so will -result in an error when you attempt to run the migrations.

      Previous documentation (and just the age of this software) likely had you installing MariaDB 10.1 which will not -work with this version of Pterodactyl.

      # Fetch Updated Files

      The first step in the update process is to download the new panel files from GitHub. The command below will download -the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time -to ensure that you're in the /var/www/pterodactyl directory as the command below will automatically unpack the archive -into your current folder.

      We will also be deleting the app/ directory. Because of the way we handle installations and upgrades deleted files -are not always detected properly, so simply uppacking over this location will result in some confusing behavior.

      # Delete the app directory to ensure we start with a clean slate here. This will not affect any
      -# of your settings or servers.
      -curl -L -o panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
      -rm -rf $(find app public resources -depth | head -n -1 | grep -Fv "$(tar -tf panel.tar.gz)")
      -
      -# Download the updated files and delete the archive file.
      -tar -xzvf panel.tar.gz && rm -f panel.tar.gz
      -

      Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid -any webserver related errors.

      chmod -R 755 storage/* bootstrap/cache
      -

      # Update Dependencies

      After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this, -simply run the commands below and follow any prompts.

      composer install --no-dev --optimize-autoloader
      -

      # Clear Compiled Template Cache

      You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for -users.

      php artisan view:clear
      -php artisan config:clear
      -

      # Database Updates

      You'll also need to update your database schema for the newest version of Pterodactyl. Running the two commands below -will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just -remember, never edit core eggs we ship! They will be overwritten by this update process.

      WARNING

      If you used a custom plugin that allowed for server transfers on 0.7 you MUST delete or rename the server_transfers table -before continuing.

      php artisan migrate --force
      -php artisan db:seed --force
      -

      # Set Permissions

      The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this -is www-data but can vary from system to system — sometimes being nginx, apache, or even nobody.

      # If using NGINX or Apache (not on CentOS):
      -chown -R www-data:www-data *
      -
      -# If using NGINX on CentOS:
      -chown -R nginx:nginx *
      -
      -# If using Apache on CentOS
      -chown -R apache:apache *
      -

      # Restarting Queue Workers

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

      php artisan queue:restart
      -

      # Exit Maintenance Mode

      Now that the upgrade is complete, exit maintenance mode and your Panel will now be available.

      # Bring the Panel back up to receive connections.
      -php artisan up
      -

      # Switch to Wings

      We've deprecated the old Node.js daemon in favor of Wings, our new server -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/upgrade/1.0.html b/panel/1.0/upgrade/1.0.html deleted file mode 100644 index 7eb4a88e..00000000 --- a/panel/1.0/upgrade/1.0.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - Upgrading 1.0 Series | Pterodactyl - - - - - - - - - - - - - - -

      # Upgrading 1.0 Series

      This documentation covers the process for upgrading within the 1.X series of releases. This means upgrading from -— for example — 1.0.3 to 1.1.0. Do not use this guide for upgrading from 0.7.

      DANGER

      Seriously, stop and read this warning. Do not use this guide to upgrade from the 0.7 series. You will -break your panel, and you will lose access to your servers.

      # Fetch Updated Files

      The first step in the update process is to download the new panel files from GitHub. The command below will download -the release archive for the most recent version of Pterodactyl and save it in the current directory. Now is a good time -to ensure that you're in the /var/www/pterodactyl directory as the command below will automatically unpack the archive -into your current folder.

      WARNING

      Panel@1.2.0 requires Wings@1.2.0 in order for Wings to run properly!

      curl -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz | tar -xzv
      -

      Once all of the files are downloaded we need to set the correct permissions on the cache and storage directories to avoid -any webserver related errors.

      chmod -R 755 storage/* bootstrap/cache
      -

      # Update Dependencies

      After you've downloaded all of the new files you will need to upgrade the core components of the panel. To do this, -simply run the commands below and follow any prompts.

      composer install --no-dev --optimize-autoloader
      -

      # Clear Compiled Template Cache

      You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for -users.

      php artisan view:clear
      -php artisan config:clear
      -

      # Database Updates

      You'll also need to update your database schema for the newest version of Pterodactyl. Running the command below -will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just -remember, never edit core eggs we ship! They will be overwritten by this update process.

      php artisan migrate --seed --force
      -

      # Set Permissions

      The last step is to set the proper owner of the files to be the user that runs your webserver. In most cases this -is www-data but can vary from system to system — sometimes being nginx, apache, or even nobody.

      # If using NGINX or Apache (not on CentOS):
      -chown -R www-data:www-data *
      -
      -# If using NGINX on CentOS:
      -chown -R nginx:nginx *
      -
      -# If using Apache on CentOS
      -chown -R apache:apache *
      -

      # Restarting Queue Workers

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

      php artisan queue:restart
      -
      - - - diff --git a/panel/1.0/upgrading.html b/panel/1.0/upgrading.html deleted file mode 100644 index 5a13f6f7..00000000 --- a/panel/1.0/upgrading.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - Upgrading | Pterodactyl - - - - - - - - - - - - - - -

      # Upgrading

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

      # Maintenance Mode

      Whenever you are performing an upgrade you should be sure to place your Panel into maintenance mode. This will prevent -users from encountering unexpected errors and ensure everything can be upgraded before users encounter -potentially new features.

      # Put the Panel into maintenance mode and deny user access
      -php artisan down
      -
      -# Bring the Panel back up to receive connections.
      -php artisan up
      -

      # Restarting Queue Workers

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

      php artisan queue:restart
      -

      # Version Specific Guides

      - - - diff --git a/panel/1.0/webserver_configuration.html b/panel/1.0/webserver_configuration.html index 7d18cb75..9eb3a8e9 100644 --- a/panel/1.0/webserver_configuration.html +++ b/panel/1.0/webserver_configuration.html @@ -4,7 +4,7 @@ Webserver Configuration | Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +

      # Webserver Configuration

      DANGER

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

      WARNING

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

      • # Webserver Configuration

        DANGER

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

        WARNING

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

          - +
          + diff --git a/project/about.html b/project/about.html index bf3c416e..423b084e 100644 --- a/project/about.html +++ b/project/about.html @@ -4,7 +4,7 @@ About | Pterodactyl - + @@ -14,36 +14,37 @@ - - + + +

          # About

          # Core Project Team

          Name Discord Name Primary Role
          Dane Everitt Tactical Fish#8008 Project Maintainer
          Stepan Fedotov Trixter#0001 WISP & WHMCS Module Maintainer
          Michael Parker parkervcp#6789 Egg Developer, Docker Integration
          Anand Capur Arcdigital#1337 Mobile/Cloud Project Lead
          Jakob Schrettenbrunner schrej#1337 Developer
          Lance Pioch ShadowLancer#5209 Developer
          Matthew Penner matthewp#0001 Developer

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

          # Community Team

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

          # Sponsors

          The following companies help to fund Pterodactyl's developement. Interested in becoming a sponsor?

          Company About
          WISP Extra features.
          Bloom.host 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.
          MineStrator Looking for a French highend hosting company for you minecraft server? More than 14,000 members on our discord, trust us.
          DedicatedMC 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.
          Skynode 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!
          XCORE XCORE offers High-End Servers for hosting and gaming since 2012. Fast, excellent and well-known for eSports Gaming.
          RoyaleHosting Build your dreams and deploy them with RoyaleHosting’s reliable servers and network. Easy to use, provisioned in a couple of minutes.
          Spill Hosting 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.
          DeinServerHost DeinServerHost offers Dedicated, vps and Gameservers for many popular Games like Minecraft and Rust in Germany since 2013.
          HostBend 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.
          Capitol Hosting Solutions CHS is the budget friendly hosting company for Australian and American gamers, offering a variety of plans from Web Hosting to Game Servers; Custom Solutions too!

          # License

          Copyright (c) 2015 - 2021 Dane Everitt <dane@daneeveritt.com>.
          +  1.3
          +  current

        • # About

          # Core Project Team

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

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

          # Community Team

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

          # Sponsors

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

          Company About
          WISP (opens new window) Extra features.
          Bloom.host (opens new window) 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.
          MineStrator (opens new window) Looking for a French highend hosting company for you minecraft server? More than 14,000 members on our discord, trust us.
          DedicatedMC (opens new window) 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.
          Skynode (opens new window) Skynode provides blazing fast game servers along with a top-notch user experience. Whatever our clients are looking for, we're able to provide it!
          XCORE (opens new window) XCORE offers High-End Servers for hosting and gaming since 2012. Fast, excellent and well-known for eSports Gaming.
          RoyaleHosting (opens new window) Build your dreams and deploy them with RoyaleHosting’s reliable servers and network. Easy to use, provisioned in a couple of minutes.
          Spill Hosting (opens new window) 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.
          DeinServerHost (opens new window) DeinServerHost offers Dedicated, vps and Gameservers for many popular Games like Minecraft and Rust in Germany since 2013.
          HostBend (opens new window) 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.
          Capitol Hosting Solutions (opens new window) CHS is the budget friendly hosting company for Australian and American gamers, offering a variety of plans from Web Hosting to Game Servers; Custom Solutions too!

          # License

          Copyright (c) 2015 - 2021 Dane Everitt <dane@daneeveritt.com>.
           
           Permission is hereby granted, free of charge, to any person obtaining a copy
           of this software and associated documentation files (the "Software"), to deal
          @@ -113,10 +114,10 @@ ODa+GmluC+jU1znpmgxBiTftk/S3L2UZf3ejglaqAdaZMIXu3Vc3bcQ4eMkPRlbb
           gkSI5o2kam0QGYUhqg==
           =rDb0
           -----END PGP PUBLIC KEY BLOCK-----
          -
          - + diff --git a/project/community.html b/project/community.html index fbb7fa14..1921806a 100644 --- a/project/community.html +++ b/project/community.html @@ -4,7 +4,7 @@ Community Standards | Pterodactyl - + @@ -14,34 +14,35 @@ - - + + +

          # Community Standards

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

          In order to keep true to that goal, and continue to foster one of the largest open-source game panel communities @@ -64,10 +65,10 @@ prohibited unless otherwise noted. This also includes reaching out to individual your services without provocation.

          Check your Username

          Advertising commercial services within your username or display name on Discord is forbidden.

          Sponsors at the silver tier and higher are exempt from this rule.

          # No Mention or Ping Spam

          Please, do not direct message any administrative, development, or notable community members without first checking with them. Keep all support queries within the public support channels unless you have been directly asked to move it elsewhere.

          But what if I am trying to respond back to someone? That is fine! We only ask that you not mention people -directly if they're not already involved in a discussion with you.

          - + diff --git a/project/introduction.html b/project/introduction.html index 2ce73bb8..75a3679a 100644 --- a/project/introduction.html +++ b/project/introduction.html @@ -4,7 +4,7 @@ Introduction | Pterodactyl - + @@ -14,44 +14,45 @@ - - + + + -

          # Introduction

          Pterodactyl is the open-source game server management panel built with PHP7, Nodejs, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to administrators and users. What more are you waiting for? Make game servers a first-class citizen on your platform today.

          # Supported Games

          We support a huge variety of games by utilizing Docker containers to isolate each instance, giving you the power to host your games across the world without having to bloat each physical machine with additional dependencies.

          Some of our core supported games include:

          • Minecraft — including Spigot, Sponge, Bungeecord, Waterfall, and more
          • Rust
          • Terraria
          • Teamspeak
          • Mumble
          • Team Fortress 2
          • Counter Strike: Global Offensive
          • Garry's Mod
          • ARK: Survival Evolved

          In addition to our standard nest of supported games, our community is constantly pushing the limits of this software -and there are plenty more games available provided by the community. Some of these games include:

          • Factorio
          • San Andreas: MP
          • Pocketmine MP
          • Squad
          • FiveM
          • Xonotic
          • Discord ATLBot
          • and many more...

          # Responsible Disclosure

          Pterodactyl is completely open-source, and as such completely open to independent users and auditors to browse our +and there are plenty more games available provided by the community. Some of these games include:

          # Responsible Disclosure

          Pterodactyl is completely open-source, and as such completely open to independent users and auditors to browse our code base and hunt for security issues. If you come across anything that raises red flags for you, please do not 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 60c6dacc..2d262f21 100644 --- a/project/terms.html +++ b/project/terms.html @@ -4,7 +4,7 @@ Terminology | Pterodactyl - + @@ -14,42 +14,43 @@ - - + + +

          # Terminology

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

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

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

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

          Container — Each server will be running inside an isolated container to enforce hardware limitations -(such as CPU and RAM) and avoid any interference between servers on one node. These are created by Docker.

          Nest — Each nest is usually used as a specific game or service, for example: Minecraft, Teamspeak or Terraria and can contain many eggs.

          Egg — Each egg is usually used to store the configuration of a specific type of game, for example: Vanilla, Spigot or Bungeecord for Minecraft.

          # Example Setup Diagram

          - + diff --git a/tutorials/creating_ssl_certificates.html b/tutorials/creating_ssl_certificates.html index afc367fe..01f3581b 100644 --- a/tutorials/creating_ssl_certificates.html +++ b/tutorials/creating_ssl_certificates.html @@ -4,7 +4,7 @@ Creating SSL Certificates | Pterodactyl - + @@ -14,37 +14,38 @@ - - + + +

          # Creating SSL Certificates

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

          # Method 1: Using Certbot

          To begin, we will be installing certbot, a simple script that will automatically renew our certificates and allow much + 1.3 + current

        • # Creating SSL Certificates

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

            - + diff --git a/tutorials/mysql_setup.html b/tutorials/mysql_setup.html index 01def153..235b5b00 100644 --- a/tutorials/mysql_setup.html +++ b/tutorials/mysql_setup.html @@ -4,7 +4,7 @@ Setting up MySQL | Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +

          • # Setting up MySQL

            # Creating a database for Pterodactyl

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

            # Logging In

            The first step in this process is to login to the MySQL command line where we will be executing some statements to get things setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when @@ -69,10 +70,10 @@ FLUSH PRIVILEGESPRIVILEGES;

            # Allowing external database access

            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 my.cnf, which varies in location depending on your OS and how MySQL was installed.

            More recent versions of MySQL have moved the default configuration to mysql.conf.d/mysqld.cnf or for MariaDB installations the default configuration should be in 50-server.cnf. However, my.cnf has been changed to update the default configurations so you don't edit your default configuration files (this is now considered bad practice)!

            If you open my.cnf, you'll want to add the lines:

            [mysqld]
             bind-address=0.0.0.0
            -

            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.

            If your Node and Daemon are on the same machine, and you won't be needing external access, you can also use the docker0 interface IP address, rather than 127.0.0.1. This IP address can be found by running ip addr | grep docker0, and it likely looks something like 172.x.x.x.

            - + diff --git a/wings/1.0/configuration.html b/wings/1.0/configuration.html index 7a0e72ce..a992b147 100644 --- a/wings/1.0/configuration.html +++ b/wings/1.0/configuration.html @@ -4,7 +4,7 @@ Additional Configuration | Pterodactyl - + @@ -14,41 +14,42 @@ - - + + +

          • # Additional Configuration

            WARNING

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

            # Private Registries

            These settings can be used to authenticate against (private) docker registries when pulling images.

            # Available Keys

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

            # Usage Example

            docker:
               registries:
                 registry.example.com:
                   username: "registryusername"
                   password: "registrypassword"
            -
            - +
            + diff --git a/wings/1.0/installing.html b/wings/1.0/installing.html index 209630da..a685d11a 100644 --- a/wings/1.0/installing.html +++ b/wings/1.0/installing.html @@ -4,7 +4,7 @@ Installing Wings | Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +

          • # 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 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 @@ -57,7 +58,7 @@ doesn't report Xen or LXC you're probably okay to cont VMware, Inc.

            # Dependencies

            • curl
            • Docker

            # Installing Docker

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

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

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

            Check your Kernel

            Please be aware that some hosts install a modified kernel that does not support important docker features. Please +are listed below for commonly supported systems.

            Check your Kernel

            Please be aware that some hosts install a modified kernel that does not support important docker features. Please check your kernel by running uname -r. If your kernel ends in -xxxx-grs-ipv6-64 or -xxxx-mod-std-ipv6-64 you're probably using a non-supported kernel. Check our Kernel Modifications guide for details.

            # Start Docker on Boot

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

            systemctl enable --now docker
             

            # Enabling Swap

            On most systems, docker will be unable to setup swap space, you can check if this is the case by running docker info. @@ -92,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
            -
            - +
            + diff --git a/wings/1.0/migrating.html b/wings/1.0/migrating.html index c797e908..b8c99d02 100644 --- a/wings/1.0/migrating.html +++ b/wings/1.0/migrating.html @@ -4,7 +4,7 @@ Migrating to Wings | Pterodactyl - + @@ -14,35 +14,36 @@ - - + + +

          • # Migrating to Wings

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

            Panel Version Requirement

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

            You'll have a brief offline period as you perform this process, however no running game processes will be affected. Plus, chances are your Panel will be offline (or in maintenance mode) during this @@ -91,7 +92,7 @@ WantedBy=multi-user.target 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 7f1e8dcd..18736268 100644 --- a/wings/1.0/upgrading.html +++ b/wings/1.0/upgrading.html @@ -4,7 +4,7 @@ Upgrading Wings | Pterodactyl - + @@ -14,39 +14,42 @@ - - + + +

            # Upgrading Wings

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

            # Download Updated Binary

            First, download the updated wings binary into /usr/local/bin.

            WARNING

            Wings@1.2 requires Panel@1.2 in order to run properly.

            curl -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64
            +  1.3
            +  current

          • # Upgrading Wings

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

            # Wings Version Requirements

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

            Panel Version Wings Version Supported
            1.0.x 1.0.x
            1.1.x 1.1.x
            1.2.x 1.2.x
            1.3.x 1.3.x

            # Download Updated Binary

            First, download the updated wings binary into /usr/local/bin.

            curl -L -o /usr/local/bin/wings https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_amd64
             chmod u+x /usr/local/bin/wings
             

            # Restart Process

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

            systemctl restart wings
            -
            - +
            +