├── .env.example ├── .github └── workflows │ └── build.yml ├── .gitignore ├── README.md ├── babel.config.js ├── blog ├── 2024-04-12-announcement.mdx ├── 2024-04-15-head-start.mdx ├── 2024-04-26-license-questions.mdx ├── 2024-05-03-translations-begin.mdx ├── 2024-05-04-agpl-relicensing.mdx └── authors.yml ├── docs ├── about.mdx ├── comparison.mdx ├── glossary.mdx ├── guides │ ├── database-hosts.mdx │ ├── docker.mdx │ ├── easypanel.mdx │ ├── mounts.mdx │ ├── php-upgrade.mdx │ ├── ssl.mdx │ └── uninstalling.mdx ├── index.mdx ├── panel │ ├── advanced │ │ ├── artisan.mdx │ │ ├── docker.mdx │ │ ├── mysql.mdx │ │ └── redis.mdx │ ├── getting-started.mdx │ ├── optional-config.mdx │ ├── panel-setup.mdx │ ├── update.mdx │ └── webserver-config.mdx ├── troubleshooting.mdx └── wings │ ├── install.mdx │ ├── optional-config.mdx │ └── update.mdx ├── docusaurus.config.ts ├── package.json ├── pnpm-lock.yaml ├── sidebars.ts ├── src ├── components │ └── HomepageFeatures │ │ ├── look.tsx │ │ ├── sponsors.tsx │ │ ├── styles.module.css │ │ ├── what.tsx │ │ └── why.tsx ├── css │ ├── custom.scss │ └── tailwind.css ├── pages │ ├── faq.mdx │ ├── index.module.css │ ├── index.tsx │ └── support.mdx ├── plugins │ └── tailwind-config.cjs └── theme │ └── MDXComponents.js ├── static ├── .nojekyll ├── img │ ├── blog │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ ├── favicon.ico │ ├── homepage │ │ ├── sponsor │ │ │ ├── ash.png │ │ │ ├── ash.svg │ │ │ ├── surfhosting.png │ │ │ └── vultric.png │ │ └── ss │ │ │ ├── 1d.png │ │ │ ├── 1l.png │ │ │ ├── 2d.png │ │ │ ├── 2l.png │ │ │ ├── 3d.png │ │ │ ├── 3l.png │ │ │ ├── 4d.png │ │ │ ├── 4l.png │ │ │ ├── 5d.png │ │ │ ├── 5l.png │ │ │ ├── 6d.png │ │ │ └── 6l.png │ └── logo.png └── updatePanel.sh ├── tailwind.config.js └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | POSTHOG_API_KEY="" 2 | POSTHOG_HOST="" 3 | POSTHOG_DEV="false" -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: 'Build' 2 | on: 3 | workflow_dispatch: 4 | workflow_call: 5 | push: 6 | branches: 7 | - 'main' 8 | 9 | jobs: 10 | deploy: 11 | name: 'Deploy' 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: 'Checkout' 15 | uses: actions/checkout@v4 16 | - name: 'Setup Node' 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 20 20 | - uses: pnpm/action-setup@v3 21 | name: Install pnpm 22 | with: 23 | version: 10 24 | run_install: true # pnpm will install dependencies recursively. 25 | 26 | - name: 'Build' 27 | run: | 28 | pnpm build -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | /.idea 23 | 24 | package-lock.json 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pelican Docs 2 | Pelican docs are created with [Docusaurus](https://docusaurus.io). 3 | 4 | ## Building 5 | 6 | To test changes locally install the dependencies and run the server using pnpm. 7 | 8 | ```shell 9 | pnpm i 10 | pnpm run start 11 | ``` -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /blog/2024-04-12-announcement.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: new-beginning 3 | title: New Beginning 4 | authors: [lance, parker, kubi, charles, alex] 5 | tags: [panel, wings, website, hub] 6 | hide_table_of_contents: true 7 | --- 8 | 9 | ## Dear Community, 10 | 11 | Today, we are thrilled to share with you an exciting new beginning. 12 | We are embarking on a new journey — one that leads us to the creation of Pelican Panel. 13 | Our vision is to build on top of the foundation we've had the privilege of being a part of previously, 14 | while also exploring new horizons and introducing features that we believe will greatly benefit the community. 15 | 16 | In the coming months, we are excited to roll out several updates that we think you'll really look forward to, including: 17 | 18 | * **Install Plugins**: ability to create, edit, upload plugins (just as easy as eggs) 19 | * **Easier Installation**: greatly streamlining the usage and setup 20 | * **Better Code**: improving and simplifying the code base to encourage open source contributions 21 | * **Accepting Suggestions**: we are accepting new feature suggestions and voting for them 22 | * **Active Discord**: panel integrations with discord (and steam) for logins and role/permissions sync 23 | * **GitHub Bounties**: ability to receive and pay for and fund github issues 24 | * **Central Hub**: our marketplace for trusted plugins and services (eggs) 25 | 26 | We understand that change can be daunting and may lead to questions. 27 | We want to assure you that we are here to listen and address any concerns you may have. 28 | Our door is always open for feedback, suggestions, or any thoughts you wish to share. 29 | We are just beginning and excited about what the future holds. 30 | We invite you to join us on this new adventure, to continue the collaboration, innovation, and community spirit that has always been at the heart of our efforts. 31 | 32 | Thank you for your continued support and trust. 33 | Here's to new beginnings, and to a future filled with great new possibilities! 34 | 35 | Best regards, 36 | [Pelican Team](mailto:team@pelican.dev) 37 | -------------------------------------------------------------------------------- /blog/2024-04-15-head-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: head-start 3 | title: Monumental Head Start 4 | authors: [lance] 5 | tags: [panel, website] 6 | hide_table_of_contents: true 7 | --- 8 | 9 | This past weekend was nothing short of incredible for the Pelican community. 10 | We're thrilled to announce that over 5,000 members have joined us, a testament to the growing interest and trust in our project. 11 | A heartfelt thank you to each one of you for choosing to be part of our journey! 12 | 13 | We also want to express our gratitude for the overwhelming response to our recent survey. 14 | With over 1,000 responses already, we're gathering invaluable data that will directly influence enhancements to Pelican Panel. 15 | Your feedback is crucial, and we're committed to making the platform even more user-friendly and feature-rich. 16 | 17 | A special thanks goes out to our contributors, donors, and dedicated team members. 18 | Your support and hard work are the backbone of this project, making everything we do possible. 19 | 20 | Looking forward, we are excited about the updates and new features we plan to roll out. 21 | Stay tuned for more updates, and please continue to share your thoughts and suggestions with us. 22 | Together, we're making Pelican Panel the best it can be. 23 | 24 | Thank you for making this weekend a milestone in our history! 25 | -------------------------------------------------------------------------------- /blog/2024-04-26-license-questions.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: commercial-license-faq 3 | title: Commercial License FAQ 4 | authors: [parker, lance] 5 | tags: [panel, license] 6 | hide_table_of_contents: true 7 | --- 8 | 9 | As some of you know, people have been asking us questions about when you need a commercial license or not. 10 | 11 | I asked people for questions they wanted clarifications on. Here are the questions as asked, and their answers. 12 | 13 | ## modification questions 14 | 15 | 1. Q: What are the plans for the theming part of Pelican Panel and what will the front end look like? 16 | 17 | A: Using [Filament themes](https://filamentphp.com/docs/3.x/panels/themes#creating-a-custom-theme) placed in `/resources/css/filament` will work and don't need a license, 18 | and so long as no files that are included with the panel are modified in the process, you do not need a commercial license. 19 | 20 | :::info 21 | A native theme selector is currently planned. 22 | ::: 23 | :::warning 24 | Themes are unable to heavily change the layout of the panel because they are limited to CSS. However plugins can completely and more easily rearrange components and add new ones and pages. 25 | ::: 26 | :::info definitions 27 | Theme: The color and style of the panel. (Ex. button colors or fonts) 28 | Layout: The way the panel is organized. (Ex. where the cpu usage shows up.) 29 | Panel Code: The files that belong to the pelican-dev/panel repository 30 | ::: 31 | 32 | 2. Q: Will only styling be a thing, or is there also some sort of support for custom layouts and functionalities? 33 | 34 | A: Custom layouts can be made with either plugins or by writing a custom frontend that uses the API to interact with the panel. 35 | 36 | 3. Q: Some users will probably use "public" themes for the panel (maybe smth like unix or so), if they are a public host, since they aren't the ones making the theme, do they need to pay the commercial license? 37 | 38 | A: The answer for question 1 should answer this, but if a theme is open sourced OR does not modify the Panel's file it is fine. 39 | 40 | :::warning 41 | If your Pelican Panel modifications are not open sourced, you are required to obtain a commercial license. 42 | ::: 43 | 44 | 45 | ## not license related 46 | Still good questions 47 | 48 | 1. Q: What kind of SLA are you guys proposing for any commercial support plans? 49 | 50 | A: Currently this depends on what level of support a customer would want. We are discussing options internally right now. Please contact us at team@pelican.dev with further inquiries. 51 | 52 | 2. Q: Would it be possible for you guys to add a real data panel like splint or grafana or netdata for the server metrics? 53 | 54 | A: Currently exporting server metrics to a service like Grafana is not planned but may be considered. 55 | :::info 56 | As discussed on the discord server this may be better served by a monitoring service such as a host level netdata install. 57 | ::: 58 | 59 | 3. Q: When Pelican goes public, will conversions be considered? 60 | 61 | A: You can use your existing Pterodactyl configuration and drop in Pelican, it will update the database when installed. 62 | :::warning 63 | We do not support reverting back to Pterodactyl. It isn't challenging, but we strongly recommend that you backup your files and database in case you want to. 64 | ::: 65 | :::info 66 | Wings is not a one way conversion, at this time, as it has far fewer changes that impact things. 67 | ::: 68 | import { faPlaneLock } from "@fortawesome/free-solid-svg-icons" 69 | -------------------------------------------------------------------------------- /blog/2024-05-03-translations-begin.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: translations-begin 3 | title: Panel Translations 4 | authors: [lance] 5 | tags: [panel, translate] 6 | hide_table_of_contents: true 7 | --- 8 | 9 | Howdy everyone, Happy Friday - it’s been a real quick first 3 weeks! 10 | If you haven’t already seen it, we have officially chosen to use Crowdin as a tool that the community can use to directly contribute to Pelican. 11 | We hope that this allows you to more easily share Pelican Panel with your friends and fellow cohorts. 12 | 13 | I want to specifically give thanks to the huge number of awesome members for helping us translate so far: 14 | 15 | * robbinnn (Turkish, Russian) 16 | * yu_solt (Japanese) 17 | * fyber (Greek) 18 | * vetyp (Bulgarian) 19 | * lenlino (Japanese) 20 | * louanbastos (Portuguese, Brazilian) 21 | * MikkelHebel (Danish) 22 | * Mixerboy24 (Finnish) 23 | * kragleh (Slovak) 24 | * Kirill2255 (Russian, Belarusian) 25 | * vibesfr_ (French) 26 | * Fabian-Ser (Dutch) 27 | * KuBeL (French) 28 | * monabean (Finnish) 29 | * llek (Slovak) 30 | * mtn16 (Czech) 31 | * arciCZ (Czech) 32 | * Khao_YT (Thai) 33 | * Shaun2177 (Hebrew) 34 | * Bobu5 (Indonesian) 35 | * Rudolfet (Italian) 36 | * huguitis (Spanish, Catalan) 37 | * Enotuk (Russian, Belarusian, Danish, German, Polish) 38 | * Jampi (Hungarian, Afrikaans) 39 | * mafen (Norwegian) 40 | * edwardcoder (Russian) 41 | * gOOvER (German) 42 | * GriffenG (Danish) 43 | * EternalTheGod (Turkish) 44 | * ShreddedPaper (Thai) 45 | * kingtino (Croatian) 46 | * xzolw (Polish) 47 | * DerLev (German) 48 | * setpopa (Czech) 49 | * arksc (Vietnamese) 50 | * xGranolah (Polish) 51 | * Netsukii (Italian) 52 | * HerrSammy (German) 53 | * irochi (Korean) 54 | * CappeDiem (Finnish) 55 | * AlexanderOFGR (Greek) 56 | * Turkidev (Arabic) 57 | * PM-Kirill (Belarusian, Russian, Danish, German, Polish, Czech) 58 | * bruhbruhbruh344343 (Afrikaans, Hungarian) 59 | * Pedervau (Norwegian) 60 | * Remixiak (Polish) 61 | * vovamod (Ukrainian) 62 | * rishon (Hebrew) 63 | * Boy132 (German) 64 | * merseh (Turkish) 65 | * Jiricech2059 (Slovenian, French) 66 | * andreiusq (Romanian) 67 | * QuintenQVD (Dutch) 68 | * hustender (German) 69 | * efekanrasit (Turkish) 70 | * liborsaf (Czech) 71 | * qsasukep (Polish) 72 | * MrCreepyCraft32 (French) 73 | * Anas-1554 (Hindi) 74 | * SimonStjernholm (Danish) 75 | * bagou450 (French) 76 | * Ikkdaan (Belarusian, Russian) 77 | * Kokonat007 (Czech) 78 | * Hituzip (Russian) 79 | * martin-bndr (German) 80 | * imirochi (Korean) 81 | * JouRambo (German) 82 | * ItsNeil (Hindi) 83 | * Vikbor5342 (Swedish) 84 | * BlueFireRO (Romanian) 85 | * WiFlow (Swedish) 86 | * lepetittechnicien28 (French) 87 | * xela-the-proto (Italian) 88 | * inishido (Indonesian) 89 | * andyaguo (Chinese Simplified) 90 | * InvalidPanda (German) 91 | * GarfieldTV (Swedish) 92 | * TeemoCell (German) 93 | * Smeja64 (Czech) 94 | * Antipovv (Russian) 95 | * sirnugget (Swedish) 96 | * ianlot (Hungarian) 97 | * cojocaru-david (Romanian) 98 | * Ikdan (Russian, Belarusian) 99 | * xIPrumIx (Arabic) 100 | * softwarenoob (Belarusian, Finnish) 101 | 102 | An additional huge thanks goes out to Senna for helping us navigate through the software and set up everything too. 103 | -------------------------------------------------------------------------------- /blog/2024-05-04-agpl-relicensing.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: relicensing-pelican-to-agpl 3 | title: Relicensing Pelican to AGPL 4 | authors: [kubi, lance] 5 | tags: [panel, license] 6 | hide_table_of_contents: false 7 | --- 8 | 9 | ## Introduction 10 | 11 | We forked from Pterodactyl and made the decision to relicense the Panel from the original [MIT license](https://en.wikipedia.org/wiki/MIT_License) to the [AGPL license](https://www.gnu.org/licenses/agpl-3.0.en.html). This is an impactful change that was carefully considered by the team to help us move towards the future we envision. This ensures the community will benefit by encouraging and accepting more open source contributions. One of our core principles is that our software should be free, open source, and benefit the community and ecosystem. 12 | 13 | 14 | ## The AGPL-3 License 15 | 16 | The AGPL license is what is known as a [copyleft](https://en.wikipedia.org/wiki/Copyleft) type license. It requires that any modifications to a public Panel **must** be open sourced under the same license. Private Panels do not have that restriction. As long as your Panel is not open to the public, it’s going to be considered for private usage. Private usage typically includes your friends, family, coworkers, etc. 17 | 18 | 19 | ### What this means for users 20 | 21 | Pelican is completely free to users and always will be!  We are committed to fostering an environment that encourages the community to participate in our development process through various means. You are free to do anything to your private Panel including installing plugins, eggs, and themes! 22 | 23 | 24 | ### What this means for developers 25 | 26 | Developers are always welcomed and encouraged to build with or on top of our codebase. The new license simply requires these modifications to be released under the same license if your instance is public. 27 | 28 | One additional very important point. We want contributors to receive recognition and payment for their hard work. We are working to introduce the concept of paying developers directly for their contributions. A budget has been established that will redirect donations and even specific bounties directly back to developers. 29 | 30 | 31 | ### What this means for companies 32 | 33 | Companies rely on modifications to set them apart from the competition. We offer Pelican under a commercial license that allows modifications without the requirement to open source your changes. For more information about this commercial license please reach out to team@pelican.dev. This also comes with dedicated 1:1 support calls directly with our team every month. 34 | 35 | 36 | ## Relicensing Process 37 | 38 | Once we had decided to relicense the project the first question was, how can we do this?  There is little legal precedent on how to relicense open source software, but it has been done many times before. Notable examples include when Mozilla relicensed Firefox from the Netscape Public License to the Mozilla Public License. Additional examples can be found at https://en.wikipedia.org/wiki/Software_relicensing. 39 | 40 | It was important to our team the process we undertook to relicense the code was public and shared with the community. There have been many historical contributions and taking these into consideration would complicate the process. Therefore, we decided to use the latest committer in the line-by-line [git blame](https://git-scm.com/docs/git-blame) for each file. This means that for every line in every file we’re giving credit to the last person that updated that line. 41 | 42 | In order to relicense a source code file we need the permission from the overall _majority owner_. A file is considered majority owned by an author if 90%+ of the lines have last been updated by that author. 43 | 44 | 45 | ## Permission 46 | 47 | In order to relicense the code we need permission from the authors we identify. Pelican was launched with the direct support of most of the developers previously from Pterodactyl. We have explicit permission from nearly every majority owner. The remaining authors’ files will retain the original license. 48 | 49 | 50 | ## The Tool 51 | 52 | We used a simple python script that utilizes git blame to list each file and generate per-line blame listings. The [scan\_licenses.py](https://gist.github.com/iamkubi/42445857323a58bcd56fe8bc2d6c5aa1) script is linked here so that this process can be fully understood and reproduced. Here’s example usage: 53 | 54 | $ python3.12 scan\_licenses.py | egrep -v 'migration' 55 | 56 | 57 | ## The Numbers 58 | 59 | ### The Panel 60 | 61 | The [Pelican Panel GitHub repository](https://github.com/pelican-dev/panel) consists of 1332 files as of Mar 29, 2024. With Contributors’ consent we accounted for 1324/1332 of the Panel’s source code files. The remaining files explicitly retain the original license at the top of their source code. 62 | 63 | 64 | ## The Contributor License Agreement 65 | 66 | In addition to the AGPL license Pelican will also be available under a commercial license.  In order to ensure that we can dual license the Pelican software and still allow open source contributions we’ve created a [Contributor License Agreement](https://github.com/pelican-dev/panel/blob/3.x/contributor_license_agreement.md).  This is a legal agreement, so it’s important to refer to the agreement itself for exact details, but I’ll attempt to summarize here. 67 | 68 | - Contributors retain all rights to their contributions 69 | 70 | - Contributors grant perpetual rights to copyright, patent, relicense, offer for sale, or transfer the Pelican Project including your contributions 71 | 72 | - Contributors represent that their contributions are their own work 73 | 74 | Essentially this means that your contributions will always be attributed to you, but you grant the Pelican Developers the right to use it.  In return the CLA commits the Pelican Developers to not use your contributions in a way that is contrary to the public benefit. 75 | 76 | 77 | ## Our Commitment to Open Source 78 | 79 | The license change was undertaken with the goal of a stronger and more cohesive open source community.  We want Pelican to be free for everyone while also supporting a community that rewards developers for their contributions.  Pelican will always be open source software that is free for personal and commercial use. 80 | -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | lance: 2 | name: Lance Pioch 3 | title: Lead Maintainer 4 | url: https://github.com/lancepioch 5 | image_url: /img/blog/1.png 6 | parker: 7 | name: Michael Parker 8 | title: Egg Maintainer 9 | url: https://github.com/parkervcp 10 | image_url: /img/blog/2.png 11 | charles: 12 | name: Charles Morgan 13 | title: Docs Maintainer 14 | url: https://github.com/notareyouscared 15 | image_url: /img/blog/3.png 16 | kubi: 17 | name: Ryan Kubi 18 | title: Wings Maintainer 19 | url: https://github.com/iamkubi 20 | image_url: /img/blog/4.png 21 | alex: 22 | name: Alex Scai 23 | title: Panel Maintainer 24 | url: https://github.com/alexevladgabriel 25 | image_url: /img/blog/5.png -------------------------------------------------------------------------------- /docs/about.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: about 3 | --- 4 | 5 | # The Team & Pelican 6 | 7 | ### Core Team 8 | 9 | | Name | Discord | Role | 10 | |--------------------------------------------------------|-----------------|-----------------------------| 11 | | [Lance Pioch](https://github.com/lancepioch) | `shadowlancer` | Project Lead & Fullstack Dev| 12 | | [Michael Parker](https://github.com/parkervcp) | `parkervcp` | Egg/ Docker Maintainer | 13 | | [Charles Morgan](https://github.com/notAreYouScared) | `areyouscared` | Fullstack Dev | 14 | | [Alex 'Scai' Vlad](https://github.com/alexevladgabriel)| `.scai` | Fullstack Dev | 15 | | [Boy132](https://github.com/boy132) | `boy132` | Fullstack Dev | 16 | | [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | Fullstack Dev | 17 | 18 | Core members of Pelican have a light blue username in Discord. 19 | 20 | ### Community Staff 21 | 22 | | Name | Discord | Role | 23 | |------------------------------------------------|---------------|---------------| 24 | | [Trixter](https://github.com/TrixterTheTux) | `trixter` | Moderator | 25 | | [Quinten](https://github.com/QuintenQVD0) | `quintenqvd` | Egg Maintainer| 26 | | [Red-Thirten](https://github.com/lilkingjr1) | `red_thirten` | Egg Maintainer| 27 | 28 | Community Staff have a darker blue username in Discord. 29 | 30 | ## License 31 | 32 | Pelican® Copyright © 2024 33 | 34 | Code released under AGPLv3 35 | -------------------------------------------------------------------------------- /docs/comparison.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: comparison 3 | --- 4 | 5 | import Admonition from '@theme/Admonition'; 6 | import Tabs from '@theme/Tabs'; 7 | import TabItem from '@theme/TabItem'; 8 | 9 | # Comparison 10 | 11 | Pelican is a fork of [Pterodactyl](https://pterodactyl.io). However, Pelican has many Improvements over it now! 12 | 13 | 14 | Want to see these changes in action? Check out our [Demo](https://demo.pelican.dev)! 15 | 16 | 17 | 18 | 19 | * ![Planned](https://img.shields.io/badge/Planned-blue) First party Plugins 20 | * ![Planned](https://img.shields.io/badge/Planned-blue) First party Themes 21 | * ![Planned](https://img.shields.io/badge/Planned-blue) Rework allocations 22 | * ![Done](https://img.shields.io/badge/Done-green) Webhooks 23 | * ![Done](https://img.shields.io/badge/Done-green) Roles & Permissions for Admins 24 | * ![Done](https://img.shields.io/badge/Done-green) Replace Nests & Locations with Tags 25 | * ![Done](https://img.shields.io/badge/Done-green) Config option for Binary Prefix (MiB/GiB) 26 | * ![Done](https://img.shields.io/badge/Done-green) Improved Settings page 27 | 28 | 29 | * ![In Progress](https://img.shields.io/badge/In_Progress-orange) Localized Frontend 30 | * ![Done](https://img.shields.io/badge/Done-green) User avatars 31 | * ![Done](https://img.shields.io/badge/Done-green) Rewrite of Client Area in Filament 32 | * ![Done](https://img.shields.io/badge/Done-green) Switch from Webpack to Vite 33 | * ![Done](https://img.shields.io/badge/Done-green) Rewrite of Admin Area in Filament 34 | * ![Done](https://img.shields.io/badge/Done-green) Timezone configurable per User 35 | 36 | 37 | * ![Done](https://img.shields.io/badge/Done-green) Integrated API docs 38 | * ![Done](https://img.shields.io/badge/Done-green) Application API for Database Hosts 39 | * ![Done](https://img.shields.io/badge/Done-green) Application API for Server Transfers 40 | * ![Done](https://img.shields.io/badge/Done-green) Application API for Mounts 41 | * ![Done](https://img.shields.io/badge/Done-green) Uniform user transformers 42 | * ![Done](https://img.shields.io/badge/Done-green) Rename `oom_disabled` to `oom_killer` 43 | 44 | 45 | * ![Done](https://img.shields.io/badge/Done-green) Replace Google reCAPTCHA with Cloudflare Turnstile 46 | * ![Done](https://img.shields.io/badge/Done-green) OAuth 47 | 48 | 49 | * ![Done](https://img.shields.io/badge/Done-green) Official support for PostgreSQL 50 | * ![Done](https://img.shields.io/badge/Done-green) Dockerized Installation 51 | * ![Done](https://img.shields.io/badge/Done-green) Easier Installation process (Web Installer) 52 | * ![Done](https://img.shields.io/badge/Done-green) SQLite as Panel database 53 | * ![Done](https://img.shields.io/badge/Done-green) "Proper" support for MariaDB as Panel database (dedicated driver) 54 | 55 | 56 | * ![Planned](https://img.shields.io/badge/Planned-blue) Server sorting 57 | * ![Done](https://img.shields.io/badge/Done-green) IPv6 Support for Allocations 58 | * ![Done](https://img.shields.io/badge/Done-green) Custom docker labels for server containers 59 | * ![Done](https://img.shields.io/badge/Done-green) "Delete files" schedule task 60 | 61 | 62 | * ![Planned](https://img.shields.io/badge/Planned-blue) More effective wings disk quota enforcement 63 | * ![Done](https://img.shields.io/badge/Done-green) Node Ownership (assign nodes to roles) 64 | * ![Done](https://img.shields.io/badge/Done-green) Node resource statistics 65 | * ![Done](https://img.shields.io/badge/Done-green) CPU Limit for Nodes 66 | * ![Done](https://img.shields.io/badge/Done-green) Alias for SFTP address 67 | * ![Done](https://img.shields.io/badge/Done-green) Automatic cleanup of dangling docker images 68 | * ![Done](https://img.shields.io/badge/Done-green) Fixed `-1` overallocation 69 | 70 | 71 | * ![Planned](https://img.shields.io/badge/Planned-blue) Easier Egg installing 72 | * ![Planned](https://img.shields.io/badge/Planned-blue) Change Egg format to YAML 73 | * ![Done](https://img.shields.io/badge/Done-green) Sortable egg variables 74 | * ![Done](https://img.shields.io/badge/Done-green) Import multiple eggs at once 75 | * ![Done](https://img.shields.io/badge/Done-green) Easier Egg updating (usage of `update_url`) 76 | 77 | 78 | * ![Planned](https://img.shields.io/badge/Planned-blue) Marketplace for Eggs 79 | * ![Planned](https://img.shields.io/badge/Planned-blue) Marketplace for Plugins 80 | * ![Planned](https://img.shields.io/badge/Planned-blue) Marketplace for Themes 81 | * ![Done](https://img.shields.io/badge/Done-green) Open Finances 82 | * ![Done](https://img.shields.io/badge/Done-green) Support Tickets 83 | 84 | 85 | 86 | ## Comparison with our competitors. 87 | | | Pelican | Pterodactyl | PufferPanel | Crafty Controller | Multicraft | TCAdmin | AMP | 88 | |--------------------------|-----------|-------------|-------------|-----------------------|----------------|---------|----------------| 89 | | File manager | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 90 | | Scheduled Tasks | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | 91 | | Free and Open Source | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | 92 | | Multilingual | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | 93 | | Database Management | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | 94 | | OAuth | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | 95 | | Webhooks | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | 96 | | Roles & Permissions | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | 97 | | Announcements | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 98 | | Themes | 📅 | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | 99 | | Plugins | 📅 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 100 | | Self update | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | 101 | | Captcha Login | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 102 | | Remote Backups | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 103 | 104 | ### Features information. 105 | - All features with 📅 are planned. 106 | - Plugins can add any features that Pelican doesn't have by default. 107 | - These values are not constantly updated, and competitors may have implemented some of the features marked with a cross in their latest version. 108 | -------------------------------------------------------------------------------- /docs/glossary.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: glossary 3 | --- 4 | 5 | # Glossary 6 | 7 | ### What is ...? 8 | 9 | **Panel** — web application that interfaces with Wings and lets you control your Servers. 10 | 11 | **Wings** — application that gives you secure control of your Servers via your Panel. 12 | 13 | **Node** — machine (computer or server) that runs Wings to connect to the Panel. 14 | 15 | **Server** — instance of a Container that is maintained by Wings. 16 | 17 | **Docker** — platform that lets you run Servers in isolated containers. 18 | 19 | **Docker Image** — file that contains libraries, dependencies, files, etc needed to run a Container. 20 | 21 | **Container** — virtualized environment that your Servers run in. 22 | 23 | **Egg** — file that configures how to run a Docker Image. 24 | 25 | **Yolk** — curated collection of (core) Docker Images that can be used with Pelican's Eggs. 26 | 27 | 28 | ## Basic Example Setup Diagram 29 | 30 | ```mermaid 31 | flowchart TD 32 | A(Pelican Panel) 33 | A --> B1(Basement Server) 34 | A --> B2(Rented Server) 35 | B1 --> W1(Wings) 36 | B2 --> W2(Wings) 37 | W2 ---> C5(Palworld) 38 | W2 ---> C6(Discord Bot) 39 | W1 ---> C7(FTB Minecraft) 40 | W1 ---> C8(Factorio) 41 | W1 ---> C9(GTA FiveM) 42 | W1 ---> C4(Project Zomboid) 43 | ``` 44 | -------------------------------------------------------------------------------- /docs/guides/database-hosts.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Database Hosts 4 | 5 | Database hosts allow to create per-server databases on the given host. 6 | 7 | ## Database Configuration 8 | 9 | ### Create Database Host user 10 | 11 | You will need a database user with the correct permissions before continuing any further. 12 | 13 | Run the following commands to quickly create a user for your new database host: 14 | 15 | ```sql 16 | mysql -u root -p 17 | 18 | # Remember to change 'yourPassword' below to be a unique password 19 | # Replace 127.0.0.1 with your panel ip if your panel and wings are on different machines 20 | CREATE USER 'pelicanuser'@'127.0.0.1' IDENTIFIED BY 'yourPassword'; 21 | GRANT ALL PRIVILEGES ON *.* TO 'pelicanuser'@'127.0.0.1' WITH GRANT OPTION; 22 | exit 23 | ``` 24 | 25 | ### Allow external database access 26 | 27 | Chances are you'll need to allow external access to this MySQL instance in order to allow servers to connect to it. 28 | 29 | To do this, open `my.cnf`, which varies in location depending on your OS and how MySQL was installed. You can type `find /etc -iname my.cnf` to locate it. 30 | 31 | Open `my.cnf`, add text below to the bottom of the file and save it: 32 | 33 | ```txt 34 | [mysqld] 35 | bind-address=0.0.0.0 36 | ``` 37 | 38 | Restart MySQL/ MariaDB to apply these changes. This will override the default MySQL configuration, which by default will only accept requests from localhost. Updating this will allow connections on all interfaces, and thus, external connections. Make sure to allow the MySQL port (default 3306) in your firewall. 39 | 40 | ## Panel Configuration 41 | 42 | In the admin area of the panel, go to "Databases" and click the "New Database Host" button. 43 | 44 | 45 | Users will later see the host as their database endpoint. Therefore, you should set it to a public ip or FQDN and not to `localhost` for example. 46 | 47 | 48 | Hit "Create" and if everything was entered correctly you should be redirected to the database host list and see your new database host. 49 | 50 | ### Common issues 51 | 52 | `Connection refused`: 53 | Make sure that your database server is running and that you allowed external access to your database. 54 | 55 | `Host '_______' is not allowed to connect to this MariaDB server`: 56 | You most likely created the database user with a 127.0.0.1 host and are trying to connect from a different host. 57 | 58 | `Access denied for user '_______'@'_______'`: 59 | You either entered a wrong password or something is wrong with the database user you entered. Make sure that the database user exists and has the required permissions. 60 | -------------------------------------------------------------------------------- /docs/guides/docker.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Installing Docker 4 | 5 | For a quick install of Docker CE, you can use the command below: 6 | 7 | ```sh 8 | curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh 9 | ``` 10 | 11 | 12 | If the above command does not work, please refer to the [official Docker documentation](https://docs.docker.com/engine/install/) on how to install Docker CE on your server. 13 | 14 | 15 | ## Start Docker on Boot 16 | 17 | If you are on an operating system with systemd (Ubuntu 16+, Debian 8+, CentOS 7+) run the command below to have Docker start when you boot your machine. 18 | 19 | ```sh 20 | sudo systemctl enable --now docker 21 | ``` 22 | 23 | ## Enabling Swap 24 | 25 | On most systems, Docker will be unable to setup swap space by default. You can confirm this by running `docker info` and looking for the output of `WARNING: No swap limit support` near the bottom. 26 | 27 | Enabling swap is entirely optional, but we recommended doing it if you will be hosting for others and to prevent OOM errors. 28 | 29 | To enable swap, open `/etc/default/grub` as a root user and find the line starting with `GRUB_CMDLINE_LINUX_DEFAULT`. Make 30 | sure the line includes `swapaccount=1` somewhere inside the double-quotes. 31 | 32 | After that, run `sudo update-grub` followed by `sudo reboot` to restart the server and have swap enabled. 33 | Below is an example of what the line should look like, _do not copy this line verbatim. It often has additional OS-specific parameters._ 34 | 35 | ```text 36 | GRUB_CMDLINE_LINUX_DEFAULT="swapaccount=1" 37 | ``` 38 | 39 | 40 | Some Linux distros may ignore `GRUB_CMDLINE_LINUX_DEFAULT`. 41 | Therefore you might have to use `GRUB_CMDLINE_LINUX` instead should the above variable not work for you. 42 | -------------------------------------------------------------------------------- /docs/guides/easypanel.mdx: -------------------------------------------------------------------------------- 1 | # Easypanel 2 | 3 | Pelican Panel is available as a pre-built Docker image through GitHub Packages. You can use either `ghcr.io/pelican-dev/panel:latest` for the latest stable release or `ghcr.io/pelican-dev/panel:main` which is automatically built from the main branch. This guide will walk you through deploying Pelican Panel using EasyPanel's custom service templates. 4 | 5 | ## Basic Setup with SQLite 6 | 7 | For a basic setup using SQLite as the database, you can use the following service template: 8 | 9 | ```json 10 | { 11 | "services": [ 12 | { 13 | "type": "app", 14 | "data": { 15 | "serviceName": "panel", 16 | "source": { 17 | "type": "image", 18 | "image": "ghcr.io/pelican-dev/panel:latest" 19 | }, 20 | "env": "XDG_DATA_HOME: /pelican-data\nAPP_URL: \"https://$(EASYPANEL_DOMAIN)\"\nCADDY_URL: \"http://$(EASYPANEL_DOMAIN)\"", 21 | "domains": [ 22 | { 23 | "host": "$(EASYPANEL_DOMAIN)", 24 | "port": 80 25 | } 26 | ], 27 | "mounts": [ 28 | { 29 | "type": "volume", 30 | "name": "pelican-data", 31 | "mountPath": "/pelican-data" 32 | }, 33 | { 34 | "type": "volume", 35 | "name": "pelican-logs", 36 | "mountPath": "/var/www/html/storage/logs" 37 | }, 38 | { 39 | "type": "file", 40 | "content": "{\n admin off\n auto_https off\n}\n\n{$CADDY_URL} {\n root * /var/www/html/public\n encode gzip\n\n php_fastcgi 127.0.0.1:9000\n file_server\n}", 41 | "mountPath": "/etc/caddy/Caddyfile" 42 | } 43 | ] 44 | } 45 | } 46 | ] 47 | } 48 | ``` 49 | 50 | ## Advanced Setup with MariaDB and Redis 51 | 52 | For a more advanced setup using MariaDB and Redis, use this template: 53 | 54 | ```json 55 | { 56 | "services": [ 57 | { 58 | "type": "app", 59 | "data": { 60 | "serviceName": "panel", 61 | "source": { 62 | "type": "image", 63 | "image": "ghcr.io/pelican-dev/panel:latest" 64 | }, 65 | "env": "XDG_DATA_HOME: /pelican-data\nAPP_URL: \"https://$(EASYPANEL_DOMAIN)\"\nCADDY_URL: \"http://$(EASYPANEL_DOMAIN)\"", 66 | "domains": [ 67 | { 68 | "host": "$(EASYPANEL_DOMAIN)", 69 | "port": 80 70 | } 71 | ], 72 | "mounts": [ 73 | { 74 | "type": "volume", 75 | "name": "pelican-data", 76 | "mountPath": "/pelican-data" 77 | }, 78 | { 79 | "type": "volume", 80 | "name": "pelican-logs", 81 | "mountPath": "/var/www/html/storage/logs" 82 | }, 83 | { 84 | "type": "file", 85 | "content": "{\n admin off\n auto_https off\n}\n\n{$CADDY_URL} {\n root * /var/www/html/public\n encode gzip\n\n php_fastcgi 127.0.0.1:9000\n file_server\n}", 86 | "mountPath": "/etc/caddy/Caddyfile" 87 | } 88 | ] 89 | } 90 | }, 91 | { 92 | "type": "mariadb", 93 | "data": { 94 | "serviceName": "panel-db", 95 | "password": "51e2a4d6e98b7c57f9b6" 96 | } 97 | }, 98 | { 99 | "type": "redis", 100 | "data": { 101 | "serviceName": "panel-redis", 102 | "password": "69cbf211602afa32e194" 103 | } 104 | } 105 | ] 106 | } 107 | ``` 108 | 109 | ## Installation Steps 110 | 111 | 1. In EasyPanel, create a new service using the `Create From Schema` option at the bottom of creating a new service 112 | 2. Paste either the basic or advanced template JSON 113 | 3. Click create to deploy panel 114 | 115 | ## Updating Domain Configuration 116 | 117 | If you need to update your domain after initial deployment: 118 | 119 | 1. Update the domain in EasyPanel's domain settings 120 | 2. Update the environment variables in your service configuration: 121 | ```env 122 | APP_URL: "https://panel.example.com" 123 | CADDY_URL: "http://panel.example.com" 124 | ``` 125 | Note: Keep `CADDY_URL` as `http://` since EasyPanel handles SSL certificates and reverse proxy 126 | 3. Redeploy the service to apply the changes 127 | 128 | ## Post-Installation 129 | 130 | After deployment: 131 | 132 | 1. Access the installer at `https://panel.example.com/installer` 133 | 2. Complete the installation process 134 | 3. For the advanced setup, configure the following in the panel settings: 135 | - Database: Use the MariaDB credentials 136 | - Cache and Queue: Use the Redis credentials 137 | 138 | :::note 139 | The first time the container starts after installing or updating, it will apply database migrations, which may take a few minutes. The panel will not be accessible during this process. 140 | ::: -------------------------------------------------------------------------------- /docs/guides/mounts.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Using Mounts 4 | 5 | Mounts is a feature that allows administrators to mount other directories from the host file-system into a Server's container. 6 | 7 | ## Wings Configuration 8 | 9 | For security reasons it is not possible to mount directories on a node by default. 10 | 11 | **Directories that should be mountable have to be specified explicitly in the Wings configuration.** 12 | 13 | In the Wings configuration file (`/etc/pelican/config.yml`) the `allowed_mounts` field is used to list mountable directories. The listed directories and all their subdirectories can be mounted. 14 | 15 | ```yml title="/etc/pelican/config.yml" 16 | allowed_mounts: 17 | - /example 18 | ``` 19 | 20 | You have to restart Wings to apply new changes to your Wings config. 21 | 22 | ## Panel Configuration 23 | 24 | You have to configure mounts in admin Panel in order to use them with your servers. They consist of a source pad on the node and a target path where it will be mounted in the container. 25 | 26 | 27 | By default Mounts cannot target `/home/container` or any of its subdirectory, you can allow it by setting `BlockBaseDirMount` to `false` in the Wings configuration. 28 | You cannot cross-mount servers such as Server A's directory into Server B. 29 | 30 | 31 | ### Creating a Mount 32 | 33 | 1. In the admin Panel go to **Mounts**. 34 | 2. Create a new mount. 35 | 3. Fill in the details as required. 36 | - **Name**: Name for your mount. 37 | - **Description**: Description for your mount. 38 | - **Source**: The absolute path to the folder or files on the Node machine. 39 | - **Target**: The absolute path where the mount will be placed inside of your server, can **not** include `/home/container` in the path. 40 | - **Read Only**: Whether the mount will be read-only for the servers using it. 41 | - **User Mountable**: Whether to allow users to self mount this mount. 42 | 4. After creating the mount, you are required to add both **Eggs** and **Nodes** that this mount may be used on. 43 | 44 | 45 | All servers using the same mounts will **only** share their contents when they are on the same node. Mounts are not synchronized between nodes. 46 | 47 | 48 | ### Assigning a Mount to a Server 49 | 50 | 1. In the admin Panel navigate to the server you would like to use a mount with 51 | 2. Go to the mounts page 52 | 3. Click the **+** button 53 | 4. Restart the server 54 | 55 | The files of the mount should become available in the target path in the container. You can temporarily change your server startup command to `ls `, which should output the contents of the mount if configured correctly. 56 | 57 | 58 | Mounts do not appear in the Panel's file manager, nor are they accessible via SFTP. However, the server itself will be able to see and use the mounts. 59 | 60 | 61 | ### Example Mount 62 | 63 | The example mount below is stored in the path `/var/lib/pelican/mounts`, which we add to the Wings `config.yml` 64 | 65 | ```yml title="/etc/pelican/config.yml" 66 | allowed_mounts: 67 | - /var/lib/pelican/mounts 68 | ``` 69 | -------------------------------------------------------------------------------- /docs/guides/php-upgrade.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: php-upgrade 3 | --- 4 | 5 | import Tabs from '@theme/Tabs'; 6 | import TabItem from '@theme/TabItem'; 7 | 8 | # Upgrading PHP 9 | 10 | This documentation includes instructions for upgrading your system to the latest version of PHP. Please reference the 11 | table below to check what PHP version you need for your version of Pelican. 12 | 13 | | Panel Version | PHP Version | 14 | |---------------|---------------| 15 | | 1.0.0+ | 8.2, 8.3, 8.4 | 16 | 17 | ## Install PHP 18 | 19 | In order to install PHP 8.4, you will need to run the following commands. Please keep in mind different operating systems 20 | may have slightly different requirements for how this commands are formatted. 21 | 22 | ```bash 23 | # Add additional repository for PHP 24 | sudo add-apt-repository -y ppa:ondrej/php 25 | sudo apt -y update 26 | 27 | # Optional: Remove old PHP versions 28 | sudo apt -y purge php* 29 | 30 | # Install PHP 8.4 31 | sudo apt -y install php8.4 php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,sqlite3,fpm} 32 | ``` 33 | 34 | ## Webserver Configuration 35 | 36 | 37 | 38 | After upgrading to PHP 8.4, you will most likely need to update your NGINX configuration. Your configuration file 39 | is most likely called `pelican.conf` and located in the `/etc/nginx/sites-available/` directory, or if on CentOS, 40 | `/etc/nginx/conf.d/`. 41 | 42 | Make sure to update the path in the command below to reflect the actual location of your configuration file. 43 | 44 | ``` bash 45 | sed -i -e 's/php[7|8].[0-9]-fpm.sock/php8.4-fpm.sock/' /etc/nginx/sites-available/pelican.conf 46 | ``` 47 | 48 | Once you have edited the file run the command below to reload NGINX and apply your changes. 49 | 50 | ```bash 51 | systemctl reload nginx 52 | ``` 53 | 54 | 55 | Run the commands below to disable all previous PHP versions and enable PHP 8.4 when serving requests. 56 | 57 | ``` bash 58 | a2dismod php* 59 | a2enmod php8.4 60 | ``` 61 | 62 | 63 | After upgrading to PHP 8.4, you will most likely need to update your Caddy configuration. Your configuration file 64 | is most likely called `Caddyfile` and located in the `/etc/caddy/` directory. 65 | 66 | Make sure to update the path in the command below to reflect the actual location of your configuration file. 67 | 68 | ``` bash 69 | sed -i -e 's/php[7|8].[0-9]-fpm.sock/php8.4-fpm.sock/' /etc/caddy/Caddyfile 70 | ``` 71 | 72 | Once you have edited the file run the command below to restart Caddy and apply your changes. 73 | 74 | ```bash 75 | systemctl restart caddy 76 | ``` 77 | 78 | 79 | -------------------------------------------------------------------------------- /docs/guides/ssl.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | 6 | # Creating SSL Certificates 7 | 8 | These tutorials briefly cover creating a new SSL certificates for your panel and/or wings. 9 | 10 | 11 | 12 | 13 | This way is the most recommended and should work in 98% of setups. 14 | 15 | To begin, we will install certbot, a simple script that automatically renews our certificates and allows much easier creation of them. 16 | The command below is for Ubuntu distributions, but you can always check [Certbot's official site](https://certbot.eff.org/) for installation instructions. 17 | We have also included a command below to install certbot's Nginx/Apache plugin so you won't have to stop your webserver. 18 | 19 | 20 | 21 | ```sh 22 | sudo apt install -y python3-certbot-nginx 23 | ``` 24 | 25 | 26 | ```sh 27 | sudo apt install -y python3-certbot-apache 28 | ``` 29 | 30 | 31 | ```sh 32 | sudo apt install -y certbot 33 | ``` 34 | 35 | 36 | 37 | ### Creating a Certificate 38 | 39 | After installing certbot, we need to generate a certificate. There are a couple of ways to do that, but the easiest 40 | is to use the web server-specific certbot plugin you just installed. 41 | 42 | 43 | For Wings-only machines that don't need a web server, use the standalone or DNS method of the certbot as you don't need a web server for it. 44 | 45 | 46 | Then, in the command below, you should replace `example.com` with the domain you would like to generate a certificate 47 | for. When you have multiple domains you would like certificates for, simply add more `-d anotherdomain.com` flags to the 48 | command. You can also look into generating a wildcard certificate but that is not covered in this tutorial. 49 | 50 | When you are using certbot's Nginx/Apache plugin, you won't need to restart your webserver to have the certificate 51 | applied assuming that you've already configured the webservers to use SSL as instructed in the [web server configuration step](../panel/webserver-config). 52 | 53 | ### HTTP challenge 54 | 55 | HTTP challenge requires you to expose port 80 for the challenge verification. 56 | 57 | 58 | 59 | ```sh 60 | certbot certonly --nginx -d example.com 61 | ``` 62 | 63 | 64 | ```sh 65 | certbot certonly --apache -d example.com 66 | ``` 67 | 68 | 69 | ```sh 70 | certbot certonly --standalone -d example.com 71 | ``` 72 | 73 | 74 | 75 | ### DNS challenge 76 | 77 | DNS challenge requires you to create a new TXT DNS record to verify domain ownership, instead of having to expose port 80. The instructions are displayed when you run the certbot command below. 78 | 79 | ```sh 80 | certbot -d example.com --manual --preferred-challenges dns certonly 81 | ``` 82 | 83 | ### Auto Renewal 84 | 85 | You'll also probably want to configure the automatic renewal of certificates to prevent unexpected certificate expirations. 86 | You can open crontab with `sudo crontab -e` and add the line from below to the bottom of it for attempting renewal every day at 23 (11 PM). 87 | 88 | Deploy hook would restart the Nginx service to apply a new certificate when it's renewed successfully. Change `nginx` in the restart command to suit your own needs, such as to `apache` or `wings`. 89 | 90 | 91 | For advanced users, we suggest installing and using [acme.sh](https://acme.sh) 92 | which provides more options, and is much more powerful than certbot. 93 | 94 | 95 | ```text 96 | 0 23 * * * certbot renew --quiet --deploy-hook "systemctl restart nginx" 97 | ``` 98 | 99 | ### Troubleshooting 100 | 101 | If you get an `Insecure Connection` or SSL/TLS related error when trying to access your panel or wings, the certificate has likely expired. 102 | This can be easily fixed by renewing the SSL certificate, although using the command `certbot renew` might not do the job if port 80 is in use, as it'll return errors like: `Error: Attempting to renew cert (domain) from /etc/letsencrypt/renew/domain.conf produced an unexpected error`. 103 | 104 | This will happen especially if you're running Nginx instead of Apache. The solution for this is to use Nginx or Apache plugins with `--nginx` and `--apache`. Alternatively, you can stop Nginx, then renew the certificate, finally restart Nginx. Replace `nginx` with your own web server or with `wings` should you be renewing the certificate for Wings. 105 | 106 | Stop Nginx: 107 | 108 | ```sh 109 | systemctl stop nginx 110 | ``` 111 | 112 | Renew the certificate: 113 | 114 | ```sh 115 | certbot renew 116 | ``` 117 | 118 | Once the process has completed, you can restart Nginx: 119 | 120 | ```sh 121 | systemctl start nginx 122 | ``` 123 | 124 | You may also need to restart Wings as not every service is able to automatically apply an updated certificate: 125 | 126 | ```sh 127 | systemctl restart wings 128 | ``` 129 | 130 | 131 | 132 | 133 | This is for advanced users, whose server systems do not have access to port 80. 134 | The command below is for Ubuntu distributions and CloudFlare API (you may google for other APIs for other DNS providers), 135 | but you can always check [acme.sh's official site](https://github.com/Neilpang/acme.sh) for installation instructions. 136 | 137 | Make sure you read both instructions, as some people may have moved to CloudFlare's [new authorization system](https://blog.cloudflare.com/permissions-best-practices) (Modern), but other's [have not](https://community.cloudflare.com/t/cannot-add-new-member-error-1005/421516) (Legacy). 138 | 139 | 140 | ```sh 141 | curl https://get.acme.sh | sh 142 | ``` 143 | 144 | 145 | 146 | ### Obtaining CloudFlare API Key (Legacy) 147 | 148 | After installing acme.sh, we need to fetch a CloudFlare API key. 149 | On Cloudfare's website, select your domain, then on the right side, copy your "Zone ID" and "Account ID". 150 | Click on "Get your API token", click on "Create Token" > select the template "Edit zone DNS" > select the scope of "Zone Resources" 151 | Click on "Continue to summary", copy your token. 152 | 153 | ### Creating a Certificate 154 | 155 | Since the configuration file is based on Certbot, we need to create the folder manually. 156 | 157 | ```sh 158 | sudo mkdir -p /etc/letsencrypt/live/example.com 159 | ``` 160 | 161 | After installing acme.sh and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials. 162 | 163 | ```sh 164 | export CF_Token="Your_CloudFlare_API_Key" 165 | export CF_Account_ID="Your_CloudFlare_Account_ID" 166 | export CF_Zone_ID="Your_CloudFlare_Zone_ID" 167 | ``` 168 | 169 | 170 | 171 | ### Obtaining CloudFlare API Key (Modern) 172 | 173 | After installing acme.sh, we need to fetch a CloudFlare API key. 174 | - Cloudfare's website, click on your profile on the top right. 175 | - Go to "My Profile" --> "[API Tokens](https://dash.cloudflare.com/profile/api-tokens)". 176 | - Click "Create Token" and use the "Edit zone DNS" template. 177 | - Then once on the next page, goto "Zone Resources" and "Include" - "Specific Zone" - (Select the domain you want to use). 178 | - Continue to the summery. 179 | - Confirm you'd like to create the token. 180 | 181 | ### Creating a Certificate 182 | 183 | Since the configuration file is based on Certbot, we need to create the folder manually. 184 | 185 | ```sh 186 | sudo mkdir -p /etc/letsencrypt/live/example.com 187 | ``` 188 | 189 | After installing acme.sh and obtaining CloudFlare API key, we need to then generate a certificate. First input the CloudFlare API credentials. 190 | 191 | ```sh 192 | export CF_Key="Your_CloudFlare_API_Key" 193 | export CF_Email="Your_CloudFlare_Email" 194 | ``` 195 | 196 | 197 | 198 | 199 | 200 | 201 | This is for advanced users, who are running Cloudflare in proxy mode or do not have access to port `80`. 202 | 203 | 204 | ### Installing Caddy with Cloudflare DNS plugin 205 | 206 | Caddy does not come by default with Cloudflare DNS plugin, you need to install it yourself. 207 | 208 | There are two main methods: 209 | 210 | 1. Using `xcaddy` - CLI tool to build your own Caddy build 211 | 2. Downloading prebuilt binary from [Caddy's download page](https://caddyserver.com/download). 212 | 3. Using Ansible to download and install Caddy with plugins. See [caddy-ansible](https://github.com/caddy-ansible/caddy-ansible) 213 | 214 | #### Build Caddy using `xcaddy` on your server 215 | 216 | Please refer to [Caddy docs on building Caddy](https://caddyserver.com/docs/build#xcaddy). 217 | 218 | ### Obtaining CloudFlare API Token 219 | 220 | After installing acme.sh, we need to fetch a CloudFlare API key. Please make sure that a DNS record (A or CNAME record) is pointing to your target node, and set the cloud to grey (bypassing CloudFlare proxy). Then go to My Profile > API keys and on Global API Key subtab, click on "view", enter your CloudFlare password, and copy the API key to clipboard. 221 | 222 | After install Caddy with Cloudflare DNS plugin, we need to fetch a Cloudflare API token. 223 | Please make sure that a DNS record (A or CNAME record) is pointing at your target node. 224 | Then go to My Profile > API Tokens and on API Tokens click "Create Token". 225 | Create API Token > API token templates, at the end of line with "Edit zone DNS", click "Use template". Under **Zone Resources**, select your DNS zone for which you wish to create the API token, click "Continue to summary". 226 | Review the API token summary and click "Create Token". Finally copy the API token to clipboard. 227 | 228 | ### Reconfiguring Caddy to use Cloudflare DNS for obtaining certificates 229 | 230 | Create an environment variable file (like `.env`), keep in mind that this file contains secrets and should not be accessed by public. 231 | 232 | We recommend that you create the secret file in the following location: `/etc/caddy/.secrets.env`. 233 | 234 | ```sh 235 | CLOUDFLARE_API_TOKEN= 236 | ``` 237 | 238 | For security reasons, we recommend setting permissions to `0600` (only owner can read or write to the file). 239 | 240 | ```sh 241 | # Set ownership of the `.secrets.env` file to `caddy` system user 242 | sudo chown caddy:caddy /etc/caddy/.secrets.env 243 | 244 | # Set read-write permissions only to owner - the `caddy` system user 245 | sudo chmod 0600 /etc/caddy/.secrets.env 246 | ``` 247 | 248 | Modify the systemd unit file, to load environment variables from file (add `--envfile /etc/caddy/.secrets.env` flag to `ExecStart`), the default systemd unit file location is `/etc/systemd/system/caddy.service`: 249 | 250 | ```unit {12} 251 | [Unit] 252 | Description=Caddy 253 | Documentation=https://caddyserver.com/docs/ 254 | After=network.target network-online.target 255 | Requires=network-online.target 256 | 257 | [Service] 258 | Type=notify 259 | User=caddy 260 | Group=caddy 261 | ExecStart=/usr/bin/caddy run --environ --envfile /etc/caddy/.secrets.env --config /etc/caddy/Caddyfile 262 | ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile 263 | TimeoutStopSec=5s 264 | LimitNOFILE=1048576 265 | LimitNPROC=512 266 | PrivateTmp=true 267 | ProtectSystem=full 268 | AmbientCapabilities=CAP_NET_BIND_SERVICE 269 | 270 | [Install] 271 | WantedBy=multi-user.target 272 | ``` 273 | 274 | You can add a `tls` block to your `Caddyfile`, under the `` block of your panel configuration, the Caddy config file location is `/etc/caddy/Caddyfile`: 275 | 276 | ```caddyfile {5-7} 277 | { 278 | # ...s 279 | 280 | tls { 281 | dns cloudflare {env.CLOUDFLARE_API_TOKEN} 282 | } 283 | } 284 | ``` 285 | 286 | 287 | -------------------------------------------------------------------------------- /docs/guides/uninstalling.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | # Uninstalling 6 | 7 | This guide will show you how to uninstall the Pelican Panel and Wings. Note that the uninstallation of dependency services is not covered here. 8 | 9 | 10 | **You will lose all data and this action is irreversible!** 11 | 12 | 13 | ## Panel 14 | 15 | ### Panel files 16 | 17 | First, run the following command to delete all panel files. 18 | 19 | ```sh 20 | sudo rm -rf /var/www/pelican 21 | ``` 22 | 23 | ### Webserver config 24 | 25 | Next, remove the Pelican webserver config. 26 | 27 | 28 | 29 | ```sh 30 | sudo rm /etc/nginx/sites-enabled/pelican.conf 31 | sudo rm /etc/nginx/sites-available/pelican.conf 32 | 33 | systemctl restart nginx 34 | ``` 35 | 36 | 37 | ```sh 38 | sudo rm /etc/apache2/sites-enabled/pelican.conf 39 | sudo rm /etc/apache2/sites-available/pelican.conf 40 | 41 | systemctl restart apache2 42 | ``` 43 | 44 | 45 | ```sh 46 | sudo rm /etc/caddy/Caddyfile 47 | 48 | systemctl restart caddy 49 | ``` 50 | 51 | 52 | 53 | ### Queue worker service 54 | 55 | Finally, remove the queue worker service. 56 | 57 | ```sh 58 | systemctl disable --now pelican-queue 59 | sudo rm /etc/systemd/system/pelican-queue.service 60 | ``` 61 | 62 | ### (Optional) Panel database 63 | 64 | If you used MySQL/ MariaDB and also want to remove the panel database, run the following commands: 65 | 66 | ```sh 67 | mysql -u root -p 68 | 69 | DROP DATABASE panel; 70 | DROP USER 'pelican'@'127.0.0.1'; 71 | ``` 72 | 73 | ## Wings 74 | 75 | ### Wings service 76 | 77 | To uninstall Wings you just have to remove the wings service, delete the wings binary and delete the wings config file. 78 | 79 | ```sh 80 | systemctl disable --now wings 81 | sudo rm /etc/systemd/system/wings.service 82 | 83 | sudo rm /usr/local/bin/wings 84 | sudo rm -rf /etc/pelican 85 | ``` 86 | 87 | ### (Optional) Server data & backups 88 | 89 | If you also want to remove all server files and backups run the following command: 90 | 91 | ```sh 92 | sudo rm -rf /var/lib/pelican 93 | ``` 94 | -------------------------------------------------------------------------------- /docs/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: welcome 3 | --- 4 | 5 | import Admonition from '@theme/Admonition'; 6 | 7 | # Welcome to Pelican! 8 | 9 | ### Who is Pelican? 10 | In the realm of technology and hosting services, bold pioneers left the constraints of Pterodactyl to forge their own path. 11 | 12 | United by a shared vision and a relentless pursuit of excellence, They came together to form Pelican—a beacon of innovation and reliability. 13 | 14 | Together, they form the heart and soul of Pelican—a company defined not only by its technological prowess but also by its unwavering dedication to customer satisfaction. 15 | 16 | With innovation as their compass and collaboration as their strength, Pelican soars to new heights, shaping the future of server management with each triumphant flight. 17 | 18 | ### Core Team 19 | 20 | | Name | Discord | Role | 21 | |--------------------------------------------------------|-----------------|-----------------------------| 22 | | [Lance Pioch](https://github.com/lancepioch) | `shadowlancer` | Project Lead & Fullstack Dev| 23 | | [Michael Parker](https://github.com/parkervcp) | `parkervcp` | Egg / Docker Maintainer | 24 | | [Charles Morgan](https://github.com/notAreYouScared) | `areyouscared` | Fullstack Dev | 25 | | [Alex 'Scai' Vlad](https://github.com/alexevladgabriel)| `.scai` | Fullstack Dev | 26 | | [Boy132](https://github.com/boy132) | `boy132` | Fullstack Dev | 27 | | [Martin Oscar](https://github.com/RMartinOscar) | `rmartinoscar` | Fullstack Dev | 28 | 29 | Core members of Pelican have a light blue username in Discord. 30 | 31 | ### Community Staff 32 | 33 | | Name | Discord | Role | 34 | |------------------------------------------------|---------------|---------------| 35 | | [Trixter](https://github.com/TrixterTheTux) | `trixter` | Moderator | 36 | | [Quinten](https://github.com/QuintenQVD0) | `quintenqvd` | Egg Maintainer| 37 | | [Red-Thirten](https://github.com/lilkingjr1) | `red_thirten` | Egg Maintainer| 38 | 39 | Community Staff have a darker blue username in Discord. 40 | ### What is Pelican? 41 | Pelican is an open-source game server management tool built upon Pterodactyl. 42 | Pelican runs all servers in isolated Docker containers to keep them separate. 43 | 44 | ### Open Source! 45 | Pelican is open-source and open to users to browse the code and hunt for security issues. 46 | 47 | 48 | If you come across anything that raises a red flag for you, please reach out directly to **team@pelican.dev** 49 | We ask that you be responsible when disclosing security concerns and that you do **not** report them on Github. 50 | 51 | -------------------------------------------------------------------------------- /docs/panel/advanced/artisan.mdx: -------------------------------------------------------------------------------- 1 | # Artisan Commands 2 | This is very much a WIP! Many Many commands, Layout might change. 3 | 4 | Updated: 01/11/2025 5 | ## User Commands 6 | ### Create a User 7 | 8 | Creates a user on the system via the CLI. 9 | ```sh 10 | php artisan p:user:make [options] 11 | ``` 12 | 13 | ```sh 14 | Options: 15 | --email[=EMAIL] 16 | --username[=USERNAME] 17 | --password[=PASSWORD] 18 | --admin[=ADMIN] 19 | --no-password 20 | -q, --quiet Do not output any message 21 | -V, --version Display this application version 22 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 23 | -n, --no-interaction Do not ask any interactive question 24 | ``` 25 | 26 | ### Delete a User 27 | 28 | Deletes a user from the Panel if no servers are attached to their account. 29 | ```sh 30 | php artisan p:user:delete [options] 31 | ``` 32 | 33 | ```sh 34 | Options: 35 | --user[=USER] 36 | -q, --quiet Do not output any message 37 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 38 | -n, --no-interaction Do not ask any interactive question 39 | ``` 40 | 41 | ### Disable 2fa for a single User 42 | 43 | Disable two-factor authentication for a specific user in the Panel. 44 | ```sh 45 | php artisan p:user:disable2fa [options] 46 | ``` 47 | 48 | ```sh 49 | Options: 50 | --email[=EMAIL] The email of the user to disable 2-Factor for. 51 | -q, --quiet Do not output any message 52 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 53 | -n, --no-interaction Do not ask any interactive question 54 | 55 | ``` 56 | 57 | ## Editing the Environment 58 | 59 | ### Editing Cache 60 | ```sh 61 | php artisan p:environment:cache [options] 62 | ``` 63 | 64 | ```sh 65 | Options: 66 | --driver[=DRIVER] The cache driver backend to use. 67 | --redis-host[=REDIS-HOST] Redis host to use for connections. 68 | --redis-user[=REDIS-USER] User used to connect to redis. 69 | --redis-pass[=REDIS-PASS] Password used to connect to redis. 70 | --redis-port[=REDIS-PORT] Port to connect to redis over. 71 | -q, --quiet Do not output any message 72 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 73 | -n, --no-interaction Do not ask any interactive question 74 | ``` 75 | 76 | ### Editing Database 77 | ```sh 78 | php artisan p:environment:database [options] 79 | ``` 80 | 81 | ```sh 82 | Options: 83 | --driver[=DRIVER] The database driver backend to use. 84 | --database[=DATABASE] The database to use. 85 | --host[=HOST] The connection address for the MySQL/ MariaDB server. 86 | --port[=PORT] The connection port for the MySQL/ MariaDB server. 87 | --username[=USERNAME] Username to use when connecting to the MySQL/ MariaDB server. 88 | --password[=PASSWORD] Password to use for the MySQL/ MariaDB database. 89 | -q, --quiet Do not output any message 90 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 91 | -n, --no-interaction Do not ask any interactive question 92 | ``` 93 | ### Editing Mail 94 | ```sh 95 | php artisan p:environment:mail [options] 96 | ``` 97 | 98 | ```sh 99 | Options: 100 | --driver[=DRIVER] The mail driver to use. 101 | --email[=EMAIL] Email address that messages from the Panel will originate from. 102 | --from[=FROM] The name emails from the Panel will appear to be from. 103 | --encryption[=ENCRYPTION] 104 | --host[=HOST] 105 | --port[=PORT] 106 | --endpoint[=ENDPOINT] 107 | --username[=USERNAME] 108 | --password[=PASSWORD] 109 | -q, --quiet Do not output any message 110 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 111 | -n, --no-interaction Do not ask any interactive question 112 | ``` 113 | ### Editing Queue 114 | ```sh 115 | php artisan p:environment:queue [options] 116 | ``` 117 | 118 | ```sh 119 | Options: 120 | --driver[=DRIVER] The queue driver backend to use. 121 | --redis-host[=REDIS-HOST] Redis host to use for connections. 122 | --redis-user[=REDIS-USER] User used to connect to redis. 123 | --redis-pass[=REDIS-PASS] Password used to connect to redis. 124 | --redis-port[=REDIS-PORT] Port to connect to redis over. 125 | -q, --quiet Do not output any message 126 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 127 | -n, --no-interaction Do not ask any interactive question 128 | ``` 129 | ### Editing Queue Service 130 | ```sh 131 | php artisan p:environment:queue-service [options] 132 | ``` 133 | 134 | ```sh 135 | Options: 136 | --service-name[=SERVICE-NAME] Name of the queue worker service. 137 | --user[=USER] The user that PHP runs under. 138 | --group[=GROUP] The group that PHP runs under. 139 | --overwrite Force overwrite if the service file already exists. 140 | -q, --quiet Do not output any message 141 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 142 | -n, --no-interaction Do not ask any interactive question 143 | ``` 144 | ### Editing Session 145 | ```sh 146 | php artisan p:environment:session [options] 147 | ``` 148 | 149 | ```sh 150 | Options: 151 | --driver[=DRIVER] The queue driver backend to use. 152 | --redis-host[=REDIS-HOST] Redis host to use for connections. 153 | --redis-user[=REDIS-USER] User used to connect to redis. 154 | --redis-pass[=REDIS-PASS] Password used to connect to redis. 155 | --redis-port[=REDIS-PORT] Port to connect to redis over. 156 | -q, --quiet Do not output any message 157 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 158 | -n, --no-interaction Do not ask any interactive question 159 | ``` 160 | ### Setting cache, queue & session driver at once 161 | ```sh 162 | php artisan p:redis:setup [options] 163 | ``` 164 | 165 | ```sh 166 | Options: 167 | --redis-host[=REDIS-HOST] Redis host to use for connections. 168 | --redis-user[=REDIS-USER] User used to connect to redis. 169 | --redis-pass[=REDIS-PASS] Password used to connect to redis. 170 | --redis-port[=REDIS-PORT] Port to connect to redis over. 171 | -q, --quiet Do not output any message 172 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 173 | -n, --no-interaction Do not ask any interactive question 174 | ``` 175 | ### Editing Setup 176 | ```sh 177 | php artisan p:environment:setup [options] 178 | ``` 179 | 180 | ```sh 181 | Options: 182 | -q, --quiet Do not output any message 183 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 184 | -n, --no-interaction Do not ask any interactive question 185 | ``` 186 | 187 | ## Migrations 188 | ### Migration Command 189 | ```sh 190 | php artisan migrate [options] 191 | ``` 192 | 193 | ```sh 194 | Options: 195 | --database[=DATABASE] The database connection to use 196 | --force Force the operation to run when in production 197 | --path[=PATH] The path(s) to the migrations files to be executed (multiple values allowed) 198 | --realpath Indicate any provided migration file paths are pre-resolved absolute paths 199 | --schema-path[=SCHEMA-PATH] The path to a schema dump file 200 | --pretend Dump the SQL queries that would be run 201 | --seed Indicates if the seed task should be re-run 202 | --seeder[=SEEDER] The class name of the root seeder 203 | --step Force the migrations to be run so they can be rolled back individually 204 | --graceful Return a successful exit code even if an error occurs 205 | --isolated[=ISOLATED] Do not run the command if another instance of the command is already running [default: false] 206 | -q, --quiet Do not output any message 207 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 208 | -n, --no-interaction Do not ask any interactive question 209 | ``` 210 | ### Running Migations 211 | ```sh 212 | php artisan migrate 213 | ``` 214 | 215 | ### Rollback previous Migration 216 | ```sh 217 | php artisan migrate:rollback [options] 218 | ``` 219 | 220 | ```sh 221 | Options: 222 | --database[=DATABASE] The database connection to use 223 | --force Force the operation to run when in production 224 | --path[=PATH] The path(s) to the migrations files to be executed (multiple values allowed) 225 | --realpath Indicate any provided migration file paths are pre-resolved absolute paths 226 | --pretend Dump the SQL queries that would be run 227 | --step[=STEP] The number of migrations to be reverted 228 | --batch=BATCH The batch of migrations (identified by their batch number) to be reverted 229 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 230 | -n, --no-interaction Do not ask any interactive question 231 | ``` 232 | 233 | ### Check Migration Status 234 | ```sh 235 | php artisan migrate:status [options] 236 | ``` 237 | ```sh 238 | Options: 239 | --database[=DATABASE] The database connection to use 240 | --pending[=PENDING] Only list pending migrations [default: false] 241 | --path[=PATH] The path(s) to the migrations files to use (multiple values allowed) 242 | --realpath Indicate any provided migration file paths are pre-resolved absolute paths 243 | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output 244 | -n, --no-interaction Do not ask any interactive question 245 | ``` 246 | Providing no extra options, `php artisan migrate:status`, You should see an output similar to the below 247 | ```sh title='Migration Status Output' 248 | Migration name .............................................................................. Batch / Status 249 | 2016_01_23_195641_add_allocations_table ............................................................ [1] Ran 250 | 2016_01_23_195851_add_api_keys ..................................................................... [1] Ran 251 | ... 252 | ... 253 | 2024_07_12_095213_fix_missing_sqlite_foreign_keys .................................................. [1] Ran 254 | 2024_08_13_171337_fix_allocation_server_foreign_key ................................................ [2] Ran 255 | ``` 256 | If any show `PENDING` or `FAILED`. Open a support thread on our discord for further assistance. 257 | 258 | ## Clearing Cache 259 | 260 | The below commands are helpful if you need to clear the config or application cache. 261 | 262 | ```sh 263 | php artisan cache:clear # Clears application cache 264 | ``` 265 | ```sh 266 | php artisan config:clear # Clears configuration cache 267 | ``` 268 | -------------------------------------------------------------------------------- /docs/panel/advanced/docker.mdx: -------------------------------------------------------------------------------- 1 | # Docker 2 | 3 | Pelican provides pre-built Docker images via GitHub Packages. `ghcr.io/pelican-dev/panel:latest` is the current latest release, and `ghcr.io/pelican-dev/panel:main` is built automatically from the current `main` branch. Deploying the panel in Docker is still a work in progress. While the plan is to make Docker the preferred installation method, we currently recommend the [standard deployment instructions](/docs/panel/getting-started) 4 | 5 | This guide requires Docker CE. (Docker Compose has been included in the Docker CLI since v2. Docker Compose v1 is unsupported.) For instructions on installing and configuring Docker, see the [installation guide](/docs/guides/docker). 6 | 7 | ## Basics 8 | 9 | The easiest deployment method is using the standard `compose.yml` file. 10 | 11 | This configuration includes an integrated web server that will automatically obtain SSL certificates if you are serving over HTTPS. For the database, it assumes you want to use SQLite (or you have an external database server to configure using the installer.) It also assumes you intend to use the Filesystem driver for cache, filesystem or database driver for session, and database driver for queue (or you have an external Redis server to configure using the installer.) If you want to use other options built into Docker, see [Advanced Options](#advanced-options). 12 | 13 | ### Create compose.yml 14 | 15 | ```yml {17,18} title="compose.yml" 16 | services: 17 | panel: 18 | image: ghcr.io/pelican-dev/panel:latest 19 | restart: always 20 | networks: 21 | - default 22 | ports: 23 | - "80:80" 24 | - "443:443" 25 | extra_hosts: 26 | - "host.docker.internal:host-gateway" 27 | volumes: 28 | - pelican-data:/pelican-data 29 | - pelican-logs:/var/www/html/storage/logs 30 | environment: 31 | XDG_DATA_HOME: /pelican-data 32 | APP_URL: "http://localhost" 33 | ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" 34 | 35 | volumes: 36 | pelican-data: 37 | pelican-logs: 38 | 39 | networks: 40 | default: 41 | ipam: 42 | config: 43 | - subnet: 172.20.0.0/16 44 | ``` 45 | 46 | ### Set Required Environment Variables 47 | 48 | 1. Set `APP_URL` to the base URL your panel will be reachable on, including the protocol (https:// or http://) and port. 49 | - Note that Caddy, the integrated webserver, will serve a 308 redirect to any requests on port 80 if the `APP_URL` begins with `https://`. If your final site will be reachable over HTTPS but TLS (SSL) will be handled and terminated by an upstream server, such as a reverse proxy, you will need to use a [custom caddyfile](#custom-caddyfile). 50 | 2. Set the `ADMIN_EMAIL` to your email address. Caddy will use this email address to generate a LetsEncrypt SSL certificate if you are serving via HTTPS. 51 | 52 | Now, close and save changes to `compose.yml`. 53 | 54 | ### Starting 55 | 56 | From the directory in which the compose file is located, run: 57 | 58 | ```sh 59 | docker compose up -d 60 | ``` 61 | 62 | ### Back Up Your Encryption Key 63 | 64 | The first time the container starts, it will generate an `APP_KEY` which is used as an encryption key. This will be saved automatically, but you should save a copy in a secure place in case you need it later. 65 | 66 | ```sh 67 | docker compose logs panel | grep 'Generated app key:' 68 | ``` 69 | 70 | ### Installing 71 | 72 | Open the installer in your browser at `APP_URL/installer` to finish setting up the panel. 73 | 74 | :::note 75 | The first time the container starts after installing or updating, it will apply database migrations, which may take a few minutes. The panel will not be accessible during this process. 76 | ::: 77 | 78 | #### Sensible Driver Defaults: 79 | 80 | * Cache Driver: Filesystem 81 | * Database Driver: SQLite 82 | * Queue Driver: Database 83 | * Session Driver: Filesystem 84 | 85 | For other configuration, such as UI options, CAPTCHA, email, backups and OAuth, head to the settings menu in the admin panel. 86 | 87 | ### Stopping 88 | 89 | The panel will automatically restart if the container crashes or the host restarts. If you need to non-destructively stop the panel for any reason, navigate back to the directory containing `compose.yml` and run: 90 | 91 | ```sh 92 | docker compose down 93 | ``` 94 | 95 | ### Uninstalling 96 | 97 | To uninstall the panel, navigate to the directory containing `compose.yml` and run: 98 | 99 | ```sh 100 | docker compose down -v 101 | ``` 102 | 103 | :::danger 104 | **This will permanently delete the panel and all associated data including the SQLite database and your encryption key.** 105 | ::: 106 | 107 | ## Advanced Options 108 | 109 | ### Custom Caddyfile 110 | 111 | The default Caddyfile will work for standard installations. If you need to edit the configuration of the integrated webserver, such as to place it behind a reverse proxy that terminates TLS, you can do so by bind-mounting a Caddyfile on the host to `/etc/caddy/Caddyfile` inside the container. 112 | 113 | This example assumes there is a Caddyfile in the same directory as the `compose.yml` file. 114 | 115 | ```yml {15} title="compose.yml" 116 | services: 117 | panel: 118 | image: ghcr.io/pelican-dev/panel:latest 119 | restart: always 120 | networks: 121 | - default 122 | ports: 123 | - "80:80" 124 | - "443:443" 125 | extra_hosts: 126 | - "host.docker.internal:host-gateway" 127 | volumes: 128 | - pelican-data:/pelican-data 129 | - pelican-logs:/var/www/html/storage/logs 130 | - ./Caddyfile:/etc/caddy/Caddyfile 131 | environment: 132 | XDG_DATA_HOME: /pelican-data 133 | APP_URL: "http://localhost" 134 | ADMIN_EMAIL: "USEYOUROWNEMAILHERE@example.com" 135 | 136 | volumes: 137 | pelican-data: 138 | pelican-logs: 139 | 140 | networks: 141 | default: 142 | ipam: 143 | config: 144 | - subnet: 172.20.0.0/16 145 | ``` 146 | 147 | An example Caddyfile for hosting the panel behind a reverse proxy is shown below. It exposes the panel on port 80 regardless of the Host header, and will not attempt to obtain a TLS certificate. `[UPSTREAM IP]` must be replaced with the IP address of the reverse proxy. 148 | 149 | ```caddyfile title="Caddyfile" 150 | { 151 | admin off 152 | servers { 153 | trusted_proxies static [UPSTREAM IP] 154 | } 155 | } 156 | 157 | :80 { 158 | root * /var/www/html/public 159 | encode gzip 160 | 161 | php_fastcgi 127.0.0.1:9000 162 | file_server 163 | } 164 | ``` 165 | 166 | :::info 167 | **Note:** If the trusted directive is not set or improperly configured, file uploads will fail. Commonly, when the reverse proxy is running outside of Docker, the IP address will not match `127.0.0.1`, but will instead match a Docker bridge interface or `docker0`. 168 | ::: 169 | 170 | #### Raising file upload limits 171 | 172 | The default file upload limit is 2MB. To raise this limit, modify the `Caddyfile` file as such: 173 | 174 | ```caddyfile {6-9} title="Caddyfile" 175 | { 176 | ... 177 | 178 | encode gzip 179 | 180 | php_fastcgi 127.0.0.1:9000 { 181 | env PHP_VALUE "upload_max_filesize = 256M 182 | post_max_size = 256M" 183 | } 184 | file_server 185 | } 186 | ``` 187 | -------------------------------------------------------------------------------- /docs/panel/advanced/mysql.mdx: -------------------------------------------------------------------------------- 1 | # MySQL 2 | 3 | ## Install MariaDB 4 | 5 | MariaDB is a MySQL fork and the preferred MySQL software. Run the following commands to quickly install it. 6 | 7 | ```sh 8 | curl -sSL https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash 9 | sudo apt install -y mariadb-server 10 | ``` 11 | 12 | ## Create User & Database 13 | 14 | ### Logging In 15 | 16 | After installing you want to login to the MySQL command line where we will be executing statements to get 17 | things setup. To do so, simply run the command below and provide the Root MySQL account's password that you setup when 18 | installing MySQL. If you do not remember doing this, chances are you can just hit enter as no password is set. 19 | 20 | ```sh 21 | mysql -u root -p 22 | ``` 23 | 24 | ### Creating User 25 | 26 | Next, we will create a user called `pelican` and allow logins from localhost which prevents any external connections 27 | to our database. You can also use `%` as a wildcard or enter a numeric IP. We will also set the account password 28 | to `somePassword`. 29 | 30 | ```sql 31 | CREATE USER 'pelican'@'127.0.0.1' IDENTIFIED BY 'somePassword'; 32 | ``` 33 | 34 | ### Creating Database 35 | 36 | Next, we need to create a database for the panel. In this tutorial we will be naming the database `panel`, but you can 37 | substitute that for whatever name you wish. 38 | 39 | ```sql 40 | CREATE DATABASE panel; 41 | ``` 42 | 43 | ### Assigning Permissions 44 | 45 | Finally, we need to tell MySQL that our pelican user should have access to the panel database. To do this, simply 46 | run the command below. 47 | 48 | ```sql 49 | GRANT ALL PRIVILEGES ON panel.* TO 'pelican'@'127.0.0.1'; 50 | ``` 51 | 52 | ## Setup Pelican for MySQL 53 | 54 | If you are switching to MySQL after installing the Panel you have to run the database setup command below. 55 | **You do not have to run this if this is the first time you are installing the Panel. You will provide the database data via the Web Installer.** 56 | 57 | ```sh 58 | cd /var/www/pelican 59 | php artisan p:environment:database 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/panel/advanced/redis.mdx: -------------------------------------------------------------------------------- 1 | # Redis 2 | 3 | ## Install Redis 4 | 5 | To install Redis you first need add their repository. 6 | 7 | ```sh 8 | curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg 9 | echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list 10 | ``` 11 | 12 | Now you can install Redis by simply running the following commands. 13 | 14 | ```sh 15 | sudo apt update -y 16 | sudo apt install -y redis-server 17 | ``` 18 | 19 | Also make sure to enable that redis will start on boot. You can do that by running the following command: 20 | 21 | ```sh 22 | sudo systemctl enable --now redis-server 23 | ``` 24 | 25 | ## Setup Pelican for Redis 26 | 27 | ### Use Redis as driver 28 | 29 | If you are switching to Redis after installing the Panel you have to run the setup command below. 30 | **You do not have to run this if this is the first time you are installing the Panel. You will provide the redis data via the Web Installer.** 31 | 32 | ```sh 33 | cd /var/www/pelican 34 | php artisan p:redis:setup 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/panel/getting-started.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | # Getting Started 6 | 7 | Pelican Panel is designed to run on your webserver. 8 | 9 | You are expected to read through our documentation. 10 | We have spent a lot of time curating these docs for the community, 11 | so please take some time to read through them before asking for help on the forums! 12 | 13 | 14 | **You should have some basic familiarity with Linux before you proceed!** 15 | 16 | 17 | 18 | Pelican is currently in **Beta**! Some things might change / break between beta versions! 19 | 20 | 21 | ### Picking an Operating System (OS) 22 | 23 | Pelican runs on a wide range of operating systems, so pick whichever you are most comfortable using. Note: Other OS's, not listed below, might still work. 24 | 25 | 26 | OpenVZ, **unless specifically configured**, will **not** work with Pelican. 27 | 28 | 29 | | Operating System | Version | Supported | Notes | 30 | |:----------------:|:--------:|:---------:|:---------------------------------------------------------------------:| 31 | | **Ubuntu** | 22.04 | ✅︎︎ | | 32 | | | **24.04**| ✅︎ | Documentation written assuming Ubuntu 24.04 as the base OS. | 33 | | **Alma Linux** | 10 | ✅︎ | | 34 | | | 9 | ⚠️ | **No SQLite Support** | 35 | | | 8 | ⚠️ | **No SQLite Support** | 36 | | **Rocky Linux** | 9 | ⚠️ | **No SQLite Support** | 37 | | | 8 | ⚠️ | **No SQLite Support** | 38 | | **CentOS** | 10 | ✅︎ | | 39 | | **Debian** | 11 | ⚠️ | **No SQLite Support** | 40 | | | 12 | ✅︎ | | 41 | 42 | SQLite support depends on [libsqlite3-0_3.35+](https://pkgs.org/download/libsqlite3-0) being on the host system. 43 | **No SQLite Support** means you'll have to build the package from source. 44 | 45 | ### Dependencies 46 | 47 | For the Panel you need to install **PHP `8.4` (recommended), `8.3` or `8.2`**, with the following **extensions**: 48 | `gd`, `mysql`, `mbstring`, `bcmath`, `xml`, `curl`, `zip`, `intl`, `sqlite3` and `fpm`. 49 | 50 | You will also need a Webserver. Currently, **Apache, NGINX or Caddy** are supported. 51 | 52 | If you want to use MySQL or MariaDB for the panel database make sure to install either **MySQL 8+ or MariaDB 10.6+**. (both client and server!) 53 | 54 | Finally, for some commands during the installation you need `curl`, `tar` and `unzip`. 55 | 56 | 57 | Please make sure you installed **all** needed dependencies before continuing! 58 | 59 | 60 | ### Create Directories & Downloading Files 61 | 62 | The first step in this process is to create the folder where the panel will live and then move ourselves into that 63 | newly created folder. 64 | 65 | ```sh 66 | sudo mkdir -p /var/www/pelican 67 | cd /var/www/pelican 68 | ``` 69 | 70 | Once you have created a new directory to use and moved into it, you'll need to download the Panel files. 71 | This is as simple as using `curl` to download the latest release. 72 | 73 | ```sh 74 | curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv 75 | ``` 76 | 77 | ### Install Composer 78 | 79 | Next we will set up Composer along with the required dependencies. 80 | 81 | ``` bash 82 | curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer 83 | ``` 84 | 85 | ```sh 86 | sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader 87 | ``` 88 | 89 | 90 | Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! 91 | 92 | -------------------------------------------------------------------------------- /docs/panel/optional-config.mdx: -------------------------------------------------------------------------------- 1 | # Optional Configuration 2 | 3 | ## Backups 4 | 5 | Pelican allows users to create backups of their servers. To create backups, a backup storage method has to be configured. 6 | 7 | When changing Pelican's backup storage method, users may still download or delete existing backups from the prior storage driver. In the instance of migrating from S3 to local backups, S3 credentials must remain configured after switching to the local backup storage method. 8 | 9 | Make sure to clear the config cache (`cd /var/www/pelican && php artisan config:clear`) and to restart the queue worker (`systemctl restart pelican-queue`) after changing the backup driver to apply the changes. 10 | 11 | ### Using Local Backups 12 | 13 | By default, Pelican uses local storage via Wings for backups. That said, this method of backup storage can be explicitly set within the Settings Page on the Admin side of the panel. 14 | 15 | 16 | Please note that, when using local storage via Wings, the destination for backups is set in the Wings config file with the following setting key: 17 | 18 | ```yml {2} 19 | system: 20 | backup_directory: /path/to/backup/storage 21 | ``` 22 | 23 | ### Using S3 Backups 24 | 25 | AWS S3 (or compatible storage) can be used to store remote or cloud-based backups. This can be configured in the Settings Page on the Admin side of the panel. 26 | 27 | For some configurations, you might have to change your S3 URL from `bucket.domain.com` to `domain.com/bucket`. To accomplish this, add `AWS_USE_PATH_STYLE_ENDPOINT=true` to your `.env` file. 28 | 29 | #### Multipart Upload 30 | 31 | The S3 backup is using the S3 multipart upload capabilities. In rare situations, you might want to adjust the size of a single part or the lifespan of the generated pre-signed URLs. The default part size is 5GB, and the default pre-signed URL lifespan is 60 minutes. 32 | 33 | You can configure the maximal part size using the `BACKUP_MAX_PART_SIZE` environment variable. You must specify the size in bytes. To define the pre-signed URL lifespan, use the `BACKUP_PRESIGNED_URL_LIFESPAN` variable. The expected unit is minutes. 34 | 35 | The following `.env` snippet configures 1GB parts and uses 120 minutes as the pre-signed URL lifespan: 36 | 37 | ```sh 38 | BACKUP_MAX_PART_SIZE=1073741824 39 | BACKUP_PRESIGNED_URL_LIFESPAN=120 40 | ``` 41 | 42 | #### Storage Class 43 | 44 | Should you need to specify a storage class, use the `AWS_BACKUPS_STORAGE_CLASS` environment variable. The default option is `STANDARD` (S3 Standard). 45 | 46 | ```sh 47 | AWS_BACKUPS_STORAGE_CLASS= 48 | ``` 49 | 50 | ## Reverse Proxy Setup 51 | 52 | When running Pelican behind a reverse proxy, such as [Cloudflare's Flexible SSL](https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean-) 53 | or NGINX/Apache/Caddy, etc., you will need to make a quick modification to the Panel to ensure things continue to work as expected. By default, when using these reverse proxies, 54 | your Panel will not correctly handle requests. You'll most likely be unable to login or see security warnings in your browser console as it attempts to load insecure assets. 55 | This is because the internal logic the Panel uses to determine how links should be generated thinks it is running over HTTP and not over HTTPS. 56 | 57 | You will need to edit trusted proxies, on the Settings page. We highly suggest providing a specific IP address 58 | (or comma-separated list of IPs) rather than allowing `*`. For example, if your proxy is running on the same machine as the server, 59 | the chances are that using `127.0.0.1` would work for you. 60 | 61 | ### NGINX Specific Configuration 62 | 63 | To properly respond to an NGINX reverse proxy, the NGINX `location` config must contain the following lines: 64 | 65 | ```NGINX 66 | proxy_set_header X-Real-IP $remote_addr; 67 | proxy_set_header Host $host; 68 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 69 | proxy_set_header X-Forwarded-Proto $scheme; 70 | proxy_redirect off; 71 | proxy_buffering off; 72 | proxy_request_buffering off; 73 | ``` 74 | 75 | ### Cloudflare Specific Configuration 76 | 77 | If you're using Cloudflare's Flexible SSL you should set `TRUSTED_PROXIES` to contain [their IP addresses](https://www.cloudflare.com/ips/). 78 | 79 | You can easily do this on the Settings page in the Panel. 80 | 81 | ## reCAPTCHA 82 | 83 | The Panel uses invisible reCAPTCHA to secure the login page from brute-force attacks. If the login attempt is considered suspicious, users may be required to perform a reCAPTCHA challenge. 84 | 85 | ### Configuring reCAPTCHA 86 | 87 | While we provide a global Site Key and Secret Key by default, we highly recommend changing it for your own setup. 88 | 89 | You can generate your own keys in the [reCAPTCHA Admin Console](https://www.google.com/recaptcha/admin). 90 | 91 | The keys can then be applied using the Settings in the Panel. 92 | 93 | #### Disabling Recaptcha 94 | 95 | If you cannot access your panel, you can modify the `.env` directly to disable it. 96 | 97 | Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `RECAPTCHA_ENABLED` to `false`. 98 | 99 | ## 2FA 100 | 101 | If possible you should use the panel to update your 2FA settings. If you can't access your panel for whatever reason you can use the following steps. 102 | 103 | ### Disable 2FA requirement 104 | 105 | Edit the `.env` in the panel's root directory `/var/www/pelican/` and change the value of `APP_2FA_REQUIRED` to `0`. 106 | 107 | ### Disable 2FA for a specific user 108 | 109 | Run the following command in your `/var/www/pelican` directory. 110 | 111 | ```sh 112 | php artisan p:user:disable2fa 113 | ``` 114 | -------------------------------------------------------------------------------- /docs/panel/panel-setup.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | # Panel Setup 6 | 7 | The core environment is easily configured using a single CLI command & the web installer built into the app. 8 | These steps will cover setting up things such as sessions, caching, database credentials, and email sending. 9 | 10 | Running `php artisan p:environment:setup` will, if it does not exist, auto create the required `.env` file and generate a `APP_KEY`. 11 | 12 | ```sh 13 | php artisan p:environment:setup 14 | ``` 15 | 16 | 17 | **Back up** your encryption key (APP_KEY in the `.env` file). This is used as an encryption key for all data that needs to be stored securely (e.g. api keys). 18 | Store it somewhere safe - not just on your server. If you lose it all encrypted data is irrecoverable -- **even if you have database backups.** 19 | 20 | 21 | ### Setting Permissions 22 | 23 | The next step in the installation process is to set the correct permissions on the Panel files so that the webserver can 24 | use them correctly. 25 | 26 | ```sh 27 | sudo chmod -R 755 storage/* bootstrap/cache/ 28 | ``` 29 | 30 | 31 | 32 | ```sh 33 | sudo chown -R www-data:www-data /var/www/pelican 34 | ``` 35 | 36 | 37 | ```sh 38 | sudo chown -R nginx:nginx /var/www/pelican 39 | ``` 40 | 41 | 42 | ```sh 43 | sudo chown -R apache:apache /var/www/pelican 44 | ``` 45 | 46 | 47 | 48 | ### Web-Installer 49 | 50 | Once you've set the proper permissions, continue the Panel install on the web interface. 51 | The web installer is located at `/installer` or `/installer`. 52 | 53 | 54 | Make sure to read the [MySQL guide](./advanced/mysql) first if you want to use MySQL/ MariaDB instead of SQLite! 55 | If you want to use Redis make sure to read the [Redis guide](./advanced/redis) first. 56 | 57 | -------------------------------------------------------------------------------- /docs/panel/update.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | # Updating the Panel 6 | 7 | This documentation covers the process for updating the panel portion of Pelican. 8 | 9 | ## Version Requirements 10 | 11 | Each version of Pelican Panel also has a corresponding minimum version of Wings that 12 | is required for it to run. 13 | 14 | Please see the chart below for how these versions line up. In 15 | most cases your base Wings version should match that of your Panel. 16 | 17 | | Panel Version | Wings Version | Supported | PHP Version | 18 | |:-------------:|:-------------:|:---------:|:-----------:| 19 | | 1.x | 1.x | ✅︎ | 8.2/8.3/8.4 | 20 | 21 | ### Enter Maintenance Mode 22 | 23 | Whenever you are performing an update you should be sure to place your Panel into maintenance mode. This will prevent 24 | users from encountering unexpected errors. 25 | 26 | ```sh 27 | cd /var/www/pelican 28 | php artisan down 29 | ``` 30 | 31 | 32 | If you are updating from < 1.0.0-beta13. Please use the below script! This will ensure all the recently deleted files are removed. 33 | 34 | Note: this script is experimental... IT WILL NOT CREATE A MYSQL DUMP FOR YOUR DATABASE! 35 | Note: This script runs all the below commands for you. 36 | 37 | What the script does, is looks for `.env`, and if it exists pulls `DB_CONNECTION` to see if you are using mysql/mariadb/sqlite, if sqlite it will copy the database.sqlite to a backup folder 38 | along with the env. Once they're copied to the backup folder it will delete everything except the backup folder in the specified install directory. 39 | 40 | Proceeds to download the latest release, extracts to install directory, Sets some permissions, runs composer install, restores old sqlite database and .env. Runs Filament Optimize, Updates migrations, asks you to input the webserver for file owner (www-data/apache/nginx), restarts the queue, and Voilà! If you have any issues please reach out on discord! 41 | 42 | If you do not wish to use the script and wish to do it manually, You can delete everything except the `.env` and the sqlite database file, if using sqlite. then follow the standard update process below. 43 | 44 | ```sh 45 | sudo bash -c "$(curl -fsSL https://pelican.dev/updatePanel.sh)" 46 | ``` 47 | 48 | 49 | 50 | ### Download Update 51 | 52 | The first step in the update process is to download the new panel files from GitHub. The command below will download 53 | the release archive for the most recent version of Pelican, save it in the current directory and will automatically 54 | unpack the archive into your current folder. 55 | 56 | ```sh 57 | curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz | sudo tar -xzv 58 | ``` 59 | 60 | Once the archive is downloaded and extracted we need to set the correct permissions on the cache and storage directories to avoid 61 | any webserver related errors. 62 | 63 | ```sh 64 | sudo chmod -R 755 storage/* bootstrap/cache 65 | ``` 66 | 67 | ### Update Dependencies 68 | 69 | ```sh 70 | sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader 71 | ``` 72 | 73 | 74 | Even though composer might tell you that you have outdated dependencies, do **not** run `composer update`! 75 | 76 | 77 | ### Create storage symlinks 78 | 79 | ```sh 80 | php artisan storage:link 81 | ``` 82 | 83 | ### Clear Compiled Template Cache 84 | 85 | You'll also want to clear the compiled template cache to ensure that new and modified templates show up correctly for 86 | users. 87 | 88 | ```sh 89 | php artisan view:clear 90 | php artisan config:clear 91 | ``` 92 | 93 | ## Cache components 94 | 95 | To make sure your panel loads faster you'll want to cache filament components. 96 | 97 | ```sh 98 | php artisan filament:optimize 99 | ``` 100 | 101 | ### Update Database 102 | 103 | You'll also need to update your database schema. Running the command below 104 | will update the schema and ensure the default eggs we ship are up to date (and add any new ones we might have). Just 105 | remember, _never edit core eggs we ship_! They will be overwritten by this update process. 106 | 107 | ```sh 108 | php artisan migrate --seed --force 109 | ``` 110 | 111 | ### Set Permissions 112 | 113 | The last step is to set proper ownership of the files. In most cases this 114 | is `www-data` but can vary from system to system — sometimes being `nginx`, `caddy`, `apache`, or even `nobody`. 115 | 116 | 117 | 118 | ```sh 119 | sudo chown -R www-data:www-data /var/www/pelican 120 | ``` 121 | 122 | 123 | ```sh 124 | sudo chown -R nginx:nginx /var/www/pelican 125 | ``` 126 | 127 | 128 | ```sh 129 | sudo chown -R apache:apache /var/www/pelican 130 | ``` 131 | 132 | 133 | 134 | ### Restart Queue Workers 135 | 136 | After _every update_ you should restart the queue worker. 137 | 138 | ```sh 139 | php artisan queue:restart 140 | ``` 141 | 142 | ### Exit Maintenance Mode 143 | 144 | Now that everything has been updated you need to exit maintenance mode. 145 | 146 | ```sh 147 | php artisan up 148 | ``` 149 | -------------------------------------------------------------------------------- /docs/panel/webserver-config.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | import Tabs from '@theme/Tabs'; 3 | import TabItem from '@theme/TabItem'; 4 | 5 | # Webserver Configuration 6 | 7 | 8 | When using the SSL (https) configuration you MUST create SSL certificates, otherwise your webserver will fail to start. 9 | See the [Creating SSL Certificates](../guides/ssl) documentation page to learn how to create these certificates before continuing. 10 | 11 | 12 | 13 | 14 | 15 | If you're **not** using php8.4, you will need to edit the config file to point to the proper php fpm socket. 16 | 17 | The line is highlighted below. 18 | 19 | First, remove the default NGINX configuration. 20 | ```sh 21 | sudo rm /etc/nginx/sites-enabled/default 22 | ``` 23 | Now, you should paste the contents of the file below, replacing `` with your domain or IP being used in a file called 24 | `pelican.conf` and place the file in `/etc/nginx/sites-available/`. 25 | 26 | 27 | 28 | **Note:** IPs cannot be used with SSL. 29 | 30 | 31 | ```nginx {5,11,25-26,47} title="/etc/nginx/sites-available/pelican.conf" 32 | server_tokens off; 33 | 34 | server { 35 | listen 80; 36 | server_name ; 37 | return 301 https://$server_name$request_uri; 38 | } 39 | 40 | server { 41 | listen 443 ssl http2; 42 | server_name ; 43 | 44 | root /var/www/pelican/public; 45 | index index.php; 46 | 47 | access_log /var/log/nginx/pelican.app-access.log; 48 | error_log /var/log/nginx/pelican.app-error.log error; 49 | 50 | # allow larger file uploads and longer script runtimes 51 | client_max_body_size 100m; 52 | client_body_timeout 120s; 53 | 54 | sendfile off; 55 | 56 | ssl_certificate /etc/letsencrypt/live//fullchain.pem; 57 | ssl_certificate_key /etc/letsencrypt/live//privkey.pem; 58 | ssl_session_cache shared:SSL:10m; 59 | ssl_protocols TLSv1.2 TLSv1.3; 60 | ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; 61 | ssl_prefer_server_ciphers on; 62 | 63 | # See https://hstspreload.org/ before uncommenting the line below. 64 | # add_header Strict-Transport-Security "max-age=15768000; preload;"; 65 | add_header X-Content-Type-Options nosniff; 66 | add_header X-XSS-Protection "1; mode=block"; 67 | add_header X-Robots-Tag none; 68 | add_header Content-Security-Policy "frame-ancestors 'self'"; 69 | add_header X-Frame-Options DENY; 70 | add_header Referrer-Policy same-origin; 71 | 72 | location / { 73 | try_files $uri $uri/ /index.php?$query_string; 74 | } 75 | 76 | location ~ \.php$ { 77 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 78 | fastcgi_pass unix:/run/php/php8.4-fpm.sock; 79 | fastcgi_index index.php; 80 | include fastcgi_params; 81 | fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; 82 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 83 | fastcgi_param HTTP_PROXY ""; 84 | fastcgi_intercept_errors off; 85 | fastcgi_buffer_size 16k; 86 | fastcgi_buffers 4 16k; 87 | fastcgi_connect_timeout 300; 88 | fastcgi_send_timeout 300; 89 | fastcgi_read_timeout 300; 90 | include /etc/nginx/fastcgi_params; 91 | } 92 | 93 | location ~ /\.ht { 94 | deny all; 95 | } 96 | } 97 | ``` 98 | 99 | 100 | ```nginx {3,28} title="/etc/nginx/sites-available/pelican.conf" 101 | server { 102 | listen 80; 103 | server_name ; 104 | 105 | 106 | root /var/www/pelican/public; 107 | index index.html index.htm index.php; 108 | charset utf-8; 109 | 110 | location / { 111 | try_files $uri $uri/ /index.php?$query_string; 112 | } 113 | 114 | location = /favicon.ico { access_log off; log_not_found off; } 115 | location = /robots.txt { access_log off; log_not_found off; } 116 | 117 | access_log off; 118 | error_log /var/log/nginx/pelican.app-error.log error; 119 | 120 | # allow larger file uploads and longer script runtimes 121 | client_max_body_size 100m; 122 | client_body_timeout 120s; 123 | 124 | sendfile off; 125 | 126 | location ~ \.php$ { 127 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 128 | fastcgi_pass unix:/run/php/php8.4-fpm.sock; 129 | fastcgi_index index.php; 130 | include fastcgi_params; 131 | fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M"; 132 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 133 | fastcgi_param HTTP_PROXY ""; 134 | fastcgi_intercept_errors off; 135 | fastcgi_buffer_size 16k; 136 | fastcgi_buffers 4 16k; 137 | fastcgi_connect_timeout 300; 138 | fastcgi_send_timeout 300; 139 | fastcgi_read_timeout 300; 140 | } 141 | 142 | location ~ /\.ht { 143 | deny all; 144 | } 145 | } 146 | ``` 147 | 148 | 149 | ### Enabling Configuration 150 | 151 | The final step is to enable your NGINX configuration and restart it. 152 | 153 | ```sh 154 | sudo ln -s /etc/nginx/sites-available/pelican.conf /etc/nginx/sites-enabled/pelican.conf 155 | ``` 156 | 157 | #### You need to restart nginx to load the new config file. 158 | 159 | ```sh 160 | sudo systemctl restart nginx 161 | ``` 162 | 163 | 164 | 165 | First, remove the default Apache configuration. 166 | 167 | ```sh 168 | a2dissite 000-default default-ssl 000-default-le-ssl 169 | ``` 170 | 171 | Now, you should paste the contents of the file below, replacing `` with your domain name being used in a file called 172 | `pelican.conf` and place the file in `/etc/apache2/sites-available/`. 173 | 174 | Note: When using Apache, make sure you have the `libapache2-mod-php` package installed or else PHP will not display on your webserver. 175 | 176 | 177 | 178 | **Note:** IPs cannot be used with SSL. 179 | 180 | ```apacheconf {2,10,24-25} title="/etc/apache2/sites-available/pelican.conf" 181 | 182 | ServerName 183 | 184 | RewriteEngine On 185 | RewriteCond %{HTTPS} !=on 186 | RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 187 | 188 | 189 | 190 | ServerName 191 | DocumentRoot "/var/www/pelican/public" 192 | 193 | AllowEncodedSlashes On 194 | 195 | php_value upload_max_filesize 100M 196 | php_value post_max_size 100M 197 | 198 | 199 | Require all granted 200 | AllowOverride all 201 | 202 | 203 | SSLEngine on 204 | SSLCertificateFile /etc/letsencrypt/live//fullchain.pem 205 | SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem 206 | 207 | ``` 208 | 209 | 210 | ```apacheconf {2} title="/etc/apache2/sites-available/pelican.conf" 211 | 212 | ServerName 213 | DocumentRoot "/var/www/pelican/public" 214 | 215 | AllowEncodedSlashes On 216 | 217 | php_value upload_max_filesize 100M 218 | php_value post_max_size 100M 219 | 220 | 221 | AllowOverride all 222 | Require all granted 223 | 224 | 225 | ``` 226 | 227 | 228 | ### Enabling Configuration 229 | 230 | Once you've created the file above, simply run the commands below. 231 | 232 | 233 | If you're **not** using php8.4, you will need to edit the command to point to enable the correct mod. 234 | 235 | The line is highlighted below. 236 | 237 | 238 | ```sh {3} 239 | sudo a2ensite pelican.conf 240 | sudo a2enmod rewrite 241 | sudo a2enmod php8.4 242 | ``` 243 | 244 | #### You need to restart apache to load the new config file. 245 | 246 | ```sh 247 | sudo systemctl restart apache2 248 | ``` 249 | 250 | 251 | 252 | 253 | If you're **not** using php8.4, you will need to edit the config file to point to the proper php fpm socket. 254 | 255 | The line is highlighted below. 256 | 257 | First, remove the default Caddy configuration. 258 | 259 | ```sh 260 | sudo rm /etc/caddy/Caddyfile 261 | ``` 262 | 263 | The config file path is `/etc/caddy/`. 264 | 265 | 266 | 267 | 268 | **Note:** IPs cannot be used with SSL. 269 | 270 | ```caddy {9,14} title="/etc/caddy/Caddyfile" 271 | { 272 | servers :443 { 273 | timeouts { 274 | read_body 120s 275 | } 276 | } 277 | } 278 | 279 | { 280 | root * /var/www/pelican/public 281 | 282 | file_server 283 | 284 | php_fastcgi unix//run/php/php8.4-fpm.sock { 285 | root /var/www/pelican/public 286 | index index.php 287 | 288 | env PHP_VALUE "upload_max_filesize = 100M 289 | post_max_size = 100M" 290 | env HTTP_PROXY "" 291 | env HTTPS "on" 292 | 293 | read_timeout 300s 294 | dial_timeout 300s 295 | write_timeout 300s 296 | } 297 | 298 | header Strict-Transport-Security "max-age=16768000; preload;" 299 | header X-Content-Type-Options "nosniff" 300 | header X-XSS-Protection "1; mode=block;" 301 | header X-Robots-Tag "none" 302 | header Content-Security-Policy "frame-ancestors 'self'" 303 | header X-Frame-Options "DENY" 304 | header Referrer-Policy "same-origin" 305 | 306 | request_body { 307 | max_size 100m 308 | } 309 | 310 | respond /.ht* 403 311 | 312 | log { 313 | output file /var/log/caddy/pelican.log { 314 | roll_size 100MiB 315 | roll_keep_for 7d 316 | } 317 | level INFO 318 | } 319 | } 320 | ``` 321 | 322 | 323 | ```caddy {9,14} title="/etc/caddy/Caddyfile" 324 | { 325 | servers :80 { 326 | timeouts { 327 | read_body 120s 328 | } 329 | } 330 | } 331 | 332 | :80 { 333 | root * /var/www/pelican/public 334 | 335 | file_server 336 | 337 | php_fastcgi unix//run/php/php8.4-fpm.sock { 338 | root /var/www/pelican/public 339 | index index.php 340 | 341 | env PHP_VALUE "upload_max_filesize = 100M 342 | post_max_size = 100M" 343 | env HTTP_PROXY "" 344 | 345 | read_timeout 300s 346 | dial_timeout 300s 347 | write_timeout 300s 348 | } 349 | 350 | header Strict-Transport-Security "max-age=16768000; preload;" 351 | header X-Content-Type-Options "nosniff" 352 | header X-XSS-Protection "1; mode=block;" 353 | header X-Robots-Tag "none" 354 | header Content-Security-Policy "frame-ancestors 'self'" 355 | header X-Frame-Options "DENY" 356 | header Referrer-Policy "same-origin" 357 | 358 | request_body { 359 | max_size 100m 360 | } 361 | 362 | respond /.ht* 403 363 | 364 | log { 365 | output file /var/log/caddy/pelican.log { 366 | roll_size 100MiB 367 | roll_keep_for 7d 368 | } 369 | level INFO 370 | } 371 | } 372 | ``` 373 | 374 | 375 | ### Enabling Configuration 376 | The final step is to restart Caddy. 377 | 378 | ```sh 379 | sudo systemctl restart caddy 380 | ``` 381 | 382 | 383 | -------------------------------------------------------------------------------- /docs/troubleshooting.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: troubleshooting 3 | --- 4 | 5 | import Admonition from '@theme/Admonition'; 6 | import Tabs from '@theme/Tabs'; 7 | import TabItem from '@theme/TabItem'; 8 | 9 | # Troubleshooting 10 | 11 | ## Panel errors 12 | 13 | If you see a `500 | SERVER ERROR` or `An unexpected error was encountered while processing this request` you have to check your panel logs by running the following command. 14 | 15 | ```sh 16 | tail -n 1000 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(date +%Y)" 17 | ``` 18 | 19 | If the command above doesn't return anything you most likely have wrong permissions for your `storage` folder. So you first need to fix that. 20 | You can set the correct permissions by running `sudo chmod -R 755 /var/www/pelican/storage/* /var/www/pelican/bootstrap/cache/`. Also make sure that your panel files are owned by the correct user. 21 | 22 | 23 | 24 | ```sh 25 | sudo chown -R www-data:www-data /var/www/pelican 26 | ``` 27 | 28 | 29 | ```sh 30 | sudo chown -R nginx:nginx /var/www/pelican 31 | ``` 32 | 33 | 34 | ```sh 35 | sudo chown -R apache:apache /var/www/pelican 36 | ``` 37 | 38 | 39 | 40 |
41 | Common errors 42 | 43 | * `ErrorException: file_put_contents(_____): failed to open stream: Permission denied`: Wrong file permissions/ ownership for the panel files, see above. 44 | * `502 Bad Gateway Error`: Make sure that php-fpm is running and that you are using the correct php version in your webserver config. 45 | * `CSRF token mismatch`: Enable SSL for your Panel with HTTPS protocol scheme in the APP_URL, or set `SESSION_SECURE_COOKIE` to `false` in your `.env` file. 46 | * `Connection refused [tcp://_______:6379]`: Redis isn't running or isn't reachable for some other reason. (start by checking the status of the redis service: `systemctl status redis-server`) 47 | * `SSL: no alternative certificate subject name matches target host name '_______'`: The used SSL certificate for your panel isn't valid for your panel domain, see [this guide](./guides/ssl) for creating a new SSL certificate. 48 | * `General error: 8 attempt to write a readonly database`: Your `database.sqlite` has wrong file permissions and is readonly. Make sure the file is writeable and owned by the correct user. 49 | * `Class '_____' not found`: This usually means you are missing php extensions. Make sure [all needed extensions](./panel/getting-started#dependencies) are installed and that you are using the correct php version. 50 | * `Connection timed out after 5001 miliseconds for _______:8080`: Your panel can't reach wings, see the wings connection issues steps below. 51 |
52 | 53 | ## Wings connection issues 54 | 55 | ### Check the wings service 56 | 57 | First you should make sure that the wings service is running. To do that run `systemctl status wings`. 58 | It should say that the service is active and running. If its in a failed state run `sudo wings diagnostics` to check the wings logs for errors. 59 | 60 |
61 | Common errors 62 | 63 | * `open /etc/letsencrypt/live/_____________/fullchain.pem: no such file or directory`: The SSL certificate for wings is missing, see [this guide](./guides/ssl) for creating a SSL certificate. 64 | * `Pool overlaps with other one on this address space`: You already have a docker network using the default subnet. (`172.18.0.0/16`) Change the subnet in your wings config file and use `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` to apply the change. 65 | * `Error response from Panel: AccessDeniedHttpException: You are not authorized to access this resource. (HTTP/403)`: Your wings token is wrong, you need [update the token in your config.yml file](./wings/install#configure) 66 | * `Error response from Panel: _MissingResponseCode: No error response returned from API endpoint`: Your panel is not responding correctly. This usually happens when Cloudflare is blocking the connection. In that case make sure your wings ip is added to the Cloudflare firewall. If you aren't using Cloudflare it might be some other CDN/ DDoS protection service or your provider. 67 | * `remote: could not unmarshal response: invalid character '<' looking for beginning of value`: This is basically the same error as above: Cloudflare is blocking the connection. 68 |
69 | 70 | ### Check the wings port 71 | 72 | If you confirmed that wings is running without errors you should make sure that the wings port (`8080` by default) isn't blocked by any firewall. The best way to check this is to use online port checkers like [dnschecker.org](https://dnschecker.org/port-scanner.php) 73 | It should say "open" if you check for your node FQDN (e.g. `node.example.com` or `123.123.123.123`) and your wings port (e.g. `8080`). If it says "timed-out" you have some firewall blocking the port. This could be an internal firewall (like iptables) or an external firewall (e.g. from your provider). 74 | 75 | ### Check for NAT loop back 76 | 77 | If your panel and wings are on the same machine or same network, and you are using domains you should check for NAT loop back issues. 78 | Edit the `/etc/hosts` file on your panel/ wings machine and add an entry for your ip and domain. 79 | 80 | Example: 81 | 82 | ```txt title="/etc/hosts" 83 | 123.123.123.123 panel.example.com node.example.com 84 | ``` 85 | 86 | ### Check the wings connection 87 | 88 | If you confirmed the above points you have to do some advanced troubleshooting. 89 | 90 | Check if your panel and your browser can connect to wings. 91 | 92 | #### Panel \<-> Wings connection 93 | 94 | Run `curl :` (e.g. `curl https://node.example.com:8080` or `curl http://123.123.123.123:8080`) on your panel machine and see what it outputs. 95 | 96 | #### Browser \<-> Wings connection 97 | 98 | Open `:` (e.g. `https://node.example.com:8080` or `http://123.123.123.123:8080`) in your browser and see what it outputs. 99 | 100 | In both cases it should output this when wings is reachable: 101 | ``` 102 | {"error" : "The required authorization heads were not present in the request."} 103 | ``` 104 | 105 | 106 | Not sure what a specific error means? 107 | Visit our [Discord](https://discord.gg/pelican-panel) and we will be happy to help you! 108 | 109 | 110 | ### Check node settings 111 | 112 | If the connection checks above were both successfull you might have misconfigured the Node settings in the Panel. 113 | Make sure that your Node FQDN/ IP, Port and Scheme (HTTP/ HTTPS) is correct. 114 | 115 | When using a reverse proxy you might have different external and internal ports for Wings. (e.g. `80` internally and `443` externally) 116 | In that case make sure the Node settings in the Panel uses the external port while the Wings config file uses the internal port! 117 | 118 | ## Schedules not running 119 | 120 | If your Schedules are stuck on `Processing` or don't execute the tasks check the following: 121 | 122 | * Is your Schedule set to run `ONLY WHEN SERVER IS ONLINE` and the server is currently offline? 123 | * Is your queue worker service running? (`systemctl status pelican-queue`) 124 | * Is your queue worker service using the correct PHP version? (`php -v`) 125 | * Is your cronjob setup correctly? (`crontab -l -u www-data` should show an entry that runs `php artisan schedule:run` every minute) 126 | 127 | If your queue worker service is not running you can also check the panel logs for errors. 128 | 129 | ```sh 130 | tail -n 100 /var/www/pelican/storage/logs/laravel-$(date +%F).log | grep "\[$(date +%Y)" 131 | ``` 132 | 133 | To recreate the queue worker service you can run `php /var/www/pelican/artisan p:environment:queue-service --overwrite`. 134 | -------------------------------------------------------------------------------- /docs/wings/install.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Installing Wings 4 | 5 | 6 | This software will not work on Windows operating systems. 7 | 8 | 9 | ## Supported Systems 10 | 11 | The following is a list of supported operating systems. Please be aware that this is not an exhaustive list, 12 | there is a high probability that you can run the software on other Linux distributions without much effort. 13 | You are responsible for determining which packages may be necessary on those systems. There is also a very 14 | high probability that new releases of the supported OSes below will work just fine, you are not restricted to 15 | only the versions listed below. 16 | 17 | | Operating System | Version | Supported | Notes | 18 | |:----------------:|:--------:|:---------:|:---------------------------------------------------------------------:| 19 | | **Ubuntu** | 22.04 | ✅︎︎ | | 20 | | | **24.04**| ✅︎ | Documentation written assuming Ubuntu 24.04 as the base OS. | 21 | | **Alma Linux** | 10 | ✅︎ | | 22 | | | 9 | ✅︎ | | 23 | | | 8 | ✅︎ | | 24 | | **Rocky Linux** | 9 | ✅︎ | | 25 | | | 8 | ✅︎ | | 26 | | **CentOS** | 10 | ✅︎ | | 27 | | **Debian** | 11 | ✅︎ | | 28 | | | 12 | ✅︎ | | 29 | 30 | ## System Requirements 31 | 32 | 33 | Please be aware that some hosts install a modified kernel that does not support some docker features required for Wings to operate correctly. Please 34 | check your kernel by running `uname -r`. If your kernel ends in `-xxxx-grs-ipv6-64` or `-xxxx-mod-std-ipv6-64` you're 35 | probably using a non-supported kernel. You should contact your host, and request a non-modified kernel. 36 | 37 | 38 | To run Wings, you will need a Linux system capable of running Docker containers. Most VPS and almost all 39 | dedicated servers should be capable of running Docker, but there are edge cases. 40 | 41 | When your provider uses `Virtuozzo`, `OpenVZ` (or `OVZ`), or `LXC` virtualization, you will most likely be unable to 42 | run Wings. Some providers have made the necessary changes for nested virtualization to support Docker. Ask your provider's support team to make sure. KVM is guaranteed to work. 43 | 44 | The easiest way to check is to type `systemd-detect-virt`. 45 | If the result doesn't contain `OpenVZ` or`LXC`, it should be fine. The result of `none` will appear when running dedicated hardware without any virtualization. 46 | 47 | Should that not work for some reason, or you're still unsure, you can also run the command below. 48 | 49 | ```sh 50 | sudo dmidecode -s system-manufacturer 51 | ``` 52 | 53 | ### Installing Docker 54 | Wings requires Docker CE. For full instructions on installing and configuring Docker, see the [installation guide](/docs/guides/docker). 55 | 56 | For a quick install of Docker CE, you can use the command below: 57 | 58 | ```sh 59 | curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh 60 | ``` 61 | 62 | ### Installing Wings 63 | 64 | The first step for installing Wings is to ensure we have the required directory structure setup. To do so, 65 | run the commands below, which will create the base directory and download the wings executable. 66 | 67 | ```sh 68 | sudo mkdir -p /etc/pelican /var/run/wings 69 | sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" 70 | sudo chmod u+x /usr/local/bin/wings 71 | ``` 72 | 73 | 74 | If you are using a server provided by OVH or SoYouStart please be aware that your main drive space is probably allocated to 75 | `/home`, and not `/` by default. Please consider using `/home/daemon-data` for server data. This can be set when creating the node. 76 | 77 | 78 | ### Configure 79 | 80 | Once you have installed Wings and the required components, the next step is to create a node on your installed Panel. 81 | Go to your Panel administrative view, select Nodes from the sidebar, and on the right side click Create New button. 82 | 83 | After you have created a node, click on it and there will be a tab called Configuration. 84 | Copy the code block content, create a new file at `/etc/pelican/config.yml`, paste the content into it and save. 85 | 86 | Alternatively, you can click on the Auto Deploy Command button, copy the sh command and paste it into your terminal. 87 | 88 | 89 | If your Panel is using SSL, then Wings must also use SSL. 90 | 91 | See [Creating SSL Certificates](../guides/ssl) documentation page for how to create these certificates before continuing. 92 | 93 | 94 | ### Starting Wings 95 | 96 | To start Wings, simply run the command below, which will start it in a debug mode. 97 | Once you confirmed that it is running without errors, use `CTRL+C` to terminate the process and daemonize it by following the instructions below. 98 | Depending on your server's internet connection pulling and starting Wings for the first time may take a few minutes. 99 | 100 | ```sh 101 | sudo wings --debug 102 | ``` 103 | 104 | You may optionally add the `--debug` flag to run Wings in debug mode. 105 | 106 | ### Daemonizing (using systemd) 107 | 108 | Running Wings in the background is a simple task, just make sure that it runs without errors before doing 109 | this. Place the contents below in a file called `wings.service` in the `/etc/systemd/system` directory. 110 | 111 | ```ini {9} title="/etc/systemd/system/wings.service" 112 | [Unit] 113 | Description=Wings Daemon 114 | After=docker.service 115 | Requires=docker.service 116 | PartOf=docker.service 117 | 118 | [Service] 119 | User=root 120 | WorkingDirectory=/etc/pelican 121 | LimitNOFILE=4096 122 | PIDFile=/var/run/wings/daemon.pid 123 | ExecStart=/usr/local/bin/wings 124 | Restart=on-failure 125 | StartLimitInterval=180 126 | StartLimitBurst=30 127 | RestartSec=5s 128 | 129 | [Install] 130 | WantedBy=multi-user.target 131 | ``` 132 | 133 | Then, run the commands below to reload systemd and start Wings. 134 | 135 | ```sh 136 | sudo systemctl enable --now wings 137 | ``` 138 | -------------------------------------------------------------------------------- /docs/wings/optional-config.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Additional Configuration 4 | 5 | 6 | These are advanced configurations for Wings. You risk breaking Wings and making containers unusable if 7 | you misconfigure something. Proceed only if you know what each configuration value does. 8 | 9 | 10 | You must apply all changes to your Wings `config.yml` file located at `/etc/pelican` and restart wings. 11 | Verify your config file using [Yaml Lint](http://www.yamllint.com/) should you receive errors related to YAML parsing. 12 | 13 | ## Private Registries 14 | 15 | You can use these settings to authenticate against (private) docker registries when pulling images. 16 | 17 | ### Available Keys 18 | 19 | | Setting Key | Default Value | Notes | 20 | | ----------- | :-----------: | ----------------- | 21 | | name | null | Registry address | 22 | | username | null | Registry username | 23 | | password | null | Registry password | 24 | 25 | ### Example of usage 26 | 27 | ```yml 28 | docker: 29 | registries: 30 | registry.example.com: 31 | username: "registryusername" 32 | password: "registrypassword" 33 | ``` 34 | 35 | ## Custom Network Interfaces 36 | 37 | You can change the network interface that Wings uses for all containers by editing the network name; it is by default set to `pelican_nw`. For example, to enable Docker host mode change the network name to `host`. 38 | 39 | 40 | Changing network mode to `host` grants Pelican direct access to all machine interfaces and Panel users can bind to any IP or Port even if it's not allocated to their container. You will lose all benefits of Docker network isolation. It is not recommended for public installations that are hosting other users' servers. 41 | 42 | 43 | ### Example of usage 44 | 45 | ```yml 46 | docker: 47 | network: 48 | name: host 49 | network_mode: host 50 | ``` 51 | 52 | After making changes, the following commands will stop the Wings, remove the Pelican network, and start the Wings again. Run at your own risk. 53 | `systemctl stop wings && docker network rm pelican_nw && systemctl start wings` 54 | 55 | ## Enabling Cloudflare proxy 56 | 57 | Cloudflare proxying of the Wings isn't beneficial since users will be connecting to the machine directly and bypassing any Cloudflare protection. As such, your Node machine IP will still be exposed. 58 | 59 | To enable Cloudflare proxy, you must change the Wings port to one of the Cloudflare HTTPS ports with caching enabled (more info [here](https://developers.cloudflare.com/fundamentals/get-started/reference/network-ports/)), such as 8443, because Cloudflare only supports HTTP on port 8080. Select your Node in the Admin Panel, and on the settings tab, change the port. Make sure that you set "Not Behind Proxy" when using Full SSL settings in Cloudflare. Then on Cloudflare dashboard, your FQDN must have an orange cloud enabled beside it. 60 | 61 | You are unable to proxy the SFTP port through Cloudflare unless you have their enterprise plan. Server transfers will most likely not work either due to [Cloudflare's request body limits](https://developers.cloudflare.com/workers/platform/limits/#request-limits). 62 | 63 | ## Container PID Limit 64 | 65 | You can change the total number of processes that can be active in a container at any given moment by changing the `container_pid_limit` value. The default value is `512`. 66 | You can set it to `0` to disable the limit completely. However, this is _not_ recommended as the limit prevents malicious overloading of the node. 67 | Restart wings and your game server to apply the new limit. 68 | 69 | ### Example of usage 70 | 71 | ```yml 72 | docker: 73 | ... 74 | container_pid_limit: 512 75 | ... 76 | ``` 77 | 78 | ## Throttles Limits 79 | 80 | You can use these settings to adjust or completely disable throttling. 81 | 82 | | Setting Key | Default Value | Notes | 83 | | :-------------------- | :-----------: | ----------------------------------------------------------------------------------------------------------------------------------- | 84 | | enabled | true | Whether or not the throttler is enabled | 85 | | lines | 2000 | Total lines that can be output in a given line_reset_interval period | 86 | | maximum_trigger_count | 5 | Amount of times throttle limit can be triggered before the server will be stopped | 87 | | line_reset_interval | 100 | The amount of time after which the number of lines processed is reset to 0 | 88 | | decay_interval | 10000 | Time in milliseconds that must pass without triggering throttle limit before trigger count is decremented | 89 | | stop_grace_period | 15 | Time that a server is allowed to be stopping for before it is terminated forcefully if it triggers output throttle | 90 | | write_limit | 0 | Impose I/O write limit for backups to the disk, 0 = unlimited. Value greater than 0 throttles write speed to the set value in MiB/s | 91 | | download_limit | 0 | Impose a Network I/O read limit for archives, 0 = unlimited. Value greater than 0 throttles read speed to the set value in MiB/s | 92 | 93 | ### Example of usage 94 | 95 | ```yml 96 | throttles: 97 | enabled: true 98 | lines: 2000 99 | maximum_trigger_count: 5 100 | line_reset_interval: 100 101 | decay_interval: 10000 102 | stop_grace_period: 15 103 | ``` 104 | 105 | ## Installer Limits 106 | 107 | Defines the limits on the installer containers that prevents a server's installation process from unintentionally consuming more resources than expected. This is used in conjunction with the server's defined limits. Whichever value is higher will take precedence in the install containers. 108 | 109 | | Setting Key | Default Value | Notes | 110 | | :---------- | :-----------: | ----------------------------------------------------------------------------------------------------------- | 111 | | memory | 1024 | The maximum amount of memory install container can use unless server memory limit is higher than this value | 112 | | cpu | 100 | The maximum amount of cpu install container can use unless server cpu limit is higher than this value | 113 | 114 | ### Example of usage 115 | 116 | ```yml 117 | installer_limits: 118 | memory: 1024 119 | cpu: 100 120 | ``` 121 | 122 | ## Other values 123 | 124 | More commonly discussed values. 125 | 126 | | Setting Key | Default Value | Notes | 127 | | -------------------------- | :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | 128 | | debug | false | Force Wings to run in debug mode | 129 | | tmpfs_size | 100 | The size of the /tmp directory in MB when mounted into a container | 130 | | websocket_log_count | 150 | The number of lines to display in the console | 131 | | detect_clean_exit_as_crash | true | Mark server as crashed if it's stopped without user interaction, e.g., not pressing stop button | 132 | | (crash detection) timeout | 60 | Timeout between server crashes that will not cause the server to be automatically restarted | 133 | | check_permissions_on_boot | true | Check all file permissions on each boot. Disable this when you have a very large amount of files and the server startup is hanging on checking permissions | 134 | -------------------------------------------------------------------------------- /docs/wings/update.mdx: -------------------------------------------------------------------------------- 1 | import Admonition from '@theme/Admonition'; 2 | 3 | # Updating Wings 4 | 5 | Updating Wings is a painless process and should take less than a minute to complete. 6 | 7 | ## Wings Version Requirements 8 | 9 | | Panel Version | Wings Version | Supported | 10 | |:-------------:|:-------------:|:---------:| 11 | |1.0.0+ | 1.0.0+ | ✅︎ | 12 | 13 | 14 | If you are updating from < 1.0.0-beta9. This won't work! 15 | 16 | If you do not wish to use the command and wish to do it manually, then follow the standard update process below. 17 | 18 | ```sh 19 | sudo wings update 20 | sudo systemctl restart wings 21 | ``` 22 | 23 | 24 | 25 | ## Download Update 26 | 27 | First, download the updated wings binary into `/usr/local/bin`. You will need to stop Wings briefly. 28 | 29 | 30 | Running servers **will not** be affected. 31 | 32 | 33 | ```sh 34 | sudo systemctl stop wings 35 | sudo curl -L -o /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")" 36 | sudo chmod u+x /usr/local/bin/wings 37 | ``` 38 | 39 | ## Restart 40 | 41 | Secondly, Restart the process. 42 | 43 | ```sh 44 | sudo systemctl restart wings 45 | ``` 46 | -------------------------------------------------------------------------------- /docusaurus.config.ts: -------------------------------------------------------------------------------- 1 | import { themes as prismThemes } from "prism-react-renderer"; 2 | import type { Config } from "@docusaurus/types"; 3 | import type * as Preset from "@docusaurus/preset-classic"; 4 | import tailwindPlugin from "./src/plugins/tailwind-config.cjs"; 5 | import remarkgfm from "remark-gfm"; 6 | 7 | const config: Config = { 8 | title: "Pelican", 9 | tagline: "From prehistoric to peak performance: Pelican takes flight!", 10 | favicon: "img/favicon.ico", 11 | markdown: { 12 | mermaid: true, 13 | }, 14 | url: "https://pelican.dev", 15 | baseUrl: "/", 16 | organizationName: "pelican-dev", 17 | projectName: "docs", 18 | onBrokenLinks: "throw", 19 | onBrokenMarkdownLinks: "warn", 20 | themes: ["@docusaurus/theme-mermaid"], 21 | presets: [ 22 | [ 23 | "classic", 24 | { 25 | docs: { 26 | sidebarPath: "./sidebars.ts", 27 | editUrl: "https://github.com/pelican-dev/docs/blob/main/", 28 | remarkPlugins: [remarkgfm], 29 | }, 30 | blog: { 31 | showReadingTime: true, 32 | }, 33 | theme: { 34 | customCss: [ 35 | require.resolve("./src/css/tailwind.css"), 36 | require.resolve("./src/css/custom.scss"), 37 | ], 38 | }, 39 | } satisfies Preset.Options, 40 | ], 41 | ], 42 | themeConfig: { 43 | navbar: { 44 | title: "Pelican", 45 | logo: { 46 | src: "img/logo.png", 47 | }, 48 | items: [ 49 | { to: "/docs", label: "Docs", position: "left" }, 50 | { to: "/blog", label: "Blog", position: "left" }, 51 | { to: "/support", label: "Support", position: "left" }, 52 | { to: "/faq", label: "FAQ", position: "left" }, 53 | { to: "/hub", label: "Hub", position: "left", target: "_blank", }, 54 | { to: "/eggs", label: "Eggs", position: "left", target: "_blank", }, 55 | { to: "/github", position: "right", className: "github-link", target: "_blank", }, 56 | { to: "/discord", position: "right", className: "discord-link", target: "_blank", }, 57 | ], 58 | }, 59 | colorMode: { 60 | defaultMode: "dark", 61 | disableSwitch: false, 62 | respectPrefersColorScheme: true, 63 | }, 64 | footer: { 65 | logo: { 66 | src: "img/logo.png", 67 | height: "64px", 68 | width: "64px", 69 | }, 70 | style: "dark", 71 | links: [ 72 | { 73 | title: 'Documentation', 74 | items: [ 75 | { 76 | label: 'Panel', 77 | to: '/docs/panel/getting-started', 78 | }, 79 | { 80 | label: 'Wings', 81 | to: '/docs/wings/install', 82 | }, 83 | { 84 | label: 'SSL Setup', 85 | to: '/docs/guides/ssl' 86 | }, 87 | ], 88 | }, 89 | { 90 | title: "Community", 91 | items: [ 92 | { label: "Discord", to: "/discord", target: "_blank", }, 93 | { label: "Blog", to: "/blog", target: "_blank", }, 94 | { label: "GitHub", to: "/github", target: "_blank", }, 95 | ], 96 | }, 97 | ], 98 | copyright: `Copyright © 2024 - ${new Date().getFullYear()} Pelican`, 99 | }, 100 | prism: { 101 | theme: prismThemes.github, 102 | darkTheme: prismThemes.dracula, 103 | additionalLanguages: [ 104 | "bash", 105 | "nginx", 106 | "apacheconf", 107 | "ini", 108 | "sql", 109 | "yaml", 110 | ], 111 | }, 112 | } satisfies Preset.ThemeConfig, 113 | plugins: [ 114 | [ 115 | require.resolve('@docusaurus/plugin-client-redirects'), 116 | { 117 | redirects: [ 118 | { from: '/discord', to: 'https://discord.gg/pelican-panel' }, 119 | { from: '/eggs', to: 'https://pelican-eggs.github.io/pelican' }, 120 | { from: '/github', to: 'https://github.com/pelican-dev/panel' }, 121 | { from: '/hub', to: 'https://hub.pelican.dev' }, 122 | { from: '/donate', to: 'https://pelican.dev/support' }, 123 | ], 124 | }, 125 | ], 126 | require.resolve('docusaurus-lunr-search'), 127 | "docusaurus-plugin-sass", 128 | [ 129 | "posthog-docusaurus", 130 | { 131 | apiKey: "phc_jFc0yrQBPn7T3u4LMXZbOVytUD3tGMxhbOdrooeuR9g", 132 | appUrl: "https://app.posthog.com", 133 | enableInDevelopment: "false", 134 | }, 135 | ], 136 | tailwindPlugin, 137 | ], 138 | }; 139 | 140 | export default config; 141 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pelicandocs", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start --host 0.0.0.0", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@algolia/client-search": "^5.19.0", 19 | "@docusaurus/core": "^3.7.0", 20 | "@docusaurus/plugin-client-redirects": "^3.7.0", 21 | "@docusaurus/preset-classic": "^3.7.0", 22 | "@docusaurus/theme-common": "^3.7.0", 23 | "@docusaurus/theme-mermaid": "^3.7.0", 24 | "@docusaurus/theme-search-algolia": "^3.7.0", 25 | "@fortawesome/fontawesome-svg-core": "^6.7.2", 26 | "@fortawesome/free-brands-svg-icons": "^6.7.2", 27 | "@fortawesome/free-regular-svg-icons": "^6.7.2", 28 | "@fortawesome/free-solid-svg-icons": "^6.7.2", 29 | "@fortawesome/react-fontawesome": "^0.2.2", 30 | "@iconify/react": "^5.2.0", 31 | "@mdx-js/react": "^3.1.0", 32 | "clsx": "^2.1.1", 33 | "docusaurus-lunr-search": "^3.6.0", 34 | "docusaurus-plugin-sass": "^0.2.6", 35 | "lunr": "^2.3.9", 36 | "posthog-docusaurus": "^2.0.2", 37 | "prism-react-renderer": "^2.4.1", 38 | "react": "^19.0.0", 39 | "react-dom": "^19.0.0", 40 | "react-medium-image-zoom": "^5.2.13", 41 | "remark-gfm": "^4.0.0", 42 | "sass": "^1.74.1" 43 | }, 44 | "devDependencies": { 45 | "@docusaurus/module-type-aliases": "^3.7.0", 46 | "@docusaurus/tsconfig": "^3.7.0", 47 | "@docusaurus/types": "^3.7.0", 48 | "autoprefixer": "^10.4.20", 49 | "postcss": "^8.5.1", 50 | "tailwindcss": "^3.4.17", 51 | "typescript": "^5.7.3" 52 | }, 53 | "browserslist": { 54 | "production": [ 55 | ">0.5%", 56 | "not dead", 57 | "not op_mini all" 58 | ], 59 | "development": [ 60 | "last 3 chrome version", 61 | "last 3 firefox version", 62 | "last 5 safari version" 63 | ] 64 | }, 65 | "engines": { 66 | "node": ">=18.0" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /sidebars.ts: -------------------------------------------------------------------------------- 1 | import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; 2 | 3 | /** 4 | * Creating a sidebar enables you to: 5 | - create an ordered group of docs 6 | - render a sidebar for each doc of that group 7 | - provide next/previous navigation 8 | 9 | The sidebars can be generated from the filesystem, or explicitly defined here. 10 | 11 | Create as many sidebars as you want. 12 | */ 13 | const sidebars: SidebarsConfig = { 14 | 15 | Sidebar: [ 16 | 'welcome', 17 | { 18 | type: 'category', 19 | label: 'Panel', 20 | collapsed: false, 21 | items: [ 22 | 'panel/getting-started', 23 | 'panel/webserver-config', 24 | 'panel/panel-setup', 25 | 'panel/optional-config', 26 | 'panel/update', 27 | { 28 | type: 'category', 29 | label: 'Advanced', 30 | items: [ 31 | 'panel/advanced/redis', 32 | 'panel/advanced/mysql', 33 | 'panel/advanced/artisan', 34 | 'panel/advanced/docker', 35 | ] 36 | } 37 | ], 38 | }, 39 | { 40 | type: 'category', 41 | label: 'Wings', 42 | items: ['wings/install','wings/optional-config', 'wings/update'], 43 | }, 44 | { 45 | type: 'category', 46 | label: 'Guides', 47 | items: ['guides/docker', 'guides/mounts', 'guides/ssl', 'guides/php-upgrade', 'guides/database-hosts', 'guides/uninstalling', 'guides/easypanel',], 48 | }, 49 | 'troubleshooting', 50 | 'comparison', 51 | 'glossary' 52 | ], 53 | }; 54 | 55 | export default sidebars; 56 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/look.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Heading from '@theme/Heading'; 4 | import styles from './styles.module.css'; 5 | import Zoom from 'react-medium-image-zoom'; 6 | import 'react-medium-image-zoom/dist/styles.css'; 7 | import { useColorMode } from '@docusaurus/theme-common'; 8 | 9 | type FeatureItem = { 10 | title: string; 11 | light: string; 12 | dark: string 13 | }; 14 | 15 | const FeatureList: FeatureItem[] = [ 16 | { 17 | title: 'Homepage', 18 | light: 'img/homepage/ss/1l.png', 19 | dark: 'img/homepage/ss/1d.png' }, 20 | { 21 | title: 'User List', 22 | light: 'img/homepage/ss/2l.png', 23 | dark: 'img/homepage/ss/2d.png' }, 24 | { 25 | title: 'Create Node', 26 | light: 'img/homepage/ss/3l.png', 27 | dark: 'img/homepage/ss/3d.png' }, 28 | { 29 | title: 'Node List', 30 | light: 'img/homepage/ss/4l.png', 31 | dark: 'img/homepage/ss/4d.png' }, 32 | { 33 | title: 'Create Server', 34 | light: 'img/homepage/ss/5l.png', 35 | dark: 'img/homepage/ss/5d.png' }, 36 | { 37 | title: 'Create API Key', 38 | light: 'img/homepage/ss/6l.png', 39 | dark: 'img/homepage/ss/6d.png' }, 40 | ]; 41 | 42 | function Feature({title, light, dark}: FeatureItem) { 43 | const {colorMode} = useColorMode(); 44 | let image: string; 45 | 46 | if (colorMode === 'dark') { 47 | image = light; 48 | } else { 49 | image = dark; 50 | } 51 | 52 | return ( 53 |
54 |
55 | 56 | {title} 57 |
58 |
59 | ); 60 | } 61 | 62 | export default function HomepageLook(): JSX.Element { 63 | return ( 64 |
65 |
66 |

Shots of the Screen

67 |
68 | {FeatureList.map((props, idx) => ( 69 | 70 | ))} 71 |
72 | 73 |
74 | These are the current prerelease screenshots. 75 |

76 |
77 |
78 | 79 |
80 |
81 | ); 82 | } 83 | 84 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/sponsors.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './styles.module.css'; 4 | import 'react-medium-image-zoom/dist/styles.css'; 5 | 6 | type SponsorItem = { 7 | sponsor: string; 8 | logo: string; 9 | url: string; 10 | desc: string 11 | }; 12 | 13 | const SponsorList: SponsorItem[] = [ 14 | { 15 | sponsor: 'Aussie Server Hosts', 16 | logo: '/img/homepage/sponsor/ash.png', 17 | url: 'https://aussieserverhosts.com/', 18 | desc: '', 19 | }, 20 | ]; 21 | 22 | function Sponsor({sponsor, logo, url, desc}: SponsorItem) { 23 | 24 | return ( 25 |
26 |
27 | 28 |
29 | {desc} 30 |
31 | ); 32 | } 33 | 34 | export default function HomepageSponsor(): JSX.Element { 35 | return ( 36 |
37 |
38 |

Project Sponsors

39 |
40 | {SponsorList.map((props, idx) => ( 41 | 42 | ))} 43 |
44 |
45 |
46 | ); 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/what.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Heading from '@theme/Heading'; 4 | import styles from './styles.module.css'; 5 | 6 | type FeatureItem = { 7 | title: string; 8 | img: string; 9 | }; 10 | 11 | const FeatureList: FeatureItem[] = [ 12 | { 13 | title: 'Node Overview', 14 | img: 'img/homepage/1.png', }, 15 | { 16 | title: 'User Overview', 17 | img: 'img/homepage/2.png', }, 18 | { 19 | title: 'Create Node', 20 | img: 'img/homepage/3.png', }, 21 | { 22 | title: 'Editing an Egg', 23 | img: 'img/homepage/4.png', }, 24 | { 25 | title: 'Editing a Server', 26 | img: 'img/homepage/5.png', }, 27 | { 28 | title: 'Creating an API Key', 29 | img: 'img/homepage/6.png', }, 30 | ]; 31 | 32 | function Feature({title, img}: FeatureItem) { 33 | return ( 34 |
35 |
36 | {title} 37 |
38 |
39 | 40 |
41 |
42 | ); 43 | } 44 | 45 | export default function HomepageWhat(): JSX.Element { 46 | return ( 47 |
48 |
49 |

What is Pelican?

50 |

51 | Pelican is the ultimate, free game server control panel offering high flying security. 52 | It's a breeze to manage your servers with our sleek and user-friendly interface. 53 | And thanks to Docker, they all run in their own safe space. 54 |

55 |
56 |
57 | ); 58 | } 59 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/why.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Heading from '@theme/Heading'; 4 | import styles from './styles.module.css'; 5 | import { Icon } from '@iconify/react/dist/iconify.js'; 6 | import Link from "@docusaurus/Link"; 7 | 8 | type FeatureItem = { 9 | title: string; 10 | icon: string; 11 | description: JSX.Element; 12 | }; 13 | 14 | const FeatureList: FeatureItem[] = [ 15 | { 16 | title: 'Updated Interface', 17 | icon: 'tabler:app-window', 18 | description: ( 19 | <> 20 | Intuitive interface, one click installations, comprehensive documentation, active community support, automatic updates. 21 | 22 | ), 23 | }, 24 | { 25 | title: 'Free to Use & Open Source', 26 | icon: 'tabler:currency-dollar-off', 27 | description: ( 28 | <> 29 | Pelican is 100% free to use forever for your self, friends, family, and others. All of our code is completely open source on GitHub. 30 | 31 | ) 32 | }, 33 | { 34 | title: 'Eggs', 35 | icon: 'tabler:eggs', 36 | description: ( 37 | <> 38 | <>We support 39 | Minecraft<>, 40 | Terraria<>, 41 | Palworld<>, 42 | Valheim<>, 43 | Enshrouded<>, 44 | Factorio<>, 45 | and so much more. 46 | Check our eggs out, we like them scrambled! 47 | 48 | ), 49 | }, 50 | { 51 | title: 'Powered by Docker', 52 | icon: 'tabler:brand-docker', 53 | description: ( 54 | <> 55 | Each server is ran in its own container and completely isolated. 56 | This allows you to use almost any of your machines with Pelican. 57 | 58 | ), 59 | }, 60 | { 61 | title: 'Scaleable to the Sky', 62 | icon: 'tabler:server-2', 63 | description: ( 64 | <> 65 | Whether you're some friends that want to play together, or a gaming community, we've got you covered. 66 | 67 | ) 68 | }, 69 | { 70 | title: 'Security', 71 | icon: 'tabler:lock-check', 72 | description: ( 73 | <> 74 | Pelican takes security extremely seriously and natively supports SSL, 2FA, AES-256 encryption, and more. 75 | 76 | ) 77 | }, 78 | ]; 79 | 80 | function Feature({title, icon, description}: FeatureItem) { 81 | return ( 82 |
83 |
84 | 85 |
86 |
87 | {title} 88 |

{description}

89 |
90 |
91 | ); 92 | } 93 | 94 | export default function HomepageWhy(): JSX.Element { 95 | return ( 96 |
97 |
98 |

Why use Pelican?

99 |
100 | {FeatureList.map((props, idx) => ( 101 | 102 | ))} 103 |
104 |
105 |
106 | ); 107 | } 108 | -------------------------------------------------------------------------------- /src/css/custom.scss: -------------------------------------------------------------------------------- 1 | /* You can override the default Infima variables here. */ 2 | :root { 3 | --ifm-color-primary-lightester: rgb(240, 249, 255); 4 | --ifm-color-primary-lightest: rgb(224, 242, 254); 5 | --ifm-color-primary-lighter: rgb(186, 230, 253); 6 | --ifm-color-primary-light: rgb(125, 211, 252); 7 | --ifm-color-primary: rgb(56, 189, 248); 8 | --ifm-color-primary-dark: rgb(14, 165, 233); 9 | --ifm-color-primary-darker: rgb(2, 132, 199); 10 | --ifm-color-primary-darkest: rgb(3, 105, 161); 11 | --ifm-color-primary-darkester: rgb(7, 89, 133); 12 | --ifm-color-primary-darkestest: rgb(12, 74, 110); 13 | --ifm-color-primary-darkestester: rgb(8, 47, 73); 14 | 15 | --ifm-color-info-dark: rgb(14, 165, 233); 16 | --ifm-color-info-darker: rgb(2, 132, 199); 17 | --ifm-color-info-darkest: rgb(3, 105, 161); 18 | --ifm-color-info-light: rgb(125, 211, 252); 19 | --ifm-color-info-lighter: rgb(186, 230, 253); 20 | --ifm-color-info-lightest: rgb(240, 249, 255); 21 | 22 | --ifm-code-font-size: 95%; 23 | } 24 | 25 | [data-theme='light'] { 26 | --docusaurus-highlighted-code-line-bg: var(--ifm-color-primary-lighter); 27 | 28 | .hero--primary { 29 | --ifm-hero-background-color: var(--ifm-color-primary-dark); 30 | } 31 | 32 | .hero .hero__subtitle { 33 | color: white; 34 | } 35 | } 36 | 37 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 38 | [data-theme='dark'] { 39 | --ifm-heading-color: white; 40 | --docusaurus-highlighted-code-line-bg: var(--ifm-color-primary-darkestest); 41 | 42 | .hero--primary { 43 | --ifm-hero-background-color: var(--ifm-color-primary-darkest); 44 | } 45 | 46 | .hero--dark { 47 | --ifm-hero-background-color: #303846; 48 | --ifm-hero-text-color: rgb(83, 78, 78); 49 | } 50 | 51 | .hero__subtitle { 52 | color: white; 53 | } 54 | } 55 | 56 | .footer { 57 | text-align: center; 58 | } 59 | 60 | .main-wrapper { 61 | min-height: calc(100vh - 60px); 62 | } 63 | 64 | html[data-theme='dark'] .github-link { 65 | align-items: center; 66 | display: flex; 67 | 68 | &:before { 69 | align-self: center; 70 | background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSIjZTNlM2UzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUxLTEuMDctMS43OC0uMi0zLjY0LS44OS0zLjY0LTMuOTUgMC0uODcuMzEtMS41OS44Mi0yLjE1LS4wOC0uMi0uMzYtMS4wMi4wOC0yLjEyIDAgMCAuNjctLjIxIDIuMi44Mi42NC0uMTggMS4zMi0uMjcgMi0uMjcuNjggMCAxLjM2LjA5IDIgLjI3IDEuNTMtMS4wNCAyLjItLjgyIDIuMi0uODIuNDQgMS4xLjE2IDEuOTIuMDggMi4xMi41MS41Ni44MiAxLjI3LjgyIDIuMTUgMCAzLjA3LTEuODcgMy43NS0zLjY1IDMuOTUuMjkuMjUuNTQuNzMuNTQgMS40OCAwIDEuMDctLjAxIDEuOTMtLjAxIDIuMiAwIC4yMS4xNS40Ni41NS4zOEE4LjAxMyA4LjAxMyAwIDAwMTYgOGMwLTQuNDItMy41OC04LTgtOHoiLz48L3N2Zz4=") 0 0/contain; 71 | content: ''; 72 | display: inline-flex; 73 | height: 32px; 74 | width: 32px; 75 | margin-right: 0.25rem; 76 | color: var(--ifm-navbar-link-color); 77 | } 78 | 79 | &:hover { 80 | &:before { 81 | background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSIjMzhiZGY4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUxLTEuMDctMS43OC0uMi0zLjY0LS44OS0zLjY0LTMuOTUgMC0uODcuMzEtMS41OS44Mi0yLjE1LS4wOC0uMi0uMzYtMS4wMi4wOC0yLjEyIDAgMCAuNjctLjIxIDIuMi44Mi42NC0uMTggMS4zMi0uMjcgMi0uMjcuNjggMCAxLjM2LjA5IDIgLjI3IDEuNTMtMS4wNCAyLjItLjgyIDIuMi0uODIuNDQgMS4xLjE2IDEuOTIuMDggMi4xMi41MS41Ni44MiAxLjI3LjgyIDIuMTUgMCAzLjA3LTEuODcgMy43NS0zLjY1IDMuOTUuMjkuMjUuNTQuNzMuNTQgMS40OCAwIDEuMDctLjAxIDEuOTMtLjAxIDIuMiAwIC4yMS4xNS40Ni41NS4zOEE4LjAxMyA4LjAxMyAwIDAwMTYgOGMwLTQuNDItMy41OC04LTgtOHoiLz48L3N2Zz4=") 0 0/contain; 82 | } 83 | } 84 | } 85 | 86 | html[data-theme='light'] .github-link { 87 | align-items: center; 88 | display: flex; 89 | 90 | &:before { 91 | align-self: center; 92 | background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSIjMWMxZTIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUxLTEuMDctMS43OC0uMi0zLjY0LS44OS0zLjY0LTMuOTUgMC0uODcuMzEtMS41OS44Mi0yLjE1LS4wOC0uMi0uMzYtMS4wMi4wOC0yLjEyIDAgMCAuNjctLjIxIDIuMi44Mi42NC0uMTggMS4zMi0uMjcgMi0uMjcuNjggMCAxLjM2LjA5IDIgLjI3IDEuNTMtMS4wNCAyLjItLjgyIDIuMi0uODIuNDQgMS4xLjE2IDEuOTIuMDggMi4xMi41MS41Ni44MiAxLjI3LjgyIDIuMTUgMCAzLjA3LTEuODcgMy43NS0zLjY1IDMuOTUuMjkuMjUuNTQuNzMuNTQgMS40OCAwIDEuMDctLjAxIDEuOTMtLjAxIDIuMiAwIC4yMS4xNS40Ni41NS4zOEE4LjAxMyA4LjAxMyAwIDAwMTYgOGMwLTQuNDItMy41OC04LTgtOHoiLz48L3N2Zz4=") 0 0/contain; 93 | content: ''; 94 | display: inline-flex; 95 | height: 32px; 96 | width: 32px; 97 | margin-right: 0.25rem; 98 | color: var(--ifm-navbar-link-color); 99 | } 100 | 101 | &:hover { 102 | &:before { 103 | background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSIjMzhiZGY4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04IDBDMy41OCAwIDAgMy41OCAwIDhjMCAzLjU0IDIuMjkgNi41MyA1LjQ3IDcuNTkuNC4wNy41NS0uMTcuNTUtLjM4IDAtLjE5LS4wMS0uODItLjAxLTEuNDktMi4wMS4zNy0yLjUzLS40OS0yLjY5LS45NC0uMDktLjIzLS40OC0uOTQtLjgyLTEuMTMtLjI4LS4xNS0uNjgtLjUyLS4wMS0uNTMuNjMtLjAxIDEuMDguNTggMS4yMy44Mi43MiAxLjIxIDEuODcuODcgMi4zMy42Ni4wNy0uNTIuMjgtLjg3LjUxLTEuMDctMS43OC0uMi0zLjY0LS44OS0zLjY0LTMuOTUgMC0uODcuMzEtMS41OS44Mi0yLjE1LS4wOC0uMi0uMzYtMS4wMi4wOC0yLjEyIDAgMCAuNjctLjIxIDIuMi44Mi42NC0uMTggMS4zMi0uMjcgMi0uMjcuNjggMCAxLjM2LjA5IDIgLjI3IDEuNTMtMS4wNCAyLjItLjgyIDIuMi0uODIuNDQgMS4xLjE2IDEuOTIuMDggMi4xMi41MS41Ni44MiAxLjI3LjgyIDIuMTUgMCAzLjA3LTEuODcgMy43NS0zLjY1IDMuOTUuMjkuMjUuNTQuNzMuNTQgMS40OCAwIDEuMDctLjAxIDEuOTMtLjAxIDIuMiAwIC4yMS4xNS40Ni41NS4zOEE4LjAxMyA4LjAxMyAwIDAwMTYgOGMwLTQuNDItMy41OC04LTgtOHoiLz48L3N2Zz4=") 0 0/contain; 104 | } 105 | } 106 | } 107 | html[data-theme='dark'] .discord-link { 108 | align-items: center; 109 | display: flex; 110 | 111 | &:before { 112 | align-self: center; 113 | background: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0cHgiIHdpZHRoPSIyNHB4IiB2aWV3Qm94PSIwIDAgNzEgNTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYwLjEwNDUgNC44OTc4QzU1LjU3OTIgMi44MjE0IDUwLjcyNjUgMS4yOTE2IDQ1LjY1MjcgMC40MTU0MkM0NS41NjAzIDAuMzk4NTEgNDUuNDY4IDAuNDQwNzY5IDQ1LjQyMDQgMC41MjUyODlDNDQuNzk2MyAxLjYzNTMgNDQuMTA1IDMuMDgzNCA0My42MjA5IDQuMjIxNkMzOC4xNjM3IDMuNDA0NiAzMi43MzQ1IDMuNDA0NiAyNy4zODkyIDQuMjIxNkMyNi45MDUgMy4wNTgxIDI2LjE4ODYgMS42MzUzIDI1LjU2MTcgMC41MjUyODlDMjUuNTE0MSAwLjQ0MzU4OSAyNS40MjE4IDAuNDAxMzMgMjUuMzI5NCAwLjQxNTQyQzIwLjI1ODQgMS4yODg4IDE1LjQwNTcgMi44MTg2IDEwLjg3NzYgNC44OTc4QzEwLjgzODQgNC45MTQ3IDEwLjgwNDggNC45NDI5IDEwLjc4MjUgNC45Nzk1QzEuNTc3OTUgMTguNzMwOSAtMC45NDM1NjEgMzIuMTQ0MyAwLjI5MzQwOCA0NS4zOTE0QzAuMjk5MDA1IDQ1LjQ1NjIgMC4zMzUzODYgNDUuNTE4MiAwLjM4NTc2MSA0NS41NTc2QzYuNDU4NjYgNTAuMDE3NCAxMi4zNDEzIDUyLjcyNDkgMTguMTE0NyA1NC41MTk1QzE4LjIwNzEgNTQuNTQ3NyAxOC4zMDUgNTQuNTEzOSAxOC4zNjM4IDU0LjQzNzhDMTkuNzI5NSA1Mi41NzI4IDIwLjk0NjkgNTAuNjA2MyAyMS45OTA3IDQ4LjUzODNDMjIuMDUyMyA0OC40MTcyIDIxLjk5MzUgNDguMjczNSAyMS44Njc2IDQ4LjIyNTZDMTkuOTM2NiA0Ny40OTMxIDE4LjA5NzkgNDYuNiAxNi4zMjkyIDQ1LjU4NThDMTYuMTg5MyA0NS41MDQxIDE2LjE3ODEgNDUuMzA0IDE2LjMwNjggNDUuMjA4MkMxNi42NzkgNDQuOTI5MyAxNy4wNTEzIDQ0LjYzOTEgMTcuNDA2NyA0NC4zNDYxQzE3LjQ3MSA0NC4yOTI2IDE3LjU2MDYgNDQuMjgxMyAxNy42MzYyIDQ0LjMxNTFDMjkuMjU1OCA0OS42MjAyIDQxLjgzNTQgNDkuNjIwMiA1My4zMTc5IDQ0LjMxNTFDNTMuMzkzNSA0NC4yNzg1IDUzLjQ4MzEgNDQuMjg5OCA1My41NTAyIDQ0LjM0MzNDNTMuOTA1NyA0NC42MzYzIDU0LjI3NzkgNDQuOTI5MyA1NC42NTI5IDQ1LjIwODJDNTQuNzgxNiA0NS4zMDQgNTQuNzczMiA0NS41MDQxIDU0LjYzMzMgNDUuNTg1OEM1Mi44NjQ2IDQ2LjYxOTcgNTEuMDI1OSA0Ny40OTMxIDQ5LjA5MjEgNDguMjIyOEM0OC45NjYyIDQ4LjI3MDcgNDguOTEwMiA0OC40MTcyIDQ4Ljk3MTggNDguNTM4M0M1MC4wMzggNTAuNjAzNCA1MS4yNTU0IDUyLjU2OTkgNTIuNTk1OSA1NC40MzVDNTIuNjUxOSA1NC41MTM5IDUyLjc1MjYgNTQuNTQ3NyA1Mi44NDUgNTQuNTE5NUM1OC42NDY0IDUyLjcyNDkgNjQuNTI5IDUwLjAxNzQgNzAuNjAxOSA0NS41NTc2QzcwLjY1NTEgNDUuNTE4MiA3MC42ODg3IDQ1LjQ1OSA3MC42OTQzIDQ1LjM5NDJDNzIuMTc0NyAzMC4wNzkxIDY4LjIxNDcgMTYuNzc1NyA2MC4xOTY4IDQuOTgyM0M2MC4xNzcyIDQuOTQyOSA2MC4xNDM3IDQuOTE0NyA2MC4xMDQ1IDQuODk3OFpNMjMuNzI1OSAzNy4zMjUzQzIwLjIyNzYgMzcuMzI1MyAxNy4zNDUxIDM0LjExMzYgMTcuMzQ1MSAzMC4xNjkzQzE3LjM0NTEgMjYuMjI1IDIwLjE3MTcgMjMuMDEzMyAyMy43MjU5IDIzLjAxMzNDMjcuMzA4IDIzLjAxMzMgMzAuMTYyNiAyNi4yNTMyIDMwLjEwNjYgMzAuMTY5M0MzMC4xMDY2IDM0LjExMzYgMjcuMjggMzcuMzI1MyAyMy43MjU5IDM3LjMyNTNaTTQ3LjMxNzggMzcuMzI1M0M0My44MTk2IDM3LjMyNTMgNDAuOTM3MSAzNC4xMTM2IDQwLjkzNzEgMzAuMTY5M0M0MC45MzcxIDI2LjIyNSA0My43NjM2IDIzLjAxMzMgNDcuMzE3OCAyMy4wMTMzQzUwLjkgMjMuMDEzMyA1My43NTQ1IDI2LjI1MzIgNTMuNjk4NiAzMC4xNjkzQzUzLjY5ODYgMzQuMTEzNiA1MC45IDM3LjMyNTMgNDcuMzE3OCAzNy4zMjUzWiIgZmlsbD0iI2UzZTNlMyIvPjwvc3ZnPg==") 0 0/contain; 114 | content: ''; 115 | display: inline-flex; 116 | height: 32px; 117 | width: 32px; 118 | margin-right: 0.25rem; 119 | color: var(--ifm-navbar-link-color); 120 | } 121 | 122 | &:hover { 123 | &:before { 124 | background: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0cHgiIHdpZHRoPSIyNHB4IiB2aWV3Qm94PSIwIDAgNzEgNTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYwLjEwNDUgNC44OTc4QzU1LjU3OTIgMi44MjE0IDUwLjcyNjUgMS4yOTE2IDQ1LjY1MjcgMC40MTU0MkM0NS41NjAzIDAuMzk4NTEgNDUuNDY4IDAuNDQwNzY5IDQ1LjQyMDQgMC41MjUyODlDNDQuNzk2MyAxLjYzNTMgNDQuMTA1IDMuMDgzNCA0My42MjA5IDQuMjIxNkMzOC4xNjM3IDMuNDA0NiAzMi43MzQ1IDMuNDA0NiAyNy4zODkyIDQuMjIxNkMyNi45MDUgMy4wNTgxIDI2LjE4ODYgMS42MzUzIDI1LjU2MTcgMC41MjUyODlDMjUuNTE0MSAwLjQ0MzU4OSAyNS40MjE4IDAuNDAxMzMgMjUuMzI5NCAwLjQxNTQyQzIwLjI1ODQgMS4yODg4IDE1LjQwNTcgMi44MTg2IDEwLjg3NzYgNC44OTc4QzEwLjgzODQgNC45MTQ3IDEwLjgwNDggNC45NDI5IDEwLjc4MjUgNC45Nzk1QzEuNTc3OTUgMTguNzMwOSAtMC45NDM1NjEgMzIuMTQ0MyAwLjI5MzQwOCA0NS4zOTE0QzAuMjk5MDA1IDQ1LjQ1NjIgMC4zMzUzODYgNDUuNTE4MiAwLjM4NTc2MSA0NS41NTc2QzYuNDU4NjYgNTAuMDE3NCAxMi4zNDEzIDUyLjcyNDkgMTguMTE0NyA1NC41MTk1QzE4LjIwNzEgNTQuNTQ3NyAxOC4zMDUgNTQuNTEzOSAxOC4zNjM4IDU0LjQzNzhDMTkuNzI5NSA1Mi41NzI4IDIwLjk0NjkgNTAuNjA2MyAyMS45OTA3IDQ4LjUzODNDMjIuMDUyMyA0OC40MTcyIDIxLjk5MzUgNDguMjczNSAyMS44Njc2IDQ4LjIyNTZDMTkuOTM2NiA0Ny40OTMxIDE4LjA5NzkgNDYuNiAxNi4zMjkyIDQ1LjU4NThDMTYuMTg5MyA0NS41MDQxIDE2LjE3ODEgNDUuMzA0IDE2LjMwNjggNDUuMjA4MkMxNi42NzkgNDQuOTI5MyAxNy4wNTEzIDQ0LjYzOTEgMTcuNDA2NyA0NC4zNDYxQzE3LjQ3MSA0NC4yOTI2IDE3LjU2MDYgNDQuMjgxMyAxNy42MzYyIDQ0LjMxNTFDMjkuMjU1OCA0OS42MjAyIDQxLjgzNTQgNDkuNjIwMiA1My4zMTc5IDQ0LjMxNTFDNTMuMzkzNSA0NC4yNzg1IDUzLjQ4MzEgNDQuMjg5OCA1My41NTAyIDQ0LjM0MzNDNTMuOTA1NyA0NC42MzYzIDU0LjI3NzkgNDQuOTI5MyA1NC42NTI5IDQ1LjIwODJDNTQuNzgxNiA0NS4zMDQgNTQuNzczMiA0NS41MDQxIDU0LjYzMzMgNDUuNTg1OEM1Mi44NjQ2IDQ2LjYxOTcgNTEuMDI1OSA0Ny40OTMxIDQ5LjA5MjEgNDguMjIyOEM0OC45NjYyIDQ4LjI3MDcgNDguOTEwMiA0OC40MTcyIDQ4Ljk3MTggNDguNTM4M0M1MC4wMzggNTAuNjAzNCA1MS4yNTU0IDUyLjU2OTkgNTIuNTk1OSA1NC40MzVDNTIuNjUxOSA1NC41MTM5IDUyLjc1MjYgNTQuNTQ3NyA1Mi44NDUgNTQuNTE5NUM1OC42NDY0IDUyLjcyNDkgNjQuNTI5IDUwLjAxNzQgNzAuNjAxOSA0NS41NTc2QzcwLjY1NTEgNDUuNTE4MiA3MC42ODg3IDQ1LjQ1OSA3MC42OTQzIDQ1LjM5NDJDNzIuMTc0NyAzMC4wNzkxIDY4LjIxNDcgMTYuNzc1NyA2MC4xOTY4IDQuOTgyM0M2MC4xNzcyIDQuOTQyOSA2MC4xNDM3IDQuOTE0NyA2MC4xMDQ1IDQuODk3OFpNMjMuNzI1OSAzNy4zMjUzQzIwLjIyNzYgMzcuMzI1MyAxNy4zNDUxIDM0LjExMzYgMTcuMzQ1MSAzMC4xNjkzQzE3LjM0NTEgMjYuMjI1IDIwLjE3MTcgMjMuMDEzMyAyMy43MjU5IDIzLjAxMzNDMjcuMzA4IDIzLjAxMzMgMzAuMTYyNiAyNi4yNTMyIDMwLjEwNjYgMzAuMTY5M0MzMC4xMDY2IDM0LjExMzYgMjcuMjggMzcuMzI1MyAyMy43MjU5IDM3LjMyNTNaTTQ3LjMxNzggMzcuMzI1M0M0My44MTk2IDM3LjMyNTMgNDAuOTM3MSAzNC4xMTM2IDQwLjkzNzEgMzAuMTY5M0M0MC45MzcxIDI2LjIyNSA0My43NjM2IDIzLjAxMzMgNDcuMzE3OCAyMy4wMTMzQzUwLjkgMjMuMDEzMyA1My43NTQ1IDI2LjI1MzIgNTMuNjk4NiAzMC4xNjkzQzUzLjY5ODYgMzQuMTEzNiA1MC45IDM3LjMyNTMgNDcuMzE3OCAzNy4zMjUzWiIgZmlsbD0iIzM4YmRmOCIvPjwvc3ZnPg==") 0 0/contain; 125 | } 126 | } 127 | } 128 | 129 | html[data-theme='light'] .discord-link { 130 | align-items: center; 131 | display: flex; 132 | 133 | &:before { 134 | align-self: center; 135 | background: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0cHgiIHdpZHRoPSIyNHB4IiB2aWV3Qm94PSIwIDAgNzEgNTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYwLjEwNDUgNC44OTc4QzU1LjU3OTIgMi44MjE0IDUwLjcyNjUgMS4yOTE2IDQ1LjY1MjcgMC40MTU0MkM0NS41NjAzIDAuMzk4NTEgNDUuNDY4IDAuNDQwNzY5IDQ1LjQyMDQgMC41MjUyODlDNDQuNzk2MyAxLjYzNTMgNDQuMTA1IDMuMDgzNCA0My42MjA5IDQuMjIxNkMzOC4xNjM3IDMuNDA0NiAzMi43MzQ1IDMuNDA0NiAyNy4zODkyIDQuMjIxNkMyNi45MDUgMy4wNTgxIDI2LjE4ODYgMS42MzUzIDI1LjU2MTcgMC41MjUyODlDMjUuNTE0MSAwLjQ0MzU4OSAyNS40MjE4IDAuNDAxMzMgMjUuMzI5NCAwLjQxNTQyQzIwLjI1ODQgMS4yODg4IDE1LjQwNTcgMi44MTg2IDEwLjg3NzYgNC44OTc4QzEwLjgzODQgNC45MTQ3IDEwLjgwNDggNC45NDI5IDEwLjc4MjUgNC45Nzk1QzEuNTc3OTUgMTguNzMwOSAtMC45NDM1NjEgMzIuMTQ0MyAwLjI5MzQwOCA0NS4zOTE0QzAuMjk5MDA1IDQ1LjQ1NjIgMC4zMzUzODYgNDUuNTE4MiAwLjM4NTc2MSA0NS41NTc2QzYuNDU4NjYgNTAuMDE3NCAxMi4zNDEzIDUyLjcyNDkgMTguMTE0NyA1NC41MTk1QzE4LjIwNzEgNTQuNTQ3NyAxOC4zMDUgNTQuNTEzOSAxOC4zNjM4IDU0LjQzNzhDMTkuNzI5NSA1Mi41NzI4IDIwLjk0NjkgNTAuNjA2MyAyMS45OTA3IDQ4LjUzODNDMjIuMDUyMyA0OC40MTcyIDIxLjk5MzUgNDguMjczNSAyMS44Njc2IDQ4LjIyNTZDMTkuOTM2NiA0Ny40OTMxIDE4LjA5NzkgNDYuNiAxNi4zMjkyIDQ1LjU4NThDMTYuMTg5MyA0NS41MDQxIDE2LjE3ODEgNDUuMzA0IDE2LjMwNjggNDUuMjA4MkMxNi42NzkgNDQuOTI5MyAxNy4wNTEzIDQ0LjYzOTEgMTcuNDA2NyA0NC4zNDYxQzE3LjQ3MSA0NC4yOTI2IDE3LjU2MDYgNDQuMjgxMyAxNy42MzYyIDQ0LjMxNTFDMjkuMjU1OCA0OS42MjAyIDQxLjgzNTQgNDkuNjIwMiA1My4zMTc5IDQ0LjMxNTFDNTMuMzkzNSA0NC4yNzg1IDUzLjQ4MzEgNDQuMjg5OCA1My41NTAyIDQ0LjM0MzNDNTMuOTA1NyA0NC42MzYzIDU0LjI3NzkgNDQuOTI5MyA1NC42NTI5IDQ1LjIwODJDNTQuNzgxNiA0NS4zMDQgNTQuNzczMiA0NS41MDQxIDU0LjYzMzMgNDUuNTg1OEM1Mi44NjQ2IDQ2LjYxOTcgNTEuMDI1OSA0Ny40OTMxIDQ5LjA5MjEgNDguMjIyOEM0OC45NjYyIDQ4LjI3MDcgNDguOTEwMiA0OC40MTcyIDQ4Ljk3MTggNDguNTM4M0M1MC4wMzggNTAuNjAzNCA1MS4yNTU0IDUyLjU2OTkgNTIuNTk1OSA1NC40MzVDNTIuNjUxOSA1NC41MTM5IDUyLjc1MjYgNTQuNTQ3NyA1Mi44NDUgNTQuNTE5NUM1OC42NDY0IDUyLjcyNDkgNjQuNTI5IDUwLjAxNzQgNzAuNjAxOSA0NS41NTc2QzcwLjY1NTEgNDUuNTE4MiA3MC42ODg3IDQ1LjQ1OSA3MC42OTQzIDQ1LjM5NDJDNzIuMTc0NyAzMC4wNzkxIDY4LjIxNDcgMTYuNzc1NyA2MC4xOTY4IDQuOTgyM0M2MC4xNzcyIDQuOTQyOSA2MC4xNDM3IDQuOTE0NyA2MC4xMDQ1IDQuODk3OFpNMjMuNzI1OSAzNy4zMjUzQzIwLjIyNzYgMzcuMzI1MyAxNy4zNDUxIDM0LjExMzYgMTcuMzQ1MSAzMC4xNjkzQzE3LjM0NTEgMjYuMjI1IDIwLjE3MTcgMjMuMDEzMyAyMy43MjU5IDIzLjAxMzNDMjcuMzA4IDIzLjAxMzMgMzAuMTYyNiAyNi4yNTMyIDMwLjEwNjYgMzAuMTY5M0MzMC4xMDY2IDM0LjExMzYgMjcuMjggMzcuMzI1MyAyMy43MjU5IDM3LjMyNTNaTTQ3LjMxNzggMzcuMzI1M0M0My44MTk2IDM3LjMyNTMgNDAuOTM3MSAzNC4xMTM2IDQwLjkzNzEgMzAuMTY5M0M0MC45MzcxIDI2LjIyNSA0My43NjM2IDIzLjAxMzMgNDcuMzE3OCAyMy4wMTMzQzUwLjkgMjMuMDEzMyA1My43NTQ1IDI2LjI1MzIgNTMuNjk4NiAzMC4xNjkzQzUzLjY5ODYgMzQuMTEzNiA1MC45IDM3LjMyNTMgNDcuMzE3OCAzNy4zMjUzWiIgZmlsbD0iIzFjMWUyMSIvPjwvc3ZnPg==") 0 0/contain; 136 | content: ''; 137 | display: inline-flex; 138 | height: 32px; 139 | width: 32px; 140 | margin-right: 0.25rem; 141 | color: var(--ifm-navbar-link-color); 142 | } 143 | 144 | &:hover { 145 | &:before { 146 | background: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0cHgiIHdpZHRoPSIyNHB4IiB2aWV3Qm94PSIwIDAgNzEgNTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYwLjEwNDUgNC44OTc4QzU1LjU3OTIgMi44MjE0IDUwLjcyNjUgMS4yOTE2IDQ1LjY1MjcgMC40MTU0MkM0NS41NjAzIDAuMzk4NTEgNDUuNDY4IDAuNDQwNzY5IDQ1LjQyMDQgMC41MjUyODlDNDQuNzk2MyAxLjYzNTMgNDQuMTA1IDMuMDgzNCA0My42MjA5IDQuMjIxNkMzOC4xNjM3IDMuNDA0NiAzMi43MzQ1IDMuNDA0NiAyNy4zODkyIDQuMjIxNkMyNi45MDUgMy4wNTgxIDI2LjE4ODYgMS42MzUzIDI1LjU2MTcgMC41MjUyODlDMjUuNTE0MSAwLjQ0MzU4OSAyNS40MjE4IDAuNDAxMzMgMjUuMzI5NCAwLjQxNTQyQzIwLjI1ODQgMS4yODg4IDE1LjQwNTcgMi44MTg2IDEwLjg3NzYgNC44OTc4QzEwLjgzODQgNC45MTQ3IDEwLjgwNDggNC45NDI5IDEwLjc4MjUgNC45Nzk1QzEuNTc3OTUgMTguNzMwOSAtMC45NDM1NjEgMzIuMTQ0MyAwLjI5MzQwOCA0NS4zOTE0QzAuMjk5MDA1IDQ1LjQ1NjIgMC4zMzUzODYgNDUuNTE4MiAwLjM4NTc2MSA0NS41NTc2QzYuNDU4NjYgNTAuMDE3NCAxMi4zNDEzIDUyLjcyNDkgMTguMTE0NyA1NC41MTk1QzE4LjIwNzEgNTQuNTQ3NyAxOC4zMDUgNTQuNTEzOSAxOC4zNjM4IDU0LjQzNzhDMTkuNzI5NSA1Mi41NzI4IDIwLjk0NjkgNTAuNjA2MyAyMS45OTA3IDQ4LjUzODNDMjIuMDUyMyA0OC40MTcyIDIxLjk5MzUgNDguMjczNSAyMS44Njc2IDQ4LjIyNTZDMTkuOTM2NiA0Ny40OTMxIDE4LjA5NzkgNDYuNiAxNi4zMjkyIDQ1LjU4NThDMTYuMTg5MyA0NS41MDQxIDE2LjE3ODEgNDUuMzA0IDE2LjMwNjggNDUuMjA4MkMxNi42NzkgNDQuOTI5MyAxNy4wNTEzIDQ0LjYzOTEgMTcuNDA2NyA0NC4zNDYxQzE3LjQ3MSA0NC4yOTI2IDE3LjU2MDYgNDQuMjgxMyAxNy42MzYyIDQ0LjMxNTFDMjkuMjU1OCA0OS42MjAyIDQxLjgzNTQgNDkuNjIwMiA1My4zMTc5IDQ0LjMxNTFDNTMuMzkzNSA0NC4yNzg1IDUzLjQ4MzEgNDQuMjg5OCA1My41NTAyIDQ0LjM0MzNDNTMuOTA1NyA0NC42MzYzIDU0LjI3NzkgNDQuOTI5MyA1NC42NTI5IDQ1LjIwODJDNTQuNzgxNiA0NS4zMDQgNTQuNzczMiA0NS41MDQxIDU0LjYzMzMgNDUuNTg1OEM1Mi44NjQ2IDQ2LjYxOTcgNTEuMDI1OSA0Ny40OTMxIDQ5LjA5MjEgNDguMjIyOEM0OC45NjYyIDQ4LjI3MDcgNDguOTEwMiA0OC40MTcyIDQ4Ljk3MTggNDguNTM4M0M1MC4wMzggNTAuNjAzNCA1MS4yNTU0IDUyLjU2OTkgNTIuNTk1OSA1NC40MzVDNTIuNjUxOSA1NC41MTM5IDUyLjc1MjYgNTQuNTQ3NyA1Mi44NDUgNTQuNTE5NUM1OC42NDY0IDUyLjcyNDkgNjQuNTI5IDUwLjAxNzQgNzAuNjAxOSA0NS41NTc2QzcwLjY1NTEgNDUuNTE4MiA3MC42ODg3IDQ1LjQ1OSA3MC42OTQzIDQ1LjM5NDJDNzIuMTc0NyAzMC4wNzkxIDY4LjIxNDcgMTYuNzc1NyA2MC4xOTY4IDQuOTgyM0M2MC4xNzcyIDQuOTQyOSA2MC4xNDM3IDQuOTE0NyA2MC4xMDQ1IDQuODk3OFpNMjMuNzI1OSAzNy4zMjUzQzIwLjIyNzYgMzcuMzI1MyAxNy4zNDUxIDM0LjExMzYgMTcuMzQ1MSAzMC4xNjkzQzE3LjM0NTEgMjYuMjI1IDIwLjE3MTcgMjMuMDEzMyAyMy43MjU5IDIzLjAxMzNDMjcuMzA4IDIzLjAxMzMgMzAuMTYyNiAyNi4yNTMyIDMwLjEwNjYgMzAuMTY5M0MzMC4xMDY2IDM0LjExMzYgMjcuMjggMzcuMzI1MyAyMy43MjU5IDM3LjMyNTNaTTQ3LjMxNzggMzcuMzI1M0M0My44MTk2IDM3LjMyNTMgNDAuOTM3MSAzNC4xMTM2IDQwLjkzNzEgMzAuMTY5M0M0MC45MzcxIDI2LjIyNSA0My43NjM2IDIzLjAxMzMgNDcuMzE3OCAyMy4wMTMzQzUwLjkgMjMuMDEzMyA1My43NTQ1IDI2LjI1MzIgNTMuNjk4NiAzMC4xNjkzQzUzLjY5ODYgMzQuMTEzNiA1MC45IDM3LjMyNTMgNDcuMzE3OCAzNy4zMjUzWiIgZmlsbD0iIzM4YmRmOCIvPjwvc3ZnPg==") 0 0/contain; 147 | } 148 | } 149 | } 150 | 151 | // Has to be a better way to style the announcment bar.... 152 | html[data-theme='dark'] .content_node_modules--pnpm-\@docusaurus\+theme-classic\@3-2-1_\@types\+react\@18-2-74_react-dom\@18-2-0_react\@18-2-0_typescript\@5-2-2-node_modules-\@docusaurus-theme-classic-lib-theme-AnnouncementBar-Content-styles-module { 153 | font-size: larger; 154 | color: white; 155 | padding: 1rem; 156 | } 157 | 158 | html[data-theme='light'] .content_node_modules--pnpm-\@docusaurus\+theme-classic\@3-2-1_\@types\+react\@18-2-74_react-dom\@18-2-0_react\@18-2-0_typescript\@5-2-2-node_modules-\@docusaurus-theme-classic-lib-theme-AnnouncementBar-Content-styles-module { 159 | font-size: larger; 160 | color: white; 161 | padding: 1rem; 162 | } 163 | -------------------------------------------------------------------------------- /src/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/pages/faq.mdx: -------------------------------------------------------------------------------- 1 | import Tabs from '@theme/Tabs'; 2 | import TabItem from '@theme/TabItem'; 3 | import Admonition from '@theme/Admonition'; 4 | 5 | 6 | # Frequently Asked Questions 7 | 8 | Here are some of the most asked questions that were asked in our Q&A stage on 4/12/2024, and our answers. 9 | 10 | **Last Updated: 2024-08-30** 11 | 12 | 13 | The Beta is now available! 14 | **Head over to the Install docs and try out Pelican yourself.** 15 | 16 | 17 | 18 | 19 |
20 | What makes Pelican different to Pterodactyl? 21 | 22 | We have a dedicated [Comparison page](https://pelican.dev/docs/comparison) where you can see differences and planned features. 23 |
24 |
25 | Will my Eggs still be compatible? 26 | 27 | Yes! We have a newer version of them planned, but the original ones will **always** work. 28 |
29 |
30 | How can I migrate to Pelican? 31 | 32 | You'll receive an easy guide to migrate from Pterodactyl to Pelican. 33 | It will be at least as easy as upgrading was originally. 34 |
35 |
36 | Are automatic updates planned? 37 | 38 | Yes. And easier manual updates too. 39 |
40 |
41 | Can I use the original API? 42 | 43 | Yes, it'll be backwards compatible. Any new changes for the API will be put in a new and separated version. 44 |
45 |
46 | Where can I submit bugs and pull requests? 47 | 48 | They can be posted on our [Github](https://github.com/pelican-dev/panel)! 49 |
50 |
51 | Will Blueprint extensions work on Pelican? 52 | 53 | No, Blueprint extensions will not work with Pelican. 54 |
55 |
56 | Will the client area match the new admin area? 57 | 58 | Yes, we are currently working on that. 59 |
60 |
61 | Will WHMCS and other billing solutions still work? 62 | 63 | To our knowledge, almost all of these solutions use the Panel's API to function. 64 | We will be supporting the same API, so everything should work the same. 65 |
66 |
67 | 68 |
69 | Are automatic updates planned? 70 | 71 | Yes! 72 |
73 |
74 | Where can I submit bugs and pull requests? 75 | 76 | They can be posted on our [Github](https://github.com/pelican-dev/wings)! 77 |
78 |
79 | Will Wings support plugins? 80 | 81 | Currently it's not planned. But new features are being built into Wings and are on the way! 82 |
83 |
84 | Will the original Wings still be compatible with Pelican? 85 | 86 | Yes, the original latest version of Wings will remain compatible with Pelican. 87 | We are working on adding new features and improvements to Wings that will greatly improve your experience. 88 |
89 |
90 | Will Podman / Kubernetes be supported? 91 | 92 | Yes, we plan on supporting them in the future. 93 |
94 |
95 | 96 | The Pelican Panel has been relicensed to **AGPLv3**. Wings still uses **MIT**. 97 | 98 | This license change does only affect you if you meet _all_ of the following requirements: 99 | 1. You modified the Pelican panel source files. 100 | 2. These modifications are not open source. 101 | 3. Your modified panel is publicly available. (Note: People who are family, friends, and acquaintances are not the public) 102 | 103 | If you meet _all_ of the above requirements you need a commercial license. 104 | Please note that the usage or development of plugins/ themes does not require a commercial license. 105 | 106 | You can find more detailed information about the new license in [this blog post](https://pelican.dev/blog/relicensing-pelican-to-agpl). 107 | 108 | 109 |
110 | Where can I submit feature requests and discuss new ideas? 111 | 112 | They can be posted on our [Github Discussions](https://github.com/pelican-dev/panel/discussions) 113 |
114 |
115 | Are there any hostilities with the previous project? 116 | 117 | Not at all. We also gave the previous team 2 months of advance notice. 118 |
119 |
120 | Why move away to make your own project? 121 | 122 | Difference of visions, directions, and opinions. 123 |
124 |
125 | Couldn't these changes be part of Pterodactyl? 126 | 127 | If they could, they would. But they can't, so they shan't. 128 |
129 |
130 | What will happen with Pterodactyl? Is it EOL now? 131 | 132 | We can't say that. That's up to the Maintainer of Pterodactyl. Pelican and Pterodactyl are separate projects. 133 |
134 |
135 |
136 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | 13 | @media screen and (max-width: 996px) { 14 | .heroBanner { 15 | padding: 2rem; 16 | } 17 | } 18 | 19 | .buttons { 20 | display: flex; 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Link from '@docusaurus/Link'; 4 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 5 | import Layout from '@theme/Layout'; 6 | import HomepageWhy from '@site/src/components/HomepageFeatures/why'; 7 | import HomepageWhat from '@site/src/components/HomepageFeatures/what'; 8 | import HomepageLook from '@site/src/components/HomepageFeatures/look'; 9 | import HomepageSponsors from '@site/src/components/HomepageFeatures/sponsors' 10 | import Heading from '@theme/Heading'; 11 | import { Icon } from '@iconify/react/dist/iconify.js'; 12 | 13 | import styles from './index.module.css'; 14 | 15 | function HomepageHeader() { 16 | const {siteConfig} = useDocusaurusContext(); 17 | return ( 18 |
19 |
20 | 21 | {siteConfig.title} 22 | 23 |

{siteConfig.tagline}

24 |
25 | Install 30 | Demo 35 |
36 |
37 |
38 | ); 39 | } 40 | 41 | export default function Home(): JSX.Element { 42 | const {siteConfig} = useDocusaurusContext(); 43 | return ( 44 | 47 | 48 |
49 | 50 | 51 | 52 | 53 |
54 |
55 | ); 56 | } 57 | -------------------------------------------------------------------------------- /src/pages/support.mdx: -------------------------------------------------------------------------------- 1 | import Link from "@docusaurus/Link"; 2 | 3 | # Support Pelican 4 | 5 | Supporting us will let us pay for the resources and time to keep Pelican amazing! 6 | 7 | How will your support be used? 8 | 9 | * Contributors: 75% 10 | * Bug Bounties: 15% 11 | * Moderators: 10% 12 | 13 |
14 | 15 | ## Monthly Support & Benefits: 16 | 17 | | | Individual | Team | Company | 18 | |------------------------|--------------|--------------|------------------| 19 | | Discord Role | Donor | Donor | Sponsor | 20 | | Support Priority | Medium | High | Highest | 21 | | # of Discord Members | 1 | 2 | 4 | 22 | | Discord Channel | Lounge | Lounge | Sponsor Lounge | 23 | | Early Beta | ✅ | ✅ | ✅ | 24 | | Private Raffles | ✅ | ✅ | ✅ | 25 | | Advertise on Discord | ❌ | ✅ | ✅ | 26 | | Logo on Websites | ❌ | ❌ | ✅ | 27 | | Commercial License | ❌ | ❌ | ✅ | 28 | | Monthly 1:1 Calls | ❌ | 30 minutes | 2 hours | 29 | | Monthly Cost | $19 | $99 | $499 | 30 | 31 | 32 | If you'd like to support the project, [visit us on The Hub](https://hub.pelican.dev/donors), to get started! 33 | 34 |
35 | 36 | ## One Time Support 37 | 38 | We really appreciate you, please follow this link to give a one time amount: 39 | 40 | Donate One Time 44 | 45 |
46 | 47 |

Thank you again for choosing to support Pelican!

48 | -------------------------------------------------------------------------------- /src/plugins/tailwind-config.cjs: -------------------------------------------------------------------------------- 1 | function tailwindPlugin(context, options) { 2 | return { 3 | name: 'tailwind-plugin', 4 | configurePostCss(postcssOptions) { 5 | postcssOptions.plugins = [ 6 | require('postcss-import'), 7 | require('tailwindcss'), 8 | require('autoprefixer'), 9 | ]; 10 | return postcssOptions; 11 | }, 12 | }; 13 | } 14 | 15 | module.exports = tailwindPlugin; -------------------------------------------------------------------------------- /src/theme/MDXComponents.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import MDXComponents from '@theme-original/MDXComponents'; 3 | import { Icon } from '@iconify/react'; // Import the entire Iconify library. 4 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; // Import the FontAwesomeIcon component. 5 | import { library } from '@fortawesome/fontawesome-svg-core'; // Import the library component. 6 | import { fab } from '@fortawesome/free-brands-svg-icons'; // Import all brands icons. 7 | import { fas } from '@fortawesome/free-solid-svg-icons'; // Import all solid icons. 8 | 9 | export default { 10 | // Re-use the default mapping 11 | ...MDXComponents, 12 | IIcon: Icon, // Make the iconify Icon component available in MDX as . 13 | FAIcon: FontAwesomeIcon, // Make the FontAwesomeIcon component available in MDX as . 14 | }; -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/.nojekyll -------------------------------------------------------------------------------- /static/img/blog/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/blog/1.png -------------------------------------------------------------------------------- /static/img/blog/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/blog/2.png -------------------------------------------------------------------------------- /static/img/blog/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/blog/3.png -------------------------------------------------------------------------------- /static/img/blog/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/blog/4.png -------------------------------------------------------------------------------- /static/img/blog/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/blog/5.png -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/homepage/sponsor/ash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/sponsor/ash.png -------------------------------------------------------------------------------- /static/img/homepage/sponsor/ash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /static/img/homepage/sponsor/surfhosting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/sponsor/surfhosting.png -------------------------------------------------------------------------------- /static/img/homepage/sponsor/vultric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/sponsor/vultric.png -------------------------------------------------------------------------------- /static/img/homepage/ss/1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/1d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/1l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/1l.png -------------------------------------------------------------------------------- /static/img/homepage/ss/2d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/2d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/2l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/2l.png -------------------------------------------------------------------------------- /static/img/homepage/ss/3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/3d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/3l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/3l.png -------------------------------------------------------------------------------- /static/img/homepage/ss/4d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/4d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/4l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/4l.png -------------------------------------------------------------------------------- /static/img/homepage/ss/5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/5d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/5l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/5l.png -------------------------------------------------------------------------------- /static/img/homepage/ss/6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/6d.png -------------------------------------------------------------------------------- /static/img/homepage/ss/6l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/homepage/ss/6l.png -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pelican-dev/docs/a85d89462d6df1d16b0411b2d199c80523aaf20b/static/img/logo.png -------------------------------------------------------------------------------- /static/updatePanel.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $EUID -ne 0 ]]; then 4 | echo "This script must be run as root or with sudo." >&2 5 | exit 1 6 | fi 7 | 8 | function exitInstall { 9 | cd "$install_dir" 10 | php artisan up 11 | echo "Panel is out of maintenance mode." 12 | exit $1 13 | } 14 | 15 | read -p "Enter the directory for the panel location [/var/www/pelican]: " install_dir 16 | install_dir=${install_dir:-/var/www/pelican} 17 | 18 | if [ ! -d "$install_dir" ]; then 19 | echo "Directory $install_dir does not exist. Exiting..." 20 | exit 1 21 | fi 22 | 23 | env_file="$install_dir/.env" 24 | 25 | if [ ! -f "$env_file" ]; then 26 | echo "File $env_file does not exist. Exiting..." 27 | exit 1 28 | fi 29 | 30 | owner=$(stat -c '%U' "$install_dir" || echo "www-data") 31 | read -p "Enter the owner of the files (www-data, apache, nginx) [$owner]: " owner 32 | owner=${owner:-www-data} 33 | 34 | group=$(stat -c '%G' "$install_dir" || echo "www-data") 35 | read -p "Enter the group of the files (www-data, apache, nginx) [$group]: " group 36 | group=${group:-www-data} 37 | 38 | cd "$install_dir" 39 | php artisan down 40 | if [ $? -ne 0 ]; then 41 | echo "Failed to put the panel into maintenance mode." 42 | exitInstall 1 43 | fi 44 | echo "Panel is now in maintenance mode." 45 | 46 | db_connection=$(grep "^DB_CONNECTION=" "$env_file" | cut -d '=' -f 2) 47 | 48 | if [ -z "$db_connection" ]; then 49 | echo "DB_CONNECTION not found in $env_file." 50 | exitInstall 0 51 | fi 52 | 53 | echo "DB_CONNECTION is set to: $db_connection" 54 | 55 | read -p "Do you want to create a backup? (y/n) [y]: " backup_confirm 56 | backup_confirm=${backup_confirm:-y} 57 | if [ "$backup_confirm" != "y" ]; then 58 | echo "Backup canceled." 59 | exitInstall 0 60 | fi 61 | 62 | backup_dir="$install_dir/backup" 63 | mkdir -p "$backup_dir" 64 | 65 | if [ "$db_connection" = "sqlite" ]; then 66 | db_database=$(grep "^DB_DATABASE=" "$env_file" | cut -d '=' -f 2) 67 | 68 | if [ -z "$db_database" ]; then 69 | echo "DB_DATABASE not found in $env_file." 70 | exitInstall 1 71 | fi 72 | 73 | if [[ "$db_database" != *.sqlite ]]; then 74 | db_database="$db_database.sqlite" 75 | fi 76 | echo "DB_DATABASE is set to: $db_database" 77 | cp "$install_dir/database/$db_database" "$backup_dir/$db_database.backup" 78 | if [ $? -ne 0 ]; then 79 | echo "Failed to backup $db_database file, aborting" 80 | exitInstall 1 81 | fi 82 | else 83 | read -p "NOTE: THIS WILL NOT BACKUP MySQL/MariaDB DATABASES!!! You should pause now and make your own backup!! You've been warned! Continue? (y/n) [y]: " database_confirm 84 | database_confirm=${database_confirm:-y} 85 | if [ "$database_confirm" != "y" ]; then 86 | echo "Update Canceled." 87 | exitInstall 0 88 | fi 89 | fi 90 | 91 | cp "$env_file" "$backup_dir/.env.backup" 92 | if [ $? -ne 0 ]; then 93 | echo "Failed to backup .env file, aborting" 94 | exitInstall 1 95 | fi 96 | echo "Backed up .env file successfully." 97 | 98 | echo "Downloading Files..." 99 | curl -L https://github.com/pelican-dev/panel/releases/latest/download/panel.tar.gz -o panel.tar.gz 100 | expected_checksum=$(curl -L https://github.com/pelican-dev/panel/releases/latest/download/checksum.txt | awk '{ print $1 }') 101 | calculated_checksum=$(sha256sum panel.tar.gz | awk '{ print $1 }') 102 | 103 | if [[ -z "$expected_checksum" || -z "$calculated_checksum" || "$expected_checksum" != "$calculated_checksum" ]]; then 104 | read -p "NOTE: Checksum mismatch, the file may be corrupted!!! You've been warned! Continue? (y/n) [y]: " checksum_confirm 105 | checksum_confirm=${checksum_confirm:-y} 106 | if [ "$checksum_confirm" != "y" ]; then 107 | echo "Update Canceled." 108 | exitInstall 1 109 | fi 110 | fi 111 | 112 | echo "Checksum verified." 113 | read -p "Do you want to delete all files and folders in $install_dir except the backup folder? (y/n) [y]: " delete_confirm 114 | delete_confirm=${delete_confirm:-y} 115 | if [ "$delete_confirm" != "y" ]; then 116 | echo "Deletion canceled." 117 | exitInstall 0 118 | fi 119 | 120 | find "$install_dir" -mindepth 1 -maxdepth 1 ! -name 'backup' ! -name 'panel.tar.gz' ! -name 'artisan' -exec rm -rf {} + 121 | if [ $? -ne 0 ]; then 122 | echo "Failed to delete old files, aborting" 123 | exitInstall 1 124 | fi 125 | echo "Deleted all files and folders in $install_dir except the backup folder." 126 | 127 | echo "Extracting tarball." 128 | tar -xzf panel.tar.gz -C "$install_dir" 129 | if [ $? -ne 0 ]; then 130 | echo "Failed to extract tarball, aborting" 131 | exitInstall 1 132 | fi 133 | rm panel.tar.gz 134 | if [ $? -ne 0 ]; then 135 | echo "Failed to delete leftover tarball, continuing." 136 | fi 137 | 138 | echo "Installing Composer" 139 | COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction 140 | if [ $? -ne 0 ]; then 141 | echo "Failed to run composer, aborting" 142 | exitInstall 1 143 | fi 144 | 145 | php artisan down 146 | if [ $? -ne 0 ]; then 147 | echo "Failed to put the panel into maintenance mode." 148 | exitInstall 1 149 | fi 150 | 151 | echo "Restoring .env" 152 | mv "$backup_dir/.env.backup" "$install_dir/.env" 153 | if [ $? -ne 0 ]; then 154 | echo "Failed to restore the .env file, aborting" 155 | exitInstall 1 156 | fi 157 | 158 | if [ "$db_connection" = "sqlite" ]; then 159 | echo "Restoring sqlite database" 160 | mv "$backup_dir/$db_database.backup" "$install_dir/database/$db_database" 161 | if [ $? -ne 0 ]; then 162 | echo "Failed to restore the database, aborting" 163 | exitInstall 1 164 | fi 165 | fi 166 | 167 | echo "Optimizing" 168 | php artisan optimize:clear 169 | php artisan filament:optimize 170 | 171 | echo "Creating storage symlinks" 172 | php artisan storage:link 173 | 174 | echo "Updating database" 175 | php artisan migrate --seed --force 176 | 177 | echo "Setting Permissions" 178 | chmod_command="chmod -R 755 storage/* bootstrap/cache" 179 | eval $chmod_command 180 | if [ $? -ne 0 ]; then 181 | echo "Failed to run chmod, Please run the following commands manually:" 182 | echo "sudo $chmod_command" 183 | fi 184 | chown_command="chown -R $owner:$group $install_dir" 185 | eval $chown_command 186 | if [ $? -ne 0 ]; then 187 | echo "Failed to run chown, Please run the following commands manually:" 188 | echo "sudo $chown_command" 189 | fi 190 | 191 | php artisan queue:restart 192 | php artisan up 193 | 194 | echo "Panel is now live and out of maintenance mode." 195 | echo "Panel Updated!" 196 | exit 0 197 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const { fontFamily } = require("tailwindcss/defaultTheme"); 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | module.exports = { 5 | corePlugins: { 6 | preflight: false, 7 | container: false, 8 | }, 9 | darkMode: ["class", '[data-theme="dark"]'], 10 | content: ["./src/**/*.{jsx,tsx,html,mdx}"], 11 | theme: { 12 | extend: { 13 | fontFamily: { 14 | sans: ['"Inter"', ...fontFamily.sans], 15 | jakarta: ['"Plus Jakarta Sans"', ...fontFamily.sans], 16 | mono: ['"Fira Code"', ...fontFamily.mono], 17 | }, 18 | borderRadius: { 19 | sm: "4px", 20 | }, 21 | screens: { 22 | sm: "0px", 23 | lg: "997px", 24 | }, 25 | colors: {}, 26 | }, 27 | }, 28 | plugins: [], 29 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@docusaurus/tsconfig", 4 | "compilerOptions": { 5 | "jsx": "react", 6 | "baseUrl": "." 7 | } 8 | } 9 | --------------------------------------------------------------------------------