From 8995b663116ed91307298d143ab3d1aea15a1f11 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Thu, 2 Oct 2025 10:20:07 -0700 Subject: [PATCH 01/14] adding docs for getting start making a server & admin view & more details (dont merge not done --- README.md | 4 ++++ content/docs/common-tasks/admin-view/admin-view.mdx | 7 +++++++ content/docs/common-tasks/admin-view/overview.mdx | 7 +++++++ content/docs/common-tasks/index.mdx | 6 ++++++ content/docs/common-tasks/user-view/overview.mdx | 8 ++++++++ content/docs/common-tasks/user-view/scedules.mdx | 7 +++++++ pnpm-workspace.yaml | 5 +++++ 7 files changed, 44 insertions(+) create mode 100644 content/docs/common-tasks/admin-view/admin-view.mdx create mode 100644 content/docs/common-tasks/admin-view/overview.mdx create mode 100644 content/docs/common-tasks/index.mdx create mode 100644 content/docs/common-tasks/user-view/overview.mdx create mode 100644 content/docs/common-tasks/user-view/scedules.mdx create mode 100644 pnpm-workspace.yaml diff --git a/README.md b/README.md index a957177..86737a4 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ This is a Next.js application generated with Run development server: +```bash +pnpm install +``` + ```bash pnpm dev ``` diff --git a/content/docs/common-tasks/admin-view/admin-view.mdx b/content/docs/common-tasks/admin-view/admin-view.mdx new file mode 100644 index 0000000..201bdb3 --- /dev/null +++ b/content/docs/common-tasks/admin-view/admin-view.mdx @@ -0,0 +1,7 @@ +--- +title: Creating a server +description: How to create and mannge a server +--- + + +text \ No newline at end of file diff --git a/content/docs/common-tasks/admin-view/overview.mdx b/content/docs/common-tasks/admin-view/overview.mdx new file mode 100644 index 0000000..130ce30 --- /dev/null +++ b/content/docs/common-tasks/admin-view/overview.mdx @@ -0,0 +1,7 @@ +--- +title: Amazing title +description: description +--- + + +text \ No newline at end of file diff --git a/content/docs/common-tasks/index.mdx b/content/docs/common-tasks/index.mdx new file mode 100644 index 0000000..370fe86 --- /dev/null +++ b/content/docs/common-tasks/index.mdx @@ -0,0 +1,6 @@ +--- +title: Common Actions for Pyrodactyl +description: Common things that are handy to know and refer back to when lost +--- + + diff --git a/content/docs/common-tasks/user-view/overview.mdx b/content/docs/common-tasks/user-view/overview.mdx new file mode 100644 index 0000000..5531e01 --- /dev/null +++ b/content/docs/common-tasks/user-view/overview.mdx @@ -0,0 +1,8 @@ +--- +title: Overview - The user +description: An overview of what the user can do and where things are as a logged in user. +--- + + +Overview for the user for pyrodactyl +text \ No newline at end of file diff --git a/content/docs/common-tasks/user-view/scedules.mdx b/content/docs/common-tasks/user-view/scedules.mdx new file mode 100644 index 0000000..eddf537 --- /dev/null +++ b/content/docs/common-tasks/user-view/scedules.mdx @@ -0,0 +1,7 @@ +--- +title: Scedules +description: How scedules work in Pyrodactyl +--- + + +Scedules are programical tasks that you can set to run to do tasks at certian intervals \ No newline at end of file diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..9af3c7d --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +onlyBuiltDependencies: + - '@tailwindcss/oxide' + - esbuild + - sharp + - workerd From 061034d9a1f9826a1cd1e7d2cc66d663a0f8df78 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Thu, 2 Oct 2025 10:40:22 -0700 Subject: [PATCH 02/14] moved the files to post install --- content/docs/common-issues/domain.mdx | 2 +- .../{common-tasks => post-install}/admin-view/admin-view.mdx | 0 .../docs/{common-tasks => post-install}/admin-view/overview.mdx | 0 content/docs/{common-tasks => post-install}/index.mdx | 0 .../docs/{common-tasks => post-install}/user-view/overview.mdx | 0 .../docs/{common-tasks => post-install}/user-view/scedules.mdx | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename content/docs/{common-tasks => post-install}/admin-view/admin-view.mdx (100%) rename content/docs/{common-tasks => post-install}/admin-view/overview.mdx (100%) rename content/docs/{common-tasks => post-install}/index.mdx (100%) rename content/docs/{common-tasks => post-install}/user-view/overview.mdx (100%) rename content/docs/{common-tasks => post-install}/user-view/scedules.mdx (100%) diff --git a/content/docs/common-issues/domain.mdx b/content/docs/common-issues/domain.mdx index 97b5cc2..1abcb7f 100644 --- a/content/docs/common-issues/domain.mdx +++ b/content/docs/common-issues/domain.mdx @@ -14,7 +14,7 @@ Most domain connection failures are caused by missing or misconfigured DNS serve ## Step 1: Check Docker DNS Configuration -On your PyroDactyl host, open the Docker daemon configuration file located at: +On your PyroDactyl host, open the Docker daemon configuration file located at: `/etc/docker/daemon.json` ``` diff --git a/content/docs/common-tasks/admin-view/admin-view.mdx b/content/docs/post-install/admin-view/admin-view.mdx similarity index 100% rename from content/docs/common-tasks/admin-view/admin-view.mdx rename to content/docs/post-install/admin-view/admin-view.mdx diff --git a/content/docs/common-tasks/admin-view/overview.mdx b/content/docs/post-install/admin-view/overview.mdx similarity index 100% rename from content/docs/common-tasks/admin-view/overview.mdx rename to content/docs/post-install/admin-view/overview.mdx diff --git a/content/docs/common-tasks/index.mdx b/content/docs/post-install/index.mdx similarity index 100% rename from content/docs/common-tasks/index.mdx rename to content/docs/post-install/index.mdx diff --git a/content/docs/common-tasks/user-view/overview.mdx b/content/docs/post-install/user-view/overview.mdx similarity index 100% rename from content/docs/common-tasks/user-view/overview.mdx rename to content/docs/post-install/user-view/overview.mdx diff --git a/content/docs/common-tasks/user-view/scedules.mdx b/content/docs/post-install/user-view/scedules.mdx similarity index 100% rename from content/docs/common-tasks/user-view/scedules.mdx rename to content/docs/post-install/user-view/scedules.mdx From f562dc705459a3b8a42e4e4edba74247faaedb73 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 3 Oct 2025 10:48:14 -0700 Subject: [PATCH 03/14] added more cards & docs for everything the pages exist - content in the pages dont yet --- .../docs/post-install/admin-view/overview.mdx | 7 ------- content/docs/post-install/admins/index.mdx | 19 +++++++++++++++++++ .../docs/post-install/admins/locations.mdx | 6 ++++++ content/docs/post-install/admins/nodes.mdx | 6 ++++++ .../admin-view.mdx => admins/servers.mdx} | 3 +-- content/docs/post-install/admins/users.mdx | 6 ++++++ content/docs/post-install/index.mdx | 6 ++++-- .../docs/post-install/user-view/scedules.mdx | 7 ------- .../docs/post-install/users/account/index.mdx | 6 ++++++ .../overview.mdx => users/index.mdx} | 2 -- .../post-install/users/servers/activity.mdx | 6 ++++++ .../post-install/users/servers/databases.mdx | 6 ++++++ .../post-install/users/servers/network.mdx | 6 ++++++ .../post-install/users/servers/scedules.mdx | 6 ++++++ .../post-install/users/servers/settings.mdx | 6 ++++++ .../post-install/users/servers/software.mdx | 6 ++++++ .../post-install/users/servers/subusers.mdx | 5 +++++ 17 files changed, 89 insertions(+), 20 deletions(-) delete mode 100644 content/docs/post-install/admin-view/overview.mdx create mode 100644 content/docs/post-install/admins/index.mdx create mode 100644 content/docs/post-install/admins/locations.mdx create mode 100644 content/docs/post-install/admins/nodes.mdx rename content/docs/post-install/{admin-view/admin-view.mdx => admins/servers.mdx} (69%) create mode 100644 content/docs/post-install/admins/users.mdx delete mode 100644 content/docs/post-install/user-view/scedules.mdx create mode 100644 content/docs/post-install/users/account/index.mdx rename content/docs/post-install/{user-view/overview.mdx => users/index.mdx} (77%) create mode 100644 content/docs/post-install/users/servers/activity.mdx create mode 100644 content/docs/post-install/users/servers/databases.mdx create mode 100644 content/docs/post-install/users/servers/network.mdx create mode 100644 content/docs/post-install/users/servers/scedules.mdx create mode 100644 content/docs/post-install/users/servers/settings.mdx create mode 100644 content/docs/post-install/users/servers/software.mdx create mode 100644 content/docs/post-install/users/servers/subusers.mdx diff --git a/content/docs/post-install/admin-view/overview.mdx b/content/docs/post-install/admin-view/overview.mdx deleted file mode 100644 index 130ce30..0000000 --- a/content/docs/post-install/admin-view/overview.mdx +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Amazing title -description: description ---- - - -text \ No newline at end of file diff --git a/content/docs/post-install/admins/index.mdx b/content/docs/post-install/admins/index.mdx new file mode 100644 index 0000000..02c13f3 --- /dev/null +++ b/content/docs/post-install/admins/index.mdx @@ -0,0 +1,19 @@ +--- +title: Overview - Admin +description: Admin Users Tasks & Abilities +--- + + + + Add user accounts with & without admin permissions + + + Add locations to keep nodes orginzed + + + Add nodes to where servers are located + + + Creating serers & assigning them to a node + + \ No newline at end of file diff --git a/content/docs/post-install/admins/locations.mdx b/content/docs/post-install/admins/locations.mdx new file mode 100644 index 0000000..ccc2021 --- /dev/null +++ b/content/docs/post-install/admins/locations.mdx @@ -0,0 +1,6 @@ +--- +title: Creating Locations +description: Creating & Configuring locations +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/admins/nodes.mdx b/content/docs/post-install/admins/nodes.mdx new file mode 100644 index 0000000..d2bed6a --- /dev/null +++ b/content/docs/post-install/admins/nodes.mdx @@ -0,0 +1,6 @@ +--- +title: Creating Node +description: creating and configuring nodes +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/admin-view/admin-view.mdx b/content/docs/post-install/admins/servers.mdx similarity index 69% rename from content/docs/post-install/admin-view/admin-view.mdx rename to content/docs/post-install/admins/servers.mdx index 201bdb3..6c4b4cc 100644 --- a/content/docs/post-install/admin-view/admin-view.mdx +++ b/content/docs/post-install/admins/servers.mdx @@ -1,7 +1,6 @@ --- -title: Creating a server +title: Creating Servers description: How to create and mannge a server --- - text \ No newline at end of file diff --git a/content/docs/post-install/admins/users.mdx b/content/docs/post-install/admins/users.mdx new file mode 100644 index 0000000..d8a4b8b --- /dev/null +++ b/content/docs/post-install/admins/users.mdx @@ -0,0 +1,6 @@ +--- +title: Adding Users +description: Making a user account for your panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/index.mdx b/content/docs/post-install/index.mdx index 370fe86..8fd8b1e 100644 --- a/content/docs/post-install/index.mdx +++ b/content/docs/post-install/index.mdx @@ -1,6 +1,8 @@ --- -title: Common Actions for Pyrodactyl -description: Common things that are handy to know and refer back to when lost +title: Post Installation +description: Post-installation configuration and setup guides. --- +# Post Installation +This section covers post-installation tasks and configuration. \ No newline at end of file diff --git a/content/docs/post-install/user-view/scedules.mdx b/content/docs/post-install/user-view/scedules.mdx deleted file mode 100644 index eddf537..0000000 --- a/content/docs/post-install/user-view/scedules.mdx +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Scedules -description: How scedules work in Pyrodactyl ---- - - -Scedules are programical tasks that you can set to run to do tasks at certian intervals \ No newline at end of file diff --git a/content/docs/post-install/users/account/index.mdx b/content/docs/post-install/users/account/index.mdx new file mode 100644 index 0000000..2f29285 --- /dev/null +++ b/content/docs/post-install/users/account/index.mdx @@ -0,0 +1,6 @@ +--- +title: User accounts +description: Account pages, setting up MFA & SSH keys +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/user-view/overview.mdx b/content/docs/post-install/users/index.mdx similarity index 77% rename from content/docs/post-install/user-view/overview.mdx rename to content/docs/post-install/users/index.mdx index 5531e01..68d3b66 100644 --- a/content/docs/post-install/user-view/overview.mdx +++ b/content/docs/post-install/users/index.mdx @@ -3,6 +3,4 @@ title: Overview - The user description: An overview of what the user can do and where things are as a logged in user. --- - -Overview for the user for pyrodactyl text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/activity.mdx b/content/docs/post-install/users/servers/activity.mdx new file mode 100644 index 0000000..1c6756e --- /dev/null +++ b/content/docs/post-install/users/servers/activity.mdx @@ -0,0 +1,6 @@ +--- +title: Activity in the server +description: Everything you need to know about the Activity section in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/databases.mdx b/content/docs/post-install/users/servers/databases.mdx new file mode 100644 index 0000000..f58f591 --- /dev/null +++ b/content/docs/post-install/users/servers/databases.mdx @@ -0,0 +1,6 @@ +--- +title: Server Databases +description: Everything you need to know about Database section in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/network.mdx b/content/docs/post-install/users/servers/network.mdx new file mode 100644 index 0000000..46901bd --- /dev/null +++ b/content/docs/post-install/users/servers/network.mdx @@ -0,0 +1,6 @@ +--- +title: Server Network +description: Everything you need to know about the Network section in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/scedules.mdx b/content/docs/post-install/users/servers/scedules.mdx new file mode 100644 index 0000000..0822d18 --- /dev/null +++ b/content/docs/post-install/users/servers/scedules.mdx @@ -0,0 +1,6 @@ +--- +title: Scedules +description: Everything you need to know about the Scedules section in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/settings.mdx b/content/docs/post-install/users/servers/settings.mdx new file mode 100644 index 0000000..f1a6bb1 --- /dev/null +++ b/content/docs/post-install/users/servers/settings.mdx @@ -0,0 +1,6 @@ +--- +title: Server Settings +description: Everything you need to know about the Settings section in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/software.mdx b/content/docs/post-install/users/servers/software.mdx new file mode 100644 index 0000000..ef37593 --- /dev/null +++ b/content/docs/post-install/users/servers/software.mdx @@ -0,0 +1,6 @@ +--- +title: Server Software +description: Everything you need to know about the Activity Software in the panel +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/users/servers/subusers.mdx b/content/docs/post-install/users/servers/subusers.mdx new file mode 100644 index 0000000..446856d --- /dev/null +++ b/content/docs/post-install/users/servers/subusers.mdx @@ -0,0 +1,5 @@ +--- +title: Sub-users +description: Everything you need to know about the Sub-users section in the panel +--- + From 5dfce6736ef8fb1b30a63cb4c30a9875abe5c4f7 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 3 Oct 2025 11:02:41 -0700 Subject: [PATCH 04/14] addded allocations & favco (needs to be swpaed for pyrodacyl, i dont have that svg) --- content/docs/post-install/admins/allocations.mdx | 6 ++++++ content/docs/post-install/admins/index.mdx | 3 +++ public/favico.svg | 5 +++++ 3 files changed, 14 insertions(+) create mode 100644 content/docs/post-install/admins/allocations.mdx create mode 100644 public/favico.svg diff --git a/content/docs/post-install/admins/allocations.mdx b/content/docs/post-install/admins/allocations.mdx new file mode 100644 index 0000000..0a57565 --- /dev/null +++ b/content/docs/post-install/admins/allocations.mdx @@ -0,0 +1,6 @@ +--- +title: allocations +description: Allocations & ports +--- + +text \ No newline at end of file diff --git a/content/docs/post-install/admins/index.mdx b/content/docs/post-install/admins/index.mdx index 02c13f3..b7f808b 100644 --- a/content/docs/post-install/admins/index.mdx +++ b/content/docs/post-install/admins/index.mdx @@ -16,4 +16,7 @@ description: Admin Users Tasks & Abilities Creating serers & assigning them to a node + + Creating ports & allocating them to servers + \ No newline at end of file diff --git a/public/favico.svg b/public/favico.svg new file mode 100644 index 0000000..d3d1d7e --- /dev/null +++ b/public/favico.svg @@ -0,0 +1,5 @@ + + + + + From 9edc4e5ae2559a9f210c2bb1988d7472797a5658 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 3 Oct 2025 11:13:43 -0700 Subject: [PATCH 05/14] added correct* favicon --- public/{favico.svg => favicon.svg} | 0 src/app/layout.tsx | 7 +++++++ 2 files changed, 7 insertions(+) rename public/{favico.svg => favicon.svg} (100%) diff --git a/public/favico.svg b/public/favicon.svg similarity index 100% rename from public/favico.svg rename to public/favicon.svg diff --git a/src/app/layout.tsx b/src/app/layout.tsx index ecf7969..2736f56 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,11 +3,18 @@ import { RootProvider } from 'fumadocs-ui/provider'; import SearchDialog from '@/components/search'; import { Inter } from 'next/font/google'; import type { ReactNode } from 'react'; +import type { Metadata } from 'next'; const inter = Inter({ subsets: ['latin'], }); +export const metadata: Metadata = { + icons: { + icon: '/favicon.svg', + }, +}; + export default function Layout({ children }: { children: ReactNode }) { return ( From 1e77264dacf8335028b674865883e65387e16913 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 3 Oct 2025 11:18:14 -0700 Subject: [PATCH 06/14] removed random 45sec text below the speed test (there no image with this text) --- public/favicon.svg | 6 +++--- src/app/(home)/page.tsx | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/favicon.svg b/public/favicon.svg index d3d1d7e..2ee0f34 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 2782fff..da6da97 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -128,7 +128,6 @@ const Page = () => {
-
45 sec

Build times comparison

{buildTimes.map((item) => (
From 64bb5cdf5b84c63cb7e65c3f5e0d6652b1f44baf Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 3 Oct 2025 11:21:28 -0700 Subject: [PATCH 07/14] favicon ripped form the panel itself --- public/favicon.ico | Bin 0 -> 15086 bytes public/favicon.svg | 5 ----- 2 files changed, 5 deletions(-) create mode 100644 public/favicon.ico delete mode 100644 public/favicon.svg diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..946b0a0eac9365fbec968eea0c5731160d18e654 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index 2ee0f34..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From fddc6f864ad8b48d6e7217811efa4536a6684c65 Mon Sep 17 00:00:00 2001 From: Skylar <118846397+NobleSkye@users.noreply.github.com> Date: Sun, 5 Oct 2025 20:58:58 -0700 Subject: [PATCH 08/14] mroe info (nodes stil wip) --- README.md | 4 +- content/docs/elytra/configuration.mdx | 6 + content/docs/elytra/index.mdx | 17 ++ content/docs/elytra/installation.mdx | 6 + .../docs/post-install/admins/locations.mdx | 79 +++++++++- content/docs/post-install/admins/nodes.mdx | 145 +++++++++++++++++- public/favicon.svg | 3 + public/img/locations-about.png | Bin 0 -> 45751 bytes public/img/locations-creation.png | Bin 0 -> 32659 bytes public/img/locations-home.png | Bin 0 -> 24540 bytes 10 files changed, 255 insertions(+), 5 deletions(-) create mode 100644 content/docs/elytra/configuration.mdx create mode 100644 content/docs/elytra/index.mdx create mode 100644 content/docs/elytra/installation.mdx create mode 100644 public/favicon.svg create mode 100644 public/img/locations-about.png create mode 100644 public/img/locations-creation.png create mode 100644 public/img/locations-home.png diff --git a/README.md b/README.md index 86737a4..6a20e91 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ This is a Next.js application generated with [Create Fumadocs](https://github.com/fuma-nama/fumadocs). -Run development server: - +Install dependencies: ```bash pnpm install ``` +Run development server: ```bash pnpm dev ``` diff --git a/content/docs/elytra/configuration.mdx b/content/docs/elytra/configuration.mdx new file mode 100644 index 0000000..7225ba8 --- /dev/null +++ b/content/docs/elytra/configuration.mdx @@ -0,0 +1,6 @@ +--- +title: Configuration +description: description +--- + +**some profound text about configuring elytra here** \ No newline at end of file diff --git a/content/docs/elytra/index.mdx b/content/docs/elytra/index.mdx new file mode 100644 index 0000000..9d62209 --- /dev/null +++ b/content/docs/elytra/index.mdx @@ -0,0 +1,17 @@ +--- +title: Elytra +description: Next-generation daemon for the Pyrodactyl ecosystem +--- + + + + Next-generation daemon for the Pyrodactyl ecosystem + + + Configuring Elytra + + \ No newline at end of file diff --git a/content/docs/elytra/installation.mdx b/content/docs/elytra/installation.mdx new file mode 100644 index 0000000..04f9a99 --- /dev/null +++ b/content/docs/elytra/installation.mdx @@ -0,0 +1,6 @@ +--- +title: Installation +description: description +--- + +**some profound text about installing elytra here** \ No newline at end of file diff --git a/content/docs/post-install/admins/locations.mdx b/content/docs/post-install/admins/locations.mdx index ccc2021..7923eb5 100644 --- a/content/docs/post-install/admins/locations.mdx +++ b/content/docs/post-install/admins/locations.mdx @@ -3,4 +3,81 @@ title: Creating Locations description: Creating & Configuring locations --- -text \ No newline at end of file +## What Is a Location? + +In Pyrodactyl a Location is a high–level grouping used to classify Nodes by geography, datacenter, or provider. It is purely organizational and does not itself run any workloads. + +## Location vs Node + +- Location: Logical label (no hardware, no allocations). +- Node: Actual machine configuration (daemon, allocations, resource limits) that is assigned to exactly one Location. + +## Creating a Location + +1. Go to Admin Area > Locations. +2. Click Create Location. +3. Provide: + - Short Code: Concise identifier (e.g. us-nyc-1). + - Description (optional but recommended). +4. Save. + +Short Codes should be: +- Lowercase +- Hyphen separated +- Stable (avoid later renames if referenced externally) + +Examples: us-east, us-east-2, eu-fra, ap-sgp, edge-la, aws-usw-1, us.chicago.pyro + +## Assigning Nodes + +When adding or editing a Node select the desired Location. Reassigning a Node later does not affect servers functionally; it only updates grouping. + +## Editing & Renaming + +- You may edit description anytime. +- Renaming the short code is safe internally but may break external automation that relies on the old code—audit before changing. + +## Deleting a Location + +- You must first move or remove all Nodes under it. +- Deletion leaves servers intact (they live under their Nodes) but you cannot delete if any Node still references the Location. + +## Best Practices + +- Keep list small and meaningful (regions/providers, not every rack). +- Use consistent pattern (region-city-number or provider-region). +- Avoid embedding transient info (like temporary offers or hardware specs). +- Document naming scheme for staff. + +## Common Mistakes + +| Mistake | Impact | Fix | +|---------|--------|-----| +| Too many granular Locations | Cluttered UI | Merge into broader regions | +| Using Location to reflect hardware tier | Confusion | Use Node naming / descriptions instead | +| Renaming without notice | Automation breakage | Maintain a mapping or avoid rename | + +## API Notes + +Locations are retrievable and manageable via the administrative API. Create Locations first, then post Nodes referencing the Location ID or short code (depending on endpoint requirements). + +## When to Add Another Location + +Add a new Location only if: +- New geographic region introduced +- New provider with distinct compliance / cost profile +- You need a clear segregation boundary for reporting + +If it is just a new machine in an existing region/provider, add another Node—not a Location. + +## Quick Checklist + +- Does it represent a distinct region or provider? (Yes -> Location) +- Will staff readily understand the code? (Yes -> Good) +- Will it stay relevant for 6+ months? (Yes -> Proceed). + +![Location Homepage](/img/locations-home.png) +![Location Creation Fourm](/img/locations-creation.png) +![Location About Page](/img/locations-about.png) + +After all of that you are done! Your location is made and now you can see it in the main locations page. \ No newline at end of file diff --git a/content/docs/post-install/admins/nodes.mdx b/content/docs/post-install/admins/nodes.mdx index d2bed6a..bcd7176 100644 --- a/content/docs/post-install/admins/nodes.mdx +++ b/content/docs/post-install/admins/nodes.mdx @@ -1,6 +1,147 @@ --- title: Creating Node -description: creating and configuring nodes +description: Creating and configuring nodes --- -text \ No newline at end of file +What is a Node? +- A Node repercents physical hardware running Pyrodactyl Elytra (or ptrodactyl wings) Daemon that hosts servers in containers. Nodes defeine resource pools for CPU, Memory, Disk Space, IPs and ports + + +Node vs Location vs Server +- Location: Grouping label (region/provider). +- Node: Machine + daemon + resource/allocation pool; belongs to one Location. +- Server: User container consuming a slice of a Node’s resources and allocations. +- Don’t create a Node just to group servers—use naming/filters. (if you must you can use locations for that eg bedwars.provider) + +When to Create a Node +- When you have a new hardware (VPS or Dedicated) that you want to use to host more servers. +- You split one dedicated server into many Virual ones (via proxmox or other hypervisor) + +Prerequisites +- Domain name (optional but required for SSL/TLS) +- Daemon reachable (firewall open). +- FQDN or IP ready (SSL/reverse proxy decided). +- SFTP/Docker dependencies installed as needed. + +## Terminology +- Servers: The game server you are wanting to run IE Minecraft, TF2 +- VPS/Dedicated: The hardware that is being used to host the game servers +- Nodes: Internal name to describe/speficy what hardware you are using +- Location: The location made in the panel to seperate where the nodes are physically hosted + + +Creating a Node +1. Admin Area > Nodes > Create Node. +2. Fill fields, Save. +3. Add at least one IP/Port allocation. +4. Assign or create servers for this Node. + +Core Fields +- General: Name, Description, Location. +- Connectivity: FQDN/IP, Public Port (daemon, e.g., 8080), SFTP Port (e.g., 2022); open firewall. +- Resource Limits (totals for the Node): Total Memory/Disk/CPU; Over-Allocate % for memory/disk/CPU. +- Allocation/Ports: Default IP, additional IPs, add port ranges, remove unused ports. +- Daemon Config: Base Path (e.g., /var/lib/pyrodactyl/servers), Behind Proxy, Maintenance Mode, Backup dir/limits. +- Security/Limits: Upload size, allowed archive extensions, default Docker images list, reject stale daemon versions. +- Advanced: Task timeout/graceful stop, container network mode, disk check strategy. + +## Editing a Node + +- Safe: Description, over-allocation, add IPs/ports, Docker image list, upload limits, Maintenance toggle. +- Caution: FQDN/IP, Public/SFTP ports (needs DNS/firewall/service restart), Base Path (requires data migration). + +## Renaming + +- No runtime impact; may break external automation—audit scripts first. + +## Resource Strategy + +- Memory/Disk: Reflect usable capacity minus OS; use modest over-allocation. +- CPU: Sum server CPU limits should respect Total CPU plus over-allocate margin. Over-allocate lightly for bursty workloads (25–50%); avoid for consistently high usage. + +## Allocation Management + +- Workflow: Add IPs -> add port ranges -> servers consume ports -> remove unused. +- Best practices: Keep 10–15% port buffer; group port ranges by game type; add aliases for multi-provider/NAT. + +## Deleting a Node + +- Move or delete all servers first, then clear allocations, then delete. No auto-migration. + +## Migration (High-Level) + +- Create new Node -> ensure parity -> stop server -> transfer files (rsync/backup) -> recreate on new Node -> validate -> clean old allocations. + +## Monitoring & Health + +- Watch daemon heartbeat, free allocations, over-allocation pressure (>90% phys), disk inodes, Docker image updates. + +## Common Mistakes (and fixes) +- Total Memory set to full RAM -> OOM risk -> reserve 5–15% for OS. +- Excessive over-allocation (e.g., 200%) -> performance issues -> lower ratio. +- Missing firewall rules for daemon/SFTP -> offline/errors -> open/persist rules. +- Mixing prod/test on same Node -> contention -> separate or limit. +- Deleting IP before clearing allocations -> stale errors -> remove allocations first. +- Skipping Maintenance before major changes -> disruptions -> enable Maintenance. +- Changing Base Path carelessly -> broken paths -> plan migration/symlinks. + +## Best Practices + +- Consistent naming (e.g., node-us-nyc-1); put hardware class in description. +- Maintain capacity sheet (total vs allocated). +- Prune unused ports; curate minimal Docker images. +- Use Maintenance Mode for daemon/kernel upgrades. + +## API Notes +- Admin API: create/list Nodes, manage allocations, update limits, toggle maintenance. +- Typical flow: POST Location -> POST Node -> POST allocations -> POST servers (Node ID). Validate daemon connection. + +When to Add Another Node +- New machine, sustained capacity >80% memory, isolation needs, different performance tiers. +- Don’t add for just a new server or a different Docker image. + +Quick Checklist +- Daemon reachable; DNS/SSL/proxy correct; firewall open (daemon/SFTP). +- Resource totals set minus OS; intentional over-allocation. +- IPs and adequate port pool added. +- Docker images curated; monitoring/logs; backup strategy in place. + +## Quick Checklist + +- Daemon reachable; DNS/SSL/proxy correct; firewall open (daemon/SFTP). +- Resource totals set minus OS; intentional over-allocation. +- IPs and adequate port pool added. +- Docker images curated; monitoring/logs; backup strategy in place. + +## Capacity Review Tips + +- Memory: alert 75%, plan 85%. +- Disk: alert 70%, plan 80%, emergency 90%. +- Ports: alert when <10% free. +- CPU: check sustained 15m load vs cores. + +## Troubleshooting +- Node offline: check daemon service, TLS/proxy, connectivity (nc/curl). +- Can’t allocate ports: pool exhausted, IP missing, port in use/firewalled. +- Start fails (insufficient resources): over-allocation exceeded -> adjust or migrate. + +## Glossary + +- Allocation: Reserved IP:Port. +- Over-Allocate: Oversubscribe beyond physical. +- Daemon: Background container manager. +- Maintenance Mode: Block new actions; running servers continue. + +## Example Naming + +- node-us-east-1, node-eu-fra-2, node-ap-sgp-1, node-edge-la-1, node-aws-usw-1, us.chicago.pyro. + +## Scaling + +- Vertical: increase Node resources (after hardware upgrade). +- Horizontal: add another Node in same Location. +- Geographic: new Location + Node. + +## Visual References + +Nodes homepage, Create Node form, Node detail overview. \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..e87822a --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/public/img/locations-about.png b/public/img/locations-about.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb1478159a2db5581ff92d2802acc47d7101f9f GIT binary patch literal 45751 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

YkS%S2yeemg}$dYjXBc()$Czz2lX4 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 U7Q=5Y2>2!OTt+1Gsg~P+0ns7=V*mgE literal 0 HcmV?d00001 diff --git a/public/img/locations-home.png b/public/img/locations-home.png new file mode 100644 index 0000000000000000000000000000000000000000..feb55db4782dc9d72ceb77fdac67f418bded321e GIT binary patch literal 24540 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 Date: Wed, 8 Oct 2025 18:16:28 -0700 Subject: [PATCH 09/14] added the bottom page "## Additional Resources" to all pages --- .../docs/installation/fresh-installation.mdx | 9 +- .../docs/post-install/admins/allocations.mdx | 9 +- content/docs/post-install/admins/index.mdx | 9 +- .../docs/post-install/admins/locations.mdx | 13 +- content/docs/post-install/admins/nodes.mdx | 173 +++++++++++------- content/docs/post-install/admins/servers.mdx | 9 +- content/docs/post-install/admins/users.mdx | 9 +- content/docs/post-install/index.mdx | 9 +- .../docs/post-install/users/account/index.mdx | 9 +- content/docs/post-install/users/index.mdx | 9 +- .../post-install/users/servers/activity.mdx | 9 +- .../post-install/users/servers/databases.mdx | 9 +- .../post-install/users/servers/network.mdx | 9 +- .../post-install/users/servers/scedules.mdx | 9 +- .../post-install/users/servers/settings.mdx | 9 +- .../post-install/users/servers/software.mdx | 9 +- .../post-install/users/servers/subusers.mdx | 6 + 17 files changed, 234 insertions(+), 84 deletions(-) diff --git a/content/docs/installation/fresh-installation.mdx b/content/docs/installation/fresh-installation.mdx index 67d7ea5..44b01d4 100644 --- a/content/docs/installation/fresh-installation.mdx +++ b/content/docs/installation/fresh-installation.mdx @@ -6,7 +6,7 @@ description: A comprehensive guide for setting up Pyrodactyl using Docker This comprehensive guide walks you through setting up Pyrodactyl using Docker, from scratch to a fully functional system. - The guide for migration has moved to a [new page](/docs/migrations). + The migration guide has moved to a [new dedicated page](/docs/migrations). @@ -101,6 +101,13 @@ In addition to the Pyrodactyl panel, you'll need Pterodactyl Wings as a backend ## Post-Installation Steps + + Enabling swap for Docker is optional but recommended if you're hosting for others or want to prevent Out of Memory (OOM) errors. + First, check if swap is needed by running docker info and looking for the warning "WARNING: No swap limit support." If you need to enable swap, open `/etc/default/grub` as root, find the line starting with `GRUB_CMDLINE_LINUX_DEFAULT`, + and ensure it includes swapaccount=1 (note: this line may have other OS-specific parameters, should look something like `GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1 net.ifnames=0"`). After making changes, run `sudo update-grub` with a swift `sudo reboot` after. + + + ### Email Configuration For user password reset emails, etc, you'll need an SMTP server. For this, you can use: diff --git a/content/docs/post-install/admins/allocations.mdx b/content/docs/post-install/admins/allocations.mdx index 0a57565..7d3b3ec 100644 --- a/content/docs/post-install/admins/allocations.mdx +++ b/content/docs/post-install/admins/allocations.mdx @@ -3,4 +3,11 @@ title: allocations description: Allocations & ports --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/admins/index.mdx b/content/docs/post-install/admins/index.mdx index b7f808b..49b56df 100644 --- a/content/docs/post-install/admins/index.mdx +++ b/content/docs/post-install/admins/index.mdx @@ -19,4 +19,11 @@ description: Admin Users Tasks & Abilities Creating ports & allocating them to servers - \ No newline at end of file + + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/admins/locations.mdx b/content/docs/post-install/admins/locations.mdx index 7923eb5..50c1106 100644 --- a/content/docs/post-install/admins/locations.mdx +++ b/content/docs/post-install/admins/locations.mdx @@ -35,7 +35,7 @@ When adding or editing a Node select the desired Location. Reassigning a Node la ## Editing & Renaming - You may edit description anytime. -- Renaming the short code is safe internally but may break external automation that relies on the old code—audit before changing. +- Renaming the short code is safe internally but may break external automation that relies on the old code--audit before changing. ## Deleting a Location @@ -68,7 +68,7 @@ Add a new Location only if: - New provider with distinct compliance / cost profile - You need a clear segregation boundary for reporting -If it is just a new machine in an existing region/provider, add another Node—not a Location. +If it is just a new machine in an existing region/provider, add another Node--not a Location. ## Quick Checklist @@ -80,4 +80,11 @@ If it is just a new machine in an existing region/provider, add another Node—n ![Location Creation Fourm](/img/locations-creation.png) ![Location About Page](/img/locations-about.png) -After all of that you are done! Your location is made and now you can see it in the main locations page. \ No newline at end of file +After all of that you are done! Your location is made and now you can see it in the main locations page. + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/admins/nodes.mdx b/content/docs/post-install/admins/nodes.mdx index bcd7176..3f2da3b 100644 --- a/content/docs/post-install/admins/nodes.mdx +++ b/content/docs/post-install/admins/nodes.mdx @@ -1,147 +1,186 @@ --- -title: Creating Node +title: Creating Nodes description: Creating and configuring nodes --- -What is a Node? -- A Node repercents physical hardware running Pyrodactyl Elytra (or ptrodactyl wings) Daemon that hosts servers in containers. Nodes defeine resource pools for CPU, Memory, Disk Space, IPs and ports +Don’t create a Node just to group servers--use naming/filters. If you must, +use Locations for grouping (e.g., bedwars.provider). +## When to Create a Node -Node vs Location vs Server -- Location: Grouping label (region/provider). +- When you have new hardware (VPS or Dedicated) to host more servers. +- When you split one dedicated server into multiple virtual machines + (e.g., Proxmox or another hypervisor). + +## What is a Node? + +- A Node represents physical hardware running the Pyrodactyl Elytra + (or Pterodactyl Wings) daemon that hosts servers in containers. +- Nodes define resource pools for CPU, Memory, Disk Space, IPs, and ports. + +## Node vs Location vs Server + +- Location: A grouping label (region/provider). - Node: Machine + daemon + resource/allocation pool; belongs to one Location. -- Server: User container consuming a slice of a Node’s resources and allocations. -- Don’t create a Node just to group servers—use naming/filters. (if you must you can use locations for that eg bedwars.provider) +- Server: A user container consuming a slice of a Node’s resources and allocations. -When to Create a Node -- When you have a new hardware (VPS or Dedicated) that you want to use to host more servers. -- You split one dedicated server into many Virual ones (via proxmox or other hypervisor) +Tip: Don’t create a Node just to group servers--use naming/filters. If needed, +use Locations for that. -Prerequisites -- Domain name (optional but required for SSL/TLS) +## Prerequisites + +- Domain name (optional, but required for SSL/TLS). - Daemon reachable (firewall open). -- FQDN or IP ready (SSL/reverse proxy decided). +- FQDN or IP ready (decide on SSL/reverse proxy). - SFTP/Docker dependencies installed as needed. ## Terminology -- Servers: The game server you are wanting to run IE Minecraft, TF2 -- VPS/Dedicated: The hardware that is being used to host the game servers -- Nodes: Internal name to describe/speficy what hardware you are using -- Location: The location made in the panel to seperate where the nodes are physically hosted +- Servers: The game servers you want to run (e.g., Minecraft, TF2). +- VPS/Dedicated: The hardware hosting the game servers. +- Nodes: Internal name to specify which hardware is used. +- Location: The panel label to separate where nodes are physically hosted. + +## Creating a Node -Creating a Node 1. Admin Area > Nodes > Create Node. -2. Fill fields, Save. +2. Fill out the fields and save. 3. Add at least one IP/Port allocation. 4. Assign or create servers for this Node. -Core Fields +## Core Fields + - General: Name, Description, Location. -- Connectivity: FQDN/IP, Public Port (daemon, e.g., 8080), SFTP Port (e.g., 2022); open firewall. -- Resource Limits (totals for the Node): Total Memory/Disk/CPU; Over-Allocate % for memory/disk/CPU. +- Connectivity: FQDN/IP, Public Port (daemon, e.g., 8080), SFTP Port (e.g., 2022); + open firewall rules. +- Resource Limits (totals for the Node): Total Memory, Disk, CPU; Over-Allocate % + for memory/disk/CPU. - Allocation/Ports: Default IP, additional IPs, add port ranges, remove unused ports. -- Daemon Config: Base Path (e.g., /var/lib/pyrodactyl/servers), Behind Proxy, Maintenance Mode, Backup dir/limits. -- Security/Limits: Upload size, allowed archive extensions, default Docker images list, reject stale daemon versions. +- Daemon Config: Base Path (e.g., /var/lib/pyrodactyl/servers), Behind Proxy, + Maintenance Mode, Backup directory/limits. +- Security/Limits: Upload size, allowed archive extensions, default Docker images list, + reject stale daemon versions. - Advanced: Task timeout/graceful stop, container network mode, disk check strategy. ## Editing a Node -- Safe: Description, over-allocation, add IPs/ports, Docker image list, upload limits, Maintenance toggle. -- Caution: FQDN/IP, Public/SFTP ports (needs DNS/firewall/service restart), Base Path (requires data migration). +- Safe changes: Description, over-allocation values, add IPs/ports, Docker image list, + upload limits, Maintenance toggle. +- Use caution: FQDN/IP, Public/SFTP ports (requires DNS/firewall updates and service restart), + Base Path (requires data migration). ## Renaming -- No runtime impact; may break external automation—audit scripts first. +- No runtime impact; may break external automation. Audit scripts first. ## Resource Strategy - Memory/Disk: Reflect usable capacity minus OS; use modest over-allocation. -- CPU: Sum server CPU limits should respect Total CPU plus over-allocate margin. Over-allocate lightly for bursty workloads (25–50%); avoid for consistently high usage. +- CPU: Sum of server CPU limits should respect Total CPU plus over-allocate margin. + Over-allocate lightly for bursty workloads (25–50%); avoid for consistently high usage. ## Allocation Management -- Workflow: Add IPs -> add port ranges -> servers consume ports -> remove unused. -- Best practices: Keep 10–15% port buffer; group port ranges by game type; add aliases for multi-provider/NAT. +- Workflow: Add IPs → add port ranges → servers consume ports → remove unused. +- Best practices: + - Keep a 10–15% port buffer. + - Group port ranges by game type. + - Add aliases for multi-provider/NAT setups. ## Deleting a Node -- Move or delete all servers first, then clear allocations, then delete. No auto-migration. +- Move or delete all servers first, then clear allocations, then delete the Node. + There is no automatic migration. ## Migration (High-Level) -- Create new Node -> ensure parity -> stop server -> transfer files (rsync/backup) -> recreate on new Node -> validate -> clean old allocations. +1. Create the new Node and ensure parity (images, versions, ports). +2. Stop the server. +3. Transfer files (rsync/backup/restore). +4. Recreate on the new Node. +5. Validate. +6. Clean old allocations. ## Monitoring & Health -- Watch daemon heartbeat, free allocations, over-allocation pressure (>90% phys), disk inodes, Docker image updates. +- Watch daemon heartbeat. +- Track free allocations and over-allocation pressure (avoid >90% of physical). +- Monitor disk usage and inodes. +- Keep Docker images updated. ## Common Mistakes (and fixes) -- Total Memory set to full RAM -> OOM risk -> reserve 5–15% for OS. -- Excessive over-allocation (e.g., 200%) -> performance issues -> lower ratio. -- Missing firewall rules for daemon/SFTP -> offline/errors -> open/persist rules. -- Mixing prod/test on same Node -> contention -> separate or limit. -- Deleting IP before clearing allocations -> stale errors -> remove allocations first. -- Skipping Maintenance before major changes -> disruptions -> enable Maintenance. -- Changing Base Path carelessly -> broken paths -> plan migration/symlinks. + +- Setting Total Memory to full RAM → OOM risk → reserve 5–15% for the OS. +- Excessive over-allocation (e.g., 200%) → performance issues → lower the ratio. +- Missing firewall rules for daemon/SFTP → offline/errors → open and persist rules. +- Mixing prod/test on the same Node → contention → separate or limit. +- Deleting an IP before clearing allocations → stale errors → remove allocations first. +- Skipping Maintenance before major changes → disruptions → enable Maintenance. +- Changing Base Path carelessly → broken paths → plan migration/symlinks. ## Best Practices -- Consistent naming (e.g., node-us-nyc-1); put hardware class in description. -- Maintain capacity sheet (total vs allocated). -- Prune unused ports; curate minimal Docker images. +- Use consistent naming (e.g., node-us-nyc-1); put hardware class in description. +- Maintain a capacity sheet (total vs. allocated). +- Prune unused ports; curate a minimal set of Docker images. - Use Maintenance Mode for daemon/kernel upgrades. ## API Notes + - Admin API: create/list Nodes, manage allocations, update limits, toggle maintenance. -- Typical flow: POST Location -> POST Node -> POST allocations -> POST servers (Node ID). Validate daemon connection. +- Typical flow: POST Location → POST Node → POST allocations → POST servers (Node ID). + Validate daemon connection. -When to Add Another Node -- New machine, sustained capacity >80% memory, isolation needs, different performance tiers. -- Don’t add for just a new server or a different Docker image. +## When to Add Another Node -Quick Checklist -- Daemon reachable; DNS/SSL/proxy correct; firewall open (daemon/SFTP). -- Resource totals set minus OS; intentional over-allocation. -- IPs and adequate port pool added. -- Docker images curated; monitoring/logs; backup strategy in place. +- Add when you have a new machine, sustained capacity >80% memory, isolation needs, + or different performance tiers. +- Don’t add a Node just for a single new server or a different Docker image. ## Quick Checklist - Daemon reachable; DNS/SSL/proxy correct; firewall open (daemon/SFTP). - Resource totals set minus OS; intentional over-allocation. -- IPs and adequate port pool added. -- Docker images curated; monitoring/logs; backup strategy in place. +- IPs added with an adequate port pool. +- Docker images curated; monitoring/logs configured; backup strategy in place. ## Capacity Review Tips -- Memory: alert 75%, plan 85%. -- Disk: alert 70%, plan 80%, emergency 90%. -- Ports: alert when <10% free. -- CPU: check sustained 15m load vs cores. +- Memory: alert at 75%, plan at 85%. +- Disk: alert at 70%, plan at 80%, emergency at 90%. +- Ports: alert when <10% free. +- CPU: check sustained 15m load vs. core count. ## Troubleshooting -- Node offline: check daemon service, TLS/proxy, connectivity (nc/curl). -- Can’t allocate ports: pool exhausted, IP missing, port in use/firewalled. -- Start fails (insufficient resources): over-allocation exceeded -> adjust or migrate. + +- Node offline: check daemon service, TLS/proxy, and connectivity (nc/curl). +- Can’t allocate ports: pool exhausted, IP missing, or port in use/firewalled. +- Start fails (insufficient resources): over-allocation exceeded → adjust or migrate. ## Glossary - Allocation: Reserved IP:Port. -- Over-Allocate: Oversubscribe beyond physical. +- Over-Allocate: Oversubscribe beyond physical resources. - Daemon: Background container manager. -- Maintenance Mode: Block new actions; running servers continue. +- Maintenance Mode: Blocks new actions; running servers continue. ## Example Naming -- node-us-east-1, node-eu-fra-2, node-ap-sgp-1, node-edge-la-1, node-aws-usw-1, us.chicago.pyro. +- node-us-east-1, node-eu-fra-2, node-ap-sgp-1, node-edge-la-1, node-aws-usw-1, us.chicago.pyro ## Scaling - Vertical: increase Node resources (after hardware upgrade). -- Horizontal: add another Node in same Location. -- Geographic: new Location + Node. +- Horizontal: add another Node in the same Location. +- Geographic: create a new Location and add a Node there. ## Visual References -Nodes homepage, Create Node form, Node detail overview. \ No newline at end of file +- Nodes homepage, Create Node form, Node detail overview. + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) diff --git a/content/docs/post-install/admins/servers.mdx b/content/docs/post-install/admins/servers.mdx index 6c4b4cc..49ce9ea 100644 --- a/content/docs/post-install/admins/servers.mdx +++ b/content/docs/post-install/admins/servers.mdx @@ -3,4 +3,11 @@ title: Creating Servers description: How to create and mannge a server --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/admins/users.mdx b/content/docs/post-install/admins/users.mdx index d8a4b8b..9ecf43e 100644 --- a/content/docs/post-install/admins/users.mdx +++ b/content/docs/post-install/admins/users.mdx @@ -3,4 +3,11 @@ title: Adding Users description: Making a user account for your panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/index.mdx b/content/docs/post-install/index.mdx index 8fd8b1e..c0c48bd 100644 --- a/content/docs/post-install/index.mdx +++ b/content/docs/post-install/index.mdx @@ -5,4 +5,11 @@ description: Post-installation configuration and setup guides. # Post Installation -This section covers post-installation tasks and configuration. \ No newline at end of file +This section covers post-installation tasks and configuration. + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/account/index.mdx b/content/docs/post-install/users/account/index.mdx index 2f29285..78d01c4 100644 --- a/content/docs/post-install/users/account/index.mdx +++ b/content/docs/post-install/users/account/index.mdx @@ -3,4 +3,11 @@ title: User accounts description: Account pages, setting up MFA & SSH keys --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/index.mdx b/content/docs/post-install/users/index.mdx index 68d3b66..31313a8 100644 --- a/content/docs/post-install/users/index.mdx +++ b/content/docs/post-install/users/index.mdx @@ -3,4 +3,11 @@ title: Overview - The user description: An overview of what the user can do and where things are as a logged in user. --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/activity.mdx b/content/docs/post-install/users/servers/activity.mdx index 1c6756e..52090fc 100644 --- a/content/docs/post-install/users/servers/activity.mdx +++ b/content/docs/post-install/users/servers/activity.mdx @@ -3,4 +3,11 @@ title: Activity in the server description: Everything you need to know about the Activity section in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/databases.mdx b/content/docs/post-install/users/servers/databases.mdx index f58f591..c523a17 100644 --- a/content/docs/post-install/users/servers/databases.mdx +++ b/content/docs/post-install/users/servers/databases.mdx @@ -3,4 +3,11 @@ title: Server Databases description: Everything you need to know about Database section in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/network.mdx b/content/docs/post-install/users/servers/network.mdx index 46901bd..4a3994f 100644 --- a/content/docs/post-install/users/servers/network.mdx +++ b/content/docs/post-install/users/servers/network.mdx @@ -3,4 +3,11 @@ title: Server Network description: Everything you need to know about the Network section in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/scedules.mdx b/content/docs/post-install/users/servers/scedules.mdx index 0822d18..f3c21d7 100644 --- a/content/docs/post-install/users/servers/scedules.mdx +++ b/content/docs/post-install/users/servers/scedules.mdx @@ -3,4 +3,11 @@ title: Scedules description: Everything you need to know about the Scedules section in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/settings.mdx b/content/docs/post-install/users/servers/settings.mdx index f1a6bb1..f05f392 100644 --- a/content/docs/post-install/users/servers/settings.mdx +++ b/content/docs/post-install/users/servers/settings.mdx @@ -3,4 +3,11 @@ title: Server Settings description: Everything you need to know about the Settings section in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/software.mdx b/content/docs/post-install/users/servers/software.mdx index ef37593..9b548f3 100644 --- a/content/docs/post-install/users/servers/software.mdx +++ b/content/docs/post-install/users/servers/software.mdx @@ -3,4 +3,11 @@ title: Server Software description: Everything you need to know about the Activity Software in the panel --- -text \ No newline at end of file +text + +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file diff --git a/content/docs/post-install/users/servers/subusers.mdx b/content/docs/post-install/users/servers/subusers.mdx index 446856d..8c953e0 100644 --- a/content/docs/post-install/users/servers/subusers.mdx +++ b/content/docs/post-install/users/servers/subusers.mdx @@ -3,3 +3,9 @@ title: Sub-users description: Everything you need to know about the Sub-users section in the panel --- +## Additional Resources + +- [Docker Documentation](https://docs.docker.com/) +- [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) +- [Pterodactyl Documentation](https://pterodactyl.io/) +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file From 4c9205cd8a71b3996cb2a0097be48c636b46ac5e Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 10 Oct 2025 11:52:04 -0700 Subject: [PATCH 10/14] fixed star on github button in lightmode not showing --- src/app/(home)/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index da6da97..36deeb9 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -78,7 +78,7 @@ const Page = () => { View Documentation - + Star on GitHub

From 72c9949c8ebf4752f8afc31f9b54c82e1edbf124 Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 10 Oct 2025 12:08:10 -0700 Subject: [PATCH 11/14] better way to use right button in light and markmdoe --- content/docs/post-install/admins/servers.mdx | 2 +- src/app/(home)/page.tsx | 2 +- src/components/ui/PyroButton.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/post-install/admins/servers.mdx b/content/docs/post-install/admins/servers.mdx index 49ce9ea..b7e1f50 100644 --- a/content/docs/post-install/admins/servers.mdx +++ b/content/docs/post-install/admins/servers.mdx @@ -3,7 +3,7 @@ title: Creating Servers description: How to create and mannge a server --- -text +Creating servers is the fundamental park of using pyrodactyl ## Additional Resources diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 36deeb9..da6da97 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -78,7 +78,7 @@ const Page = () => { View Documentation - + Star on GitHub
diff --git a/src/components/ui/PyroButton.tsx b/src/components/ui/PyroButton.tsx index f2cf823..3399d59 100644 --- a/src/components/ui/PyroButton.tsx +++ b/src/components/ui/PyroButton.tsx @@ -33,8 +33,8 @@ const button = cva( variant: { primary: ["bg-brand", "text-white", "hover:bg-brand/80"], secondary: ["bg-black dark:bg-white", "text-white dark:text-black", "hover:bg-black/80 dark:hover:bg-white/80"], - tertiary: ["bg-[#ffffff33]", "text-white", "hover:bg-[#ffffff55]"], - quaternary: ["bg-transparent", "text-white", "hover:bg-black/80", "border-[#ffffff33]", "hover:border-[#ffffff55]"], + tertiary: ["bg-black/10 dark:bg-[#ffffff33]", "text-black dark:text-white", "hover:bg-black/20 dark:hover:bg-[#ffffff55]"], + quaternary: ["bg-transparent", "text-black dark:text-white", "hover:bg-black/10 dark:hover:bg-black/80", "border-black/20 dark:border-[#ffffff33]", "hover:border-black/30 dark:hover:border-[#ffffff55]"], }, size: { ghost: [], From 4bc1a1df7ea703ef0596af4828a6a4fd46abf37f Mon Sep 17 00:00:00 2001 From: "skye.mbp" Date: Fri, 10 Oct 2025 20:31:06 -0700 Subject: [PATCH 12/14] added more discord invite and more info into the servers file --- content/docs/index.mdx | 4 +- content/docs/post-install/admins/servers.mdx | 108 ++++++++++++++++++- 2 files changed, 108 insertions(+), 4 deletions(-) diff --git a/content/docs/index.mdx b/content/docs/index.mdx index e0caffe..7ff7ce4 100644 --- a/content/docs/index.mdx +++ b/content/docs/index.mdx @@ -9,12 +9,12 @@ description: The Pterodactyl-based game server panel that's faster, smaller, saf Pyrodactyl is under development and pre-release. Some UI elements may appear - broken, and there might be some bugs. + broken, and there might be some bugs. You can report bugs by joining our [Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support)] For Pyrodactyl-specific issues, join our Discord community at - [discord.gg/FGWKZT5dxv](https://discord.gg/FGWKZT5dxv) for support. + [discord.gg/FGWKZT5dxv](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) for support. Pyrodactyl is the Pterodactyl-based game server management panel that focuses on performance enhancements, a reimagined, accessible interface, and top-tier developer experience. Builds faster, compiles smaller: Pyrodactyl is the world's best Pterodactyl. diff --git a/content/docs/post-install/admins/servers.mdx b/content/docs/post-install/admins/servers.mdx index b7e1f50..1d03efd 100644 --- a/content/docs/post-install/admins/servers.mdx +++ b/content/docs/post-install/admins/servers.mdx @@ -3,11 +3,115 @@ title: Creating Servers description: How to create and mannge a server --- -Creating servers is the fundamental park of using pyrodactyl +Creating servers is the fundamental part of using Pyrodactyl. + +After setting up your nodes and seeing a green beating heart, you can continue with setting up servers. + +## What is a Server? + +A server in Pyrodactyl is a containerized application instance that runs on a Node. It consumes a defined amount of resources (CPU, memory, disk, network allocations) from its assigned Node. + +## Prerequisites + +- At least one configured and online Node. +- Available allocations (IP:Port combinations) on the chosen Node. +- A valid Egg for the game or application you wish to run. + +## Creating a Server + +1. **Navigate to the Admin Area:** From your Pyrodactyl panel, go to `Admin Area` > `Servers`. +2. **Click "Create New":** In the top right corner, click the "Create New" button. +3. **Fill out the Server Details:** + + - **Server Name:** A user-friendly name for your server (e.g., "My Minecraft Survival Server"). + - **Server Owner:** Select the user who will own and manage this server. + - **Description (Optional):** A brief description of the server's purpose. + - **Node:** Choose the Node where this server will be deployed. Ensure the Node has sufficient resources and allocations. + - **Allocation:** Select an available IP:Port allocation from the chosen Node. This is how users will connect to your server. + - **Egg:** Select the appropriate Egg for the game or application (e.g., "Minecraft: Java Edition"). + - **Nest:** The Nest associated with the chosen Egg will be automatically selected. + +4. **Configure Resources:** + + - **Memory (MiB):** The maximum amount of RAM the server can use. + - **Swap (MiB):** The amount of swap space available. Set to `-1` for unlimited. + - **Disk Space (MiB):** The maximum amount of disk space the server can use. + - **CPU Limit (%):** The percentage of a single CPU core the server can use (e.g., `100` for one thread, `200` for two cores). + - **IO Weight:** Adjusts the I/O priority for the server (10-1000, default 500). + +5. **Configure Startup Parameters:** + + - **Startup Command:** The command used to start the server. This is usually pre-filled by the Egg. + - **Service Variables:** Additional variables defined by the Egg that can be configured (e.g., server JAR file, difficulty). + +6. **Advanced Settings (Optional):** + + - **Database Limit:** Maximum number of databases the server owner can create. + - **Allocation Limit:** Maximum number of additional allocations the server owner can create. (in the [network tab](/post-install/users/servers/network)) + - **Backup Limit:** Maximum number of backups the server owner can create. + - **OOM Killer:** Enable or disable the Out-Of-Memory killer for this server. + +7. **Click "Create Server":** Once all details are filled, click the button to create the server. + +The server will now be provisioned on the selected Node. You can monitor its status and manage it from the server list. + +## Managing Servers + +Once a server is created, the user that is assigned the server can perform various management tasks: + + Admins can still manage and access servers, they will apear under "other servers" when on the homepage of the panel + + +- **Start/Stop/Restart:** Control the server's power state. +- **Console:** View server logs and send commands. +- **Files:** Access and manage server files via SFTP or the web interface. +- **Databases:** Create and manage MySQL databases for the server. +- **Schedules:** Set up automated tasks (e.g., daily backups, restarts). +- **Network:** Manage additional IP allocations and port forwarding. +- **Subusers:** Grant other users access to manage specific aspects of the server. +- **Settings:** Modify server resource limits, startup parameters, and other configurations. +- **Backups:** Create, restore, and manage server backups. + +## Best Practices + +- **Resource Allocation:** Allocate resources carefully. Over-allocating can lead to resource exhaustion on the Node, while under-allocating can cause server performance issues. +- **Security:** Regularly update server software and use strong passwords for SFTP and database access. +- **Backups:** Implement a regular backup strategy to prevent data loss. +- **Monitoring:** Keep an eye on server resource usage and logs to identify and resolve issues proactively. +- **Eggs:** Ensure you are using up-to-date and well-maintained Eggs for your applications. + +## Common Issues + +| Issue | Cause | Solution | +|-------|-------|----------| +| Server won't start | Insufficient resources on Node | Check Node capacity and reduce server limits or add resources | +| Port binding errors | Allocation already in use or bind IP incorrect | Use `0.0.0.0` as bind address, verify port is free on Node | +| Out of Memory crashes | Memory limit too low for application | Increase memory allocation or enable swap | +| Server stuck in "Installing" | Egg installation script failed | Check server logs, verify Egg is up-to-date | +| Cannot connect to server | Firewall blocking ports or wrong allocation | Verify Node firewall rules allow the server's port | +| SFTP connection fails | Wrong SFTP port or Node unreachable | Verify Node's SFTP port (default 2022) is open and correct | +| Slow file uploads | Upload size limit too restrictive | Increase Node's upload size limit in settings | +| Database creation fails | Database limit reached | Increase database limit or remove unused databases | +| Startup command errors | Invalid variables or missing files | Review Egg configuration and service variables | +| Backup fails | Insufficient disk space or backup limit reached | Free up disk space or increase backup limit | + +### Troubleshooting Tips + +- **Check Server Logs:** Most issues and their situations are in the server logs themselves. +- **Verify Node Status:** Ensure the Node has a green heartbeat and correct resources. +- **Review Egg Configuration:** Ensure the Egg is compatible with the application version you're trying to use. +- **Resource Monitoring:** Use Node metrics to find resource bottlenecks (CPU, RAM, disk I/O). + +### When to Contact Support + +If you've verified all settings and the issue persists: +- Check the [Common Issues](/common-issues/bind-issues) section for detailed troubleshooting guides. +- Review [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) for similar issues. +- Gather server logs, Node status, and error messages before seeking help. ## Additional Resources - [Docker Documentation](https://docs.docker.com/) - [Pyrodactyl GitHub](https://github.com/pyrohost/pyrodactyl) - [Pterodactyl Documentation](https://pterodactyl.io/) -- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) \ No newline at end of file +- [Pyrodactyl Discord](https://discord.com/invite/FGWKZT5dxv?utm_campaign=pyrodactyl_support) From 7099860d594e9a6e64c8277eb9bc439df386a4e0 Mon Sep 17 00:00:00 2001 From: Skylar <118846397+NobleSkye@users.noreply.github.com> Date: Fri, 10 Oct 2025 21:03:27 -0700 Subject: [PATCH 13/14] updating to newer docs --- content/docs/elytra/configuration.mdx | 2 +- content/docs/elytra/index.mdx | 4 ++-- content/docs/elytra/installation.mdx | 2 +- content/docs/installation/fresh-installation.mdx | 4 ++++ src/app/docs/[[...slug]]/page.tsx | 2 ++ 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/content/docs/elytra/configuration.mdx b/content/docs/elytra/configuration.mdx index 7225ba8..333b429 100644 --- a/content/docs/elytra/configuration.mdx +++ b/content/docs/elytra/configuration.mdx @@ -3,4 +3,4 @@ title: Configuration description: description --- -**some profound text about configuring elytra here** \ No newline at end of file +# Coming Soon \ No newline at end of file diff --git a/content/docs/elytra/index.mdx b/content/docs/elytra/index.mdx index 9d62209..b5f7289 100644 --- a/content/docs/elytra/index.mdx +++ b/content/docs/elytra/index.mdx @@ -1,6 +1,6 @@ --- -title: Elytra -description: Next-generation daemon for the Pyrodactyl ecosystem +title: Elytra Documentation +description: The Pterodactyl-based game server panel that's faster, smaller, safer, and more accessible --- diff --git a/content/docs/elytra/installation.mdx b/content/docs/elytra/installation.mdx index 04f9a99..beed203 100644 --- a/content/docs/elytra/installation.mdx +++ b/content/docs/elytra/installation.mdx @@ -3,4 +3,4 @@ title: Installation description: description --- -**some profound text about installing elytra here** \ No newline at end of file +# Coming Soon \ No newline at end of file diff --git a/content/docs/installation/fresh-installation.mdx b/content/docs/installation/fresh-installation.mdx index 44b01d4..7becac4 100644 --- a/content/docs/installation/fresh-installation.mdx +++ b/content/docs/installation/fresh-installation.mdx @@ -38,6 +38,10 @@ This comprehensive guide walks you through setting up Pyrodactyl using Docker, f 1. In terminal, cd into the directory, and run the following command to start the panel: + + If you want to use Let's Encrypt for SSL, add the `LE_EMAIL` variable to the `x-common` section under the panel service in your `docker-compose.yml` file. After adding it, run `docker compose down`, delete the `/srv/pterodactyl/nginx` directory, and then run `docker compose up -d` to regenerate the SSL configuration. + + ```bash docker compose up -d ``` diff --git a/src/app/docs/[[...slug]]/page.tsx b/src/app/docs/[[...slug]]/page.tsx index 7de03b2..0d9c3f5 100644 --- a/src/app/docs/[[...slug]]/page.tsx +++ b/src/app/docs/[[...slug]]/page.tsx @@ -2,6 +2,7 @@ import { notFound } from 'next/navigation'; import type { Metadata } from 'next'; import { DocsPage, DocsBody, DocsTitle, DocsDescription } from 'fumadocs-ui/page'; import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; +import { Callout } from 'fumadocs-ui/components/callout'; import { Card, Cards } from 'fumadocs-ui/components/card'; import defaultMdxComponents, { createRelativeLink } from 'fumadocs-ui/mdx'; import { source } from '@/lib/source'; @@ -47,6 +48,7 @@ export default async function Page({ params }: PageParams) { a: createRelativeLink(source, page), Tabs, Tab, + Callout, Card, Cards }} From dde7aa49579da3e73484e898e0513915d3b0de51 Mon Sep 17 00:00:00 2001 From: Skylar <118846397+NobleSkye@users.noreply.github.com> Date: Fri, 10 Oct 2025 21:09:06 -0700 Subject: [PATCH 14/14] reorgizing docs to match newlayout --- .../admins/allocations.mdx | 0 .../admins/index.mdx | 0 .../admins/locations.mdx | 0 .../admins/nodes.mdx | 0 .../admins/servers.mdx | 0 .../admins/users.mdx | 0 .../{post-install => common-tasks}/index.mdx | 0 .../users/account/index.mdx | 0 .../users/index.mdx | 0 .../users/servers/activity.mdx | 0 .../users/servers/databases.mdx | 0 .../users/servers/network.mdx | 0 .../users/servers/scedules.mdx | 0 .../users/servers/settings.mdx | 0 .../users/servers/software.mdx | 0 .../users/servers/subusers.mdx | 0 content/docs/elytra/index.mdx | 36 ++- content/docs/elytra/installation.mdx | 284 +++++++++++++++++- content/docs/elytra/meta.json | 6 + content/docs/{ => pyrodactyl}/automated.mdx | 0 content/docs/{ => pyrodactyl}/changelog.mdx | 0 .../common-issues/bind-issues.mdx | 0 .../{ => pyrodactyl}/common-issues/domain.mdx | 0 content/docs/{ => pyrodactyl}/index.mdx | 0 .../installation/community-install-guides.mdx | 0 .../installation/fresh-installation.mdx | 0 .../hosting-providers/dokploy.mdx | 0 .../{ => pyrodactyl}/installation/index.mdx | 0 .../local-development/docker.mdx | 0 .../local-development/index.mdx | 0 .../local-development/vagrant.mdx | 0 content/docs/{ => pyrodactyl}/meta.json | 0 .../{ => pyrodactyl}/migrations/docker.mdx | 0 .../{ => pyrodactyl}/migrations/index.mdx | 0 .../migrations/native-to-docker.mdx | 0 .../migrations/native-to-native.mdx | 0 .../migrations/native-update.mdx | 0 37 files changed, 310 insertions(+), 16 deletions(-) rename content/docs/{post-install => common-tasks}/admins/allocations.mdx (100%) rename content/docs/{post-install => common-tasks}/admins/index.mdx (100%) rename content/docs/{post-install => common-tasks}/admins/locations.mdx (100%) rename content/docs/{post-install => common-tasks}/admins/nodes.mdx (100%) rename content/docs/{post-install => common-tasks}/admins/servers.mdx (100%) rename content/docs/{post-install => common-tasks}/admins/users.mdx (100%) rename content/docs/{post-install => common-tasks}/index.mdx (100%) rename content/docs/{post-install => common-tasks}/users/account/index.mdx (100%) rename content/docs/{post-install => common-tasks}/users/index.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/activity.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/databases.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/network.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/scedules.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/settings.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/software.mdx (100%) rename content/docs/{post-install => common-tasks}/users/servers/subusers.mdx (100%) create mode 100644 content/docs/elytra/meta.json rename content/docs/{ => pyrodactyl}/automated.mdx (100%) rename content/docs/{ => pyrodactyl}/changelog.mdx (100%) rename content/docs/{ => pyrodactyl}/common-issues/bind-issues.mdx (100%) rename content/docs/{ => pyrodactyl}/common-issues/domain.mdx (100%) rename content/docs/{ => pyrodactyl}/index.mdx (100%) rename content/docs/{ => pyrodactyl}/installation/community-install-guides.mdx (100%) rename content/docs/{ => pyrodactyl}/installation/fresh-installation.mdx (100%) rename content/docs/{ => pyrodactyl}/installation/hosting-providers/dokploy.mdx (100%) rename content/docs/{ => pyrodactyl}/installation/index.mdx (100%) rename content/docs/{ => pyrodactyl}/local-development/docker.mdx (100%) rename content/docs/{ => pyrodactyl}/local-development/index.mdx (100%) rename content/docs/{ => pyrodactyl}/local-development/vagrant.mdx (100%) rename content/docs/{ => pyrodactyl}/meta.json (100%) rename content/docs/{ => pyrodactyl}/migrations/docker.mdx (100%) rename content/docs/{ => pyrodactyl}/migrations/index.mdx (100%) rename content/docs/{ => pyrodactyl}/migrations/native-to-docker.mdx (100%) rename content/docs/{ => pyrodactyl}/migrations/native-to-native.mdx (100%) rename content/docs/{ => pyrodactyl}/migrations/native-update.mdx (100%) diff --git a/content/docs/post-install/admins/allocations.mdx b/content/docs/common-tasks/admins/allocations.mdx similarity index 100% rename from content/docs/post-install/admins/allocations.mdx rename to content/docs/common-tasks/admins/allocations.mdx diff --git a/content/docs/post-install/admins/index.mdx b/content/docs/common-tasks/admins/index.mdx similarity index 100% rename from content/docs/post-install/admins/index.mdx rename to content/docs/common-tasks/admins/index.mdx diff --git a/content/docs/post-install/admins/locations.mdx b/content/docs/common-tasks/admins/locations.mdx similarity index 100% rename from content/docs/post-install/admins/locations.mdx rename to content/docs/common-tasks/admins/locations.mdx diff --git a/content/docs/post-install/admins/nodes.mdx b/content/docs/common-tasks/admins/nodes.mdx similarity index 100% rename from content/docs/post-install/admins/nodes.mdx rename to content/docs/common-tasks/admins/nodes.mdx diff --git a/content/docs/post-install/admins/servers.mdx b/content/docs/common-tasks/admins/servers.mdx similarity index 100% rename from content/docs/post-install/admins/servers.mdx rename to content/docs/common-tasks/admins/servers.mdx diff --git a/content/docs/post-install/admins/users.mdx b/content/docs/common-tasks/admins/users.mdx similarity index 100% rename from content/docs/post-install/admins/users.mdx rename to content/docs/common-tasks/admins/users.mdx diff --git a/content/docs/post-install/index.mdx b/content/docs/common-tasks/index.mdx similarity index 100% rename from content/docs/post-install/index.mdx rename to content/docs/common-tasks/index.mdx diff --git a/content/docs/post-install/users/account/index.mdx b/content/docs/common-tasks/users/account/index.mdx similarity index 100% rename from content/docs/post-install/users/account/index.mdx rename to content/docs/common-tasks/users/account/index.mdx diff --git a/content/docs/post-install/users/index.mdx b/content/docs/common-tasks/users/index.mdx similarity index 100% rename from content/docs/post-install/users/index.mdx rename to content/docs/common-tasks/users/index.mdx diff --git a/content/docs/post-install/users/servers/activity.mdx b/content/docs/common-tasks/users/servers/activity.mdx similarity index 100% rename from content/docs/post-install/users/servers/activity.mdx rename to content/docs/common-tasks/users/servers/activity.mdx diff --git a/content/docs/post-install/users/servers/databases.mdx b/content/docs/common-tasks/users/servers/databases.mdx similarity index 100% rename from content/docs/post-install/users/servers/databases.mdx rename to content/docs/common-tasks/users/servers/databases.mdx diff --git a/content/docs/post-install/users/servers/network.mdx b/content/docs/common-tasks/users/servers/network.mdx similarity index 100% rename from content/docs/post-install/users/servers/network.mdx rename to content/docs/common-tasks/users/servers/network.mdx diff --git a/content/docs/post-install/users/servers/scedules.mdx b/content/docs/common-tasks/users/servers/scedules.mdx similarity index 100% rename from content/docs/post-install/users/servers/scedules.mdx rename to content/docs/common-tasks/users/servers/scedules.mdx diff --git a/content/docs/post-install/users/servers/settings.mdx b/content/docs/common-tasks/users/servers/settings.mdx similarity index 100% rename from content/docs/post-install/users/servers/settings.mdx rename to content/docs/common-tasks/users/servers/settings.mdx diff --git a/content/docs/post-install/users/servers/software.mdx b/content/docs/common-tasks/users/servers/software.mdx similarity index 100% rename from content/docs/post-install/users/servers/software.mdx rename to content/docs/common-tasks/users/servers/software.mdx diff --git a/content/docs/post-install/users/servers/subusers.mdx b/content/docs/common-tasks/users/servers/subusers.mdx similarity index 100% rename from content/docs/post-install/users/servers/subusers.mdx rename to content/docs/common-tasks/users/servers/subusers.mdx diff --git a/content/docs/elytra/index.mdx b/content/docs/elytra/index.mdx index b5f7289..53fe36c 100644 --- a/content/docs/elytra/index.mdx +++ b/content/docs/elytra/index.mdx @@ -1,17 +1,27 @@ --- title: Elytra Documentation -description: The Pterodactyl-based game server panel that's faster, smaller, safer, and more accessible +description: A maintained fork of Pterodactyl Wings, developed and supported by Pyro Inc. --- - - - Next-generation daemon for the Pyrodactyl ecosystem - - - Configuring Elytra - - \ No newline at end of file + +This list is small, but planned to expand in the future. + + +Key Features and Changes: + +- Deduplicated Backups + + Deduplication is the procecss of only storing a piece of data once. + In the same way git works, we use an open source program called [Rustic](https://github.com/rustic-rs/rustic) + to ensure your backups are both Encrypted, and as small as possible, all while still maintaining their integrity. + + + + + +--- + + +Have something you want to see added to Elytra? +Make an issue on our [Github!](https://github.com/pyrohost/elytra/issues/new) + diff --git a/content/docs/elytra/installation.mdx b/content/docs/elytra/installation.mdx index beed203..50dc82d 100644 --- a/content/docs/elytra/installation.mdx +++ b/content/docs/elytra/installation.mdx @@ -1,6 +1,284 @@ --- -title: Installation -description: description +title: Installing Elytra +description: How to install and setup Elytra on Linux --- -# Coming Soon \ No newline at end of file + +## Supported Operating Systems + + +There is a very high chance it will work on more than these. These are the ones that are +known working and officially supported though. + + +|OS|Version| +|---|---| +|Fedora| 40-42| +|Ubuntu| 24.04| +|Debian| 13| +|Rocky | 10| +|RHEL | 10| +|Arch| 2025.10.1| + +## Prerequisites + +- curl +- tar +- docker +- [rustic](https://github.com/rustic-rs/rustic/releases/latest) + + +### Installing Prequisites + + + +```bash +sudo dnf update +sudo dnf install curl tar +sudo dnf -y install dnf-plugins-core +sudo dnf-3 config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo + +sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + + +```bash +sudo apt-get update +sudo apt-get install curl tar ca-certificates +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +# Add the repository to Apt sources: +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update + +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + + +```bash +sudo apt-get update +sudo apt-get install curl tar ca-certificates +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +# Add the repository to Apt sources: +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update + +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + + +```bash +sudo dnf update +sudo dnf install curl tar +sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo +sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + + +```bash +sudo yum update +sudo yum install curl tar +sudo dnf -y install dnf-plugins-core +sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo +sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + + +```bash +sudo pacman -Syu +sudo pacman -S curl tar docker +``` + + + +Now, enable the docker engine service to start on boot +```bash +sudo systemctl enable --now docker +``` + +## Installing Elytra +Now we need to install elytra. This will be the program communicating with your Pyrodactyl Panel. + +### Download Executable + + + + ```bash + curl -o /usr/local/bin/elytra https://github.com/pyrohost/elytra/releases/download/latest/elytra_linux_amd64 + ``` + + + ```bash + curl -o /usr/local/bin/elytra https://github.com/pyrohost/elytra/releases/download/latest/elytra_linux_arm64 + ``` + + + + +### Installing Rustic + +Rustic is not required to run Elytra. You do however lose out on Deduplicated and encrypted backups. +The Pyrodactyl team heavily recommends you install it. + + +To install rustic, you have the choice of building from source, or downloading the latest pre-built binary. +The quickest way is to use the pre-built binaries. + + + +```bash + mkdir -p /tmp/rustic-install + curl -L https://github.com/rustic-rs/rustic/releases/download/v0.10.0/rustic-v0.10.0-x86_64-unknown-linux-musl.tar.gz | sudo tar -zx -C /usr/local/bin + sudo mv /tmp/rustic-install/rustic /usr/local/bin/ +``` + + +```bash + mkdir -p /tmp/rustic-install + curl -L https://github.com/rustic-rs/rustic/releases/download/v0.10.0/rustic-v0.10.0-aarch64-unknown-linux-musl.tar.gz | sudo tar -zx -C /usr/local/bin + sudo mv /tmp/rustic-install/rustic /usr/local/bin/ +``` + + + + + +### Setting up Systemd Task for Elytra + +```bash +sudo nano /etc/systemd/system/elytra.service +``` +and paste + +```systemd +[Unit] +Description=Pyrodactyl Elytra Daemon +After=docker.service +Requires=docker.service +PartOf=docker.service + +[Service] +User=root +WorkingDirectory=/etc/elytra +LimitNOFILE=4096 +PIDFile=/var/run/elytra/daemon.pid +ExecStart=/usr/local/bin/elytra +Restart=on-failure +StartLimitInterval=180 +StartLimitBurst=30 +RestartSec=5s + +[Install] +WantedBy=multi-user.target +``` + +Now save and exit that file. + + +## Setup Elytra +To setup Elytra, you must first get your config. This is done by first, adding a new node in your Pyrodactyl Panel. + +### Setup your Elytra + First thing you need to do, is to get to your admin panel. + This is located at `https:///admin` + +### Setting up Your Location + + after visiting this page, you should see a menu on the left side of the screen called `Locations` + Click on that to make your first location + + +![Location View](/img/SearchForLocations.png) + + +Once on this page, click "Create New" in the top right corner +Name it whatever you want. This name doesn't matter that much. + +### Create Your Node + +Once your Location is created. Click on Nodes right beneath the locations button. + +![Node View](/img/SearchForNodes.png) + + +Click "Create New" + +and you will be prompted with a screen with lots of buttons and input fields. +The only values you will need to change are + +- Name +Give it a unique name that you can identify this node by + +- Public FQDN +This address should be The address that people will use when connecting to your node. +not panel to node +If your panel is https secured is has to be a domain name, and vise versa, if it's http, it has to be +an ip address. + +- Total Memory +How much memory your Server has + This is not a hard value. The panel will only get mad at you, not stop you! + +- Memory Over-Allocation +How much percent over your Total Memory you want to show up as "Available" + +- Total Disk Space +How much disk space you have to use + This is not a hard value. The panel will only get mad at you, not stop you! + +- Disk Over-Allocation +How much percent over your Total Disk you want to show up as "Available" + + If your going to run Elytra behind a proxy Set Behind proxy to true + + + +Click Create on your node, and it might take a second. But then it should load into the nodes page. + +--- + +### Configuring Elytra + +Click the `Configuration` Button located at the top of the page + +![Elytra Config](/img/ElytraConfig.png) + + +Rather than anything complex, you can press the auto deploy button on the side of the page, +and copy the command that pops out which should look a little something like this + +```bash +cd /etc/elytra && sudo elytra configure --panel-url http://panel.pyrodactyl.dev --token pyro_XWsMcVoJkoMCWn9COtSsUTlbRSevBbLJ5HEMKZQjnN5 --node 1 +``` + + +### Test your service. + +If you want to run Elytra just to test it. You can do that by running this command anywhere on your host + +```bash + elytra +``` + +Once you've got your stuff working. your free to go + +--- + + +### Enable Elytra Service + +```bash + sudo systemctl enable --now elytra +``` + diff --git a/content/docs/elytra/meta.json b/content/docs/elytra/meta.json new file mode 100644 index 0000000..9cc5bd6 --- /dev/null +++ b/content/docs/elytra/meta.json @@ -0,0 +1,6 @@ +{ + "title": "Elytra", + "description": "Docs for the Elytra Server Daemon", + "icon": "elytra", + "root": true +} diff --git a/content/docs/automated.mdx b/content/docs/pyrodactyl/automated.mdx similarity index 100% rename from content/docs/automated.mdx rename to content/docs/pyrodactyl/automated.mdx diff --git a/content/docs/changelog.mdx b/content/docs/pyrodactyl/changelog.mdx similarity index 100% rename from content/docs/changelog.mdx rename to content/docs/pyrodactyl/changelog.mdx diff --git a/content/docs/common-issues/bind-issues.mdx b/content/docs/pyrodactyl/common-issues/bind-issues.mdx similarity index 100% rename from content/docs/common-issues/bind-issues.mdx rename to content/docs/pyrodactyl/common-issues/bind-issues.mdx diff --git a/content/docs/common-issues/domain.mdx b/content/docs/pyrodactyl/common-issues/domain.mdx similarity index 100% rename from content/docs/common-issues/domain.mdx rename to content/docs/pyrodactyl/common-issues/domain.mdx diff --git a/content/docs/index.mdx b/content/docs/pyrodactyl/index.mdx similarity index 100% rename from content/docs/index.mdx rename to content/docs/pyrodactyl/index.mdx diff --git a/content/docs/installation/community-install-guides.mdx b/content/docs/pyrodactyl/installation/community-install-guides.mdx similarity index 100% rename from content/docs/installation/community-install-guides.mdx rename to content/docs/pyrodactyl/installation/community-install-guides.mdx diff --git a/content/docs/installation/fresh-installation.mdx b/content/docs/pyrodactyl/installation/fresh-installation.mdx similarity index 100% rename from content/docs/installation/fresh-installation.mdx rename to content/docs/pyrodactyl/installation/fresh-installation.mdx diff --git a/content/docs/installation/hosting-providers/dokploy.mdx b/content/docs/pyrodactyl/installation/hosting-providers/dokploy.mdx similarity index 100% rename from content/docs/installation/hosting-providers/dokploy.mdx rename to content/docs/pyrodactyl/installation/hosting-providers/dokploy.mdx diff --git a/content/docs/installation/index.mdx b/content/docs/pyrodactyl/installation/index.mdx similarity index 100% rename from content/docs/installation/index.mdx rename to content/docs/pyrodactyl/installation/index.mdx diff --git a/content/docs/local-development/docker.mdx b/content/docs/pyrodactyl/local-development/docker.mdx similarity index 100% rename from content/docs/local-development/docker.mdx rename to content/docs/pyrodactyl/local-development/docker.mdx diff --git a/content/docs/local-development/index.mdx b/content/docs/pyrodactyl/local-development/index.mdx similarity index 100% rename from content/docs/local-development/index.mdx rename to content/docs/pyrodactyl/local-development/index.mdx diff --git a/content/docs/local-development/vagrant.mdx b/content/docs/pyrodactyl/local-development/vagrant.mdx similarity index 100% rename from content/docs/local-development/vagrant.mdx rename to content/docs/pyrodactyl/local-development/vagrant.mdx diff --git a/content/docs/meta.json b/content/docs/pyrodactyl/meta.json similarity index 100% rename from content/docs/meta.json rename to content/docs/pyrodactyl/meta.json diff --git a/content/docs/migrations/docker.mdx b/content/docs/pyrodactyl/migrations/docker.mdx similarity index 100% rename from content/docs/migrations/docker.mdx rename to content/docs/pyrodactyl/migrations/docker.mdx diff --git a/content/docs/migrations/index.mdx b/content/docs/pyrodactyl/migrations/index.mdx similarity index 100% rename from content/docs/migrations/index.mdx rename to content/docs/pyrodactyl/migrations/index.mdx diff --git a/content/docs/migrations/native-to-docker.mdx b/content/docs/pyrodactyl/migrations/native-to-docker.mdx similarity index 100% rename from content/docs/migrations/native-to-docker.mdx rename to content/docs/pyrodactyl/migrations/native-to-docker.mdx diff --git a/content/docs/migrations/native-to-native.mdx b/content/docs/pyrodactyl/migrations/native-to-native.mdx similarity index 100% rename from content/docs/migrations/native-to-native.mdx rename to content/docs/pyrodactyl/migrations/native-to-native.mdx diff --git a/content/docs/migrations/native-update.mdx b/content/docs/pyrodactyl/migrations/native-update.mdx similarity index 100% rename from content/docs/migrations/native-update.mdx rename to content/docs/pyrodactyl/migrations/native-update.mdx